) in made - switch, default... build array befor
if ($topicid!=-1) {
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $message, "top_msg_id" => $topicid, "parse_mode" => "html"));
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $message, "top_msg_id" => $topicid, "parse_mode" => "html"));
} else {
made("messages", "sendMessage", array("peer" => $channelInfoNew[$channelInfoKey]["peerid"], "message" => $message, "parse_mode" => "html"));
} // if ($topicid!=-1)
} // function end
function requestusage($channelInfoKey, $command, $mode="default") {
global $channelInfoNew, $globalsettings;
$usage="";
switch($mode) {
case "error":
$usage.="no valid (".$command.") ".$globalsettings["request"]["requestcommand"]."
command!
please delete ur ".$globalsettings["request"]["requestcommand"]." and try another stunt.
";
case "help":
$usage.="- ".$globalsettings["request"]["requestcommand"]."help
";
$usage.="- ".$globalsettings["request"]["requestcommand"]."list
";
$usage.="- ".$globalsettings["request"]["requestcommand"]."#resolve
".htmlspecialchars("
")."
";
if ($channelInfoNew[$channelInfoKey]["redirectout"] != -1) {
switch ($channelInfoNew[$channelInfoKey]["redirectout_mode"]) {
case "id":
$usage.="redirect mode:
";
$usage.="- ".$globalsettings["request"]["requestcommand"]."#getfile
".htmlspecialchars("")."
";
break;
} // switch ($channelInfoNew[$channelInfoKey]["redirectout_mode"])
} // if ($channelInfoNew[$channelInfoKey]["redirectout"] != -1)
break;
case "invalidrequest":
$usage.="no valid request: ".$command."
please delete ur ".$globalsettings["request"]["requestcommand"]." and try another stunt.
";
break;
case "alreadyondb":
case "replyonrequest":
case "fulfillednotcorrect":
case "resolve":
$usage.=$command."
";
break;
} // switch($mode)
$default="- ".$globalsettings["request"]["requestcommand"]."
<title> <year>
eg. ".$globalsettings["request"]["requestcommand"]."
Kung Fu Panda 4 2024
";
$usage.=$default;
$usage.=generatebotmarker();
return $usage;
} // function end
function listopenrequests($channelInfoKey, $topicid) {
global $globalsettings, $channelInfoNew;
$sql="select title, year, link from requests where channelid=".$channelInfoNew[$channelInfoKey]["chanid"]." and fulfills = -1 and deleted = -1";
// echo $sql."\n";
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
$numrows=pg_num_rows($result);
$output="open requests:
";
if ($numrows != 0) {
while ($row = pg_fetch_array($result)) {
$output.="".$row['title']." ".$row['year']."
: ➡️
";
} // while ($row = pg_fetch_array($result))
} else {
$output.="no open requests
";
}// if ($numrows != 0)
$output.=generatebotmarker();
sendmessageintochannel($channelInfoKey, $output, $topicid);
} // function end
function workonrequest($channelInfoKey, $message, $topicid, $username, $userid, $channelname, $channelid, $msgid, $infoarray) {
global $channelInfoNew, $globalsettings;
preg_match_all("/(.+?)\W?(\d{4})?$/mu", $message, $res);
$reqmsg="";
$year=$res[count($res)-1][0];
$title=$res[count($res)-2][0];
$title=preg_replace("/^".strtolower($globalsettings["request"]["requestcommand"])."/u", "", strtolower($title));
$title=preg_replace("/^\s+|\s+$|\s+(?=\s)/u", "", $title);
$title=strtolower($title);
$title=htmlspecialchars($title);
$reqmsg.="channelname: ".$channelname."
";
// $reqmsg.="channelid: ".$channelid."
"; // security reason
$reqmsg.="messageid: ".$msgid."
";
$reqmsg.="username: ".$username."
";
// $reqmsg.="userid: ".$userid."
"; // privacy reason
$link="https://t.me/c/".$channelid."/".$msgid;
// $reqmsg.="link: ".$link."
"; // security reason
$reqmsg.="request: ".$message."
";
$reqmsg.="title: ".$title."
";
$reqmsg.="year: ".$year."
";
if (explode(" ",$title)[0] == "#getfile" ) {
$getfile_msgid=explode(" ",$message)[2];
if (!ctype_digit($getfile_msgid)) {
sendmessageintochannel($channelInfoKey, "❌".$globalsettings["request"]["requestcommand"]." #getfile: invalid message id: ".$getfile_msgid."
".generatebotmarker(), $topicid);
return;
} // if (!ctype_digit($input))
redirect_getfile($channelInfoKey, $getfile_msgid, $topicid, $infoarray);
return;
} // if (explode(" ",$title)[0] == "#getfile" )
if(!preg_match("/^\d{4}$/u", $year)) {
sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, htmlspecialchars($message), "invalidrequest"), $topicid);
return;
} // if(!preg_match("/^\d{4}$/u", $year))
if (explode(" ",$title)[0] == "#resolve" ) {
resolve($channelInfoKey, $topicid, $title, $year, $infoarray);
return;
} // if (explode(" ",$title)[0] == "resolve" )
if (substr(explode(" ",$title)[0],0,1) == "#" ) {
sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, htmlspecialchars($message), "invalidrequest"), $topicid);
return;
} // if (substr(explode(" ",$title)[0],0) == "#" )
$sql="select channelid, msgid, link, fulfills, request, fulfillsmessage, fulfillslink from requests where channelid=".$channelid." and title='".pg_escape_string($globalsettings["db"]["pg_conn"], $title)."' and year=".$year;
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
while ($row = pg_fetch_array($result)) {
$reschannelid=$row['channelid'];
$resmsgid=$row['msgid'];
$reslink=$row['link'];
$fulfilled=$row['fulfills'];
$request=$row['request'];
$fulfillsmessage=$row['fulfillsmessage'];
$fulfillslink=$row['fulfillslink'];
} // while ($row = pg_fetch_array($result))
if (isset($reschannelid)) { // already in db
if ($fulfilled==1) { $fmarker="and fulfilled"; } else $fmarker=""; // auto search? when fulfilled==1
$alreadymsg="";
$alreadymsg.="❌".$title." ".$year." - already requested ".$fmarker."
";
$alreadymsg.="".$request."
";
$alreadymsg.="↪️
";
if ($fulfilled==1) { $alreadymsg.="".$fulfillsmessage."
↪️
"; }
sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, $alreadymsg, "alreadyondb"), $topicid);
return;
} // if (isset($reschannelid))
$sql="insert into requests (channelid,
channelname,
msgid,
userid,
username,
timestamp,
request,
title,
year,
link) values (".$channelid.",
'".pg_escape_string($globalsettings["db"]["pg_conn"], $channelname)."',
".$msgid.",
".$userid.",
'".pg_escape_string($globalsettings["db"]["pg_conn"], $username)."',
".time().",
'".pg_escape_string($globalsettings["db"]["pg_conn"], $message)."',
'".pg_escape_string($globalsettings["db"]["pg_conn"], $title)."',
".$year.",
'".pg_escape_string($globalsettings["db"]["pg_conn"], $link)."')";
pg_query($globalsettings["db"]["pg_conn"], $sql);
$reqmsg.="request saved
";
sendmessageintochannel($channelInfoKey, "📝request mode:
".$reqmsg.generatebotmarker(), $topicid);
} // function end
function deletemessages($infoarray) {
global $globalsettings;
if (substr($infoarray["channelid"],0,4) == "-100" ) {
print_r($infoarray);
exit;
}
if ($infoarray['userid'] == $globalsettings["bot"]["pandaownerid"] || $infoarray['bot'] == 1) {
$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);
} // if ($infoarray['userid'] == $pandaOwner)
} // function end
function deleteMarkedMessagesJob() {
global $globalsettings, $channelInfoNew;
logger("job: deleteMarkedMessages");
$deltime=time() - $globalsettings["message"]["deletemessagestimer"];
$sql="select channelid, msgid from deletemessages where timestamp < ".$deltime." order by channelid limit 50"; // delete only 50 message per run...
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
$numrows=pg_num_rows($result);
if ($numrows != 0) {
while ($row = pg_fetch_array($result)) {
$deletearray[$row['channelid']][]=$row['msgid'];
} // while ($row = pg_fetch_array($result))
foreach (array_keys($deletearray) as $deletemsgkey) {
made("channels", "deleteMessages", array("channel" => $channelInfoNew[$deletemsgkey]["peerid"], "id" => $deletearray[$deletemsgkey]));
foreach ($deletearray[$deletemsgkey] as $todelete) {
$sql="delete from deletemessages where channelid=".$deletemsgkey." and msgid=".$todelete;
pg_query($globalsettings["db"]["pg_conn"], $sql);
} // foreach ($deletearray[$deletemsgkey] as $todelete)
} // foreach (array_keys($deletearray) as $deletemsgkey)
} // if ($numrows != 0)
} // function end
function deleteRequestMessagesJob() {
global $globalsettings;
$deltime=time() - ($globalsettings["request"]["requestMessagesDeleteTimer"] * 86400);
$sql="update requests set deleted = 1 where timestamp < ".$deltime;
pg_query($globalsettings["db"]["pg_conn"], $sql);
} // function end
function checkfulfillmessage($infoarray) {
$linktest=preg_match_all("/(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/mu", $infoarray['message'], $res);
if (!$linktest) {
$message="";
$message="❌dear honored santa
";
$message.="please reply with link
";
$message.="
";
$message.="eg.
";
$message.="ur request are fulfilled:
";
$message.="https://t.me/c/1234/1234
";
sendmessageintochannel($infoarray['channelid'], requestusage($infoarray['channelInfoKey'], $message, "fulfillednotcorrect"), $infoarray['topicid']);
} else {
$message="";
$message="dear honored santa
";
$message.="found link on: ".$infoarray['msgid']."
";
sendmessageintochannel($infoarray['channelid'], requestusage($infoarray['channelInfoKey'], $message, "fulfillednotcorrect"), $infoarray['topicid']);
}
return false;
} // function end
function requestsolution($infoarray) {
global $globalsettings;
$sql="select msgid, title, year, link from requests where channelid=".$infoarray['channelid']." and msgid=".$infoarray['replyid']." and fulfills = -1";
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
$numrows=pg_num_rows($result);
if ($numrows != 0) {
while ($row = pg_fetch_array($result)) {
$requestfulfills['msgid']=$row['msgid'];
$requestfulfills['title']=$row['title'];
$requestfulfills['year']=$row['year'];
$requestfulfills['link']=$row['link'];
} // while ($row = pg_fetch_array($result))
} // if ($numrows != 0)
if (isset($requestfulfills)) {
// if (!checkfulfillmessage($infoarray)) return;
$link="https://t.me/c/".$infoarray['channelid']."/".$infoarray['msgid'];
$sql="update requests set fulfills=1,
fulfillsmsgid=".$infoarray['msgid'].",
fulfillsmessage='".pg_escape_string($globalsettings["db"]["pg_conn"], $infoarray['message'])."',
fulfillsuserid=".$infoarray['userid'].",
fulfillsusername='".pg_escape_string($globalsettings["db"]["pg_conn"], $infoarray['username'])."',
fulfillstimestamp=".time().",
fulfillslink='".pg_escape_string($globalsettings["db"]["pg_conn"], $link)."'
where channelid=".$infoarray['channelid']." and msgid=".$infoarray['replyid'];
pg_query($globalsettings["db"]["pg_conn"], $sql);
// clear up request message, when resolved over reply - non practicable ... ?!?
// time()+86400
$sql="insert into deletemessages (channelid, msgid, timestamp) values (".$infoarray['channelid'].",".$infoarray['replyid'].",".time().") on conflict do nothing;";
pg_query($globalsettings["db"]["pg_conn"], $sql);
$message="";
$message="request fulfilled
";
$message.="link: ".$requestfulfills['link']."
";
$message.="title: ".$requestfulfills['title']."
";
$message.="year: ".$requestfulfills['year']."
";
$message.="revolver: ".$infoarray['username']."
";
sendmessageintochannel($infoarray['channelid'], requestusage($infoarray['channelInfoKey'], $message, "replyonrequest"), $infoarray['topicid']);
} // if (isset($requestfulfills))
} // function end
function getMessageMarker($infoarray) {
global $globalsettings;
// print_r($infoarray);
switch ($infoarray['mode']) {
case "generatebotmarker": // check if userid == botowner...$infoarray['userid']
if (preg_match("/".generatebotmarker()."/u", $infoarray['message'])) deletemessages($infoarray);
break;
case "reply":
if ($infoarray['replyid'] != -1) {
requestsolution($infoarray);
}
break;
} // switch ($marker)
} // function end
function getreplyid($data, $infoarray) {
foreach($data['messages'] as $msg) {
if ($msg['id']==$infoarray['msgid'] ) {
if (array_key_exists('reply_to', $msg)) {
if (array_key_exists('reply_to_msg_id', $msg['reply_to'])) { // reply_to_top_id
if ($msg['reply_to']['forum_topic'] == 1 && (array_key_exists('reply_to_msg_id', $msg['reply_to']) && (array_key_exists('reply_to_top_id', $msg['reply_to']) && $msg['reply_to']['reply_to_msg_id'] != $msg['reply_to']['reply_to_top_id']))) {
return $msg['reply_to']['reply_to_msg_id'];
} // if ($msg['reply_to']['forum_topic'] == 1 && !array_key_exists('reply_to_top_id', $msg['reply_to'])) peu, peu
if ($msg['reply_to']['forum_topic'] == "") {
return $msg['reply_to']['reply_to_msg_id'];
} // if ($msg['reply_to']['forum_topic'] == "")
} // if (array_key_exists('reply_to_msg_id', $msg['reply_to']))
} // if (!array_key_exists('reply_to', $msg))
} // if ($msg['id']==$msgid )
} // foreach($data['messages'] as $msg)
return -1;
} // function end
function resolve($channelInfoKey, $topicid, $title, $year, $infoarray) {
global $channelInfoNew, $globalsettings;
$link="https://t.me/c/".$infoarray['channelid']."/".$infoarray['msgid'];
$title=str_replace("#resolve ", "", $title);
$out="resolve:
";
$out.="title: ".$title."
";
$out.="year: ".$year."
";
$out.="revolver: ".$infoarray['username']."
";
$sql="select channelid, msgid from requests where channelid=".$channelInfoNew[$channelInfoKey]["chanid"]." and title='".pg_escape_string($globalsettings["db"]["pg_conn"], $title)."' and year=".$year." and fulfills = -1 and deleted = -1";
$result=pg_query($globalsettings["db"]["pg_conn"], $sql);
$numrows=pg_num_rows($result);
if ($numrows != 0) {
while ($row = pg_fetch_array($result)) {
$channelid=$row["channelid"];
$msgid=$row["msgid"];
} // while ($row = pg_fetch_array($result))
$sql="update requests set fulfills=1,
fulfillsmsgid=".$infoarray['msgid'].",
fulfillsmessage='manualy resolved',
fulfillsuserid=".$infoarray['userid'].",
fulfillsusername='".pg_escape_string($globalsettings["db"]["pg_conn"], $infoarray['username'])."',
fulfillstimestamp=".time().",
fulfillslink='".pg_escape_string($globalsettings["db"]["pg_conn"], $link)."'
where channelid=".$infoarray['channelid']." and msgid=".$msgid;
pg_query($globalsettings["db"]["pg_conn"], $sql);
$out.="
request manualy solved by user
";
} else $out.="
❌no open request
"; // if ($numrows != 0)
sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, $out, "resolve") , $topicid);
} // function end
function clearupall($channelInfoKey,$topicid, $infoarray) {
global $channelInfoNew, $globalsettings;
$link="https://t.me/c/".$infoarray['channelid']."/".$infoarray['msgid']; // damn link! -> infoarray
$sql="update requests set fulfills=1,
fulfillsmsgid=".$infoarray['msgid'].",
fulfillsmessage='clear up list',
fulfillsuserid=".$infoarray['userid'].",
fulfillsusername='".pg_escape_string($globalsettings["db"]["pg_conn"], $infoarray['username'])."',
fulfillstimestamp=".time().",
fulfillslink='".pg_escape_string($globalsettings["db"]["pg_conn"], $link)."'
where fulfills = -1 and deleted = -1 and channelid=".$infoarray['channelid'];
$sql="delete from requests where fulfills = -1 and deleted = -1 and channelid=".$infoarray['channelid'];
pg_query($globalsettings["db"]["pg_conn"], $sql);
sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, "done", "resolve") , $topicid);
} // function end
function request($data, $channelInfoKey) {
global $channelInfoNew, $globalsettings;
// $infoarray['channelInfoKey']=$channelInfoKey; ??? channelid, channelname obsolete
$infoarray['mode']="reply";
$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;
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'];
$userfirstname=$userdata['first_name'];
$userlastname=$userdata['last_name'];
$botuser=$userdata['bot']; // gehen wir davon aus, dass wenn der user in einem channel posten kann, dann kann er auch löschen?!?
$topicid=-1; // backwards to get reply on request - reply (fulsfills)
if (array_key_exists("reply_to", $msg)) {
if (array_key_exists("forum_topic", $msg["reply_to"])) {
$topicid=$msg["reply_to"]["reply_to_msg_id"];
if (array_key_exists("reply_to_top_id",$msg["reply_to"])) $topicid=$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['userid']=$userid;
$infoarray['username']=$username;
$infoarray['topicid']=$topicid;
$infoarray['bot']=$botuser;
unset($getreplyid);
$getreplyid=getreplyid($data, $infoarray);
if (isset($getreplyid) && $getreplyid != -1) { $infoarray['replyid']=$getreplyid; } else { $infoarray['replyid']=-1; }
getMessageMarker($infoarray);
$messagefix=substr($msg['message'],0,strlen($globalsettings["request"]["requestcommand"])); // single !request command without options fixed over str like function str_contains()?
if (strlen(substr($msg['message'],0,strlen($globalsettings["request"]["requestcommand"])))+1 == strlen($globalsettings["request"]["requestcommand"])) $messagefix.=" "; // damn... linebreak direct after requestcommand, no check if more than one line... str_contains str_contains str_contains str_contains - take it!
if (strtolower($messagefix) == strtolower($globalsettings["request"]["requestcommand"])) { // regex ^ ?!?
if (cacheasks($infoarray) == 1 ) {
logger("request on channel: [".$channelInfoNew[$channelInfoKey]["name"]."] - request ".$msg['message'].": valid request command");
$requestmsg=explode(" ",$message);
if (count($requestmsg) == 1) { $command=$requestmsg[0]; } else $command=$requestmsg[1];
switch (count($requestmsg)) {
case 1: sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, $command, "help"), $topicid);
break;
case 2:
switch ($requestmsg[1]) {
case "help": sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, $command, "help"), $topicid);
break;
case "list": listopenrequests($channelInfoKey,$topicid);
break;
case "clearupall": clearupall($channelInfoKey,$topicid, $infoarray);
break;
default: sendmessageintochannel($channelInfoKey, requestusage($channelInfoKey, $command, "error"), $topicid);
} // switch ($requestmsg[1])
break;
default: workonrequest($channelInfoKey, $message, $topicid, $username, $userid, $channelname, $channelid, $msgid, $infoarray );
} // switch (count($requestmsg))
} // if (cacheasks() == 1 )
} // if (substr($msg['message'],0,strlen($globalsettings["request"]["requestcommand"])) == $globalsettings["request"]["requestcommand"])
} // if (array_key_exists('message', $msg))
} // foreach($data['messages'] as $msg)
} // function end
// these inc contains:
//
// request();
// cacheasks();
// sendmessageintochannel();
// requestusage();
// workonrequest();
// generatebotmarker();
// deletemessages();
// deleteMarkedMessagesJob();
// getMessageMarker();
// getreplyid();
// deleteRequestMessagesJob();
// checkfulfillmessage();
// listopenrequests();
// use $lastMessagePerChan array to remove old entry's from cacheaskstable... 150-200 messages... would be work fine. (attention, deleted messages...)
// job, cleanasktableJob(), once @ day or so... job settings...