feat(counters): Add counterslb twitch command.
This commit is contained in:
@@ -3,6 +3,8 @@ from enum import Enum
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from data.base import RawExpr
|
||||||
|
from data.columns import Column
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands as cmds
|
from discord.ext import commands as cmds
|
||||||
from discord import app_commands as appcmds
|
from discord import app_commands as appcmds
|
||||||
@@ -165,7 +167,8 @@ class CounterCog(LionCog):
|
|||||||
)
|
)
|
||||||
disc_cmds.append(
|
disc_cmds.append(
|
||||||
cmds.hybrid_command(
|
cmds.hybrid_command(
|
||||||
name=row.name
|
name=row.name,
|
||||||
|
with_app_command=False,
|
||||||
)(self.discord_callback(counter_cb))
|
)(self.discord_callback(counter_cb))
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -177,18 +180,20 @@ class CounterCog(LionCog):
|
|||||||
)
|
)
|
||||||
disc_cmds.append(
|
disc_cmds.append(
|
||||||
cmds.hybrid_command(
|
cmds.hybrid_command(
|
||||||
name=row.lbname
|
name=row.lbname,
|
||||||
|
with_app_command=False,
|
||||||
)(self.discord_callback(lb_cb))
|
)(self.discord_callback(lb_cb))
|
||||||
)
|
)
|
||||||
if row.undoname:
|
if row.undoname:
|
||||||
twitch_cmds.append(
|
twitch_cmds.append(
|
||||||
commands.command(
|
commands.command(
|
||||||
name=row.undoname
|
name=row.undoname,
|
||||||
)(self.twitch_callback(undo_cb))
|
)(self.twitch_callback(undo_cb))
|
||||||
)
|
)
|
||||||
disc_cmds.append(
|
disc_cmds.append(
|
||||||
cmds.hybrid_command(
|
cmds.hybrid_command(
|
||||||
name=row.undoname
|
name=row.undoname,
|
||||||
|
with_app_command=False,
|
||||||
)(self.discord_callback(undo_cb))
|
)(self.discord_callback(undo_cb))
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -370,6 +375,51 @@ class CounterCog(LionCog):
|
|||||||
await ctx.reply("Counter userid->profileid migration done.")
|
await ctx.reply("Counter userid->profileid migration done.")
|
||||||
|
|
||||||
# Counters commands
|
# Counters commands
|
||||||
|
@commands.command()
|
||||||
|
async def counterslb(self, ctx: commands.Context, *, periodstr: Optional[str] = None):
|
||||||
|
"""
|
||||||
|
Build a leaderboard of counter totals in the given period.
|
||||||
|
"""
|
||||||
|
profiles = self.bot.get_cog('ProfileCog')
|
||||||
|
author = await profiles.fetch_profile_twitch(ctx.author)
|
||||||
|
userid = author.profileid
|
||||||
|
community = await profiles.fetch_community_twitch(await ctx.channel.user())
|
||||||
|
|
||||||
|
period, start_time = await self.parse_period(community, periodstr or '')
|
||||||
|
|
||||||
|
query = self.data.CounterEntry.table.select_where()
|
||||||
|
query.group_by('counterid')
|
||||||
|
query.select('counterid', counter_total='SUM(value)')
|
||||||
|
query.order_by('counter_total', ORDER.DESC)
|
||||||
|
# query.where(Column('counter_total') > 0)
|
||||||
|
if start_time is not None:
|
||||||
|
query.where(self.data.CounterEntry.created_at >= start_time)
|
||||||
|
query.with_no_adapter()
|
||||||
|
results = await query
|
||||||
|
query.where(self.data.CounterEntry.userid == userid)
|
||||||
|
user_results = await query
|
||||||
|
|
||||||
|
lb = {result['counterid']: result['counter_total'] for result in results}
|
||||||
|
userlb = {result['counterid']: result['counter_total'] for result in user_results}
|
||||||
|
|
||||||
|
counters = await self.data.Counter.fetch_where(counterid=list(lb.keys()))
|
||||||
|
cmap = {c.counterid: c for c in counters}
|
||||||
|
|
||||||
|
parts = []
|
||||||
|
for cid, ctotal in lb.items():
|
||||||
|
if not ctotal:
|
||||||
|
continue
|
||||||
|
counter = cmap[cid]
|
||||||
|
user_total = userlb.get(cid) or 0
|
||||||
|
|
||||||
|
parts.append(f"{counter.name}: {ctotal}")
|
||||||
|
|
||||||
|
prefix = 'top 10 ' if len(parts) > 10 else ''
|
||||||
|
parts = parts[:10]
|
||||||
|
|
||||||
|
lbstr = '; '.join(parts)
|
||||||
|
await ctx.reply(f"Counters {period.value[-1]} {prefix}leaderboard -- {lbstr}")
|
||||||
|
|
||||||
@commands.command()
|
@commands.command()
|
||||||
async def counter(self, ctx: commands.Context, name: str, subcmd: Optional[str], *, args: Optional[str]=None):
|
async def counter(self, ctx: commands.Context, name: str, subcmd: Optional[str], *, args: Optional[str]=None):
|
||||||
if not (ctx.author.is_mod or ctx.author.is_broadcaster):
|
if not (ctx.author.is_mod or ctx.author.is_broadcaster):
|
||||||
|
|||||||
Reference in New Issue
Block a user