(stats): Assorted bugfixes and UI tweaks.

This commit is contained in:
2023-07-18 15:25:46 +03:00
parent f4769b407e
commit d4800f1db6
6 changed files with 55 additions and 31 deletions

Submodule src/gui updated: 0561b43b07...58e8d34b4b

View File

@@ -1,7 +1,9 @@
import logging
from babel.translator import LocalBabel from babel.translator import LocalBabel
from meta.LionBot import LionBot from meta.LionBot import LionBot
babel = LocalBabel('statistics') babel = LocalBabel('statistics')
logger = logging.getLogger(__name__)
async def setup(bot: LionBot): async def setup(bot: LionBot):

View File

@@ -7,6 +7,7 @@ from gui.cards import WeeklyGoalCard, MonthlyGoalCard
from gui.base import CardMode from gui.base import CardMode
from tracking.text.data import TextTrackerData from tracking.text.data import TextTrackerData
from .. import logger
from ..data import StatsData from ..data import StatsData
from ..lib import extract_weekid, extract_monthid, apply_week_offset, apply_month_offset 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()) goals = await goal_model.fetch(*key.values())
if not goals: if not goals:
from collections import defaultdict from collections import defaultdict
goals = defaultdict(lambda: -1) goals = defaultdict(lambda: 0)
task_rows = await tasks_model.fetch_where(**key) task_rows = await tasks_model.fetch_where(**key)
tasks = [(i, row.content, bool(row.completed)) for i, row in enumerate(task_rows)] tasks = [(i, row.content, bool(row.completed)) for i, row in enumerate(task_rows)]

View File

@@ -21,20 +21,15 @@ async def get_leaderboard_card(
names = {} names = {}
missing = [] missing = []
for userid, _, _ in entry_data: for userid, _, _ in entry_data:
hash = name = None
if guild and (member := guild.get_member(userid)): if guild and (member := guild.get_member(userid)):
hash = member.avatar.key avatars[userid] = member.avatar.key if member.avatar else None
name = member.display_name names[userid] = member.display_name
elif (user := bot.get_user(userid)): elif (user := bot.get_user(userid)):
hash = user.avatar.key avatars[userid] = user.avatar.key if user.avatar else None
name = user.name names[userid] = user.display_name
elif (user_data := bot.core.data.User._cache_.get((userid,))): elif (user_data := bot.core.data.User._cache_.get((userid,))):
hash = user_data.avatar_hash avatars[userid] = user_data.avatar_hash
name = user_data.name names[userid] = user_data.name
if hash:
avatars[userid] = hash
names[userid] = name or 'Unknown'
else: else:
missing.append(userid) missing.append(userid)

View File

@@ -19,8 +19,11 @@ from .. import babel
from .base import StatsUI from .base import StatsUI
_p = babel._p _p = babel._p
ANKI_AVAILABLE = False
class LBPeriod(IntEnum): class LBPeriod(IntEnum):
SEASON = 0 SEASON = 0
@@ -125,6 +128,9 @@ class LeaderboardUI(StatsUI):
data = await self.data.MemberExp.leaderboard_since( data = await self.data.MemberExp.leaderboard_since(
self.guildid, period_start self.guildid, period_start
) )
else:
# TODO: Anki data
...
# TODO: Handle removing members in invisible roles # TODO: Handle removing members in invisible roles
return data return data
@@ -233,7 +239,8 @@ class LeaderboardUI(StatsUI):
'ui:leaderboard|menu:stats|item:voice', 'ui:leaderboard|menu:stats|item:voice',
"Voice Activity" "Voice Activity"
)), )),
value=str(StatType.VOICE.value) value=str(StatType.VOICE.value),
default=(self.stat_type == StatType.VOICE),
) )
) )
else: else:
@@ -243,7 +250,8 @@ class LeaderboardUI(StatsUI):
'ui:leaderboard|menu:stats|item:study', 'ui:leaderboard|menu:stats|item:study',
"Study Statistics" "Study Statistics"
)), )),
value=str(StatType.VOICE.value) value=str(StatType.VOICE.value),
default=(self.stat_type == StatType.VOICE),
) )
) )
@@ -253,16 +261,19 @@ class LeaderboardUI(StatsUI):
'ui:leaderboard|menu:stats|item:message', 'ui:leaderboard|menu:stats|item:message',
"Message Activity" "Message Activity"
)), )),
value=str(StatType.TEXT.value) value=str(StatType.TEXT.value),
default=(self.stat_type == StatType.TEXT),
) )
) )
if ANKI_AVAILABLE:
options.append( options.append(
SelectOption( SelectOption(
label=t(_p( label=t(_p(
'ui:leaderboard|menu;stats|item:anki', 'ui:leaderboard|menu;stats|item:anki',
"Anki Cards Reviewed" "Anki Cards Reviewed"
)), )),
value=str(StatType.ANKI.value) value=str(StatType.ANKI.value),
default=(self.stat_type == StatType.ANKI),
) )
) )
menu.options = options menu.options = options
@@ -411,16 +422,28 @@ class LeaderboardUI(StatsUI):
) )
else: else:
t = self.bot.translator.t 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( embed = discord.Embed(
colour=discord.Colour.orange(), colour=discord.Colour.orange(),
title=t(_p( title=t(_p(
'ui:leaderboard|message:empty|title', 'ui:leaderboard|message:empty|title',
"Empty Leaderboard!" "Leaderboard Empty!"
)), )),
description=t(_p( description=empty_description
'ui:leaderboard|message:empty|desc',
"There has been no activity of this type in this period!"
))
) )
args = MessageArgs(embed=embed, files=[]) args = MessageArgs(embed=embed, files=[])
return args return args

View File

@@ -36,6 +36,7 @@ from .base import StatsUI
_p = babel._p _p = babel._p
ANKI = False
GoalCard: TypeAlias = Union[WeeklyGoalCard, MonthlyGoalCard] GoalCard: TypeAlias = Union[WeeklyGoalCard, MonthlyGoalCard]
StatsCard: TypeAlias = Union[WeeklyStatsCard, MonthlyStatsCard] StatsCard: TypeAlias = Union[WeeklyStatsCard, MonthlyStatsCard]
@@ -55,9 +56,11 @@ class StatType(IntEnum):
class StatPage(Enum): class StatPage(Enum):
WEEKLY_VOICE = (0, PeriodType.WEEKLY, StatType.VOICE) WEEKLY_VOICE = (0, PeriodType.WEEKLY, StatType.VOICE)
WEEKLY_TEXT = (1, PeriodType.WEEKLY, StatType.TEXT) WEEKLY_TEXT = (1, PeriodType.WEEKLY, StatType.TEXT)
if ANKI:
WEEKLY_ANKI = (2, PeriodType.WEEKLY, StatType.ANKI) WEEKLY_ANKI = (2, PeriodType.WEEKLY, StatType.ANKI)
MONTHLY_VOICE = (3, PeriodType.MONTHLY, StatType.VOICE) MONTHLY_VOICE = (3, PeriodType.MONTHLY, StatType.VOICE)
MONTHLY_TEXT = (4, PeriodType.MONTHLY, StatType.TEXT) MONTHLY_TEXT = (4, PeriodType.MONTHLY, StatType.TEXT)
if ANKI:
MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI) MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI)
@classmethod @classmethod