#!/usr/bin/php
$channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker(), "top_msg_id" => $topic));
} else {
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker()));
} // if ($topic!=-1) - else
break;
case "TOUSER": made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker(), "reply_to_msg_id" => $msgid));
break;
} // switch ($sendMsg[0])
} else {
switch ($sendMsg[0]) {
case "TOCHAN":
if ($topic!=-1) {
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker(), "parse_mode" => "html", "top_msg_id" => $topic));
} else {
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker(), "parse_mode" => "html"));
} // if ($topic!=-1) - else
break;
case "TOUSER": made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $sendMsg[1].generatebotmarker(), "reply_to_msg_id" => $msgid, "parse_mode" => "html"));
break;
} // switch ($sendMsg[0])
} // if (!html) - else
} //function end
function getLastMessages($channelInfoKey, $singletarget, $startup) {
global $lastMessagePerChan, $channelInfoNew, $globalsettings;
if ($startup) { // build last messages array and get last 100 messages at startup
$out=made("messages", "getPeerDialogs", array("peers" => array($channelInfoNew[$channelInfoKey]["peerid"])));
if (array_key_exists($channelInfoNew[$channelInfoKey]["peerid"], $lastMessagePerChan)) { // update $lastMessagePerChan when key exists
$lastMessagePerChan[$channelInfoNew[$channelInfoKey]["peerid"]]=$out['dialogs'][0]['top_message'];
} else $lastMessagePerChan+=array($channelInfoNew[$channelInfoKey]["peerid"] => $out['dialogs'][0]['top_message']);
$out=made("messages", "getHistory", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "limit" => 100));
return $out;
}
$allChannels=array_keys($lastMessagePerChan);
// $globalsettings["channels"]["channeldb"]=$allChannels; -- falsche stelle getdialog...
if ($singletarget == "1" ) {
unset($allChannels);
$allChannels[]=$channelInfoNew[$channelInfoKey]["peerid"]; // prevent dubletten
}
$getAllLastMsgID=made("messages", "getPeerDialogs", array("peers" => $allChannels));
foreach($getAllLastMsgID['dialogs'] as $dialog) {
/*
if (substr($dialog['peer'],0,4)!= "-100") {
print_r($dialog);
exit;
}
/* switch ($dialog['peer']['_']) {
case 'peerUser': $dialogid=$dialog['peer']['user_id']; $context="user";
break;
case 'peerChannel': $dialogid=$dialog['peer']['channel_id']; $context="chat";
break;
}
*/
$dialogid=substr($dialog['peer'],4); // chat context
if (substr($dialog['peer'],0,4)!= "-100") $dialogid=$dialog['peer']; // user context
$dialogtopmessage=$dialog['top_message'];
foreach(array_keys($channelInfoNew) as $k) {
if ($channelInfoNew[$k]["chanid"] == $dialogid ) {
$lastMessageCount=$lastMessagePerChan[$channelInfoNew[$k]["peerid"]];
if ($lastMessageCount != $dialogtopmessage) {
if ($channelInfoNew[$k]["status"] == "ok" ) {
if ($channelInfoNew[$k]["from_topic_id"] != -1) { $fromprint=$channelInfoNew[$k]["chanid"].":".$channelInfoNew[$k]["from_topic_id"]; } else $fromprint=$channelInfoNew[$k]["chanid"];
if ($channelInfoNew[$k]["mode"] == "r" ) { $printmode="readonly"; } else $printmode="interactiv";
switch ($channelInfoNew[$k]["mode"]) {
case "ir": $printmode="interactiv+request";
break;
case "i": $printmode="interactiv";
break;
case "r": $printmode="readonly";
break;
case "a": $printmode="admin";
break;
} // switch ($channelInfoNew[$k]["mode"])
logger("activity on channel: [".$channelInfoNew[$k]["name"]."] - mode: ".$printmode);
$limit=$dialogtopmessage-$lastMessageCount+5; // get only new messages + 5
if ($limit>100) $limit=100;
$lastMessagePerChan[$channelInfoNew[$k]["peerid"]]=$dialogtopmessage; // update lastMessagePerChan
$data=made("messages", "getHistory", array("peer" => $channelInfoNew[$k]["peerid"], "limit" => $limit));
} else $data=false; // if ($channelInfoNew[$k]["status"] == "ok" )
switch ($channelInfoNew[$k]["mode"]) {
case "ir": if ($data != false) { getAskTasks($data, $k); request($data, $k); }
break;
case "i": if ($data != false) getAskTasks($data, $k);
break;
case "r": if ($data != false) insertData(parseData($data), $k);
break;
case "a": if ($data != false) adminCommands($data, $startup);
break;
} // switch ($channelInfoNew[$k]["mode"])
} // if ($lastMessageCount != $dialogtopmessage)
} // if ($channelInfoNew[$k]["chanid"] == $dialogid )
} // foreach(array_keys($channelInfoNew) as $k)
} // foreach($getAllLastMsgID['dialogs'] as $dialog)
} // function end
function BotCommands($askMessage, $channelInfoKey, $msgid, $infoarray, $rerun=null) {
global $globalsettings, $channelInfoNew;
$askcommand="!".$channelInfoNew[$channelInfoKey]["channelbotname"]." ";
$askMessage=preg_replace("/[()]+/u", "", $askMessage); // remove brackets - [] more, when needed...
$askMessage=preg_replace("/^\s+|\s+$|\s+(?=\s)/u", "", $askMessage); // remove more than one space in follow
$splitMsg=explode(" ",$askMessage);
foreach ($globalsettings["bot"]["botcommands"] as $botcmd) {
if (strtolower($botcmd)==strtolower($splitMsg[1])) {
$cmd=strtolower($botcmd);
}
}
if (array_key_exists(2,$splitMsg)) {$secarg=$splitMsg[2];} else $secarg=false;
if (!isset($cmd)) {
$returnMsg[0]="TOUSER";
$returnMsg[1]=$splitMsg[1].", no valid bot command!";
return $returnMsg;
}
$grpid=$channelInfoNew[$channelInfoKey]["chanid"];
$fromChannel=$channelInfoNew[$channelInfoKey]["name"];
if (strlen($fromChannel) >= 20) $fromChannel=substr($fromChannel,0,20)."...";
logger("botcommand on [".$fromChannel."]: ".$askMessage);
switch (strtolower($cmd)) {
case "help":
$sendMsg=" avaible commands:
";
foreach ($globalsettings["bot"]["botcommands"] as $admincmd) $sendMsg.="- ".$askcommand.$admincmd."
";
if ($channelInfoNew[$channelInfoKey]["mode"] == "ir") $sendMsg.="
- ".$globalsettings["request"]["requestcommand"]."
";
$sendMsg.="
".$globalsettings["bot"]["version"]."
";
$returnMsg[0]="TOCHAN"; $returnMsg[1]=$sendMsg;
break;
case "search": $returnMsg=search($splitMsg, $askMessage, $grpid, $rerun);
break;
case "suche": $returnMsg=search($splitMsg, $askMessage, $grpid, $rerun);
break;
case "last5": $returnMsg=last($grpid,5,$channelInfoKey, $infoarray, $secarg);
break;
case "last10": $returnMsg=last($grpid,10,$channelInfoKey, $infoarray, $secarg);
break;
case "last20": $returnMsg=last($grpid,20,$channelInfoKey, $infoarray, $secarg);
break;
case "last30": $returnMsg=last($grpid,30,$channelInfoKey, $infoarray, $secarg);
break;
case "last50": $returnMsg=last($grpid,50,$channelInfoKey, $infoarray, $secarg);
break;
case "last100": $returnMsg=last($grpid,100,$channelInfoKey, $infoarray, $secarg);
break;
case "say": $returnMsg=askPaul();
break;
default: $returnMsg[0]="TOUSER"; $returnMsg[1]='no valid botcommand';
} //switch end
return $returnMsg;
} // function end
function getAskTasks($data, $channelInfoKey) {
global $globalsettings, $channelInfoNew;
$infoarray['mode']="generatebotmarker";
$infoarray['channelid']=-1;
$infoarray['channelname']=-1;
$infoarray['msgid']=-1;
$infoarray['msgdate']=-1;
$infoarray['message']=-1;
$infoarray['userid']=-1;
$infoarray['username']=-1;
$infoarray['topicid']=-1;
$infoarray['replyid']=-1;
$infoarray['bot']=-1;
$infoarray['channelInfoKey']=$channelInfoKey;
// parse for video data
if ($data!=false) if ($data != false) insertData(parseData($data), $channelInfoKey);
foreach($data['messages'] as $msg) {
if (array_key_exists('message', $msg)) {
$channelid=substr($data['chats'][0]['id'],4);
$channelname=preg_replace("/[^a-zA-Z0-9]+!/u", "",$data['chats'][0]['title']);
$msgid=$msg['id'];
$msgdate=$msg['date'];
$message=preg_replace("/[^a-zA-Z0-9]+!/u", "",$msg['message']);
$userdata=getUserData($msg, $data);
$userid=$userdata['user_id'];
$username=$userdata['username'];
$botuser=$userdata['bot'];
$topic_id=-1;
if (array_key_exists("reply_to", $msg)) {
if (array_key_exists("forum_topic", $msg["reply_to"])) {
$topic_id=$msg["reply_to"]["reply_to_msg_id"];
if (array_key_exists("reply_to_top_id",$msg["reply_to"])) $topic_id=$msg["reply_to"]["reply_to_top_id"];
} // if (array_key_exists("forum_topic", $msg["reply_to"))
} // if (array_key_exists("reply_to", $msg))
$infoarray['channelid']=$channelid;
$infoarray['channelname']=$channelname;
$infoarray['msgid']=$msgid;
$infoarray['msgdate']=$msgdate;
$infoarray['message']=$message;
$infoarray['topicid']=$topic_id;
$infoarray['userid']=$userid;
$infoarray['username']=$username;
$infoarray['bot']=$botuser;
getMessageMarker($infoarray);
forcedelete($infoarray);
$askcommand="!".$channelInfoNew[$channelInfoKey]["channelbotname"]." ";
if (strtolower(substr($msg['message'],0,strlen($askcommand))) == strtolower($askcommand)) {
$fromid=$userid;
$fromuser=$username;
$grpid=substr($data['chats'][0]['id'],4);
$grpname=preg_replace("/[^a-zA-Z0-9]+/", "",$data['chats'][0]['title']);
$msgid=$msg['id'];
$date=$msg['date'];
$message=preg_replace("/[^a-zA-Z0-9]+!/", "",$msg['message']);
// cleanup cacheAsks
$sql="delete from cacheasks where grpid=".$grpid." and msgid < (select max(msgid)-150 as msgid from cacheAsks where grpid=".$grpid.")";
pg_query($globalsettings["db"]["pg_conn"], $sql);
$sql="select msgid from cacheAsks where grpid=".$grpid." and msgid=".$msgid;
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
while ($row = pg_fetch_array($result)) {
$askid=$row['msgid'];
}
if (!isset($askid)) { // no entry in db
getlastbotcommands($infoarray);
$sql=sprintf("insert into cacheAsks values (%s,'%s',%s,%s,'%s',%s,'%s')\n", $grpid, pg_escape_string($globalsettings["db"]["pg_conn"], $grpname), $msgid, $fromid, pg_escape_string($globalsettings["db"]["pg_conn"], $fromuser), $date,pg_escape_string($globalsettings["db"]["pg_conn"], $message));
pg_query($globalsettings["db"]["pg_conn"], $sql);
$sql="insert into deletemessages (channelid, msgid, timestamp) values (".$infoarray['channelid'].",".$infoarray['msgid'].",".$infoarray['msgdate'].") on conflict do nothing;";
pg_query($globalsettings["db"]["pg_conn"], $sql);
$sendMsg=BotCommands($message, $grpid, $msgid, $infoarray);
if ($sendMsg!=-1) {
sendMessage($sendMsg, $grpid, $msgid, $topic_id);
if (array_key_exists('2', $sendMsg)) if ($sendMsg[2]=="SEARCHMAXRESULTS") sendMessage(BotCommands($message, $channelInfoKey, $msgid, $infoarray, $globalsettings["search"]["maxresults"]), $grpid, $msgid, $topic_id);
} // if ($sendMsg!=-1) (when botcommands send hes own message
} // if (!isset($askid)) // else echo "do nothing\n";
}
}
}
}
function initbot($startup) {
global $globalsettings, $channelInfoNew;
logger("startup phase");
$channelInfoNew=loadChannelConfig($startup);
copyChannelConfig($channelInfoNew);
$checkArray=array();
foreach(array_keys($channelInfoNew) as $k) {
switch ($channelInfoNew[$k]["mode"]) {
case "ir":
case "i":
case "r":
if ($channelInfoNew[$k]["from_topic_id"] != -1) { $fromprint=$channelInfoNew[$k]["chanid"].":".$channelInfoNew[$k]["from_topic_id"]; } else $fromprint=$channelInfoNew[$k]["chanid"];
if ($channelInfoNew[$k]["status"] == "nook" ) {
logger("ERR: processing channel: ".$channelInfoNew[$k]["info"]." - ".$fromprint." (".$channelInfoNew[$k]['name'].")");
} else {
logger("processing channel: ".$fromprint." (".$channelInfoNew[$k]['name'].")");
if (!asearch($channelInfoNew[$k]["peerid"], $checkArray)) { // do not read channel with from_topic_id twice or more
$checkArray[]=$channelInfoNew[$k]["peerid"];
$data=getLastMessages($k, "1", $startup);
if ($data != false) insertData(parseData($data), $k);
} // if (!asearch($channelInfo[$k]["peerid"], $checkArray) - do not read channel twice or more when from:topic is configured
} // if ($channelInfoNew[$k]["status"] == "nook" )
break;
case "a":
logger("processing: ".$k." (".$channelInfoNew[$k]['name'].")");
$sendMsg="pandabot startup (loading channels...)";
made("messages", "sendMessage", array("peer" => $globalsettings["bot"]["pandaownerid"], "message" => $sendMsg, "parse_mode" => "html"));
adminCommands(getLastMessages($k, "1", $startup), $startup);
break;
default:
} // switch ($channelInfoNew[$k]["mode"])
sleep(1);
} // foreach(array_keys($channelInfoNew) as $k)
// function sendmessageintochannel($channelInfoKey, $message, $topicid, $html=true) {
$date=date('m/d/Y H:i:s', time());
made("messages", "sendMessage", array("peer" => $globalsettings["bot"]["pandaownerid"], "message" => "done: ".$date."
use: help
", "parse_mode" => "html")); // murmel
logger("startup done");
} // function end
$startup=true; // first run detection
while (true) {
if ($startup == true) {
initbot($startup);
} // if ($startup==true) {
if ($startup!=true) {
sleep(5);
getLastMessages("-1", "-1", $startup);
jobs();
} // if ($startup!=true)
$startup=false;
} // while (true)