mirror of
https://github.com/civsocit/olgram.git
synced 2025-12-16 01:26:17 +00:00
Миграции
This commit is contained in:
65
extendedinstance/bot.py
Normal file
65
extendedinstance/bot.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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"])
|
||||
Reference in New Issue
Block a user