rewrite: Initial statistics UI.

This commit is contained in:
2023-03-02 19:01:14 +02:00
parent 8f127af9d0
commit 7dc361b1b9
19 changed files with 2283 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
from typing import Optional
from datetime import timedelta
from data import ORDER
from meta import LionBot
from gui.cards import WeeklyStatsCard
from gui.base import CardMode
from ..data import StatsData
async def get_weekly_card(bot: LionBot, userid: int, guildid: int, offset: int, mode: CardMode) -> WeeklyStatsCard:
data: StatsData = bot.get_cog('StatsCog').data
lion = await bot.core.lions.fetch(guildid, userid)
today = lion.today
week_start = today - timedelta(days=today.weekday()) - timedelta(weeks=offset)
days = [week_start + timedelta(i) for i in range(-7, 7 if offset else (today.weekday() + 1))]
# TODO: Select statistics model based on mode
model = data.VoiceSessionStats
# Get user session rows
query = model.table.select_where()
if guildid:
query = query.where(userid=userid, guildid=guildid).order_by('start_time', ORDER.ASC)
else:
query = query.where(userid=userid)
sessions = await query
# Extract quantities per-day
day_stats = await model.study_times_between(guildid or None, userid, *days)
for i in range(14 - len(day_stats)):
day_stats.append(0)
# Get member profile
if member := await lion.get_member():
username = (member.display_name, member.discriminator)
else:
username = (lion.data.display_name, '#????')
card = WeeklyStatsCard(
user=username,
timezone=str(lion.timezone),
now=lion.now.timestamp(),
week=week_start.timestamp(),
daily=tuple(map(lambda n: n/3600, day_stats)),
sessions=[
(int(session['start_time'].timestamp()), int(session['end_time'].timestamp()))
for session in sessions
],
skin={'mode': mode}
)
return card