Finished auto role filter #162

This commit is contained in:
2023-02-07 18:53:28 +01:00
parent eb58c34c4d
commit 3f7cfc47af
8 changed files with 62 additions and 23 deletions

View File

@@ -42,7 +42,7 @@ class AutoRoleFilter(FilterABC):
def filter(self, query: List[AutoRole]) -> List[AutoRole]:
if self._id is not None:
query = query.where(lambda x: x.id == self._id)
query = query.where(lambda x: x.auto_role_id == self._id)
if self._channel_id is not None:
query = query.where(lambda x: x.discord_channel_id == self._channel_id)

View File

@@ -1,3 +1,4 @@
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_data.model.auto_role_rule import AutoRoleRule
@@ -5,13 +6,15 @@ from bot_graphql.abc.filter_abc import FilterABC
class AutoRoleRuleFilter(FilterABC):
def __init__(self):
def __init__(self, bot: DiscordBotServiceABC):
FilterABC.__init__(self)
self._bot = bot
self._id = None
self._emoji_name = None
self._role_id = None
self._auto_role_id = None
self._role_name = None
self._auto_role = None
def from_dict(self, values: dict):
if "id" in values:
@@ -23,23 +26,37 @@ class AutoRoleRuleFilter(FilterABC):
if "role_id" in values:
self._role_id = int(values["role_id"])
if "auto_role_id" in values:
self._auto_role_id = int(values["auto_role_id"])
if "role_name" in values:
self._role_name = values["role_name"]
if "auto_role" in values:
from bot_graphql.filter.auto_role_filter import AutoRoleFilter
auto_role = AutoRoleFilter(self._bot)
auto_role.from_dict(values["auto_role"])
self._auto_role = auto_role
def filter(self, query: List[AutoRoleRule]) -> List[AutoRoleRule]:
if self._id is not None:
query = query.where(lambda x: x.auto_role_rule_id == self._id)
if self._auto_role_id is not None:
query = query.where(lambda x: x.auto_role_id == self._auto_role_id)
if self._emoji_name is not None:
query = query.where(lambda x: x.emoji_name == self._emoji_name)
if self._role_id is not None:
query = query.where(lambda x: x.role_id == self._role_id)
# if self._server_id is not None:
# query = query.where(lambda x: x.server.server_id == self._server_id)
if self._role_name is not None:
def get_role_name(x: AutoRoleRule):
guild = self._bot.get_guild(x.auto_role.server.discord_server_id)
name = guild.get_role(x.role_id).name
return name == self._role_name or self._role_name in name
query = query.where(get_role_name)
if self._auto_role is not None:
auto_roles = self._auto_role.filter(query.select(lambda x: x.auto_role)).select(lambda x: x.auto_role_id)
query = query.where(lambda x: x.auto_role.auto_role_id in auto_roles)
return query

View File

@@ -6,8 +6,8 @@ type AutoRole implements TableQuery {
server: Server
auto_role_rules: [AutoRoleRule]
auto_role_rule_count: Int
auto_role_rules(filter: AutoRoleRuleFilter, page: Page, sort: Sort): [AutoRoleRule]
created_at: String
modified_at: String

View File

@@ -2,6 +2,7 @@ type AutoRoleRule implements TableQuery {
id: ID
emoji_name: String
role_id: String
role_name: String
auto_role: AutoRole
@@ -13,5 +14,6 @@ input AutoRoleRuleFilter {
id: ID
emoji_name: String
role_id: String
role_name: String
auto_role: AutoRoleFilter
}

View File

@@ -2,7 +2,7 @@ type Query {
auto_roles(filter: AutoRoleFilter, page: Page, sort: Sort): [AutoRole]
auto_role_count: Int
auto_role_rules(filter: AutoRoleRuleFilter, page: Page, sort: Sort): [AutoRole]
auto_role_rules(filter: AutoRoleRuleFilter, page: Page, sort: Sort): [AutoRoleRule]
auto_role_rule_count: Int
clients(filter: ClientFilter, page: Page, sort: Sort): [Client]

View File

@@ -1,3 +1,5 @@
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_graphql.abc.data_query_abc import DataQueryABC
@@ -6,15 +8,18 @@ from bot_graphql.abc.data_query_abc import DataQueryABC
class AutoRoleRuleQuery(DataQueryABC):
def __init__(
self,
bot: DiscordBotServiceABC,
auto_roles: AutoRoleRepositoryABC,
):
DataQueryABC.__init__(self, "AutoRoleRule")
self._bot = bot
self._auto_roles = auto_roles
self.set_field("id", self.resolve_id)
self.set_field("emoji_name", self.resolve_emoji_name)
self.set_field("role_id", self.resolve_role_id)
self.set_field("role_name", self.resolve_role_name)
self.set_field("auto_role", self.resolve_auto_role)
@staticmethod
@@ -29,5 +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_server_id)
return guild.get_role(x.role_id).name
def resolve_auto_role(self, x: AutoRoleRule, *_):
return self._auto_roles.get_auto_role_by_id(x.auto_role_id)
return self._auto_roles.get_auto_role_by_id(x.auto_role.auto_role_id)