Сейчас мой бот запускается так:
def main():
logger.info(f"Starting bot...")
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(group_manager.setup_group_clones())
loop.create_task(check_old_tokens())
loop.create_task(periodic_check())
loop.create_task(periodic_refresh_groups())
try:
bot.run_forever()
except KeyboardInterrupt:
logger.info("Shutting down")
Класс для работы с ботами:
class GroupCloneManager:
def __init__(self):
self.group_bots: Dict[int, Bot] = {}
self.group_tasks: Dict[int, asyncio.Task] = {}
async def setup_group_clones(self):
try:
async with make_session() as db_session:
groups = await get_connected_groups(db_session)
for group in groups:
await self.add_group_clone(group)
except Exception as e:
logger.debug(f"Error adding groups: {e}")
async def add_group_clone(self, group_data: ConnectedGroups):
group_id = group_data.group_id
token = ssl_crypter.decrypt(group_data.access_token).decode('utf-8')
try:
group_api = API(token=token)
group_bot = Bot(
api=group_api,
labeler=deepcopy(labeler),
state_dispenser=deepcopy(state_dispenser)
)
self.group_bots[group_id] = group_bot
self.group_tasks[group_id] = asyncio.create_task(
self._run_group_bot(group_bot, group_data)
)
logger.debug(f"Group {group_id} added and successfully started")
return True
except Exception as e:
logger.debug(f"Group {group_id} failed to start, unavailable token ({e})")
return False
async def _run_group_bot(self, group_bot: Bot, group_data: ConnectedGroups):
group_id = group_data.group_id
try:
await group_bot.run_polling()
async with make_session() as db_session:
async with make_session() as db_session:
stmt = sa.update(ConnectedGroups).where(ConnectedGroups.group_id == group_id).values(is_active=True)
await db_session.execute(stmt)
await db_session.commit()
except Exception as e:
logger.debug(f"Group {group_id} stopped: {e}")
async def remove_group_clone(self, group_id: int):
if group_id in self.group_bots:
self.group_tasks[group_id].cancel()
if group_id in self.group_bots:
del self.group_bots[group_id]
del self.group_tasks[group_id]
async with make_session() as db_session:
stmt = sa.update(ConnectedGroups).where(ConnectedGroups.group_id == group_id).values(is_active=True)
await db_session.execute(stmt)
await db_session.commit()
logger.debug("Group removed from polling")
async def refresh_group_clones(self):
try:
async with make_session() as db_session:
current_groups = await get_connected_groups(db_session)
current_group_ids = {g['group_id'] for g in current_groups if g['is_active']}
existing_group_ids = set(self.group_bots.keys())
for group_data in current_groups:
if group_data.is_active and group_data.group_id not in existing_group_ids:
await self.add_group_clone(group_data)
for group_id in existing_group_ids:
if group_id not in current_group_ids:
await self.remove_group_clone(group_id)
except Exception as e:
logger.debug(f"Error refreshing groups: {e}")
Сейчас у меня есть варнинги в консоли:
DEBUG | 2025-11-15 14:51:44 | bot.control_groups:add_group_clone:46 > Group |id| added and successfully started
DEBUG | 2025-11-15 14:51:44 | bot.control_groups:_run_group_bot:64 > Group |id| stopped: Cannot close a running event loop
Но боты (2) запускаются и реагируют но два раза на одну команду.
Сейчас схема примерно такая:
Бот (основной) запускает привязанные боты пользователями (другие группы)