mirror of
https://github.com/twisterarmy/twister-rss-bot.git
synced 2025-02-06 12:14:22 +00:00
initial commit
This commit is contained in:
parent
4e130ca4b7
commit
7a7c69231b
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/vendor/
|
||||
/storage/
|
||||
/config.json
|
30
README.md
30
README.md
@ -1,2 +1,32 @@
|
||||
# twister-rss-bot-php
|
||||
|
||||
RSS Bot for Twister P2P
|
||||
|
||||
## Requirements
|
||||
|
||||
* `php-8.2`
|
||||
* `php-curl`
|
||||
* `php-mbstring`
|
||||
* `php-pdo`
|
||||
* `php-sqlite3`
|
||||
|
||||
## Install
|
||||
|
||||
### Production
|
||||
|
||||
* `composer create-project twisterarmy/twister-rss-bot`
|
||||
|
||||
### Development
|
||||
|
||||
* `git clone https://github.com/twisterarmy/twister-rss-bot-php.git`
|
||||
* `cd twister-rss-bot-php`
|
||||
* `composer install`
|
||||
|
||||
## Config
|
||||
|
||||
* `cp config.example.json config.json`
|
||||
* `nano config.json` add twister connection and RSS feeds
|
||||
|
||||
## Usage
|
||||
|
||||
* `@hourly php src/cli/bot.php`
|
14
composer.json
Normal file
14
composer.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "twisterarmy/twister-rss-bot",
|
||||
"description": "RSS Bot for Twister P2P",
|
||||
"type": "project",
|
||||
"license": "MIT",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Twisterarmy\\TwisterRssBot\\": "src/"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"twisterarmy/twister": "^1.0"
|
||||
}
|
||||
}
|
50
composer.lock
generated
Normal file
50
composer.lock
generated
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "70fb72082709cc5f798645656e8c4865",
|
||||
"packages": [
|
||||
{
|
||||
"name": "twisterarmy/twister",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twisterarmy/twister-php.git",
|
||||
"reference": "5761f1b90b25caf58fef7a1274b91af9c25a1831"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twisterarmy/twister-php/zipball/5761f1b90b25caf58fef7a1274b91af9c25a1831",
|
||||
"reference": "5761f1b90b25caf58fef7a1274b91af9c25a1831",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Twisterarmy\\Twister\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"description": "PHP 8 / Composer Tools for Twister API",
|
||||
"support": {
|
||||
"issues": "https://github.com/twisterarmy/twister-php/issues",
|
||||
"source": "https://github.com/twisterarmy/twister-php/tree/1.0.0"
|
||||
},
|
||||
"time": "2023-12-21T03:22:50+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": [],
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.3.0"
|
||||
}
|
35
config.example.json
Normal file
35
config.example.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"twister":
|
||||
{
|
||||
"protocol":"http",
|
||||
"host":"localhost",
|
||||
"port":28332,
|
||||
"username":"user",
|
||||
"password":"pwd"
|
||||
},
|
||||
"sqlite":
|
||||
{
|
||||
"database":"database.sqlite",
|
||||
"username":null,
|
||||
"password":null
|
||||
},
|
||||
"feed":
|
||||
[
|
||||
{
|
||||
"source":"https://...",
|
||||
"target":"user1",
|
||||
"queue":
|
||||
{
|
||||
"limit":5
|
||||
}
|
||||
},
|
||||
{
|
||||
"source":"https://...",
|
||||
"target":"user2",
|
||||
"queue":
|
||||
{
|
||||
"limit":5
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
169
src/cli/bot.php
Normal file
169
src/cli/bot.php
Normal file
@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
// Load dependencies
|
||||
require __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
// Load config
|
||||
$config = json_decode(
|
||||
file_get_contents(
|
||||
__DIR__ . '/../../config.json'
|
||||
)
|
||||
);
|
||||
|
||||
// Connect twister
|
||||
try
|
||||
{
|
||||
$twister = new \Twisterarmy\Twister\Client(
|
||||
$config->twister->protocol,
|
||||
$config->twister->host,
|
||||
$config->twister->port,
|
||||
$config->twister->username,
|
||||
$config->twister->password
|
||||
);
|
||||
}
|
||||
|
||||
catch (Exception $e)
|
||||
{
|
||||
var_dump(
|
||||
$e->getMessage()
|
||||
);
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
// Connect DB
|
||||
try
|
||||
{
|
||||
$database = new PDO(
|
||||
sprintf(
|
||||
'sqlite:%s',
|
||||
sprintf(
|
||||
'%s/../../storage/%s',
|
||||
__DIR__,
|
||||
$config->sqlite->database
|
||||
)
|
||||
),
|
||||
$config->sqlite->username,
|
||||
$config->sqlite->password
|
||||
);
|
||||
|
||||
$database->setAttribute(
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE,
|
||||
PDO::FETCH_OBJ
|
||||
);
|
||||
}
|
||||
|
||||
catch (Exception $e)
|
||||
{
|
||||
var_dump(
|
||||
$e->getMessage()
|
||||
);
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
// Collect feeds data
|
||||
foreach ($config->feed as $feed)
|
||||
{
|
||||
// Create account database if not exists
|
||||
$database->query(
|
||||
sprintf(
|
||||
'CREATE TABLE IF NOT EXISTS "%s"
|
||||
(
|
||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("id" >= 0),
|
||||
"hash" CHAR(32) NOT NULL,
|
||||
"message" VARCHAR(256) NOT NULL,
|
||||
"time" INTEGER NOT NULL,
|
||||
"sent" INTEGER NULL,
|
||||
CONSTRAINT "UNIQUE"
|
||||
UNIQUE("hash")
|
||||
)',
|
||||
$feed->target
|
||||
)
|
||||
);
|
||||
|
||||
// Save feed to the database pool
|
||||
foreach ((array) \Twisterarmy\Twister\Tools\Rss::feed($feed->source) as $data)
|
||||
{
|
||||
// Generate record hash
|
||||
$hash = md5(
|
||||
$data['message']
|
||||
);
|
||||
|
||||
// Check record not exist
|
||||
$query = $database->prepare(
|
||||
sprintf(
|
||||
'SELECT COUNT(*) AS `total` FROM %s WHERE `hash` = ?',
|
||||
$feed->target
|
||||
)
|
||||
);
|
||||
|
||||
$query->execute(
|
||||
[
|
||||
$hash
|
||||
]
|
||||
);
|
||||
|
||||
if ($query->fetch()->total)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add new record
|
||||
$query = $database->prepare(
|
||||
sprintf(
|
||||
'INSERT INTO %s (`hash`, `message`, `time`) VALUES (?, ?, ?)',
|
||||
$feed->target
|
||||
)
|
||||
);
|
||||
|
||||
$query->execute(
|
||||
[
|
||||
$hash,
|
||||
$data['message'],
|
||||
$data['time'],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
// Process messages queue by time ASC
|
||||
$query = $database->query(
|
||||
sprintf(
|
||||
'SELECT `id`, `message` FROM %s WHERE `sent` IS NULL ORDER BY `time` ASC LIMIT %s',
|
||||
$feed->target,
|
||||
$feed->queue->limit,
|
||||
)
|
||||
);
|
||||
|
||||
// Send each message to the twister account
|
||||
foreach ($query->fetchAll() as $queue)
|
||||
{
|
||||
$errors = [];
|
||||
|
||||
$twister->newPostMessage(
|
||||
$feed->target,
|
||||
time(), //int $k,
|
||||
$queue->message,
|
||||
$errors
|
||||
);
|
||||
|
||||
if ($errors)
|
||||
{
|
||||
var_dump(
|
||||
$errors
|
||||
);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Update time sent on success
|
||||
$database->query(
|
||||
sprintf(
|
||||
'UPDATE %s SET `sent` = %s WHERE `id` = %s LIMIT 1',
|
||||
$feed->target,
|
||||
time(),
|
||||
$queue->id
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user