mirror of
https://github.com/civsocit/olgram.git
synced 2023-07-22 01:29:12 +03:00
66 lines
2.8 KiB
Python
66 lines
2.8 KiB
Python
|
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"])
|