Queer European MD passionate about IT
Browse Source

Send long text messages as files

Davte 4 years ago
parent
commit
7ad4f48de1
3 changed files with 53 additions and 3 deletions
  1. 1 1
      davtelepot/__init__.py
  2. 35 2
      davtelepot/bot.py
  3. 17 0
      davtelepot/messages.py

+ 1 - 1
davtelepot/__init__.py

@@ -11,7 +11,7 @@ __author__ = "Davide Testa"
 __email__ = "davide@davte.it"
 __credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
 __license__ = "GNU General Public License v3.0"
-__version__ = "2.5.22"
+__version__ = "2.6.0"
 __maintainer__ = "Davide Testa"
 __contact__ = "t.me/davte"
 

+ 35 - 2
davtelepot/bot.py

@@ -52,6 +52,7 @@ from aiohttp import web
 from .api import TelegramBot, TelegramError
 from .database import ObjectWithDatabase
 from .languages import MultiLanguageObject
+from .messages import davtelepot_messages
 from .utilities import (
     async_get, escape_html_chars, extract, get_secure_key,
     make_inline_query_answer, make_lines_of_buttons, remove_html_tags
@@ -82,6 +83,7 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
     _authorization_denied_message = None
     _unknown_command_message = None
     TELEGRAM_MESSAGES_MAX_LEN = 4096
+    _max_message_length = 3 * (TELEGRAM_MESSAGES_MAX_LEN - 100)
     _default_inline_query_answer = [
         dict(
             type='article',
@@ -120,6 +122,7 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
         TelegramBot.__init__(self, token)
         ObjectWithDatabase.__init__(self, database_url=database_url)
         MultiLanguageObject.__init__(self)
+        self.messages['davtelepot'] = davtelepot_messages
         self._path = None
         self.preliminary_tasks = []
         self.final_tasks = []
@@ -128,6 +131,7 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
         self._certificate = certificate
         self._max_connections = max_connections
         self._allowed_updates = allowed_updates
+        self._max_message_length = None
         self._session_token = get_secure_key(length=10)
         self._name = None
         self._telegram_id = None
@@ -399,6 +403,17 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
         """
         return self._allowed_updates or []
 
+    @property
+    def max_message_length(self) -> int:
+        return self._max_message_length or self.__class__._max_message_length
+
+    @classmethod
+    def set_class_max_message_length(cls, max_message_length: int):
+        cls._max_message_length = max_message_length
+
+    def set_max_message_length(self, max_message_length: int):
+        self._max_message_length = max_message_length
+
     @property
     def name(self):
         """Bot name."""
@@ -1178,6 +1193,8 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
             update = update['message']
         if chat_id is None and 'chat' in update:
             chat_id = self.get_chat_id(update)
+        if user_record is None:
+            user_record = self.db['users'].find_one(telegram_id=chat_id)
         if reply_to_update and 'message_id' in update:
             reply_to_message_id = update['message_id']
         if (
@@ -1195,13 +1212,29 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
             return
         parse_mode = str(parse_mode)
         if isinstance(text, dict):
-            if user_record is None:
-                user_record = self.db['users'].find_one(telegram_id=chat_id)
             text = self.get_message(
                 update=update,
                 user_record=user_record,
                 messages=text
             )
+        if len(text) > self.max_message_length:
+            message_file = io.StringIO(text)
+            message_file.name = self.get_message(
+                'davtelepot', 'long_message', 'file_name',
+                update=update,
+                user_record=user_record,
+            )
+            return await self.send_document(
+                chat_id=chat_id,
+                document=message_file,
+                caption=self.get_message(
+                    'davtelepot', 'long_message', 'caption',
+                    update=update,
+                    user_record=user_record,
+                ),
+                use_stored_file_id=False,
+                parse_mode='HTML'
+            )
         text_chunks = self.split_message_text(
             text=text,
             limit=self.__class__.TELEGRAM_MESSAGES_MAX_LEN - 100,

+ 17 - 0
davtelepot/messages.py

@@ -1,5 +1,22 @@
 """Default messages for bot functions."""
 
+davtelepot_messages = {
+    'long_message': {
+        'file_name': {
+            'en': "Long message.html",
+            'it': "Messaggio lungo.html",
+        },
+        'caption': {
+            'en': "<b>Long message</b>\n\n"
+                  "This message is too long to be sent as individual "
+                  "messages.",
+            'it': "<b>Messaggio lungo</b>\n\n"
+                  "Questo messaggio è troppo lungo per essere inviato come "
+                  "messaggi separati.",
+        }
+    }
+}
+
 default_admin_messages = {
     'cancel': {
         'button': {