Edit on GitHub

src.handlers.user_service

  1import logging
  2from typing import Union
  3
  4from aiogram import Bot, F, Router
  5from aiogram.filters.command import Command
  6from aiogram.types import CallbackQuery, Message
  7
  8import text
  9from core import exceptions as exc
 10from core.err import bot_except
 11from db import utils
 12from db.models import UserActivity, UserData
 13from handlers.utils import find_user
 14from src.handlers.account import account_actions
 15
 16logger = logging.getLogger()
 17router = Router()
 18router.message.filter(F.chat.type == "private")
 19
 20
 21@router.message(Command("reg"))
 22@router.callback_query(F.data == "register_user")
 23@bot_except
 24async def register_user(trigger: Union[Message, CallbackQuery], bot: Bot):
 25    try:
 26        # Attempt to add a new user to the database using their ID and full name
 27        user_data = await utils.add_user(
 28            trigger.from_user.id, trigger.from_user.full_name
 29        )
 30    except exc.UniquenessError as e:
 31        # Handle uniqueness error (e.g., user already exists)
 32        await trigger.answer(text=e.args[0], show_alert=True)
 33    except exc.DatabaseError:
 34        # Handle general database errors
 35        await trigger.answer(text=text.DB_ERROR, show_alert=True)
 36    else:
 37        # Notify the user of successful registration
 38        await trigger.answer(text="Поздравляю, регистрация успешна!", show_alert=True)
 39        # Perform additional account actions after registration
 40        await account_actions(
 41            getattr(trigger, "message", trigger),
 42            user_data=user_data,
 43            usr_id=trigger.from_user.id,
 44        )
 45    finally:
 46        # Delete the original message after processing to keep the chat clean
 47        await bot.delete_message(
 48            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
 49        )
 50
 51
 52@router.message(Command("freeze"))
 53@router.callback_query(F.data == "freeze_account")
 54@bot_except
 55async def freeze_user(trigger: Union[Message, CallbackQuery], bot: Bot):
 56    try:
 57        user_data: UserData = await utils.get_user(trigger.from_user.id)
 58        match user_data.active:
 59            case UserActivity.freezed:
 60                await trigger.answer(text="Ваш аккаунт уже заморожен")
 61                return
 62            case UserActivity.banned:
 63                await trigger.answer(text="Ваш аккаунт забанен")
 64                return
 65            case UserActivity.deleted:
 66                await trigger.answer(text="Ваш аккаунт удален")
 67                return
 68            case _:
 69                await utils.freeze_user(trigger.from_user.id)
 70    except exc.DatabaseError:
 71        await trigger.answer(text=text.DB_ERROR, show_alert=True)
 72    else:
 73        await trigger.answer(text="Посылаю запрос на заморозку учетной записи...")
 74    finally:
 75        await bot.delete_message(
 76            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
 77        )
 78
 79
 80@router.message(Command("recover"))
 81@router.callback_query(F.data == "recover_account")
 82@bot_except
 83async def recover_user(trigger: Union[Message, CallbackQuery], bot: Bot):
 84    try:
 85        user_data: UserData = await utils.get_user(trigger.from_user.id)
 86        match user_data.active:
 87            case UserActivity.banned:
 88                await trigger.answer(text="Ваш аккаунт забанен")
 89                return
 90            case UserActivity.deleted:
 91                await trigger.answer(text="Ваш аккаунт удален")
 92                return
 93            case UserActivity.freezed:
 94                user_data = await utils.recover_user(trigger.from_user.id)
 95            case _:
 96                await trigger.answer(text="Ваш аккаунт уже разморожен")
 97                return
 98    except exc.DatabaseError:
 99        # Handle database errors during recovery
100        await trigger.answer(text=text.DB_ERROR, show_alert=True)
101    else:
102        # Notify the user that a recovery request is being processed
103        await trigger.answer(text="Посылаю запрос на разморозку учетной записи...")
104        # Perform additional account actions after recovery
105        await account_actions(
106            getattr(trigger, "message", trigger),
107            user_data=user_data,
108            usr_id=trigger.from_user.id,
109        )
110    finally:
111        # Delete the original message after processing to keep the chat clean
112        await bot.delete_message(
113            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
114        )
115
116
117@router.message(Command("mute"))
118@router.callback_query(F.data == "user_mute_toggle")
119@bot_except
120async def mute_toggle(trigger: Union[Message, CallbackQuery], bot: Bot):
121    user_data: UserData = await find_user(trigger)
122    if not user_data:
123        return
124    elif user_data.stage < 2:
125        await getattr(trigger, "message", trigger).answer(
126            "Команда заблокирована. Выберите тариф от 'Расширенного' или выше."
127        )
128        return
129
130    try:
131        await utils.mute_user(trigger.from_user.id)
132
133    except exc.DatabaseError:
134        await trigger.answer(text=text.DB_ERROR, show_alert=True)
135
136    else:
137        if user_data.mute:
138            mute_status = "включены"
139        else:
140            mute_status = "отключены"
141
142        await getattr(trigger, "message", trigger).answer(
143            f"Ваши уведомления <b>{mute_status}</b>"
144        )
logger = <RootLogger root (DEBUG)>
router = <Router '0x7f23dac8c140'>
@router.message(Command('reg'))
@router.callback_query(F.data == 'register_user')
@bot_except
async def register_user( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], bot: aiogram.client.bot.Bot):
22@router.message(Command("reg"))
23@router.callback_query(F.data == "register_user")
24@bot_except
25async def register_user(trigger: Union[Message, CallbackQuery], bot: Bot):
26    try:
27        # Attempt to add a new user to the database using their ID and full name
28        user_data = await utils.add_user(
29            trigger.from_user.id, trigger.from_user.full_name
30        )
31    except exc.UniquenessError as e:
32        # Handle uniqueness error (e.g., user already exists)
33        await trigger.answer(text=e.args[0], show_alert=True)
34    except exc.DatabaseError:
35        # Handle general database errors
36        await trigger.answer(text=text.DB_ERROR, show_alert=True)
37    else:
38        # Notify the user of successful registration
39        await trigger.answer(text="Поздравляю, регистрация успешна!", show_alert=True)
40        # Perform additional account actions after registration
41        await account_actions(
42            getattr(trigger, "message", trigger),
43            user_data=user_data,
44            usr_id=trigger.from_user.id,
45        )
46    finally:
47        # Delete the original message after processing to keep the chat clean
48        await bot.delete_message(
49            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
50        )
@router.message(Command('freeze'))
@router.callback_query(F.data == 'freeze_account')
@bot_except
async def freeze_user( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], bot: aiogram.client.bot.Bot):
53@router.message(Command("freeze"))
54@router.callback_query(F.data == "freeze_account")
55@bot_except
56async def freeze_user(trigger: Union[Message, CallbackQuery], bot: Bot):
57    try:
58        user_data: UserData = await utils.get_user(trigger.from_user.id)
59        match user_data.active:
60            case UserActivity.freezed:
61                await trigger.answer(text="Ваш аккаунт уже заморожен")
62                return
63            case UserActivity.banned:
64                await trigger.answer(text="Ваш аккаунт забанен")
65                return
66            case UserActivity.deleted:
67                await trigger.answer(text="Ваш аккаунт удален")
68                return
69            case _:
70                await utils.freeze_user(trigger.from_user.id)
71    except exc.DatabaseError:
72        await trigger.answer(text=text.DB_ERROR, show_alert=True)
73    else:
74        await trigger.answer(text="Посылаю запрос на заморозку учетной записи...")
75    finally:
76        await bot.delete_message(
77            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
78        )
@router.message(Command('recover'))
@router.callback_query(F.data == 'recover_account')
@bot_except
async def recover_user( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], bot: aiogram.client.bot.Bot):
 81@router.message(Command("recover"))
 82@router.callback_query(F.data == "recover_account")
 83@bot_except
 84async def recover_user(trigger: Union[Message, CallbackQuery], bot: Bot):
 85    try:
 86        user_data: UserData = await utils.get_user(trigger.from_user.id)
 87        match user_data.active:
 88            case UserActivity.banned:
 89                await trigger.answer(text="Ваш аккаунт забанен")
 90                return
 91            case UserActivity.deleted:
 92                await trigger.answer(text="Ваш аккаунт удален")
 93                return
 94            case UserActivity.freezed:
 95                user_data = await utils.recover_user(trigger.from_user.id)
 96            case _:
 97                await trigger.answer(text="Ваш аккаунт уже разморожен")
 98                return
 99    except exc.DatabaseError:
100        # Handle database errors during recovery
101        await trigger.answer(text=text.DB_ERROR, show_alert=True)
102    else:
103        # Notify the user that a recovery request is being processed
104        await trigger.answer(text="Посылаю запрос на разморозку учетной записи...")
105        # Perform additional account actions after recovery
106        await account_actions(
107            getattr(trigger, "message", trigger),
108            user_data=user_data,
109            usr_id=trigger.from_user.id,
110        )
111    finally:
112        # Delete the original message after processing to keep the chat clean
113        await bot.delete_message(
114            trigger.from_user.id, getattr(trigger, "message", trigger).message_id
115        )
@router.message(Command('mute'))
@router.callback_query(F.data == 'user_mute_toggle')
@bot_except
async def mute_toggle( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], bot: aiogram.client.bot.Bot):
118@router.message(Command("mute"))
119@router.callback_query(F.data == "user_mute_toggle")
120@bot_except
121async def mute_toggle(trigger: Union[Message, CallbackQuery], bot: Bot):
122    user_data: UserData = await find_user(trigger)
123    if not user_data:
124        return
125    elif user_data.stage < 2:
126        await getattr(trigger, "message", trigger).answer(
127            "Команда заблокирована. Выберите тариф от 'Расширенного' или выше."
128        )
129        return
130
131    try:
132        await utils.mute_user(trigger.from_user.id)
133
134    except exc.DatabaseError:
135        await trigger.answer(text=text.DB_ERROR, show_alert=True)
136
137    else:
138        if user_data.mute:
139            mute_status = "включены"
140        else:
141            mute_status = "отключены"
142
143        await getattr(trigger, "message", trigger).answer(
144            f"Ваши уведомления <b>{mute_status}</b>"
145        )