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"
__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"

View File

@ -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,

View File

@ -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': {