mirror of
https://git.eworm.de/cgit/routeros-scripts
synced 2025-07-31 16:24:25 +02:00
Merge branch 'telegram-topics' into next
This commit is contained in:
commit
78f9687558
6 changed files with 30 additions and 16 deletions
|
@ -58,6 +58,9 @@ Sending notifications to a group is possible as well. Add your bot and the
|
|||
*GetIDs Bot* to a group, then use the group's id (which starts with a dash)
|
||||
for `TelegramChatId`. Then remove *GetIDs Bot* from group.
|
||||
|
||||
Groups can enable the `Topics` feature. Use `TelegramThreadId` to send to a
|
||||
specific topic in a group.
|
||||
|
||||
Usage and invocation
|
||||
--------------------
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
:global TelegramChatId "";
|
||||
#:global TelegramTokenId "123456:ABCDEF-GHI";
|
||||
#:global TelegramChatId "12345678";
|
||||
# Use this to send notifications to a specific topic in group.
|
||||
:global TelegramThreadId "";
|
||||
# Using telegram-chat you have to define trusted chat ids (not group ids!)
|
||||
# or user names. Groups allow to chat with devices simultaneously.
|
||||
#:global TelegramChatIdsTrusted {
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
# Git commit id & info, expected configuration version
|
||||
:global CommitId "unknown";
|
||||
:global CommitInfo "unknown";
|
||||
:global ExpectedConfigVersion 133;
|
||||
:global ExpectedConfigVersion 134;
|
||||
|
||||
# global variables not to be changed by user
|
||||
:global GlobalFunctionsReady false;
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
|
||||
:global IsFullyConnected;
|
||||
:global LogPrint;
|
||||
:global UrlEncode;
|
||||
|
||||
:if ([ $IsFullyConnected ] = false) do={
|
||||
$LogPrint debug $0 ("System is not fully connected, not flushing.");
|
||||
|
@ -41,9 +40,7 @@
|
|||
:do {
|
||||
:local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \
|
||||
("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \
|
||||
http-data=("chat_id=" . ($Message->"chatid") . "&disable_notification=" . ($Message->"silent") . \
|
||||
"&reply_to_message_id=" . ($Message->"replyto") . "&disable_web_page_preview=true" . \
|
||||
"&parse_mode=MarkdownV2&text=" . [ $UrlEncode ($Message->"text") ]) as-value ]->"data");
|
||||
http-data=($Message->"http-data") as-value ]->"data");
|
||||
:set ($TelegramQueue->$Id);
|
||||
:set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1;
|
||||
} on-error={
|
||||
|
@ -71,6 +68,8 @@
|
|||
:global TelegramChatIdOverride;
|
||||
:global TelegramMessageIDs;
|
||||
:global TelegramQueue;
|
||||
:global TelegramThreadId;
|
||||
:global TelegramThreadIdOverride;
|
||||
:global TelegramTokenId;
|
||||
:global TelegramTokenIdOverride;
|
||||
|
||||
|
@ -111,6 +110,8 @@
|
|||
|
||||
:local ChatId [ $EitherOr ($Notification->"chatid") \
|
||||
[ $EitherOr ($TelegramChatIdOverride->($Notification->"origin")) $TelegramChatId ] ];
|
||||
:local ThreadId [ $EitherOr ($Notification->"threadid") \
|
||||
[ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) $TelegramThreadId ] ];
|
||||
:local TokenId [ $EitherOr ($TelegramTokenIdOverride->($Notification->"origin")) $TelegramTokenId ];
|
||||
|
||||
:if ([ :len $TokenId ] = 0 || [ :len $ChatId ] = 0) do={
|
||||
|
@ -145,6 +146,9 @@
|
|||
(($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%_!") "plain" "_" ]);
|
||||
}
|
||||
|
||||
:local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \
|
||||
"&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \
|
||||
"&disable_web_page_preview=true&parse_mode=MarkdownV2");
|
||||
:do {
|
||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||
|
@ -152,9 +156,7 @@
|
|||
}
|
||||
:local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \
|
||||
("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \
|
||||
http-data=("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \
|
||||
"&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \
|
||||
"&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data");
|
||||
http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) as-value ]->"data");
|
||||
:set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1;
|
||||
} on-error={
|
||||
$LogPrint info $0 ("Failed sending Telegram notification! Queuing...");
|
||||
|
@ -165,8 +167,8 @@
|
|||
:set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \
|
||||
[ $EscapeMD ("This message was queued since _" . [ /system/clock/get date ] . \
|
||||
" " . [ /system/clock/get time ] . "_ and may be obsolete.") "plain" "_" ]);
|
||||
:set ($TelegramQueue->[ :len $TelegramQueue ]) { chatid=$ChatId; tokenid=$TokenId;
|
||||
text=$Text; silent=($Notification->"silent"); replyto=($Notification->"replyto") };
|
||||
:set ($TelegramQueue->[ :len $TelegramQueue ]) { tokenid=$TokenId;
|
||||
http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) };
|
||||
:if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] = 0) do={
|
||||
/system/scheduler/add name="_FlushTelegramQueue" interval=1m start-time=startup \
|
||||
on-event=(":global FlushTelegramQueue; \$FlushTelegramQueue;");
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now.";
|
||||
132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically.";
|
||||
133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added.";
|
||||
134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups.";
|
||||
};
|
||||
|
||||
# Migration steps to be applied on script updates
|
||||
|
|
|
@ -97,13 +97,14 @@
|
|||
:foreach Update in=($JSON->"result") do={
|
||||
:set UpdateID ($Update->"update_id");
|
||||
:local Message ($Update->"message");
|
||||
:local IsReply [ :len ($Message->"reply_to_message") ];
|
||||
:local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string");
|
||||
: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={
|
||||
|
@ -115,7 +116,8 @@
|
|||
: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!") });
|
||||
:set Done true;
|
||||
|
@ -130,7 +132,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 || ($IsReply = false && \
|
||||
$TelegramChatActive = true)) && [ :len $Command ] > 0) do={
|
||||
:if ([ $ValidateSyntax $Command ] = true) do={
|
||||
:local State "";
|
||||
:local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]);
|
||||
|
@ -149,7 +152,8 @@
|
|||
: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 +162,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 +175,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={
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue