From d4800f1db620379fc2ae8140447f7f09d4309ee3 Mon Sep 17 00:00:00 2001 From: Conatum Date: Tue, 18 Jul 2023 15:25:46 +0300 Subject: [PATCH] (stats): Assorted bugfixes and UI tweaks. --- src/gui | 2 +- src/modules/statistics/__init__.py | 2 + src/modules/statistics/graphics/goals.py | 3 +- .../statistics/graphics/leaderboard.py | 17 ++---- src/modules/statistics/ui/leaderboard.py | 55 +++++++++++++------ src/modules/statistics/ui/weeklymonthly.py | 7 ++- 6 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/gui b/src/gui index 0561b43b..58e8d34b 160000 --- a/src/gui +++ b/src/gui @@ -1 +1 @@ -Subproject commit 0561b43b07a87ef6bdee8ff01f78de73155576dc +Subproject commit 58e8d34b4bb4dd9e212ea845862884e60eb7d14d diff --git a/src/modules/statistics/__init__.py b/src/modules/statistics/__init__.py index 9c14b34d..b566fcfc 100644 --- a/src/modules/statistics/__init__.py +++ b/src/modules/statistics/__init__.py @@ -1,7 +1,9 @@ +import logging from babel.translator import LocalBabel from meta.LionBot import LionBot babel = LocalBabel('statistics') +logger = logging.getLogger(__name__) async def setup(bot: LionBot): diff --git a/src/modules/statistics/graphics/goals.py b/src/modules/statistics/graphics/goals.py index 36ab5662..6ed8fc22 100644 --- a/src/modules/statistics/graphics/goals.py +++ b/src/modules/statistics/graphics/goals.py @@ -7,6 +7,7 @@ from gui.cards import WeeklyGoalCard, MonthlyGoalCard from gui.base import CardMode from tracking.text.data import TextTrackerData +from .. import logger from ..data import StatsData from ..lib import extract_weekid, extract_monthid, apply_week_offset, apply_month_offset @@ -49,7 +50,7 @@ async def get_goals_card( goals = await goal_model.fetch(*key.values()) if not goals: from collections import defaultdict - goals = defaultdict(lambda: -1) + goals = defaultdict(lambda: 0) task_rows = await tasks_model.fetch_where(**key) tasks = [(i, row.content, bool(row.completed)) for i, row in enumerate(task_rows)] diff --git a/src/modules/statistics/graphics/leaderboard.py b/src/modules/statistics/graphics/leaderboard.py index 8e3ba7f4..36632634 100644 --- a/src/modules/statistics/graphics/leaderboard.py +++ b/src/modules/statistics/graphics/leaderboard.py @@ -21,20 +21,15 @@ async def get_leaderboard_card( names = {} missing = [] for userid, _, _ in entry_data: - hash = name = None if guild and (member := guild.get_member(userid)): - hash = member.avatar.key - name = member.display_name + avatars[userid] = member.avatar.key if member.avatar else None + names[userid] = member.display_name elif (user := bot.get_user(userid)): - hash = user.avatar.key - name = user.name + avatars[userid] = user.avatar.key if user.avatar else None + names[userid] = user.display_name elif (user_data := bot.core.data.User._cache_.get((userid,))): - hash = user_data.avatar_hash - name = user_data.name - - if hash: - avatars[userid] = hash - names[userid] = name or 'Unknown' + avatars[userid] = user_data.avatar_hash + names[userid] = user_data.name else: missing.append(userid) diff --git a/src/modules/statistics/ui/leaderboard.py b/src/modules/statistics/ui/leaderboard.py index f7a7201a..4d9668d1 100644 --- a/src/modules/statistics/ui/leaderboard.py +++ b/src/modules/statistics/ui/leaderboard.py @@ -19,8 +19,11 @@ from .. import babel from .base import StatsUI + _p = babel._p +ANKI_AVAILABLE = False + class LBPeriod(IntEnum): SEASON = 0 @@ -125,6 +128,9 @@ class LeaderboardUI(StatsUI): data = await self.data.MemberExp.leaderboard_since( self.guildid, period_start ) + else: + # TODO: Anki data + ... # TODO: Handle removing members in invisible roles return data @@ -233,7 +239,8 @@ class LeaderboardUI(StatsUI): 'ui:leaderboard|menu:stats|item:voice', "Voice Activity" )), - value=str(StatType.VOICE.value) + value=str(StatType.VOICE.value), + default=(self.stat_type == StatType.VOICE), ) ) else: @@ -243,7 +250,8 @@ class LeaderboardUI(StatsUI): 'ui:leaderboard|menu:stats|item:study', "Study Statistics" )), - value=str(StatType.VOICE.value) + value=str(StatType.VOICE.value), + default=(self.stat_type == StatType.VOICE), ) ) @@ -253,18 +261,21 @@ class LeaderboardUI(StatsUI): 'ui:leaderboard|menu:stats|item:message', "Message Activity" )), - value=str(StatType.TEXT.value) + value=str(StatType.TEXT.value), + default=(self.stat_type == StatType.TEXT), ) ) - options.append( - SelectOption( - label=t(_p( - 'ui:leaderboard|menu;stats|item:anki', - "Anki Cards Reviewed" - )), - value=str(StatType.ANKI.value) + if ANKI_AVAILABLE: + options.append( + SelectOption( + label=t(_p( + 'ui:leaderboard|menu;stats|item:anki', + "Anki Cards Reviewed" + )), + value=str(StatType.ANKI.value), + default=(self.stat_type == StatType.ANKI), + ) ) - ) menu.options = options @button(label="This Season", style=ButtonStyle.grey) @@ -411,16 +422,28 @@ class LeaderboardUI(StatsUI): ) else: t = self.bot.translator.t + if self.stat_type is StatType.VOICE: + empty_description = t(_p( + 'ui:leaderboard|mode:voice|message:empty|desc', + "There has been no voice activity in this period!" + )) + elif self.stat_type is StatType.TEXT: + empty_description = t(_p( + 'ui:leaderboard|mode:text|message:empty|desc', + "There has been no message activity in this period!" + )) + elif self.stat_type is StatType.ANKI: + empty_description = t(_p( + 'ui:leaderboard|mode:anki|message:empty|desc', + "There have been no Anki cards reviewed in this period!" + )) embed = discord.Embed( colour=discord.Colour.orange(), title=t(_p( 'ui:leaderboard|message:empty|title', - "Empty Leaderboard!" + "Leaderboard Empty!" )), - description=t(_p( - 'ui:leaderboard|message:empty|desc', - "There has been no activity of this type in this period!" - )) + description=empty_description ) args = MessageArgs(embed=embed, files=[]) return args diff --git a/src/modules/statistics/ui/weeklymonthly.py b/src/modules/statistics/ui/weeklymonthly.py index eaab3bc8..cd86dc73 100644 --- a/src/modules/statistics/ui/weeklymonthly.py +++ b/src/modules/statistics/ui/weeklymonthly.py @@ -36,6 +36,7 @@ from .base import StatsUI _p = babel._p +ANKI = False GoalCard: TypeAlias = Union[WeeklyGoalCard, MonthlyGoalCard] StatsCard: TypeAlias = Union[WeeklyStatsCard, MonthlyStatsCard] @@ -55,10 +56,12 @@ class StatType(IntEnum): class StatPage(Enum): WEEKLY_VOICE = (0, PeriodType.WEEKLY, StatType.VOICE) WEEKLY_TEXT = (1, PeriodType.WEEKLY, StatType.TEXT) - WEEKLY_ANKI = (2, PeriodType.WEEKLY, StatType.ANKI) + if ANKI: + WEEKLY_ANKI = (2, PeriodType.WEEKLY, StatType.ANKI) MONTHLY_VOICE = (3, PeriodType.MONTHLY, StatType.VOICE) MONTHLY_TEXT = (4, PeriodType.MONTHLY, StatType.TEXT) - MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI) + if ANKI: + MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI) @classmethod def from_value(cls, value: int) -> 'StatPage':