Working on manual mode (cotrol bots from terminal).
This commit is contained in:
		| @@ -2,7 +2,7 @@ __author__ = "Davide Testa" | ||||
| __email__ = "davte@libero.it" | ||||
| __credits__ = "Marco Origlia" | ||||
| __license__ = "GNU General Public License v3.0" | ||||
| __version__ = "1.2.6" | ||||
| __version__ = "1.3.0" | ||||
| __maintainer__ = "Davide Testa" | ||||
| __contact__ = "t.me/davte" | ||||
|  | ||||
|   | ||||
| @@ -27,9 +27,10 @@ import telepot | ||||
| import telepot.aio | ||||
|  | ||||
| # Project modules | ||||
| from davteutil import Gettable, MyOD | ||||
| from davteutil import (escape_html_chars, get_cleaned_text, | ||||
|                        make_lines_of_buttons, markdown_check, | ||||
| from davteutil import (Gettable, escape_html_chars, get_cleaned_text, | ||||
|                        line_drawing_unordered_list, | ||||
|                        make_lines_of_buttons, markdown_check, MyOD, | ||||
|                        pick_most_similar_from_list, | ||||
|                        remove_html_tags, sleep_until) | ||||
|  | ||||
|  | ||||
| @@ -1631,12 +1632,10 @@ class Bot(telepot.aio.Bot, Gettable): | ||||
|         self.to_be_obscured.remove(inline_message_id) | ||||
|         return | ||||
|  | ||||
|     async def continue_running(self): | ||||
|         """Get updates. | ||||
|     async def get_me(self): | ||||
|         """Get bot information. | ||||
|  | ||||
|         If bot can be got, sets name and telegram_id, | ||||
|             awaits preliminary tasks and starts getting updates from telegram. | ||||
|         If bot can't be got, restarts all bots in 5 minutes. | ||||
|         Restart bots if bot can't be got. | ||||
|         """ | ||||
|         try: | ||||
|             me = await self.getMe() | ||||
| @@ -1651,6 +1650,15 @@ class Bot(telepot.aio.Bot, Gettable): | ||||
|             await asyncio.sleep(5*60) | ||||
|             self.restart_bots() | ||||
|             return | ||||
|  | ||||
|     async def continue_running(self): | ||||
|         """Get updates. | ||||
|  | ||||
|         If bot can be got, sets name and telegram_id, | ||||
|             awaits preliminary tasks and starts getting updates from telegram. | ||||
|         If bot can't be got, restarts all bots in 5 minutes. | ||||
|         """ | ||||
|         await get_me() | ||||
|         for task in self.run_before_loop: | ||||
|             await task | ||||
|         self.set_default_keyboard() | ||||
| @@ -1730,7 +1738,7 @@ class Bot(telepot.aio.Bot, Gettable): | ||||
|     @classmethod | ||||
|     def run(cls, loop=None): | ||||
|         """Call this method to run the async bots.""" | ||||
|         if not loop: | ||||
|         if loop is None: | ||||
|             loop = asyncio.get_event_loop() | ||||
|         logging.info( | ||||
|             "{sep}{subjvb} STARTED{sep}".format( | ||||
| @@ -1752,8 +1760,9 @@ class Bot(telepot.aio.Bot, Gettable): | ||||
|             loop.run_until_complete(cls.end_session()) | ||||
|         except Exception as e: | ||||
|             logging.error( | ||||
|                 '\nYour bot has been stopped. with error \'{}\''.format( | ||||
|                     e | ||||
|                 '\nYour bot{vb} been stopped. with error \'{e}\''.format( | ||||
|                     e=e, | ||||
|                     vb='s have' if len(cls.instances) > 1 else ' has' | ||||
|                 ), | ||||
|                 exc_info=True | ||||
|             ) | ||||
| @@ -1764,3 +1773,115 @@ class Bot(telepot.aio.Bot, Gettable): | ||||
|             ) | ||||
|         ) | ||||
|         return | ||||
|  | ||||
|     @classmethod | ||||
|     async def _run_manual_mode(cls): | ||||
|         available_bots = MyOD() | ||||
|         for code, bot in enumerate( | ||||
|             cls.instances.values() | ||||
|         ): | ||||
|             await bot.get_me() | ||||
|             available_bots[code] = dict( | ||||
|                 bot=bot, | ||||
|                 code=code, | ||||
|                 name=bot.name | ||||
|             ) | ||||
|         selected_bot = None | ||||
|         while selected_bot is None: | ||||
|             user_input = input( | ||||
|                 "\n=============================================\n" | ||||
|                 "Which bot would you like to control manually?\n" | ||||
|                 "Available bots:\n{}\n\n\t\t".format( | ||||
|                     line_drawing_unordered_list( | ||||
|                         list( | ||||
|                             "{b[code]:>3} - {b[bot].name}".format( | ||||
|                                 b=bot, | ||||
|                             ) | ||||
|                             for bot in available_bots.values() | ||||
|                         ) | ||||
|                     ) | ||||
|                 ) | ||||
|             ) | ||||
|             if ( | ||||
|                 user_input.isnumeric() | ||||
|                 and int(user_input) in available_bots | ||||
|             ): | ||||
|                 selected_bot = available_bots[int(user_input)] | ||||
|             else: | ||||
|                 selected_bot = pick_most_similar_from_list( | ||||
|                     [ | ||||
|                         bot['name'] | ||||
|                         for bot in available_bots.values() | ||||
|                     ], | ||||
|                     user_input | ||||
|                 ) | ||||
|                 selected_bot = available_bots.get_by_key_val( | ||||
|                     key='name', | ||||
|                     val=selected_bot, | ||||
|                     case_sensitive=False, | ||||
|                     return_value=True | ||||
|                 ) | ||||
|             if selected_bot is None: | ||||
|                 logging.error("Invalid selection.") | ||||
|                 continue | ||||
|             logging.info( | ||||
|                 "Bot `{b[name]}` selected.".format( | ||||
|                     b=selected_bot | ||||
|                 ) | ||||
|             ) | ||||
|             exit_code = await selected_bot['bot']._run_manually() | ||||
|             if exit_code == 0: | ||||
|                 break | ||||
|         return | ||||
|  | ||||
|     @classmethod | ||||
|     def run_manual_mode(cls, loop=None): | ||||
|         """Run in manual mode: send messages via bots.""" | ||||
|         if loop is None: | ||||
|             loop = asyncio.get_event_loop() | ||||
|         logging.info( | ||||
|             "=== MANUAL MODE STARTED ===" | ||||
|         ) | ||||
|         try: | ||||
|             loop.run_until_complete( | ||||
|                 cls._run_manual_mode() | ||||
|             ) | ||||
|         except KeyboardInterrupt: | ||||
|             logging.info( | ||||
|                 '\n\t\tYour script received a KeyboardInterrupt signal, "\ | ||||
|                 "your bot{} being stopped.'.format( | ||||
|                     's are' if len(cls.instances) > 1 else ' is' | ||||
|                 ) | ||||
|             ) | ||||
|         except Exception as e: | ||||
|             logging.error( | ||||
|                 '\nYour bot{vb} been stopped. with error \'{e}\''.format( | ||||
|                     e=e, | ||||
|                     vb='s have' if len(cls.instances) > 1 else ' has' | ||||
|                 ), | ||||
|                 exc_info=True | ||||
|             ) | ||||
|         logging.info( | ||||
|             "=== MANUAL MODE STOPPED ===" | ||||
|         ) | ||||
|  | ||||
|     async def _run_manually(self): | ||||
|         user_input = '  choose_addressee' | ||||
|         while user_input: | ||||
|             try: | ||||
|                 user_input = input( | ||||
|                     "Choose an addressee." | ||||
|                     "\n\t\t" | ||||
|                 ) | ||||
|             except KeyboardInterrupt: | ||||
|                 logging.error("Keyboard interrupt.") | ||||
|                 break | ||||
|             logging.info(user_input) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     # from davtelepot.custombot import Bot | ||||
|     # davtebot = Bot.get('335545766:AAEVvbdqy7OCG7ufxBwKVdBscdfddFF2lmk') | ||||
|     # davtetest = Bot.get('279769259:AAEri-FF8AZeLz0LAi4BpPVjkQcKeOOTimo') | ||||
|     # Bot.run_manual_mode() | ||||
|     print('Work in progress') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user