diff --git a/tg/tasks.py b/tg/tasks.py index 02617f4..4f6c34f 100644 --- a/tg/tasks.py +++ b/tg/tasks.py @@ -3,6 +3,8 @@ import traceback from asyncio import sleep from aiogram import Bot +from aiogram.exceptions import TelegramBadRequest +from aiogram.types import ChatMemberBanned, ChatMemberLeft from aiogram.utils.formatting import Bold from messages import * @@ -10,6 +12,28 @@ import tg.tg_database as database from tg.handlers.user import format_rating +async def cleanup_users(bot: Bot): + for chat in database.DB.get_chats(): + if chat['active'] == 0: + continue + + chat_id = chat['id'] + + for user in database.DB.get_top_silent(chat_id=chat_id, threshold_days=14): + user_id = user['user_id'] + found = False + try: + info = await bot.get_chat_member(chat_id, user_id) + if not isinstance(info, ChatMemberLeft) and not isinstance(info, ChatMemberBanned): + found = True + except TelegramBadRequest: + pass + + if not found: + database.DB.delete_user(chat_id, user_id) + print(f'Из чата (id={chat_id}) удален пользователь (id={user_id})') + + async def reset_counters(reset_month: bool, bot: Bot): database.DB.reset_messages_today() print('Дневные счетчики сброшены.') @@ -55,6 +79,7 @@ async def daily_maintenance_task(bot: Bot): await wait_until(target_datetime) try: + await cleanup_users(bot) await reset_counters(target_datetime.day == 1, bot) except Exception: print(traceback.format_exc()) diff --git a/vk/tasks.py b/vk/tasks.py index 97f68d0..5d76549 100644 --- a/vk/tasks.py +++ b/vk/tasks.py @@ -9,6 +9,27 @@ import vk.vk_database as database from vk.handlers.user import format_rating +async def cleanup_users(api: API): + for chat in database.DB.get_chats(): + if chat['active'] == 0: + continue + + chat_id = chat['id'] + members = await api.messages.get_conversation_members(peer_id=chat_id, extended=False) + + for user in database.DB.get_top_silent(chat_id=chat_id, threshold_days=14): + user_id = user['user_id'] + found = False + for item in members.items: + if item.member_id == user_id: + found = True + break + + if not found: + database.DB.delete_user(chat_id, user_id) + print(f'Из чата (id={chat_id}) удален пользователь (id={user_id})') + + async def reset_counters(reset_month: bool, api: API): database.DB.reset_messages_today() print('Дневные счетчики сброшены.') @@ -91,6 +112,7 @@ async def daily_maintenance_task(api: API): await wait_until(target_datetime) try: + await cleanup_users(api) await reset_counters(target_datetime.day == 1, api) await check_birthdays(api) except Exception: