Moved messages to dedicated module

This commit is contained in:
Davte 2020-02-18 18:50:19 +01:00
parent 61cebd0c1f
commit 086750c77e
4 changed files with 484 additions and 505 deletions

View File

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

View File

@ -14,6 +14,7 @@ import datetime
import json
# Third party modules
from davtelepot import messages
from davtelepot.utilities import (
async_wrapper, Confirmator, extract, get_cleaned_text, get_user,
escape_html_chars, line_drawing_unordered_list, make_button,
@ -23,110 +24,6 @@ from davtelepot.utilities import (
from sqlalchemy.exc import ResourceClosedError
default_talk_messages = dict(
admin_session_ended=dict(
en=(
'Session with user {u} ended.'
),
it=(
'Sessione terminata con l\'utente {u}.'
),
),
admin_warning=dict(
en=(
'You are now talking to {u}.\n'
'Until you end this session, your messages will be '
'forwarded to each other.'
),
it=(
'Sei ora connesso con {u}.\n'
'Finché non chiuderai la connessione, i messaggi che scriverai '
'qui saranno inoltrati a {u}, e ti inoltrerò i suoi.'
),
),
end_session=dict(
en=(
'End session?'
),
it=(
'Chiudere la sessione?'
),
),
help_text=dict(
en='Press the button to search for user.',
it='Premi il pulsante per scegliere un utente.'
),
search_button=dict(
en="🔍 Search for user",
it="🔍 Cerca utente",
),
select_user=dict(
en='Which user would you like to talk to?',
it='Con quale utente vorresti parlare?'
),
user_not_found=dict(
en=(
"Sory, but no user matches your query for\n"
"<code>{q}</code>"
),
it=(
"Spiacente, ma nessun utente corrisponde alla ricerca per\n"
"<code>{q}</code>"
),
),
instructions=dict(
en=(
'Write a part of name, surname or username of the user you want '
'to talk to.'
),
it=(
'Scrivi una parte del nome, cognome o username dell\'utente con '
'cui vuoi parlare.'
),
),
stop=dict(
en=(
'End session'
),
it=(
'Termina la sessione'
),
),
user_session_ended=dict(
en=(
'Session with admin {u} ended.'
),
it=(
'Sessione terminata con l\'amministratore {u}.'
),
),
user_warning=dict(
en=(
'{u}, admin of this bot, wants to talk to you.\n'
'Until this session is ended by {u}, your messages will be '
'forwarded to each other.'
),
it=(
'{u}, amministratore di questo bot, vuole parlare con te.\n'
'Finché non chiuderà la connessione, i messaggi che scriverai '
'qui saranno inoltrati a {u}, e ti inoltrerò i suoi.'
),
),
# key=dict(
# en='',
# it='',
# ),
# key=dict(
# en=(
# ''
# ),
# it=(
# ''
# ),
# ),
)
async def _forward_to(update, bot, sender, addressee, is_admin=False):
if update['text'].lower() in ['stop'] and is_admin:
with bot.db as db:
@ -490,245 +387,6 @@ async def _talk_button(bot, update, user_record, data):
return result
default_admin_messages = {
'talk_command': {
'description': {
'en': "Choose a user and forward messages to each other",
'it': "Scegli un utente e il bot farà da tramite inoltrando a "
"ognuno i messaggi dell'altro finché non terminerai la "
"sessione"
}
},
'restart_command': {
'description': {
'en': "Restart bots",
'it': "Riavvia i bot"
},
'restart_scheduled_message': {
'en': "Bots are being restarted, after pulling from repository.",
'it': "I bot verranno riavviati in pochi secondi, caricando "
"prima le eventuali modifiche al codice."
},
'restart_completed_message': {
'en': "<i>Restart was successful.</i>",
'it': "<i>Restart avvenuto con successo.</i>"
}
},
'stop_command': {
'description': {
'en': "Stop bots",
'it': "Ferma i bot"
},
'text': {
'en': "Are you sure you want to stop all bots?\n"
"To make them start again you will have to ssh-log "
"in server.\n\n"
"To restart the bots remotely use the /restart command "
"instead (before starting over, a <code>git pull</code> "
"is performed).",
'it': "Sei sicuro di voler fermare i bot?\n"
"Per farli ripartire dovrai accedere al server.\n\n"
"Per far ripartire i bot da remoto usa invece il comando "
"/restart (prima di ripartire farò un "
"<code>git pull</code>)."
}
},
'stop_button': {
'stop_text': {
'en': "Stop bots",
'it': "Ferma i bot"
},
'cancel': {
'en': "Cancel",
'it': "Annulla"
},
'confirm': {
'en': "Do you really want to stop all bots?",
'it': "Vuoi davvero fermare tutti i bot?"
},
'stopping': {
'en': "Stopping bots...",
'it': "Arresto in corso..."
},
'cancelled': {
'en': "Operation was cancelled",
'it': "Operazione annullata"
}
},
'db_command': {
'description': {
'en': "Ask for bot database via Telegram",
'it': "Ricevi il database del bot via Telegram"
},
'not_sqlite': {
'en': "Only SQLite databases may be sent via Telegram, since they "
"are single-file databases.\n"
"This bot has a `{db_type}` database.",
'it': "Via Telegram possono essere inviati solo database SQLite, "
"in quanto composti di un solo file.\n"
"Questo bot ha invece un database `{db_type}`."
},
'file_caption': {
'en': "Here is bot database.",
'it': "Ecco il database!"
},
'db_sent': {
'en': "Database sent.",
'it': "Database inviato."
}
},
'query_command': {
'description': {
'en': "Receive the result of a SQL query performed on bot "
"database",
'it': "Ricevi il risultato di una query SQL sul database del bot"
},
'help': {
'en': "Write a SQL query to be run on bot database.\n\n"
"<b>Example</b>\n"
"<code>/query SELECT * FROM users WHERE 0</code>",
'it': "Invia una query SQL da eseguire sul database del bot.\n\n"
"<b>Esempio</b>\n"
"<code>/query SELECT * FROM users WHERE 0</code>"
},
'no_iterable': {
'en': "No result to show was returned",
'it': "La query non ha restituito risultati da mostrare"
},
'exception': {
'en': "The query threw this error:",
'it': "La query ha dato questo errore:"
},
'result': {
'en': "Query result",
'it': "Risultato della query"
}
},
'select_command': {
'description': {
'en': "Receive the result of a SELECT query performed on bot "
"database",
'it': "Ricevi il risultato di una query SQL di tipo SELECT "
"sul database del bot"
}
},
'query_button': {
'error': {
'en': "Error!",
'it': "Errore!"
},
'file_name': {
'en': "Query result.csv",
'it': "Risultato della query.csv"
},
'empty_file': {
'en': "No result to show.",
'it': "Nessun risultato da mostrare."
}
},
'log_command': {
'description': {
'en': "Receive bot log file, if set",
'it': "Ricevi il file di log del bot, se impostato"
},
'no_log': {
'en': "Sorry but no log file is set.\n"
"To set it, use `bot.set_log_file_name` instance method or "
"`Bot.set_class_log_file_name` class method.",
'it': "Spiacente ma il file di log non è stato impostato.\n"
"Per impostarlo, usa il metodo d'istanza "
"`bot.set_log_file_name` o il metodo di classe"
"`Bot.set_class_log_file_name`."
},
'sending_failure': {
'en': "Sending log file failed!\n\n"
"<b>Error:</b>\n"
"<code>{e}</code>",
'it': "Inviio del messaggio di log fallito!\n\n"
"<b>Errore:</b>\n"
"<code>{e}</code>"
},
'here_is_log_file': {
'en': "Here is the complete log file.",
'it': "Ecco il file di log completo."
},
'log_file_first_lines': {
'en': "Here are the first {lines} lines of the log file.",
'it': "Ecco le prime {lines} righe del file di log."
},
'log_file_last_lines': {
'en': "Here are the last {lines} lines of the log file.\n"
"Newer lines are at the top of the file.",
'it': "Ecco le ultime {lines} righe del file di log.\n"
"L'ordine è cronologico, con i messaggi nuovi in alto."
}
},
'errors_command': {
'description': {
'en': "Receive bot error log file, if set",
'it': "Ricevi il file di log degli errori del bot, se impostato"
},
'no_log': {
'en': "Sorry but no errors log file is set.\n"
"To set it, use `bot.set_errors_file_name` instance method"
"or `Bot.set_class_errors_file_name` class method.",
'it': "Spiacente ma il file di log degli errori non è stato "
"impostato.\n"
"Per impostarlo, usa il metodo d'istanza "
"`bot.set_errors_file_name` o il metodo di classe"
"`Bot.set_class_errors_file_name`."
},
'empty_log': {
'en': "Congratulations! Errors log is empty!",
'it': "Congratulazioni! Il log degli errori è vuoto!"
},
'sending_failure': {
'en': "Sending errors log file failed!\n\n"
"<b>Error:</b>\n"
"<code>{e}</code>",
'it': "Inviio del messaggio di log degli errori fallito!\n\n"
"<b>Errore:</b>\n"
"<code>{e}</code>"
},
'here_is_log_file': {
'en': "Here is the complete errors log file.",
'it': "Ecco il file di log degli errori completo."
},
'log_file_first_lines': {
'en': "Here are the first {lines} lines of the errors log file.",
'it': "Ecco le prime {lines} righe del file di log degli errori."
},
'log_file_last_lines': {
'en': "Here are the last {lines} lines of the errors log file.\n"
"Newer lines are at the top of the file.",
'it': "Ecco le ultime {lines} righe del file di log degli "
"errori.\n"
"L'ordine è cronologico, con i messaggi nuovi in alto."
}
},
'maintenance_command': {
'description': {
'en': "Put the bot under maintenance",
'it': "Metti il bot in manutenzione"
},
'maintenance_started': {
'en': "<i>Bot has just been put under maintenance!</i>\n\n"
"Until further notice, it will reply to users "
"with the following message:\n\n"
"{message}",
'it': "<i>Il bot è stato messo in manutenzione!</i>\n\n"
"Fino a nuovo ordine, risponderà a tutti i comandi con il "
"seguente messaggio\n\n"
"{message}"
},
'maintenance_ended': {
'en': "<i>Maintenance ended!</i>",
'it': "<i>Manutenzione terminata!</i>"
}
}
}
async def _restart_command(bot, update, user_record):
with bot.db as db:
db['restart_messages'].insert(
@ -1037,7 +695,7 @@ async def _errors_command(bot, update, user_record):
try:
# Check that error log is not empty
with open(bot.errors_file_path, 'r') as errors_file:
for line in errors_file:
for _ in errors_file:
break
else:
return bot.get_message(
@ -1094,6 +752,7 @@ def get_maintenance_exception_criterion(bot, allowed_command):
`bot` : davtelepot.bot.Bot() instance
`allowed_command` : str (command to be allowed during maintenance)
"""
def criterion(update):
if 'message' not in update:
return False
@ -1115,18 +774,19 @@ def get_maintenance_exception_criterion(bot, allowed_command):
):
return False
return text == allowed_command.strip('/')
return criterion
def init(bot, talk_messages=None, admin_messages=None):
def init(telegram_bot, talk_messages=None, admin_messages=None):
"""Assign parsers, commands, buttons and queries to given `bot`."""
if talk_messages is None:
talk_messages = default_talk_messages
bot.messages['talk'] = talk_messages
talk_messages = messages.default_talk_messages
telegram_bot.messages['talk'] = talk_messages
if admin_messages is None:
admin_messages = default_admin_messages
bot.messages['admin'] = admin_messages
with bot.db as db:
admin_messages = messages.default_admin_messages
telegram_bot.messages['admin'] = admin_messages
db = telegram_bot.db
if 'talking_sessions' not in db.tables:
db['talking_sessions'].insert(
dict(
@ -1137,14 +797,13 @@ def init(bot, talk_messages=None, admin_messages=None):
)
allowed_during_maintenance = [
get_maintenance_exception_criterion(bot, command)
get_maintenance_exception_criterion(telegram_bot, command)
for command in ['stop', 'restart', 'maintenance']
]
@bot.additional_task(when='BEFORE')
@telegram_bot.additional_task(when='BEFORE')
async def load_talking_sessions():
sessions = []
with bot.db as db:
for session in db.query(
"""SELECT *
FROM talking_sessions
@ -1163,34 +822,33 @@ def init(bot, talk_messages=None, admin_messages=None):
)
for session in sessions:
await start_session(
bot=bot,
bot=telegram_bot,
other_user_record=session['other_user_record'],
admin_record=session['admin_record']
)
@bot.command(command='/talk', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/talk', aliases=[], show_in_keyboard=False,
description=admin_messages['talk_command']['description'],
authorization_level='admin')
async def talk_command(bot, update, user_record):
return await _talk_command(bot, update, user_record)
@bot.button(prefix='talk:///', separator='|', authorization_level='admin')
@telegram_bot.button(prefix='talk:///', separator='|', authorization_level='admin')
async def talk_button(bot, update, user_record, data):
return await _talk_button(bot, update, user_record, data)
@bot.command(command='/restart', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/restart', aliases=[], show_in_keyboard=False,
description=admin_messages['restart_command']['description'],
authorization_level='admin')
async def restart_command(bot, update, user_record):
return await _restart_command(bot, update, user_record)
@bot.additional_task('BEFORE')
@telegram_bot.additional_task('BEFORE')
async def send_restart_messages():
"""Send restart messages at restart."""
with bot.db as db:
for restart_message in db['restart_messages'].find(sent=None):
asyncio.ensure_future(
bot.send_message(
telegram_bot.send_message(
**{
key: val
for key, val in restart_message.items()
@ -1213,60 +871,59 @@ def init(bot, talk_messages=None, admin_messages=None):
)
return
@bot.command(command='/stop', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/stop', aliases=[], show_in_keyboard=False,
description=admin_messages['stop_command']['description'],
authorization_level='admin')
async def stop_command(bot, update, user_record):
return await _stop_command(bot, update, user_record)
@bot.button(prefix='stop:///', separator='|',
@telegram_bot.button(prefix='stop:///', separator='|',
description=admin_messages['stop_command']['description'],
authorization_level='admin')
async def stop_button(bot, update, user_record, data):
return await _stop_button(bot, update, user_record, data)
@bot.command(command='/db', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/db', aliases=[], show_in_keyboard=False,
description=admin_messages['db_command']['description'],
authorization_level='admin')
async def send_bot_database(bot, update, user_record):
return await _send_bot_database(bot, update, user_record)
@bot.command(command='/query', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/query', aliases=[], show_in_keyboard=False,
description=admin_messages['query_command']['description'],
authorization_level='admin')
async def query_command(bot, update, user_record):
return await _query_command(bot, update, user_record)
@bot.command(command='/select', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/select', aliases=[], show_in_keyboard=False,
description=admin_messages['select_command']['description'],
authorization_level='admin')
async def select_command(bot, update, user_record):
return await _query_command(bot, update, user_record)
@bot.button(prefix='db_query:///', separator='|',
@telegram_bot.button(prefix='db_query:///', separator='|',
description=admin_messages['query_command']['description'],
authorization_level='admin')
async def query_button(bot, update, user_record, data):
return await _query_button(bot, update, user_record, data)
@bot.command(command='/log', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/log', aliases=[], show_in_keyboard=False,
description=admin_messages['log_command']['description'],
authorization_level='admin')
async def log_command(bot, update, user_record):
return await _log_command(bot, update, user_record)
@bot.command(command='/errors', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/errors', aliases=[], show_in_keyboard=False,
description=admin_messages['errors_command']['description'],
authorization_level='admin')
async def errors_command(bot, update, user_record):
return await _errors_command(bot, update, user_record)
for exception in allowed_during_maintenance:
bot.allow_during_maintenance(exception)
telegram_bot.allow_during_maintenance(exception)
@bot.command(command='/maintenance', aliases=[], show_in_keyboard=False,
description=admin_messages[
'maintenance_command']['description'],
@telegram_bot.command(command='/maintenance', aliases=[], show_in_keyboard=False,
description=admin_messages['maintenance_command']['description'],
authorization_level='admin')
async def maintenance_command(bot, update, user_record):
return await _maintenance_command(bot, update, user_record)

View File

@ -60,7 +60,7 @@ DEFAULT_ROLES[100] = {
}
class Role():
class Role:
"""Authorization level for users of a bot."""
roles = OrderedDict()
@ -232,6 +232,7 @@ class Role():
def get_authorization_function(bot):
"""Take a `bot` and return its authorization_function."""
def is_authorized(update, user_record=None, authorization_level=2):
"""Return True if user role is at least at `authorization_level`."""
user_role = bot.Role.get_user_role(user_record=user_record)
@ -241,6 +242,7 @@ def get_authorization_function(bot):
if needed_role.code < user_role.code:
return False
return True
return is_authorized
@ -497,38 +499,39 @@ async def _ban_command(bot, update, user_record):
return
def init(bot: Bot, roles=None, authorization_messages=None):
def init(telegram_bot: Bot, roles=None, authorization_messages=None):
"""Set bot roles and assign role-related commands.
Pass an OrderedDict of `roles` to get them set.
"""
class _Role(Role):
roles = OrderedDict()
bot.set_role_class(_Role)
telegram_bot.set_role_class(_Role)
if roles is None:
roles = DEFAULT_ROLES
# Cast roles to OrderedDict
if isinstance(roles, list):
roles = OrderedDict(
(i, element)
for i, element in enumerate(list)
for i, element in enumerate(roles)
)
if not isinstance(roles, OrderedDict):
raise TypeError("`roles` shall be a OrderedDict!")
for id, role in roles.items():
for code, role in roles.items():
if 'code' not in role:
role['code'] = id
bot.Role(**role)
role['code'] = code
telegram_bot.Role(**role)
bot.set_authorization_function(
get_authorization_function(bot)
telegram_bot.set_authorization_function(
get_authorization_function(telegram_bot)
)
if authorization_messages is None:
authorization_messages = deafult_authorization_messages
bot.messages['authorization'] = authorization_messages
telegram_bot.messages['authorization'] = authorization_messages
@bot.command(command='/auth', aliases=[], show_in_keyboard=False,
@telegram_bot.command(command='/auth', aliases=[], show_in_keyboard=False,
description=(
authorization_messages['auth_command']['description']
),
@ -536,19 +539,15 @@ def init(bot: Bot, roles=None, authorization_messages=None):
async def authorization_command(bot, update, user_record):
return await _authorization_command(bot, update, user_record)
@bot.button('auth:///',
description=(
authorization_messages['auth_button']['description']
),
@telegram_bot.button('auth:///',
description=authorization_messages['auth_button']['description'],
separator='|',
authorization_level='moderator')
async def authorization_button(bot, update, user_record, data):
return await _authorization_button(bot, update, user_record, data)
@bot.command('/ban', aliases=[], show_in_keyboard=False,
description=(
authorization_messages['ban_command']['description']
),
@telegram_bot.command('/ban', aliases=[], show_in_keyboard=False,
description=authorization_messages['ban_command']['description'],
authorization_level='admin')
async def ban_command(bot, update, user_record):
return await _ban_command(bot, update, user_record)

View File

@ -1,5 +1,248 @@
"""Default messages for bot functions."""
default_admin_messages = {
'talk_command': {
'description': {
'en': "Choose a user and forward messages to each other",
'it': "Scegli un utente e il bot farà da tramite inoltrando a "
"ognuno i messaggi dell'altro finché non terminerai la "
"sessione"
}
},
'restart_command': {
'description': {
'en': "Restart bots",
'it': "Riavvia i bot"
},
'restart_scheduled_message': {
'en': "Bots are being restarted, after pulling from repository.",
'it': "I bot verranno riavviati in pochi secondi, caricando "
"prima le eventuali modifiche al codice."
},
'restart_completed_message': {
'en': "<i>Restart was successful.</i>",
'it': "<i>Restart avvenuto con successo.</i>"
}
},
'stop_command': {
'description': {
'en': "Stop bots",
'it': "Ferma i bot"
},
'text': {
'en': "Are you sure you want to stop all bots?\n"
"To make them start again you will have to ssh-log "
"in server.\n\n"
"To restart the bots remotely use the /restart command "
"instead (before starting over, a <code>git pull</code> "
"is performed).",
'it': "Sei sicuro di voler fermare i bot?\n"
"Per farli ripartire dovrai accedere al server.\n\n"
"Per far ripartire i bot da remoto usa invece il comando "
"/restart (prima di ripartire farò un "
"<code>git pull</code>)."
}
},
'stop_button': {
'stop_text': {
'en': "Stop bots",
'it': "Ferma i bot"
},
'cancel': {
'en': "Cancel",
'it': "Annulla"
},
'confirm': {
'en': "Do you really want to stop all bots?",
'it': "Vuoi davvero fermare tutti i bot?"
},
'stopping': {
'en': "Stopping bots...",
'it': "Arresto in corso..."
},
'cancelled': {
'en': "Operation was cancelled",
'it': "Operazione annullata"
}
},
'db_command': {
'description': {
'en': "Ask for bot database via Telegram",
'it': "Ricevi il database del bot via Telegram"
},
'not_sqlite': {
'en': "Only SQLite databases may be sent via Telegram, since they "
"are single-file databases.\n"
"This bot has a `{db_type}` database.",
'it': "Via Telegram possono essere inviati solo database SQLite, "
"in quanto composti di un solo file.\n"
"Questo bot ha invece un database `{db_type}`."
},
'file_caption': {
'en': "Here is bot database.",
'it': "Ecco il database!"
},
'db_sent': {
'en': "Database sent.",
'it': "Database inviato."
}
},
'query_command': {
'description': {
'en': "Receive the result of a SQL query performed on bot "
"database",
'it': "Ricevi il risultato di una query SQL sul database del bot"
},
'help': {
'en': "Write a SQL query to be run on bot database.\n\n"
"<b>Example</b>\n"
"<code>/query SELECT * FROM users WHERE 0</code>",
'it': "Invia una query SQL da eseguire sul database del bot.\n\n"
"<b>Esempio</b>\n"
"<code>/query SELECT * FROM users WHERE 0</code>"
},
'no_iterable': {
'en': "No result to show was returned",
'it': "La query non ha restituito risultati da mostrare"
},
'exception': {
'en': "The query threw this error:",
'it': "La query ha dato questo errore:"
},
'result': {
'en': "Query result",
'it': "Risultato della query"
}
},
'select_command': {
'description': {
'en': "Receive the result of a SELECT query performed on bot "
"database",
'it': "Ricevi il risultato di una query SQL di tipo SELECT "
"sul database del bot"
}
},
'query_button': {
'error': {
'en': "Error!",
'it': "Errore!"
},
'file_name': {
'en': "Query result.csv",
'it': "Risultato della query.csv"
},
'empty_file': {
'en': "No result to show.",
'it': "Nessun risultato da mostrare."
}
},
'log_command': {
'description': {
'en': "Receive bot log file, if set",
'it': "Ricevi il file di log del bot, se impostato"
},
'no_log': {
'en': "Sorry but no log file is set.\n"
"To set it, use `bot.set_log_file_name` instance method or "
"`Bot.set_class_log_file_name` class method.",
'it': "Spiacente ma il file di log non è stato impostato.\n"
"Per impostarlo, usa il metodo d'istanza "
"`bot.set_log_file_name` o il metodo di classe"
"`Bot.set_class_log_file_name`."
},
'sending_failure': {
'en': "Sending log file failed!\n\n"
"<b>Error:</b>\n"
"<code>{e}</code>",
'it': "Inviio del messaggio di log fallito!\n\n"
"<b>Errore:</b>\n"
"<code>{e}</code>"
},
'here_is_log_file': {
'en': "Here is the complete log file.",
'it': "Ecco il file di log completo."
},
'log_file_first_lines': {
'en': "Here are the first {lines} lines of the log file.",
'it': "Ecco le prime {lines} righe del file di log."
},
'log_file_last_lines': {
'en': "Here are the last {lines} lines of the log file.\n"
"Newer lines are at the top of the file.",
'it': "Ecco le ultime {lines} righe del file di log.\n"
"L'ordine è cronologico, con i messaggi nuovi in alto."
}
},
'errors_command': {
'description': {
'en': "Receive bot error log file, if set",
'it': "Ricevi il file di log degli errori del bot, se impostato"
},
'no_log': {
'en': "Sorry but no errors log file is set.\n"
"To set it, use `bot.set_errors_file_name` instance method"
"or `Bot.set_class_errors_file_name` class method.",
'it': "Spiacente ma il file di log degli errori non è stato "
"impostato.\n"
"Per impostarlo, usa il metodo d'istanza "
"`bot.set_errors_file_name` o il metodo di classe"
"`Bot.set_class_errors_file_name`."
},
'empty_log': {
'en': "Congratulations! Errors log is empty!",
'it': "Congratulazioni! Il log degli errori è vuoto!"
},
'sending_failure': {
'en': "Sending errors log file failed!\n\n"
"<b>Error:</b>\n"
"<code>{e}</code>",
'it': "Inviio del messaggio di log degli errori fallito!\n\n"
"<b>Errore:</b>\n"
"<code>{e}</code>"
},
'here_is_log_file': {
'en': "Here is the complete errors log file.",
'it': "Ecco il file di log degli errori completo."
},
'log_file_first_lines': {
'en': "Here are the first {lines} lines of the errors log file.",
'it': "Ecco le prime {lines} righe del file di log degli errori."
},
'log_file_last_lines': {
'en': "Here are the last {lines} lines of the errors log file.\n"
"Newer lines are at the top of the file.",
'it': "Ecco le ultime {lines} righe del file di log degli "
"errori.\n"
"L'ordine è cronologico, con i messaggi nuovi in alto."
}
},
'maintenance_command': {
'description': {
'en': "Put the bot under maintenance",
'it': "Metti il bot in manutenzione"
},
'maintenance_started': {
'en': "<i>Bot has just been put under maintenance!</i>\n\n"
"Until further notice, it will reply to users "
"with the following message:\n\n"
"{message}",
'it': "<i>Il bot è stato messo in manutenzione!</i>\n\n"
"Fino a nuovo ordine, risponderà a tutti i comandi con il "
"seguente messaggio\n\n"
"{message}"
},
'maintenance_ended': {
'en': "<i>Maintenance ended!</i>",
'it': "<i>Manutenzione terminata!</i>"
}
}
}
default_authorization_denied_message = {
'en': "You are not allowed to use this command, sorry.",
'it': "Non disponi di autorizzazioni sufficienti per questa richiesta, spiacente.",
}
default_help_messages = {
'help_command': {
'header': {
@ -211,3 +454,83 @@ default_suggestion_messages = {
},
}
}
default_talk_messages = {
'admin_session_ended': {
'en': 'Session with user {u} ended.',
'it': 'Sessione terminata con l\'utente {u}.',
},
'admin_warning': {
'en': (
'You are now talking to {u}.\n'
'Until you end this session, your messages will be '
'forwarded to each other.'
),
'it': (
'Sei ora connesso con {u}.\n'
'Finché non chiuderai la connessione, i messaggi che scriverai '
'qui saranno inoltrati a {u}, e ti inoltrerò i suoi.'
),
},
'end_session': {
'en': 'End session?',
'it': 'Chiudere la sessione?',
},
'help_text': {
'en': 'Press the button to search for user.',
'it': 'Premi il pulsante per scegliere un utente.',
},
'search_button': {
'en': "🔍 Search for user",
'it': "🔍 Cerca utente",
},
'select_user': {
'en': 'Which user would you like to talk to?',
'it': 'Con quale utente vorresti parlare?',
},
'user_not_found': {
'en': (
"Sory, but no user matches your query for\n"
"<code>{q}</code>"
),
'it': (
"Spiacente, ma nessun utente corrisponde alla ricerca per\n"
"<code>{q}</code>"
),
},
'instructions': {
'en': (
'Write a part of name, surname or username of the user you want '
'to talk to.'
),
'it': (
'Scrivi una parte del nome, cognome o username dell\'utente con '
'cui vuoi parlare.'
),
},
'stop': {
'en': 'End session',
'it': 'Termina la sessione',
},
'user_session_ended': {
'en': 'Session with admin {u} ended.',
'it': 'Sessione terminata con l\'amministratore {u}.',
},
'user_warning': {
'en': (
'{u}, admin of this bot, wants to talk to you.\n'
'Until this session is ended by {u}, your messages will be '
'forwarded to each other.'
),
'it': (
'{u}, amministratore di questo bot, vuole parlare con te.\n'
'Finché non chiuderà la connessione, i messaggi che scriverai '
'qui saranno inoltrati a {u}, e ti inoltrerò i suoi.'
),
},
}
default_unknown_command_message = {
'en': "Unknown command! Touch /help to read the guide and available commands.",
'it': "Comando sconosciuto! Fai /help per leggere la guida e i comandi."
}