You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
5.0 KiB
130 lines
5.0 KiB
<?php |
|
$supress_master = 1; |
|
|
|
define('TGAPI_URL', 'https://api.telegram.org/bot' . $config['push']['telegram']['api_key']); |
|
|
|
// Telegram Bot API webhook requests subnets |
|
$tgAllowedSubnets = array("149.154.160.0/20", "91.108.4.0/22"); |
|
|
|
/** |
|
* Checks if a given IP address matches the specified CIDR subnet/s |
|
* |
|
* @param string $ip The IP address to check |
|
* @param mixed $cidrs The IP subnet (string) or subnets (array) in CIDR notation |
|
* @param string $match optional If provided, will contain the first matched IP subnet |
|
* @return boolean TRUE if the IP matches a given subnet or FALSE if it does not |
|
*/ |
|
function ipMatch($ip, $cidrs, &$match = null) { |
|
foreach((array) $cidrs as $cidr) { |
|
list($subnet, $mask) = explode('/', $cidr); |
|
if(((ip2long($ip) & ($mask = ~ ((1 << (32 - $mask)) - 1))) == (ip2long($subnet) & $mask))) { |
|
$match = $cidr; |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
if(!ipMatch($_SERVER['REMOTE_ADDR'], $tgAllowedSubnets)) { |
|
die('IP Address not allowed.'); |
|
} |
|
|
|
if($_SERVER['REQUEST_METHOD'] != 'POST') { |
|
die('Request method not allowed.'); |
|
} |
|
|
|
$content = file_get_contents("php://input"); |
|
$update = json_decode($content, true); |
|
$chatID = $update["message"]["chat"]["id"]; |
|
$message = $update["message"]["text"]; |
|
|
|
$prepareResponse = function ($message) use ($chatID, $api, $bitcoin, $block, $setting, $statistics, $transaction, $user, $worker, $mysqli){ |
|
// Get userID in MPOS by chatID |
|
$stmt = $mysqli->prepare("SELECT account_id as user_id FROM user_settings WHERE value LIKE '%".$chatID."%' LIMIT 1"); |
|
if($stmt && $stmt->execute() && $result = $stmt->get_result()) |
|
$row = $result->fetch_object(); |
|
$user_id = (!empty($row->user_id)) ? $row->user_id : 0; |
|
if ( ! $interval = $setting->getValue('statistics_ajax_data_interval')) $interval = 300; |
|
|
|
$response = ''; |
|
|
|
switch($message){ |
|
case "/start": |
|
$response = "Hi there! I'm ".($setting->getValue('website_title')?:"PHP-MPOS")." notifications bot.".PHP_EOL."Type /help to see all commands!"; |
|
break; |
|
case "/help": |
|
$response = "/api - Get API state of pool frontend".PHP_EOL."/getid - Show your id, required for pool notifications".PHP_EOL."/help - Print this text".PHP_EOL.PHP_EOL. |
|
"*Commands for registered users:*".PHP_EOL."/hashrate - Show your hashrate".PHP_EOL."/status - Show information about network and pool".PHP_EOL."/workers - Show information about your workers"; |
|
break; |
|
case "/api": |
|
$response = "API state: ".($api->isActive()?"enabled":"disabled"); |
|
break; |
|
case "/getid": |
|
$response = "Your ID is ".$chatID.PHP_EOL."Use that ID on pool notifications settings page."; |
|
break; |
|
// That is example of command, which will send information to user about his workers. |
|
case "/hashrate": |
|
if($user_id){ |
|
$username = $user->getUsername($user_id); |
|
$stats = $statistics->getUserMiningStats($username, $user_id, $interval); |
|
$response = sprintf("Your workers hashrate is %.4f KH/s", $stats['hashrate']); |
|
} |
|
break; |
|
case "/status": |
|
if($user_id){ |
|
$poolHashrate = $statistics->getCurrentHashrate(); |
|
$poolWorkers = $worker->getCountAllActiveWorkers(); |
|
$poolLastBlock = $block->getLast(); |
|
|
|
$now = new DateTime( "now" ); |
|
if (!empty($poolLastBlock)) { |
|
$poolTimeSinceLast = ($now->getTimestamp() - $poolLastBlock['time']); |
|
} else { |
|
$poolTimeSinceLast = 0; |
|
} |
|
|
|
if ($bitcoin->can_connect() === true){ |
|
$netDiff = $bitcoin->getdifficulty(); |
|
$netBlock = $bitcoin->getblockcount(); |
|
$netHashrate = $bitcoin->getnetworkhashps(); |
|
} else { |
|
$netDiff = 0; |
|
$netBlock = unknown; |
|
$netHashrate = 0; |
|
} |
|
|
|
$response = sprintf("*Network*\nBlock: %s\nDiff: %.4f\nHashrate: %.4f MH/s\n\n*Pool*\nHashrate: %.4f MH/s\nWorkers: %d\nLast found block: %d\nTime since block: %d min", |
|
$netBlock, $netDiff, $netHashrate/1000000, $poolHashrate/1000, $poolWorkers, $poolLastBlock['height'], $poolTimeSinceLast/60); |
|
} |
|
break; |
|
case "/workers": |
|
if($user_id){ |
|
$workers = $worker->getWorkers($user_id, $interval); |
|
foreach ($workers as $worker) |
|
$response .= sprintf("*Username: %s*\nShares: %.4f\nHashrate: %.4f\nDifficulty: %.4f\n\n", $worker['username'], $worker['shares'], $worker['hashrate'], $worker['difficulty']); |
|
} |
|
break; |
|
default: |
|
$response = "mumble-mumble..."; |
|
break; |
|
} |
|
return $response; |
|
}; |
|
|
|
function sendMessage($chatID, $reply){ |
|
curl_setopt_array($ch = curl_init(), array( |
|
CURLOPT_URL => TGAPI_URL . "/sendMessage", |
|
CURLOPT_POST => true, |
|
CURLOPT_RETURNTRANSFER => true, |
|
CURLOPT_POSTFIELDS => http_build_query($data = array( |
|
"chat_id" => $chatID, |
|
"text" => $reply, |
|
"parse_mode" => "Markdown", |
|
)), |
|
)); |
|
curl_exec($ch); |
|
curl_close($ch); |
|
} |
|
|
|
$reply = $prepareResponse($message); |
|
sendMessage($chatID, $reply);
|
|
|