82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from typing import TYPE_CHECKING, Sequence
|
|
|
|
import discord
|
|
import discord.ext.commands as commands
|
|
from loguru import logger
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
from main import Bot
|
|
|
|
|
|
def build_table_embed(*columns: Sequence[object], name: str, description: str, **kwargs) -> discord.Embed:
|
|
"""First value of one column is a header"""
|
|
|
|
embed = discord.Embed(
|
|
title=name,
|
|
description=description,
|
|
**kwargs
|
|
)
|
|
|
|
for column in columns:
|
|
column_iter = iter(column)
|
|
embed.add_field(name=next(column_iter), value='\n'.join(str(cell) for cell in column_iter), inline=True)
|
|
|
|
return embed
|
|
|
|
|
|
class Frontend(commands.Cog):
|
|
def __init__(self, bot: 'Bot'):
|
|
self.bot = bot
|
|
|
|
@discord.app_commands.command()
|
|
async def stats(self, interaction: discord.Interaction, user: discord.User | None):
|
|
"""
|
|
Show how many hours a user spent in games per game (default - You)
|
|
|
|
:param interaction:
|
|
:param user: User for who we will get stats, You by default
|
|
"""
|
|
|
|
_user = interaction.user if user is None else user
|
|
|
|
logger.trace(f'Starting my_stats for {_user}')
|
|
stats: dict[str, int] = self.bot.activity_tracker.user_breakdown(_user.id)
|
|
if len(stats) == 0:
|
|
await interaction.response.send_message('No records for such user')
|
|
return
|
|
|
|
embed = build_table_embed(
|
|
('Games', *stats.keys()),
|
|
('Hours spent', *stats.values()),
|
|
name=f'Gaming stats for {str(_user)}',
|
|
description=f'Totally played {sum(stats.values())} hours'
|
|
)
|
|
await interaction.response.send_message(embed=embed)
|
|
|
|
@discord.app_commands.command()
|
|
async def top_users(
|
|
self,
|
|
interaction: discord.Interaction
|
|
# ,last_days_count: discord.app_commands.Range[int, 1, None]
|
|
):
|
|
"""
|
|
Show top of players by spent in games hours
|
|
|
|
:param interaction:
|
|
:param last_days_count: Show stats for last number of days, i.e. for last 14 days (all time for default)
|
|
:return:
|
|
"""
|
|
data = self.bot.activity_tracker.top_users(0)
|
|
embed = build_table_embed(
|
|
('Username', *(value[0] for value in data.values())),
|
|
('Spent hours', *(value[1] for value in data.values())),
|
|
name='Top users by spent in games',
|
|
description='Limited up to 50 entries'
|
|
)
|
|
await interaction.response.send_message(embed=embed)
|
|
|
|
|
|
async def setup(bot: 'Bot'):
|
|
await bot.add_cog(Frontend(bot))
|