(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 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):
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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,18 +261,21 @@ 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),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
options.append(
|
if ANKI_AVAILABLE:
|
||||||
SelectOption(
|
options.append(
|
||||||
label=t(_p(
|
SelectOption(
|
||||||
'ui:leaderboard|menu;stats|item:anki',
|
label=t(_p(
|
||||||
"Anki Cards Reviewed"
|
'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
|
menu.options = options
|
||||||
|
|
||||||
@button(label="This Season", style=ButtonStyle.grey)
|
@button(label="This Season", style=ButtonStyle.grey)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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,10 +56,12 @@ 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)
|
||||||
WEEKLY_ANKI = (2, PeriodType.WEEKLY, StatType.ANKI)
|
if 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)
|
||||||
MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI)
|
if ANKI:
|
||||||
|
MONTHLY_ANKI = (5, PeriodType.MONTHLY, StatType.ANKI)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_value(cls, value: int) -> 'StatPage':
|
def from_value(cls, value: int) -> 'StatPage':
|
||||||
|
|||||||
Reference in New Issue
Block a user