DispelEvilBot/bot/services/users.py

68 lines
2.0 KiB
Python

"""Сервис пользователей."""
from __future__ import annotations
from aiogram.types import ChatMemberUpdated, Message, User
from common.models import NickEntry, UserInfo
from common.repositories import users_repo
def _user_fields(user: User) -> tuple[int, str, str, str]:
return (
int(user.id),
user.username or "",
user.first_name or "",
user.last_name or "",
)
async def register_from_message(message: Message) -> None:
"""Зарегистрировать/обновить автора сообщения."""
user = message.from_user
if user is None or user.is_bot:
return
await users_repo.add_user(*_user_fields(user))
async def register_from_event(event: ChatMemberUpdated) -> None:
"""Зарегистрировать/обновить участника, вошедшего в чат."""
user = event.new_chat_member.user
if user.is_bot:
return
await users_repo.add_user(*_user_fields(user))
async def set_nick(id_user: int, nick: str) -> None:
await users_repo.add_nick(id_user, nick)
async def delete_user(id_user: int) -> None:
await users_repo.del_user_by_id(id_user)
async def list_nicks() -> list[NickEntry]:
rows = await users_repo.get_nick_list()
return [NickEntry(username=row.get("username"), nick=row.get("nick")) for row in rows]
async def list_subscribers() -> list[dict]:
return await users_repo.get_nick_list_subscribe()
async def get_user_info(id_user: int) -> UserInfo | None:
row = await users_repo.get_info_by_id(id_user)
if not row:
return None
return UserInfo(
username=row.get("username"),
nick=row.get("nick"),
title=row.get("title"),
lvl=int(row.get("lvl") or 0),
exp=int(row.get("expr") or 0),
money=int(row.get("mny") or 0),
dt=row.get("dt") or "",
msg_count=int(row.get("msg_count") or 0),
eggs=int(row.get("eggs_count") or 0),
)