419 lines
13 KiB
PHP
419 lines
13 KiB
PHP
<?php
|
|
/*
|
|
* Codice beta v0.99 del GOLEMbot - 24 set 2017
|
|
*
|
|
* Opera by giomba e giuliof rilasciata sotto licenza GPLv3
|
|
*
|
|
*/
|
|
|
|
|
|
// male, dovrebbero adeguarsi al sistema internazionale
|
|
require_once('config.php');
|
|
require_once('shared.php');
|
|
|
|
|
|
// === BEGIN ===
|
|
|
|
if (DEBUG) botlog("\n\n\n".'[II] BOT request starting at ' . date('Y-m-d H:i:s') . ' ====================' . "\n\n");
|
|
|
|
$json = file_get_contents('php://input');
|
|
$row = json_decode($json);
|
|
|
|
if (DEBUG) botlog("[LOG] ".$json."\n");
|
|
|
|
// Start up Memcached
|
|
$mc = new Memcached();
|
|
$mc->addServer('localhost', MEMCACHED_PORT)
|
|
or error("Something is wrong connecting to memcached daemon");
|
|
|
|
// Accept only messages from a private chat
|
|
if (isset($row->message->chat->type) and $row->message->chat->type != "private") {
|
|
if (DEBUG) warning("Message from ".$row->message->chat->type);
|
|
die();
|
|
}
|
|
// HANDLE A CALLBACK
|
|
elseif (isset ($row->callback_query)) {
|
|
$chatID = $row->callback_query->message->chat->id;
|
|
|
|
// Check if it was thrown by admitted users
|
|
in_array($row->callback_query->message->chat->username, BOT_ALLOWED_USERS) or not_authorized($chatID);
|
|
|
|
// Answer to the callback query (remove the loading sign)
|
|
if (DEBUG) info("Callback Query, answering");
|
|
$url = API_URL.API_TOKEN."/answerCallbackQuery?callback_query_id=".$row->callback_query->id;
|
|
file_get_contents($url);
|
|
|
|
// Do something - insert here useful variables
|
|
$callback_data = $row->callback_query->data;
|
|
//$callback_id = $row->callback_query->id;
|
|
|
|
$inlineID = $row->callback_query->message->message_id;
|
|
$inlineID_old = $mc->get($chatID.MC_INLINE_ID);
|
|
|
|
// check if request comes from active inline item
|
|
if ($inlineID != $inlineID_old) { // expired session
|
|
// If called callback comes from an old inline item do not answer
|
|
if (DEBUG) warning("That's an old callback!");
|
|
die();
|
|
}
|
|
}
|
|
// HANDLE A COMMON MESSAGE (text/commands/keyboard)
|
|
else {
|
|
// Load variables
|
|
$chatID = $row->message->chat->id;
|
|
|
|
|
|
// Check if it was thrown by admitted users
|
|
in_array($row->message->from->username, BOT_ALLOWED_USERS) or not_authorized($chatID);
|
|
|
|
|
|
}
|
|
|
|
// Finally, check actual state and do things
|
|
$status = $mc->get($chatID.MC_STATUS) or $mc->set($chatID.MC_STATUS, STATE_IDLE) or die(); // set status or force it to STATE_IDLE
|
|
if (DEBUG) info("Starting from status $status");
|
|
|
|
// ricordati di schiantare quando ricevi un messaggio invece di una callback
|
|
|
|
switch ($status) {
|
|
case STATE_IDLE:
|
|
// In this state are not accepted callback requests
|
|
if (isset($callback_data)) {
|
|
if (DEBUG) warning("Callback request is not accepted in status $status");
|
|
die();
|
|
}
|
|
|
|
// Search for a command
|
|
if (($command = getCommand($row->message)) != -1) {
|
|
info("Command received: $command[command] with options $command[options]");
|
|
|
|
switch ($command['command']) {
|
|
case '/help':
|
|
$resp = array("remove_keyboard" => true);
|
|
$resp = json_encode($resp);
|
|
|
|
$query = API_URL . API_TOKEN . '/sendmessage?' .
|
|
'chat_id=' . urlencode($chatID) .
|
|
'&text='.urlencode($WELCOME_MESSAGE).
|
|
'&reply_markup='.$resp;
|
|
file_get_contents($query);
|
|
break;
|
|
|
|
case '/list':
|
|
$dateID = date('Y-n-j G:*');
|
|
|
|
$sql = new mysqli('localhost', MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
|
|
$query = $sql->query("SELECT DateTime FROM ".MYSQL_TABLE." WHERE DateTime>='$dateID'
|
|
ORDER BY DateTime ASC LIMIT 10") or error("Can't make the query, SQL error ".$sql->error);
|
|
|
|
$text = "Prossimi 10 messaggi programmati";
|
|
$i = 1;
|
|
while ($row = $query->fetch_assoc()) {
|
|
$text .= "\n".$i." - ". $row['DateTime'];
|
|
$i++;
|
|
}
|
|
$sql->close();
|
|
|
|
$query = API_URL.API_TOKEN."/sendmessage?chat_id=".($chatID).
|
|
"&text=".urlencode($text).
|
|
"&reply_markup=".$reply;
|
|
$answer = file_get_contents($query);
|
|
break;
|
|
|
|
default:
|
|
if (DEBUG) warning("$command[command] is not a valid command");
|
|
}
|
|
}
|
|
else { // not a command (pure text)
|
|
// you probably want to forward a message?
|
|
$mc->set($chatID.MC_FORWARD_MSG, $row)
|
|
or $mc->replace($chatID.MC_FORWARD_MSG, $row)
|
|
or error("Something is wrong with memcached");
|
|
|
|
// SetUp inline messages (OK, NO, SCHEDULE)
|
|
$container[] = array(
|
|
array(
|
|
"text" => "SI ".$EMOJI_THUMBSUP,
|
|
"callback_data" => MSG_YES
|
|
),
|
|
array(
|
|
"text" => "NO ".$EMOJI_THUMBSDOWN,
|
|
"callback_data" => MSG_NO
|
|
),
|
|
array(
|
|
"text" => "Programma ".$EMOJI_CLOCK,
|
|
"callback_data" => MSG_SCHEDULE
|
|
));
|
|
$resp = array(
|
|
"inline_keyboard" => $container);
|
|
$reply = json_encode($resp);
|
|
|
|
$text="Vuoi condividere sul canale?"; // NOME CANALE ".API_CHANNEL_ID."?";
|
|
|
|
$query = API_URL.API_TOKEN."/sendmessage?chat_id=".($row->message->chat->id).
|
|
"&text=".urlencode($text).
|
|
"&reply_markup=".$reply;
|
|
$answer = file_get_contents($query);
|
|
//if (DEBUG) botlog("\nINLINE ANSWER\n\n".$answer);
|
|
$answer = json_decode($answer);
|
|
|
|
$inlineID = $answer->result->message_id;
|
|
if (DEBUG) info("Callback message id: $inlineID");
|
|
|
|
$mc->replace($chatID.MC_STATUS, STATE_MSG_ANSWER);
|
|
$mc->set($chatID.MC_INLINE_ID, $inlineID) or $mc->replace($chatID.MC_INLINE_ID, $inlineID);
|
|
}
|
|
break;
|
|
|
|
|
|
case STATE_MSG_ANSWER: // only accessible by callback
|
|
if (!(isset($callback_data))) {
|
|
//$mc->replace($chatID.MC_STATUS, STATE_IDLE);
|
|
wrong_action($chatID);
|
|
die();
|
|
}
|
|
|
|
switch ($callback_data) {
|
|
case MSG_YES:
|
|
// forward previously sent message
|
|
$mc->replace($chatID.MC_STATUS, STATE_IDLE)
|
|
or error("Something is wrong with memcached");
|
|
$msg = $mc->get($chatID.MC_FORWARD_MSG)
|
|
or error("Can't forward message\n");
|
|
|
|
$query = API_URL . API_TOKEN . '/forwardMessage?' .
|
|
'chat_id=' . urlencode(API_CHANNEL_ID) .
|
|
'&from_chat_id=' . urlencode($msg->message->chat->id) .
|
|
'&message_id=' . urlencode($msg->message->message_id);
|
|
file_get_contents($query);
|
|
|
|
// Remove kbd
|
|
$text = "Invio effettuato correttamente";
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text);
|
|
file_get_contents($url);
|
|
break;
|
|
|
|
case MSG_NO:
|
|
$status = $mc->replace($chatID.MC_STATUS, STATE_IDLE)
|
|
or error("Something is wrong with memcached");
|
|
|
|
// destroy saved message?
|
|
$text = "Invio annullato correttamente";
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text);
|
|
file_get_contents($url);
|
|
break;
|
|
|
|
case MSG_SCHEDULE:
|
|
// == from here can be put in a function ==
|
|
$status = $mc->replace($chatID.MC_STATUS, STATE_WAIT_DATE) or die();
|
|
$currentTab = array(
|
|
'month' => date('n'),
|
|
'year' => date('Y'),
|
|
'day' => null
|
|
);
|
|
|
|
$container = getCalendarTab($currentTab['month'], $currentTab['year']);
|
|
|
|
$mc->set($chatID.MC_DATE_MSG, $currentTab) or $mc->replace($chatID.MC_DATE_MSG, $currentTab) or die ();
|
|
|
|
$container = array(
|
|
"inline_keyboard" => $container);
|
|
|
|
$text="Quando vuoi inviare il messaggio?";
|
|
$reply = json_encode($container);
|
|
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text).
|
|
"&reply_markup=".$reply;
|
|
|
|
file_get_contents($url);
|
|
|
|
$mc->set($chatID.MC_INLINE_ID, $inlineID) or $mc->replace($chatID.MC_INLINE_ID, $inlineID)
|
|
or error("Something is wrong with memcached");
|
|
// == end ==
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case STATE_WAIT_DATE:
|
|
if (!isset($callback_data)) {
|
|
wrong_action($chatID);
|
|
die();
|
|
}
|
|
|
|
$currentTab = $mc->get($chatID.MC_DATE_MSG)
|
|
or error("Something is wrong with memcached");
|
|
|
|
// two cases: change page or confirm date
|
|
if ($callback_data == '>') {
|
|
// add 1 to month
|
|
if ($currentTab['month'] < 12)
|
|
$currentTab['month'] +=1;
|
|
else {
|
|
$currentTab['month'] = 1;
|
|
$currentTab['year'] +=1;
|
|
}
|
|
$mc->set($chatID.MC_DATE_MSG, $currentTab) or $mc->replace($chatID.MC_DATE_MSG, $currentTab)
|
|
or error("Something is wrong with memcached");
|
|
|
|
$text = "Il calendario del ".$currentTab['month']."-".$currentTab['year'];
|
|
|
|
// get new inline container
|
|
}
|
|
elseif ($callback_data == '<') {
|
|
if ($currentTab['month'] > 1)
|
|
$currentTab['month'] -=1;
|
|
else {
|
|
$currentTab['month'] = 12;
|
|
$currentTab['year'] -=1;
|
|
}
|
|
$text = "Il calendario del ".$currentTab['month']."-".$currentTab['year'];
|
|
|
|
$mc->set($chatID.MC_DATE_MSG, $currentTab) or $mc->replace($chatID.MC_DATE_MSG, $currentTab)
|
|
or error("Something is wrong with memcached");
|
|
}
|
|
elseif ($callback_data == 'null') {
|
|
// not a valid button (like week days buttons)
|
|
die();
|
|
}
|
|
elseif ($callback_data == MSG_ABORT) {
|
|
$text = "Invio annullato correttamente";
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text);
|
|
file_get_contents($url);
|
|
$mc->replace($chatID.MC_STATUS, STATE_IDLE) or die();
|
|
die();
|
|
}
|
|
else {
|
|
// read current day, verify it and then change state
|
|
if (!$callback_data = intval($callback_data))
|
|
error("Not a numerical day, how you did it?!?");
|
|
$currentTab['day'] = $callback_data;
|
|
$mc->set($chatID.MC_DATE_MSG, $currentTab) or $mc->replace($chatID.MC_DATE_MSG, $currentTab) or die ("Failed to save data at Memcached server");
|
|
|
|
// Display time inline keyboard
|
|
$container = array();
|
|
$riga = array();
|
|
|
|
$firstHour = date('Ynj') == $currentTab['year'].$currentTab['month'].$currentTab['day']?
|
|
date('G')+1 : 8;
|
|
|
|
for ($i = 8; $i <= 21; $i++) {
|
|
if ($i < $firstHour) {
|
|
$riga[] = array(
|
|
"text" => " ",
|
|
"callback_data" => "null"
|
|
);
|
|
}
|
|
else {
|
|
$riga[] = array(
|
|
"text" => "$i".":00",
|
|
"callback_data" => "$i"
|
|
);
|
|
}
|
|
|
|
if ($i == 14) {
|
|
$container[] = $riga;
|
|
$riga = array();
|
|
}
|
|
}
|
|
$container[] = $riga;
|
|
|
|
$container[] = array(array(
|
|
"text" => "$EMOJI_X Annulla",
|
|
"callback_data" => MSG_ABORT
|
|
));
|
|
|
|
$container = array(
|
|
"inline_keyboard" => $container);
|
|
|
|
$text="A che ora vuoi inviare il messaggio?";
|
|
$reply = json_encode($container);
|
|
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text)."&reply_markup=".$reply;
|
|
file_get_contents($url);
|
|
|
|
$mc->replace($chatID.MC_STATUS, STATE_WAIT_TIME) or die();
|
|
break;
|
|
}
|
|
|
|
// If answer is < or > remain in current state and update calendar
|
|
$container = getCalendarTab($currentTab['month'], $currentTab['year']);
|
|
|
|
$resp = array(
|
|
"inline_keyboard" => $container);
|
|
|
|
$reply = json_encode($resp);
|
|
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text)."&reply_markup=".$reply;
|
|
file_get_contents($url);
|
|
|
|
$mc->set($chatID.MC_INLINE_ID, $inlineID) or $mc->replace($chatID.MC_INLINE_ID, $inlineID);
|
|
|
|
break;
|
|
|
|
case STATE_WAIT_TIME:
|
|
$mc->replace($chatID.MC_STATUS, STATE_IDLE);
|
|
if (!isset($callback_data)) {
|
|
die();
|
|
}
|
|
|
|
if ($callback_data == MSG_ABORT) {
|
|
$text = "Invio annullato correttamente";
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text);
|
|
file_get_contents($url);
|
|
$mc->replace($chatID.MC_STATUS, STATE_IDLE) or die();
|
|
die();
|
|
}
|
|
elseif (!$time = intval($callback_data)) {
|
|
if (DEBUG) botlog("[EE] Not a numeric time\n");
|
|
die();
|
|
}
|
|
|
|
$currentTab = $mc->get($chatID.MC_DATE_MSG);
|
|
$msg = $mc->get($chatID.MC_FORWARD_MSG);
|
|
|
|
// add to database (mysql)
|
|
|
|
// Build up mysql query
|
|
$value = "(";
|
|
$value .= $msg->message->message_id;
|
|
$value .= ",";
|
|
$value .= $msg->message->chat->id;
|
|
$value .= ",";
|
|
$value .= "'".$currentTab['year'].'-';
|
|
$value .= $currentTab['month'].'-';
|
|
$value .= $currentTab['day'].' ';
|
|
$value .= $callback_data.":00:00'";
|
|
$value .= ");";
|
|
|
|
info("Saving post in ".MYSQL_TABLE.", scheduled date: ".$value);
|
|
|
|
$sql = new mysqli('localhost', MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
|
|
$query = $sql->query("INSERT INTO ".MYSQL_TABLE." (MessageID,ChatID,DateTime) VALUE ".$value);
|
|
$sql->close();
|
|
|
|
$text = "Programmazione avvenuta con successo";
|
|
|
|
$url = API_URL.API_TOKEN."/editMessageText?chat_id=".($chatID).
|
|
"&message_id=".$inlineID .
|
|
"&text=".urlencode($text);
|
|
file_get_contents($url);
|
|
|
|
break;
|
|
}
|
|
|
|
?>
|