142 lines
4.8 KiB
Python
142 lines
4.8 KiB
Python
"""Основные команды бота."""
|
||
|
||
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("ник", 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("список", 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("кто", 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("помощь", 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("инфо", 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("рейтинг", 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("отписка", 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("подписка", 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)
|