Queer European MD passionate about IT
Browse Source

More elegant way of `/stop`ping bots

Davte 5 years ago
parent
commit
6e95de61e9
2 changed files with 114 additions and 1 deletions
  1. 1 1
      davtelepot/__init__.py
  2. 113 0
      davtelepot/administration_tools.py

+ 1 - 1
davtelepot/__init__.py

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

+ 113 - 0
davtelepot/administration_tools.py

@@ -507,6 +507,41 @@ default_admin_messages = {
         '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"
         }
     }
 }
@@ -538,10 +573,82 @@ async def _restart_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)
     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'):
     """Assign parsers, commands, buttons and queries to given `bot`."""
     if talk_messages is None:
@@ -648,3 +755,9 @@ def init(bot, talk_messages=None, admin_messages=None, language='en'):
                  authorization_level='admin')
     async def 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)