More elegant way of /stopping bots

This commit is contained in:
Davte 2019-07-20 21:05:40 +02:00
parent 191a2d2ecb
commit 6e95de61e9
2 changed files with 114 additions and 1 deletions

View File

@ -14,7 +14,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.1.24" __version__ = "2.1.25"
__maintainer__ = "Davide Testa" __maintainer__ = "Davide Testa"
__contact__ = "t.me/davte" __contact__ = "t.me/davte"

View File

@ -507,6 +507,41 @@ default_admin_messages = {
'description': { 'description': {
'en': "Stop bots", 'en': "Stop bots",
'it': "Ferma i bot" '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"
} }
} }
} }
@ -538,10 +573,82 @@ async def _restart_command(bot, update, user_record):
async def _stop_command(bot, update, user_record): async def _stop_command(bot, update, user_record):
text = bot.get_message(
'admin', 'stop_command', 'text',
update=update, user_record=user_record
)
reply_markup = make_inline_keyboard(
[
make_button(
text=bot.get_message(
'admin', 'stop_button', 'stop_text',
update=update, user_record=user_record
),
prefix='stop:///',
data=['stop']
),
make_button(
text=bot.get_message(
'admin', 'stop_button', 'cancel',
update=update, user_record=user_record
),
prefix='stop:///',
data=['cancel']
)
],
1
)
return dict(
text=text,
parse_mode='HTML',
reply_markup=reply_markup
)
async def stop_bots(bot):
"""Stop bots in `bot` class."""
await asyncio.sleep(2)
bot.__class__.stop(message='=== STOP ===', final_state=0) bot.__class__.stop(message='=== STOP ===', final_state=0)
return return
async def _stop_button(bot, update, user_record, data):
result, text, reply_markup = '', '', None
telegram_id = user_record['telegram_id']
command = data[0] if len(data) > 0 else 'None'
if command == 'stop':
if not Confirmator.get('stop_bots').confirm(telegram_id):
return bot.get_message(
'admin', 'stop_button', 'confirm',
update=update, user_record=user_record
)
text = bot.get_message(
'admin', 'stop_button', 'stopping',
update=update, user_record=user_record
)
result = text
# Do not stop bots immediately, otherwise callback query
# will never be answered
asyncio.ensure_future(stop_bots(bot))
elif command == 'cancel':
text = bot.get_message(
'admin', 'stop_button', 'cancelled',
update=update, user_record=user_record
)
result = text
if text:
return dict(
text=result,
edit=dict(
text=text,
parse_mode='HTML',
reply_markup=reply_markup,
disable_web_page_preview=True
)
)
return result
def init(bot, talk_messages=None, admin_messages=None, language='en'): def init(bot, talk_messages=None, admin_messages=None, language='en'):
"""Assign parsers, commands, buttons and queries to given `bot`.""" """Assign parsers, commands, buttons and queries to given `bot`."""
if talk_messages is None: if talk_messages is None:
@ -648,3 +755,9 @@ def init(bot, talk_messages=None, admin_messages=None, language='en'):
authorization_level='admin') authorization_level='admin')
async def stop_command(bot, update, user_record): async def stop_command(bot, update, user_record):
return await _stop_command(bot, update, user_record) return await _stop_command(bot, update, user_record)
@bot.button(prefix='stop:///', separator='|',
description=stop_command_description,
authorization_level='admin')
async def stop_button(bot, update, user_record, data):
return await _stop_button(bot, update, user_record, data)