from pydantic import BaseModel from pyrogram import Client, filters from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup from utils import filters as myfilters from utils.client import MyClient from utils.db import Depends, User as DBUser, get_user_query, inject from utils.i18n import tr as _ from utils.messages import message_handler class User(BaseModel): user: DBUser invites: int @Client.on_callback_query(filters.regex("cp_most-invitors") & myfilters.is_admin) @inject async def most_invitors( client: MyClient, query: CallbackQuery, user: DBUser = Depends(get_user_query) ) -> None: keyboard = InlineKeyboardMarkup( [ [InlineKeyboardButton(_("common.back", locale=user.language), "cp_manage-users")], ] ) pipeline = [ { "$group": { "_id": "$invited_by", "total_invites": {"$sum": 1}, } }, {"$sort": {"total_invites": -1}}, {"$limit": 10}, ] users = await DBUser.find().aggregate(pipeline).to_list() users = [ User( user=(await DBUser.find_one(DBUser.id == user["_id"].id)), invites=user["total_invites"], ) for user in users if user["_id"] ] msg = "\n".join( map( lambda u: _( "cp.user_invited", user_id=u.user.user_id, invites_count=u.invites, locale=user.language, ) + (" (🚫) " if u.user.is_banned else " ") + f"[📨](tg://openmessage?user_id={u.user.user_id})", users, ) ) await message_handler( query.edit_message_text, _("cp.most_invitors", locale=user.language) + f"\n{msg}", reply_markup=keyboard, )