aboutsummaryrefslogtreecommitdiffstats
path: root/telegram-chat.rsc
diff options
context:
space:
mode:
Diffstat (limited to 'telegram-chat.rsc')
-rw-r--r--telegram-chat.rsc49
1 files changed, 31 insertions, 18 deletions
diff --git a/telegram-chat.rsc b/telegram-chat.rsc
index 10952a6..7f7b7a7 100644
--- a/telegram-chat.rsc
+++ b/telegram-chat.rsc
@@ -9,11 +9,11 @@
# use Telegram to chat with your Router and send commands
# https://rsc.eworm.de/doc/telegram-chat.md
-:global GlobalFunctionsReady;
-:while ($GlobalFunctionsReady != true) do={ :delay 500ms; }
-
:local ExitOK false;
-:do {
+:onerror Err {
+ :global GlobalConfigReady; :global GlobalFunctionsReady;
+ :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \
+ do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50;
:local ScriptName [ :jobname ];
:global Identity;
@@ -30,9 +30,11 @@
:global CertificateAvailable;
:global EitherOr;
:global EscapeForRegEx;
+ :global FileExists;
:global GetRandom20CharAlNum;
:global IfThenElse;
:global LogPrint;
+ :global LogPrintVerbose;
:global MAX;
:global MIN;
:global MkDir;
@@ -70,14 +72,14 @@
:local Data false;
:for I from=1 to=4 do={
:if ($Data = false) do={
- :do {
+ :onerror Err {
:set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=" . \
$TelegramChatOffset->0 . "&allowed_updates=%5B%22message%22%5D") as-value ]->"data");
:set TelegramRandomDelay [ $MAX 0 ($TelegramRandomDelay - 1) ];
- } on-error={
+ } do={
:if ($I < 4) do={
- $LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try.");
+ $LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try: " . $Err);
:set TelegramRandomDelay [ $MIN 15 ($TelegramRandomDelay + 5) ];
:delay (($I * $I) . "s");
}
@@ -96,17 +98,22 @@
:local Uptime [ /system/resource/get uptime ];
:foreach Update in=($JSON->"result") do={
:set UpdateID ($Update->"update_id");
+ $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]);
+
:local Message ($Update->"message");
- :local IsReply [ :len ($Message->"reply_to_message") ];
+ :local IsAnyReply ([ :typeof ($Message->"reply_to_message") ] = "array");
:local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]);
:if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={
:local Trusted false;
:local Chat ($Message->"chat");
:local From ($Message->"from");
:local Command ($Message->"text");
+ :local ThreadId [ $IfThenElse ($Message->"is_topic_message") ($Message->"message_thread_id") "" ];
:foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={
- :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={
+ :if ($From->"id" = $IdsTrusted || \
+ $From->"username" = $IdsTrusted || \
+ $Chat->"id" = $IdsTrusted) do={
:set Trusted true;
}
}
@@ -115,9 +122,11 @@
:local Done false;
:if ($Command = "?") do={
$LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . ".");
- $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \
+ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \
+ replyto=($Message->"message_id"); threadid=$ThreadId; \
subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \
- message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") });
+ message=([ $IfThenElse ([ :len ($From->"first_name") ] > 0) ("Hello " . ($From->"first_name") . "!\n\n") ] . \
+ "Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") });
:set Done true;
}
:if ($Done = false && [ :pick $Command 0 1 ] = "!") do={
@@ -130,7 +139,8 @@
" from update " . $UpdateID . "!");
:set Done true;
}
- :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len $Command ] > 0) do={
+ :if ($Done = false && ($IsMyReply = 1 || ($IsAnyReply = false && \
+ $TelegramChatActive = true)) && [ :len $Command ] > 0) do={
:if ([ $ValidateSyntax $Command ] = true) do={
:local State "";
:local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]);
@@ -145,11 +155,12 @@
:if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={
:set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n");
}
- :if ([ :len [ /file/find where name=($File . ".failed") ] ] > 0) do={
+ :if ([ $FileExists ($File . ".failed") ] = true) do={
:set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n");
}
:local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data");
- $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \
+ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \
+ replyto=($Message->"message_id"); threadid=$ThreadId; \
subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \
message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \
$State . [ $IfThenElse ([ :len $Content ] > 0) \
@@ -158,7 +169,8 @@
$RmDir "tmpfs/telegram-chat";
} else={
$LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!");
- $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \
+ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \
+ replyto=($Message->"message_id"); threadid=$ThreadId; \
subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \
message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \
[ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") });
@@ -170,7 +182,8 @@
" (ID " . $From->"id" . ") in update " . $UpdateID . "!");
:if ($Command ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={
$LogPrint warning $ScriptName $MessageText;
- $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \
+ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \
+ replyto=($Message->"message_id"); threadid=$ThreadId; \
subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \
message=("You are not trusted.") });
} else={
@@ -183,6 +196,6 @@
}
:set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \
[ $IfThenElse ($UpdateID >= $TelegramChatOffset->2) ($UpdateID + 1) ($TelegramChatOffset->2) ]);
-} on-error={
- :global ExitError; $ExitError $ExitOK [ :jobname ];
+} do={
+ :global ExitError; $ExitError $ExitOK [ :jobname ] $Err;
}