(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 meta.LionBot import LionBot
babel = LocalBabel('statistics')
logger = logging.getLogger(__name__)
async def setup(bot: LionBot):

View File

@@ -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)]

View File

@@ -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)

View File

@@ -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,16 +261,19 @@ 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),
)
)
if ANKI_AVAILABLE:
options.append(
SelectOption(
label=t(_p(
'ui:leaderboard|menu;stats|item:anki',
"Anki Cards Reviewed"
)),
value=str(StatType.ANKI.value)
value=str(StatType.ANKI.value),
default=(self.stat_type == StatType.ANKI),
)
)
menu.options = options
@@ -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

View File

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