DispelEvilBot/bot/handlers/commands.py

142 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Основные команды бота."""
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"<b>🥚 Количество яичек:</b> {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)