(stats): Assorted bugfixes and UI tweaks.
This commit is contained in:
2
src/gui
2
src/gui
Submodule src/gui updated: 0561b43b07...58e8d34b4b
@@ -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):
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user