fix(bot): 🐛 Servers leaderboard now updating.

This commit is contained in:
Nyeki.py
2024-10-19 21:24:29 -03:00
parent 398fc2cb93
commit 9b0deec19e
6 changed files with 66 additions and 51 deletions
+21 -43
View File
@@ -7,8 +7,9 @@ from discord.ext import commands, tasks
from tortoise import transactions, functions, exceptions from tortoise import transactions, functions, exceptions
from payphone import bot from payphone import bot
from payphone.db import models, utils from payphone.db import utils as dbutils, models
from payphone.cogs import base from payphone.cogs import base
from payphone.core import utils
class Admin(base.Cog): class Admin(base.Cog):
@@ -37,54 +38,31 @@ class Admin(base.Cog):
) )
) )
# ID to count # ID: Count
servers_count_map: dict[int, int] = {} servers_map: dict[int, int] = {}
servers: dict[int, models.Server] = {}
servers_map: dict[int, models.Server] = {
rs.channel.server_id: rs.channel.server
for call in calls
for rs in call.call_rss
}
for call in calls: for call in calls:
for rs in call.call_rss: for rs in utils.deduplicate(call.call_rss, lambda i: i.channel.server_id):
if rs.channel.server_id in servers_count_map: server_id = rs.channel.server_id
servers_count_map[rs.channel.server_id] += 1 servers[server_id] = rs.channel.server
if server_id in servers_map:
servers_map[server_id] += 1
else: else:
servers_count_map[rs.channel.server_id] = 0 servers_map[server_id] = 1
server_counts = list(servers_count_map.items()) server_counts = sorted(servers_map.items(), key=lambda i: i[1])
server_counts.sort(key=lambda i: i[1], reverse=True) for pos, (server_id, calls_count) in enumerate(server_counts):
servers[server_id].leaderboard_calls_count = calls_count
for server_map in server_counts[:10]: servers[server_id].leaderboard_position = pos + 1
if servers_map[server_map[0]].name is None:
try:
guild = await self.bot.fetch_guild(server_map[0])
except errors.DiscordException:
continue
servers_map[server_map[0]].name = guild.name
try:
vanity = await guild.vanity_invite()
except errors.DiscordException:
continue
if vanity is not None:
servers_map[server_map[0]].vanity_code = vanity.code
for i, server_map in enumerate(server_counts):
servers_map[server_map[0]].leaderboard_position = i + 1
servers_map[server_map[0]].leaderboard_calls_count = server_map[1]
await models.Server.bulk_update( await models.Server.bulk_update(
servers_map.values(), servers.values(),
["name", "vanity_code", "leaderboard_position", "leaderboard_calls_count"], ["leaderboard_calls_count", "leaderboard_position"],
500, batch_size=500,
) )
@commands.Cog.listener() @commands.Cog.listener()
@@ -183,7 +161,7 @@ class Admin(base.Cog):
) )
else: else:
row = await utils.get_channel(channel) row = await dbutils.get_channel(channel)
row.enabled = True row.enabled = True
await row.save() await row.save()
@@ -211,7 +189,7 @@ class Admin(base.Cog):
channel = channel or ctx.channel channel = channel or ctx.channel
row = await utils.get_channel(channel) row = await dbutils.get_channel(channel)
row.enabled = False row.enabled = False
await row.save() await row.save()
+1 -1
View File
@@ -16,7 +16,7 @@ import aiohttp
import orjson import orjson
from payphone import bot from payphone import bot
from payphone.db import models, utils from payphone.db import utils, models
from payphone.cogs import base from payphone.cogs import base
from payphone.cogs.calls import embeds from payphone.cogs.calls import embeds
from payphone.core import constants, checks, censorship, formatting from payphone.core import constants, checks, censorship, formatting
+14 -4
View File
@@ -12,7 +12,7 @@ from discord.ext import commands
from tortoise import transactions, expressions from tortoise import transactions, expressions
from payphone import bot from payphone import bot
from payphone.db import models, utils from payphone.db import utils, models
from payphone.cogs import base from payphone.cogs import base
from payphone.cogs.mods import embeds, views from payphone.cogs.mods import embeds, views
from payphone.core import checks, converters, constants, formatting as fmt from payphone.core import checks, converters, constants, formatting as fmt
@@ -416,7 +416,11 @@ class Mods(base.Cog):
) )
embed = discord.Embed( embed = discord.Embed(
color=(profile.color or constants.EMBED_COLOR) if profile is not None else constants.EMBED_COLOR, color=(
(profile.color or constants.EMBED_COLOR)
if profile is not None
else constants.EMBED_COLOR
),
title="Profile Information", title="Profile Information",
timestamp=datetime.now(timezone.utc), timestamp=datetime.now(timezone.utc),
fields=[ fields=[
@@ -431,8 +435,14 @@ class Mods(base.Cog):
or "*No ongoing bans.*", or "*No ongoing bans.*",
) )
], ],
author=profile.embed_author if profile is not None else self.bot.embed_author, author=(
thumbnail=profile.avatar_url if profile is not None else self.bot.user.display_avatar.url profile.embed_author if profile is not None else self.bot.embed_author
),
thumbnail=(
profile.avatar_url
if profile is not None
else self.bot.user.display_avatar.url
),
) )
await ctx.send(embed=embed) await ctx.send(embed=embed)
+1 -1
View File
@@ -2,7 +2,7 @@ import discord
from discord.ext import pages from discord.ext import pages
from discord.utils import find from discord.utils import find
from tortoise import transactions, functions from tortoise import transactions
from payphone import bot from payphone import bot
from payphone.db import models from payphone.db import models
+2 -2
View File
@@ -496,7 +496,7 @@ class Users(base.Cog):
if board in users_board_options: if board in users_board_options:
top_users = ( top_users = (
await models.User.filter(leaderboard_position__lte=5) await models.User.filter(leaderboard_position__range=[1, 5])
.prefetch_related("profiles") .prefetch_related("profiles")
.order_by("leaderboard_position") .order_by("leaderboard_position")
.limit(5) .limit(5)
@@ -510,7 +510,7 @@ class Users(base.Cog):
else: else:
top_servers = ( top_servers = (
await models.Server.filter(leaderboard_position__lte=5) await models.Server.filter(leaderboard_position__range=[1, 5])
.order_by("leaderboard_position") .order_by("leaderboard_position")
.limit(5) .limit(5)
) )
+27
View File
@@ -0,0 +1,27 @@
from typing import Callable, Iterable, TypeVar
T = TypeVar("T")
U = TypeVar("U")
def deduplicate(iter: Iterable[T], key: Callable[[T], U] = lambda i: i) -> list[T]:
"""Deduplicates an Iterable.
Args:
iter (Iterable[T]): The iterable with items to deduplicate.
key (Callable[[T], U], optional): The key by which to deduplicate. Defaults to `lambda i: i`.
Returns:
list[T]: A list with the deduplicated items.
"""
found_keys = set()
result = []
for i in iter:
if key(i) not in found_keys:
result.append(i)
return result