rewrite: Profile, Stats, Leaderboard.
This commit is contained in:
91
src/modules/statistics/graphics/profile.py
Normal file
91
src/modules/statistics/graphics/profile.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from typing import Optional, TYPE_CHECKING
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import discord
|
||||
|
||||
from meta import LionBot
|
||||
from gui.cards import ProfileCard
|
||||
|
||||
from modules.ranks.cog import RankCog
|
||||
from modules.ranks.utils import format_stat_range
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ..cog import StatsCog
|
||||
|
||||
|
||||
async def get_profile_card(bot: LionBot, userid: int, guildid: int):
|
||||
ranks: Optional[RankCog] = bot.get_cog('RankCog')
|
||||
stats: Optional[StatsCog] = bot.get_cog('StatsCog')
|
||||
if ranks is None or stats is None:
|
||||
return
|
||||
|
||||
guild = bot.get_guild(guildid)
|
||||
if guild is None:
|
||||
return
|
||||
|
||||
lion = await bot.core.lions.fetch_member(guildid, userid)
|
||||
luser = lion.luser
|
||||
member = await lion.fetch_member()
|
||||
|
||||
if member:
|
||||
username = (member.display_name, '#' + str(member.discriminator))
|
||||
avatar = member.avatar.key
|
||||
else:
|
||||
username = (lion.data.display_name, "#????")
|
||||
avatar = luser.data.avatar_hash
|
||||
|
||||
profile_badges = await stats.data.ProfileTag.fetch_tags(guildid, userid)
|
||||
|
||||
# Fetch current and next guild rank
|
||||
season_rank = await ranks.get_member_rank(guildid, userid)
|
||||
rank_type = lion.lguild.config.get('rank_type').value
|
||||
crank = season_rank.current_rank
|
||||
nrank = season_rank.next_rank
|
||||
if crank:
|
||||
roleid = crank.roleid
|
||||
role = guild.get_role(roleid)
|
||||
name = role.name if role else str(role.id)
|
||||
minimum = crank.required
|
||||
maximum = nrank.required if nrank else None
|
||||
rangestr = format_stat_range(rank_type, minimum, maximum)
|
||||
if maximum is None:
|
||||
rangestr = f"≥ {rangestr}"
|
||||
current_rank = (name, rangestr)
|
||||
|
||||
if maximum:
|
||||
rank_progress = (season_rank.stat - minimum) / (maximum - minimum)
|
||||
else:
|
||||
rank_progress = 1
|
||||
else:
|
||||
current_rank = None
|
||||
rank_progress = 0
|
||||
|
||||
if nrank:
|
||||
roleid = nrank.roleid
|
||||
role = guild.get_role(roleid)
|
||||
name = role.name if role else str(role.id)
|
||||
minimum = nrank.required
|
||||
|
||||
guild_ranks = await ranks.get_guild_ranks(guildid)
|
||||
nnrank = next((rank for rank in guild_ranks if rank.required > nrank.required), None)
|
||||
maximum = nnrank.required if nnrank else None
|
||||
rangestr = format_stat_range(rank_type, minimum, maximum)
|
||||
if maximum is None:
|
||||
rangestr = f"≥ {rangestr}"
|
||||
next_rank = (name, rangestr)
|
||||
else:
|
||||
next_rank = None
|
||||
|
||||
achievements = (0, 1)
|
||||
|
||||
card = ProfileCard(
|
||||
user=username,
|
||||
avatar=(userid, avatar),
|
||||
coins=lion.data.coins, gems=luser.data.gems, gifts=0,
|
||||
profile_badges=profile_badges,
|
||||
achievements=achievements,
|
||||
current_rank=current_rank,
|
||||
rank_progress=rank_progress,
|
||||
next_rank=next_rank
|
||||
)
|
||||
return card
|
||||
Reference in New Issue
Block a user