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 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()
+1 -1
View File
@@ -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
+14 -4
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
)
+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