diff --git a/davtelepot/__init__.py b/davtelepot/__init__.py index fd511fd..4565090 100644 --- a/davtelepot/__init__.py +++ b/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" diff --git a/davtelepot/bot.py b/davtelepot/bot.py index 62f268c..fa4ca7e 100644 --- a/davtelepot/bot.py +++ b/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, diff --git a/davtelepot/messages.py b/davtelepot/messages.py index a7247be..c54b016 100644 --- a/davtelepot/messages.py +++ b/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': "Long message\n\n" + "This message is too long to be sent as individual " + "messages.", + 'it': "Messaggio lungo\n\n" + "Questo messaggio รจ troppo lungo per essere inviato come " + "messaggi separati.", + } + } +} + default_admin_messages = { 'cancel': { 'button': {