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.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.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.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.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 )