Как создать мультибота
Всем привет. Я пытаюсь создать мультибота в пайтон. Суть этого кода в том, чтобы он запускал основного бота через токен, который находит в конфиге.
Затем, когда в базу данных добавлялся новый токен, бот должен сразу же запускать нового бота по токену, который в базе данных.
Сейчас он запускается, только если вырубить бота и заново врубить.
Подскажите, как это сделать более правильно.
async def stop_bot(bot):
await bot.close()
async def on_startup():
logging.info('Starting...')
bot_tokens = get_bot_tokens_from_database()
running_bots = []
try:
main_bot = Bot(token=TOKEN)
dp = Dispatcher(main_bot, storage=MemoryStorage())
dp.register_message_handler(client.profile_handler, text='Меню')
dp.register_message_handler(client.my_bots, text='🤖 Мои боты')
dp.register_message_handler(lambda msg: client.settings(msg, bot_tokens), text='⚙️ Настройки')
dp.register_message_handler(start.start_message_handler, commands=['start'])
dp.register_message_handler(client.adding_token, content_types=['text'], state=client.AddTokenStates.add_token)
dp.register_callback_query_handler(client.back_set, text="back_in_settings", chat_type=types.ChatType.PRIVATE)
dp.register_callback_query_handler(client.back_my, text="back_in_my_bot", chat_type=types.ChatType.PRIVATE)
dp.register_callback_query_handler(client.adding_bot_defaul, text="adding_bot_default_set")
dp.register_message_handler(client.adding_token, content_types=['text'], state=client.AddTokenStates.add_token)
dp.register_callback_query_handler(client.adding_bot_default, text="adding_bot_default_my", chat_type=types.ChatType.PRIVATE)
tasks = []
tasks.append(dp.start_polling())
for token in bot_tokens:
if token is not None:
tasks.append(start.start_bot(token))
bot = Bot(token=token)
running_bots.append(bot)
else:
logging.info('Отсутствует токен в базе данных. Остановка бота.')
break
await asyncio.gather(*tasks)
except Exception as e:
logging.info(f'Бот не запустился: {e}')
for bot in running_bots:
await stop_bot(bot)
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
try:
asyncio.run(on_startup())
except KeyboardInterrupt:
pass
Источник: Stack Overflow на русском