Improved sorting #130

This commit is contained in:
2023-02-17 19:15:03 +01:00
parent fea259fa3b
commit dfe4f28e24
20 changed files with 146 additions and 48 deletions

View File

@@ -36,7 +36,7 @@ class ServerFilter(FilterABC):
if self._name is not None:
def where_guild(x: Guild):
guild = bot.get_guild(x.discord_server_id)
guild = bot.get_guild(x.discord_id)
return guild is not None and (
self._name.lower() == guild.name.lower() or self._name.lower() in guild.name.lower()
)

View File

@@ -1,11 +1,17 @@
import functools
from cpl_core.utils import String
from cpl_query.extension import List
from bot_api.exception.service_error_code_enum import ServiceErrorCode
from bot_api.exception.service_exception import ServiceException
from bot_graphql.abc.filter_abc import FilterABC
class Sort(FilterABC):
def __init__(self):
FilterABC.__init__(self)
self._sort_direction = None
self._sort_column = None
@@ -16,8 +22,19 @@ class Sort(FilterABC):
if "sortColumn" in values:
self._sort_column = values["sortColumn"]
@staticmethod
def _rgetattr(obj, attr, *args):
def _getattr(obj, attr):
return getattr(obj, attr, *args)
return functools.reduce(_getattr, [obj] + attr.split("."))
def _by_column(self, x):
atr = getattr(x, self._sort_column, None)
atr = self._rgetattr(x, String.convert_to_snake_case(self._sort_column), None)
if atr is None:
raise ServiceException(
ServiceErrorCode.InvalidData, f"Attribute {self._sort_column} in object of {type(x)} not found"
)
return atr
def filter(self, query: List, *args) -> List:

View File

@@ -51,12 +51,12 @@ class UserJoinedVoiceChannelFilter(FilterABC):
query = query.where(lambda x: x.id == self._id)
if self._channel_id is not None:
query = query.where(lambda x: x.dc_channel_id == self._channel_id)
query = query.where(lambda x: x.channel_id == self._channel_id)
if self._channel_name is not None and self._channel_id is not None:
def get_channel_name(x: UserJoinedVoiceChannel):
name = self._bot.get_channel(x.dc_channel_id).name
name = self._bot.get_channel(x.channel_id).name
return name == self._channel_name or self._channel_name in name
query = query.where(get_channel_name)

View File

@@ -40,9 +40,9 @@ class AutoRoleQuery(DataQueryABC):
def resolve_channel_id(x: AutoRole, *_):
return x.discord_channel_id
def resolve_channel_name(self, x: AutoRole, *_):
channel = self._bot.get_channel(x.discord_channel_id)
return None if channel is None else channel.name
@staticmethod
def resolve_channel_name(x: AutoRole, *_):
return x.discord_channel_name
@staticmethod
def resolve_message_id(x: AutoRole, *_):

View File

@@ -34,9 +34,9 @@ class AutoRoleRuleQuery(DataQueryABC):
def resolve_role_id(x: AutoRoleRule, *_):
return x.role_id
def resolve_role_name(self, x: AutoRoleRule, *_):
guild = self._bot.get_guild(x.auto_role.server.discord_id)
return guild.get_role(x.role_id).name
@staticmethod
def resolve_role_name(x: AutoRoleRule, *_):
return x.role_name
def resolve_auto_role(self, x: AutoRoleRule, *_):
return self._auto_roles.get_auto_role_by_id(x.auto_role.id)

View File

@@ -31,8 +31,9 @@ class ClientQuery(DataQueryABC):
def resolve_discord_id(client: Client, *_):
return client.discord_id
def resolve_name(self, client: Client, *_):
return self._bot.user.name
@staticmethod
def resolve_name(client: Client, *_):
return client.name
@staticmethod
def resolve_sent_message_count(client: Client, *_):

View File

@@ -59,10 +59,10 @@ class ServerQuery(DataQueryABC):
def resolve_discord_id(server: Server, *_):
return server.discord_id
def resolve_name(self, server: Server, *_):
guild = self._bot.get_guild(server.discord_id)
return None if guild is None else guild.name
@staticmethod
def resolve_name(server: Server, *_):
return server.name
def resolve_icon_url(self, server: Server, *_):
guild = self._bot.get_guild(server.discord_id)
return None if guild is None else guild.icon.url
@staticmethod
def resolve_icon_url(server: Server, *_):
return server.icon_url

View File

@@ -23,10 +23,11 @@ class UserJoinedVoiceChannelQuery(DataQueryABC):
@staticmethod
def resolve_channel_id(x: UserJoinedVoiceChannel, *_):
return x.dc_channel_id
return x.channel_id
def resolve_channel_name(self, x: UserJoinedVoiceChannel, *_):
return self._bot.get_channel(x.dc_channel_id).name
@staticmethod
def resolve_channel_name(x: UserJoinedVoiceChannel, *_):
return x.channel_name
@staticmethod
def resolve_user(x: UserJoinedVoiceChannel, *_):

View File

@@ -67,10 +67,9 @@ class UserQuery(DataQueryABC):
def resolve_discord_id(user: User, *_):
return user.discord_id
def resolve_name(self, user: User, *_):
guild = self._bot.get_guild(user.server.discord_id)
user = guild.get_member(user.discord_id)
return None if user is None else user.name
@staticmethod
def resolve_name(user: User, *_):
return user.name
@staticmethod
def resolve_xp(user: User, *_):
@@ -80,11 +79,13 @@ class UserQuery(DataQueryABC):
def resolve_minecraft_id(user: User, *_):
return user.minecraft_id
def resolve_ontime(self, user: User, *_):
return self._client_utils.get_ontime_for_user(user)
@staticmethod
def resolve_ontime(user: User, *_):
return user.ontime
def resolve_level(self, user: User, *_):
return self._levels.get_level(user)
@staticmethod
def resolve_level(user: User, *_):
return user.level
@staticmethod
def resolve_server(user: User, *_):