olgram/extendedinstance/bot.py

66 lines
2.8 KiB
Python
Raw Normal View History

2021-07-11 12:53:33 +03:00
from aiogram import types
import asyncio
import aiocache
import typing as ty
from instance.bot import BotInstance, BotProperties
from olgram.models.models import Bot, GroupChat
class BotInstanceDatabase(BotInstance):
_instances: ty.Dict[int, "BotInstanceDatabase"] = dict()
def __init__(self, bot: Bot):
self._bot = bot
super().__init__()
@classmethod
async def run_all(cls):
bots = await Bot.all()
for bot in bots:
cls._instances[bot.id] = BotInstanceDatabase(bot)
# Polling только для отладки
asyncio.get_event_loop().create_task(cls._instances[bot.id].start_polling())
@classmethod
async def on_delete(cls, instance: Bot):
# Polling только для отладки
cls._instances[instance.id].stop_polling()
cls._instances.pop(instance.id)
@classmethod
async def on_create(cls, instance: Bot):
# Polling только для отладки
cls._instances[instance.id] = BotInstanceDatabase(instance)
asyncio.get_event_loop().create_task(cls._instances[instance.id].start_polling())
@aiocache.cached(ttl=5)
async def _properties(self) -> BotProperties:
await self._bot.refresh_from_db()
return BotProperties(self._bot.token, self._bot.start_text, int(self._bot.token.split(":")[0]),
await self._bot.super_chat_id())
async def _setup(self):
await super()._setup()
# Callback-и на добавление бота в чат и удаление бота из чата
self._dp.register_message_handler(self._receive_invite, content_types=[types.ContentType.NEW_CHAT_MEMBERS])
self._dp.register_message_handler(self._receive_left, content_types=[types.ContentType.LEFT_CHAT_MEMBER])
async def _receive_invite(self, message: types.Message):
for member in message.new_chat_members:
if member.id == message.bot.id:
chat, _ = await GroupChat.get_or_create(chat_id=message.chat.id,
defaults={"name": message.chat.full_name})
if chat not in await self._bot.group_chats.all():
await self._bot.group_chats.add(chat)
await self._bot.save()
break
async def _receive_left(self, message: types.Message):
if message.left_chat_member.id == message.bot.id:
chat = await self._bot.group_chats.filter(chat_id=message.chat.id).first()
if chat:
await self._bot.group_chats.remove(chat)
if self._bot.group_chat == chat:
self._bot.group_chat = None
await self._bot.save(update_fields=["group_chat"])