From 9b0deec19ecd65735f4063350638f8f09761bf86 Mon Sep 17 00:00:00 2001 From: "Nyeki.py" <84998222+Nekidev@users.noreply.github.com> Date: Sat, 19 Oct 2024 21:24:29 -0300 Subject: [PATCH] fix(bot): :bug: Servers leaderboard now updating. --- payphone/cogs/admin/cog.py | 64 ++++++++++++------------------------- payphone/cogs/calls/cog.py | 2 +- payphone/cogs/mods/cog.py | 18 ++++++++--- payphone/cogs/mods/views.py | 2 +- payphone/cogs/users/cog.py | 4 +-- payphone/core/utils.py | 27 ++++++++++++++++ 6 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 payphone/core/utils.py diff --git a/payphone/cogs/admin/cog.py b/payphone/cogs/admin/cog.py index 1eeb3ea..3a1ea05 100644 --- a/payphone/cogs/admin/cog.py +++ b/payphone/cogs/admin/cog.py @@ -7,8 +7,9 @@ from discord.ext import commands, tasks from tortoise import transactions, functions, exceptions 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.core import utils class Admin(base.Cog): @@ -37,54 +38,31 @@ class Admin(base.Cog): ) ) - # ID to count - servers_count_map: dict[int, int] = {} - - servers_map: dict[int, models.Server] = { - rs.channel.server_id: rs.channel.server - for call in calls - for rs in call.call_rss - } + # ID: Count + servers_map: dict[int, int] = {} + servers: dict[int, models.Server] = {} for call in calls: - for rs in call.call_rss: - if rs.channel.server_id in servers_count_map: - servers_count_map[rs.channel.server_id] += 1 + for rs in utils.deduplicate(call.call_rss, lambda i: i.channel.server_id): + server_id = rs.channel.server_id + servers[server_id] = rs.channel.server + + if server_id in servers_map: + servers_map[server_id] += 1 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 server_map in server_counts[:10]: - 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] + for pos, (server_id, calls_count) in enumerate(server_counts): + servers[server_id].leaderboard_calls_count = calls_count + servers[server_id].leaderboard_position = pos + 1 await models.Server.bulk_update( - servers_map.values(), - ["name", "vanity_code", "leaderboard_position", "leaderboard_calls_count"], - 500, + servers.values(), + ["leaderboard_calls_count", "leaderboard_position"], + batch_size=500, ) @commands.Cog.listener() @@ -183,7 +161,7 @@ class Admin(base.Cog): ) else: - row = await utils.get_channel(channel) + row = await dbutils.get_channel(channel) row.enabled = True await row.save() @@ -211,7 +189,7 @@ class Admin(base.Cog): channel = channel or ctx.channel - row = await utils.get_channel(channel) + row = await dbutils.get_channel(channel) row.enabled = False await row.save() diff --git a/payphone/cogs/calls/cog.py b/payphone/cogs/calls/cog.py index ecdb1e3..5c13cc9 100644 --- a/payphone/cogs/calls/cog.py +++ b/payphone/cogs/calls/cog.py @@ -16,7 +16,7 @@ import aiohttp import orjson from payphone import bot -from payphone.db import models, utils +from payphone.db import utils, models from payphone.cogs import base from payphone.cogs.calls import embeds from payphone.core import constants, checks, censorship, formatting diff --git a/payphone/cogs/mods/cog.py b/payphone/cogs/mods/cog.py index a05771d..3f26e68 100644 --- a/payphone/cogs/mods/cog.py +++ b/payphone/cogs/mods/cog.py @@ -12,7 +12,7 @@ from discord.ext import commands from tortoise import transactions, expressions from payphone import bot -from payphone.db import models, utils +from payphone.db import utils, models from payphone.cogs import base from payphone.cogs.mods import embeds, views from payphone.core import checks, converters, constants, formatting as fmt @@ -416,7 +416,11 @@ class Mods(base.Cog): ) 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", timestamp=datetime.now(timezone.utc), fields=[ @@ -431,8 +435,14 @@ class Mods(base.Cog): or "*No ongoing bans.*", ) ], - author=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 + author=( + 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) diff --git a/payphone/cogs/mods/views.py b/payphone/cogs/mods/views.py index 09ea534..b9dcfe9 100644 --- a/payphone/cogs/mods/views.py +++ b/payphone/cogs/mods/views.py @@ -2,7 +2,7 @@ import discord from discord.ext import pages from discord.utils import find -from tortoise import transactions, functions +from tortoise import transactions from payphone import bot from payphone.db import models diff --git a/payphone/cogs/users/cog.py b/payphone/cogs/users/cog.py index 362a633..b928d5a 100644 --- a/payphone/cogs/users/cog.py +++ b/payphone/cogs/users/cog.py @@ -496,7 +496,7 @@ class Users(base.Cog): if board in users_board_options: top_users = ( - await models.User.filter(leaderboard_position__lte=5) + await models.User.filter(leaderboard_position__range=[1, 5]) .prefetch_related("profiles") .order_by("leaderboard_position") .limit(5) @@ -510,7 +510,7 @@ class Users(base.Cog): else: top_servers = ( - await models.Server.filter(leaderboard_position__lte=5) + await models.Server.filter(leaderboard_position__range=[1, 5]) .order_by("leaderboard_position") .limit(5) ) diff --git a/payphone/core/utils.py b/payphone/core/utils.py new file mode 100644 index 0000000..e407cea --- /dev/null +++ b/payphone/core/utils.py @@ -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