Send long text messages as files

This commit is contained in:
Davte 2020-05-19 15:12:38 +02:00
parent e3cde032ba
commit 7ad4f48de1
3 changed files with 53 additions and 3 deletions

View File

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

View File

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

View File

@ -1,5 +1,22 @@
"""Default messages for bot functions.""" """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 = { default_admin_messages = {
'cancel': { 'cancel': {
'button': { 'button': {