"""Основные команды бота.""" from __future__ import annotations import logging from aiogram import Router from aiogram.enums import ChatMemberStatus from aiogram.filters import Command from aiogram.types import Message from bot.services import access, stats, subscriptions from bot.services import users as users_service from common.config import get_settings from common.eggs import is_egg_event_active from common.texts import system from common.texts.render import escape, format_tops, format_user_list, render from common.texts.store import get_text logger = logging.getLogger(__name__) router = Router(name="commands") @router.message(Command("ник", "nick", ignore_case=True)) async def set_nick_handler(message: Message) -> None: if not await access.check_user(message): return parts = (message.text or "").split() if len(parts) < 2: await message.reply(system.MSG_NICK_ERROR) return nick = parts[1] try: await users_service.set_nick(message.from_user.id, nick) await message.answer(render(system.MSG_NICK_SET, {"username": message.from_user.username, "nick": nick})) await message.delete() except Exception: logger.exception("Не удалось установить ник") await message.reply(system.MSG_NICK_ERROR) @router.message(Command("список", "list", ignore_case=True)) async def list_nicks_handler(message: Message) -> None: if not await access.check_user(message): return settings = get_settings() if message.chat.type == "private": allowed = True else: member = await message.bot.get_chat_member(settings.chat_id, message.from_user.id) allowed = member.status in {ChatMemberStatus.ADMINISTRATOR, ChatMemberStatus.CREATOR} if not allowed: await message.answer(system.MSG_LIST_PRIVATE_ONLY) return await users_service.register_from_message(message) nicks = await users_service.list_nicks() context = { "users_list": format_user_list([{"username": n.username, "nick": n.nick} for n in nicks]), "users_list_count": len(nicks), } await message.answer(render(await get_text("economy.nick_list"), context)) @router.message(Command("кто", "who", ignore_case=True)) async def get_nick_handler(message: Message) -> None: if not await access.check_user(message): return if message.reply_to_message is None or message.reply_to_message.from_user is None: await message.reply(system.MSG_REPLY_REQUIRED) return user_info = await users_service.get_user_info(message.reply_to_message.from_user.id) if user_info is None or not user_info.nick: await message.reply(system.MSG_NICK_EMPTY) return await message.reply(user_info.nick) @router.message(Command("помощь", "help", ignore_case=True)) async def help_handler(message: Message) -> None: if not await access.check_user(message): return await message.answer(await get_text("info.help")) @router.message(Command("инфо", "info", ignore_case=True)) async def info_handler(message: Message) -> None: if not await access.check_user(message): return user_info = await users_service.get_user_info(message.from_user.id) if user_info is None: await message.reply(system.MSG_NICK_ERROR) return context = { "username": user_info.username, "nick": user_info.nick_text, "title": user_info.title_text, "lvl": user_info.lvl, "exp": user_info.exp, "exp_max": user_info.exp_max, "money": user_info.money, "dt": user_info.dt, "msg_count": user_info.msg_count, "eggs": user_info.eggs, "eggs_line": ( f"🥚 Количество яичек: {escape(user_info.eggs)}" if is_egg_event_active(get_settings()) else "" ), } await message.answer(render(await get_text("info.profile"), context)) @router.message(Command("рейтинг", "top", ignore_case=True)) async def top_handler(message: Message) -> None: if not await access.check_user(message): return tops = await stats.top_users() context = {"tops": format_tops([{"nick": t.nick, "count": t.count} for t in tops])} await message.answer(render(await get_text("economy.top"), context)) @router.message(Command("отписка", "unsub", ignore_case=True)) async def unsubscribe_handler(message: Message) -> None: if not await access.check_user(message): return await subscriptions.unsubscribe(message.from_user.id) await message.reply(system.MSG_UNSUBSCRIBED) @router.message(Command("подписка", "sub", ignore_case=True)) async def subscribe_handler(message: Message) -> None: if not await access.check_user(message): return await subscriptions.subscribe(message.from_user.id) await message.reply(system.MSG_SUBSCRIBED)