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 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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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