diff --git a/docu/docs/plugin/telegram.md b/docu/docs/plugin/telegram.md index 92319d2..bd82296 100644 --- a/docu/docs/plugin/telegram.md +++ b/docu/docs/plugin/telegram.md @@ -5,6 +5,8 @@ Mit diesem Plugin ist es moeglich, Telegram-Nachrichten für POCSAG-Alarmierungen zu senden. Außerdem werden Locations versendet, wenn die Felder `lat` und `lon` im Paket definiert sind. (beispielsweise durch das [Geocoding](../modul/geocoding.md) Modul) +Die abarbeitung der Alarmierungen erfolgt per Queue nach den Limits der Telegram API, damit keine Nachrichten verloren gehen, diese Funktion kann mit dem ```queue``` Parameter deaktiviert werden. + ## Unterstütze Alarmtypen - Fms - Pocsag @@ -24,6 +26,7 @@ Außerdem werden Locations versendet, wenn die Felder `lat` und `lon` im Paket d |message_pocsag|Format der Nachricht für Pocsag|`{RIC}({SRIC})\n{MSG}`| |message_zvei|Format der Nachricht für ZVEI|`{TONE}`| |message_msg|Format der Nachricht für MSG|| +|queue|Aktivieren/Deaktivieren der MessageQueue|true| **Beispiel:** ```yaml diff --git a/plugin/telegram.py b/plugin/telegram.py index 46018d9..9bc5ef1 100644 --- a/plugin/telegram.py +++ b/plugin/telegram.py @@ -20,12 +20,36 @@ from plugin.pluginBase import PluginBase # ###################### # # Custom plugin includes # from telegram.error import (TelegramError, Unauthorized, BadRequest, TimedOut, NetworkError) -import telegram +from telegram.ext import messagequeue as mq +from telegram.utils.request import Request +import telegram.bot # ###################### # logging.debug("- %s loaded", __name__) +class MQBot(telegram.bot.Bot): + '''A subclass of Bot which delegates send method handling to MQ''' + + def __init__(self, *args, is_queued_def=True, mqueue=None, **kwargs): + super(MQBot, self).__init__(*args, **kwargs) + # below 2 attributes should be provided for decorator usage + self._is_messages_queued_default = is_queued_def + self._msg_queue = mqueue or mq.MessageQueue() + + def __del__(self): + try: + self._msg_queue.stop() + except: + pass + + @mq.queuedmessage + def send_message(self, *args, **kwargs): + '''Wrapped method would accept new `queued` and `isgroup` + OPTIONAL arguments''' + return super(MQBot, self).send_message(*args, **kwargs) + + class BoswatchPlugin(PluginBase): """!Description of the Plugin""" @@ -35,7 +59,14 @@ class BoswatchPlugin(PluginBase): def onLoad(self): """!Called by import of the plugin""" - self.bot = telegram.Bot(token=self.config.get("botToken")) + if self.config.get("queue", default=True): + q = mq.MessageQueue() + request = Request(con_pool_size=8) + self.bot = MQBot(token=self.config.get("botToken", default=""), request=request, mqueue=q) + print('queue') + else: + self.bot = telegram.Bot(token=self.config.get("botToken")) + print('normal') def fms(self, bwPacket): """!Called on FMS alarm