fix(bot): 🐛 Servers leaderboard now updating.
This commit is contained in:
+21
-43
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user