mirror of https://github.com/kevachat/geminiapp
ghost
10 months ago
8 changed files with 469 additions and 49 deletions
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
CREATE TABLE IF NOT EXISTS "pool" ( |
||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||
"time" INTEGER NOT NULL, |
||||
"sent" INTEGER NOT NULL, |
||||
"expired" INTEGER NOT NULL, |
||||
"cost" INTEGER NOT NULL, |
||||
"address" VARCHAR NOT NULL, |
||||
"namespace" VARCHAR NOT NULL, |
||||
"key" VARCHAR NOT NULL, |
||||
"value" TEXT NOT NULL |
||||
); |
@ -0,0 +1,237 @@
@@ -0,0 +1,237 @@
|
||||
<?php |
||||
|
||||
// Check arguments |
||||
if (empty($argv[1])) |
||||
{ |
||||
exit( |
||||
sprintf( |
||||
_('[%s] [error] Configured hostname required as argument!'), |
||||
date('c') |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Check host configured |
||||
if (!file_exists(__DIR__ . '/../host/' . $argv[1] . '/config.json')) |
||||
{ |
||||
exit( |
||||
sprintf( |
||||
_('[%s] [error] Host "%s" not configured!'), |
||||
date('c'), |
||||
$argv[1] |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Prevent multi-thread execution |
||||
$semaphore = sem_get( |
||||
crc32(__FILE__ . $argv[1]), 1 |
||||
); |
||||
|
||||
if (false === sem_acquire($semaphore, true)) |
||||
{ |
||||
exit( |
||||
sprintf( |
||||
_('[%s] [warning] Process locked by another thread!'), |
||||
date('c') |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Init config |
||||
$config = json_decode( |
||||
file_get_contents( |
||||
__DIR__ . '/../host/' . $argv[1] . '/config.json' |
||||
) |
||||
); |
||||
|
||||
// Load dependencies |
||||
require_once __DIR__ . '/../vendor/autoload.php'; |
||||
|
||||
// Init kevacoin |
||||
try |
||||
{ |
||||
$kevacoin = new \Kevachat\Kevacoin\Client( |
||||
$config->kevacoin->server->protocol, |
||||
$config->kevacoin->server->host, |
||||
$config->kevacoin->server->port, |
||||
$config->kevacoin->server->username, |
||||
$config->kevacoin->server->password |
||||
); |
||||
} |
||||
|
||||
catch (Exception $exception) |
||||
{ |
||||
exit( |
||||
print_r( |
||||
$exception, |
||||
true |
||||
) |
||||
); |
||||
} |
||||
|
||||
// Init database |
||||
try |
||||
{ |
||||
$database = new \PDO( |
||||
sprintf( |
||||
'sqlite:%s/../host/%s', |
||||
__DIR__, |
||||
$config->sqlite->server->name |
||||
), |
||||
$config->sqlite->server->user, |
||||
$config->sqlite->server->password |
||||
); |
||||
|
||||
$database->setAttribute( |
||||
\PDO::ATTR_ERRMODE, |
||||
\PDO::ERRMODE_EXCEPTION |
||||
); |
||||
|
||||
$database->setAttribute( |
||||
\PDO::ATTR_DEFAULT_FETCH_MODE, |
||||
\PDO::FETCH_OBJ |
||||
); |
||||
|
||||
$database->setAttribute( |
||||
\PDO::ATTR_TIMEOUT, |
||||
$config->sqlite->server->timeout |
||||
); |
||||
|
||||
$database->query( |
||||
file_get_contents( |
||||
__DIR__ . '/../data.sql' |
||||
) |
||||
); |
||||
} |
||||
|
||||
catch (Exception $exception) |
||||
{ |
||||
exit( |
||||
print_r( |
||||
$exception, |
||||
true |
||||
) |
||||
); |
||||
} |
||||
|
||||
// Init room list |
||||
$rooms = []; |
||||
|
||||
foreach ((array) $kevacoin->kevaListNamespaces() as $value) |
||||
{ |
||||
$rooms[$value['namespaceId']] = mb_strtolower($value['displayName']); |
||||
} |
||||
|
||||
// Skip room lock events |
||||
if (empty($rooms)) |
||||
{ |
||||
exit( |
||||
sprintf( |
||||
_('[%s] [error] Could not init room list!'), |
||||
date('c') |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Process pool queue |
||||
$total = 0; |
||||
|
||||
foreach ($database->query('SELECT * FROM `pool` WHERE `sent` = 0 AND `expired` = 0')->fetchAll() as $pool) |
||||
{ |
||||
// Payment received, send to blockchain |
||||
if ($kevacoin->getReceivedByAddress($pool->address, $config->kevachat->post->pool->confirmations) >= $pool->cost) |
||||
{ |
||||
// Check physical wallet balance |
||||
if ($kevacoin->getBalance() <= $pool->getCost()) |
||||
{ |
||||
exit( |
||||
sprintf( |
||||
_('[%s] [error] Insufficient wallet funds!'), |
||||
date('c') |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Check namespace is valid |
||||
if (!isset($rooms[$pool->namespace])) |
||||
{ |
||||
print( |
||||
sprintf( |
||||
_('[%s] [warning] Could not found "%s" in room list!'), |
||||
date('c'), |
||||
$pool->namespace |
||||
) . PHP_EOL |
||||
); |
||||
|
||||
continue; |
||||
} |
||||
|
||||
// Send to blockchain |
||||
if ($txid = $kevacoin->kevaPut($pool->namespace, $pool->key, $pool->value)) |
||||
{ |
||||
// Update status |
||||
$database->query( |
||||
sprintf( |
||||
'UPDATE `pool` SET `sent` = %d WHERE `id` = %d LIMIT 1', |
||||
time(), |
||||
$pool->id |
||||
) |
||||
); |
||||
|
||||
print( |
||||
sprintf( |
||||
_('[%s] [notice] Record ID "%d" sent to blockchain with transaction ID "%s"'), |
||||
date('c'), |
||||
$pool->id, |
||||
$txid |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
else |
||||
{ |
||||
print( |
||||
sprintf( |
||||
_('[%s] [error] Could not send record ID "%d" to blockchain!'), |
||||
date('c'), |
||||
$pool->id, |
||||
$txid |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
} |
||||
|
||||
// Record expired |
||||
else if (time() >= $pool->time + $this->_config->kevachat->post->pool->timeout) |
||||
{ |
||||
// Update status |
||||
$database->query( |
||||
sprintf( |
||||
'UPDATE `pool` SET `expired` = %d WHERE `id` = %d LIMIT 1', |
||||
time(), |
||||
$pool->id |
||||
) |
||||
); |
||||
|
||||
print( |
||||
sprintf( |
||||
_('[%s] [notice] Record ID "%d" expired.'), |
||||
date('c'), |
||||
$pool->id, |
||||
$txid |
||||
) . PHP_EOL |
||||
); |
||||
} |
||||
|
||||
// Update counter |
||||
$total++; |
||||
} |
||||
|
||||
print( |
||||
sprintf( |
||||
_('[%s] [notice] Records processed: %d'), |
||||
date('c'), |
||||
$total |
||||
) . PHP_EOL |
||||
); |
Loading…
Reference in new issue