Added members view #130

This commit is contained in:
2023-02-17 17:53:54 +01:00
parent f44f77d7e5
commit 85452c9a74
24 changed files with 724 additions and 49 deletions

View File

@@ -180,12 +180,12 @@ class QueryABC(ObjectType):
# @FilterABC.resolve_filter_annotation
def _resolve_collection(self, collection: List, *_, filter: FilterABC = None, page: Page = None, sort: Sort = None):
if filter is not None:
return filter.filter(collection)
collection = filter.filter(collection)
if page is not None:
return page.filter(collection)
collection = page.filter(collection)
if sort is not None:
return sort.filter(collection)
collection = sort.filter(collection)
return collection

View File

@@ -25,7 +25,7 @@ class LevelFilter(FilterABC):
if "server" in values:
from bot_graphql.filter.server_filter import ServerFilter
self._server: ServerFilter = self._services.get_service(LevelFilter)
self._server: ServerFilter = self._services.get_service(ServerFilter)
self._server.from_dict(values["server"])
def filter(self, query: List[Level]) -> List[Level]:

View File

@@ -5,6 +5,7 @@ from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
from bot_data.model.user import User
from bot_graphql.abc.filter_abc import FilterABC
from bot_graphql.filter.level_filter import LevelFilter
@@ -18,6 +19,7 @@ class UserFilter(FilterABC):
bot: DiscordBotServiceABC,
client_utils: ClientUtilsABC,
levels: LevelService,
user_joined_servers: UserJoinedServerRepositoryABC,
):
FilterABC.__init__(self)
@@ -25,6 +27,7 @@ class UserFilter(FilterABC):
self._bot = bot
self._client_utils = client_utils
self._levels = levels
self._user_joined_servers = user_joined_servers
self._id = None
self._discord_id = None
@@ -34,6 +37,7 @@ class UserFilter(FilterABC):
self._ontime = None
self._level: Optional[LevelFilter] = None
self._server = None
self._left_server = None
def from_dict(self, values: dict):
if "id" in values:
@@ -64,18 +68,26 @@ class UserFilter(FilterABC):
self._server: ServerFilter = self._services.get_service(ServerFilter)
self._server.from_dict(values["server"])
if "leftServer" in values:
self._left_server = values["leftServer"]
def filter(self, query: List[User]) -> List[User]:
if self._id is not None:
query = query.where(lambda x: x.user_id == self._id)
query = query.where(lambda x: x.user_id == self._id or str(self._id) in str(x.user_id))
if self._discord_id is not None:
query = query.where(lambda x: x.discord_id == self._discord_id)
query = query.where(
lambda x: x.discord_id == self._discord_id or str(self._discord_id) in str(x.discord_id)
)
if self._name is not None:
query = query.where(
lambda x: self._bot.get_user(x.discord_id).name == self._name
or self._name in self._bot.get_user(x.discord_id).name
)
def _get_member(user: User):
guild = self._bot.get_guild(user.server.discord_server_id)
member = guild.get_member(user.discord_id)
return member is not None and (member.name == self._name or self._name in member.name)
query = query.where(_get_member)
if self._xp is not None:
query = query.where(lambda x: x.xp == self._xp)
@@ -94,4 +106,12 @@ class UserFilter(FilterABC):
servers = self._server.filter(query.select(lambda x: x.server)).select(lambda x: x.server_id)
query = query.where(lambda x: x.server.server_id in servers)
if self._left_server is not None:
def _has_user_left_server(user: User):
active_join = self._user_joined_servers.find_active_user_joined_server_by_user_id(user.user_id)
return (active_join is None) == self._left_server
query = query.where(_has_user_left_server)
return query

View File

@@ -17,6 +17,7 @@ type User implements TableQuery {
userJoinedGameServers(filter: UserJoinedGameServerFilter, page: Page, sort: Sort): [UserJoinedGameServer]
server: Server
leftServer: Boolean
createdAt: String
modifiedAt: String
@@ -31,6 +32,7 @@ input UserFilter {
ontime: Float
level: LevelFilter
server: ServerFilter
leftServer: Boolean
}
type UserMutation {
@@ -40,4 +42,5 @@ type UserMutation {
input UserInput {
id: ID
xp: Int
levelId: ID
}

View File

@@ -1,10 +1,12 @@
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.user_role_enum import UserRoleEnum
from bot_graphql.abc.query_abc import QueryABC
from modules.level.service.level_service import LevelService
from modules.permission.service.permission_service import PermissionService
@@ -16,6 +18,8 @@ class UserMutation(QueryABC):
bot: DiscordBotServiceABC,
db: DatabaseContextABC,
permissions: PermissionService,
levels: LevelRepositoryABC,
level_service: LevelService,
):
QueryABC.__init__(self, "UserMutation")
@@ -24,6 +28,8 @@ class UserMutation(QueryABC):
self._bot = bot
self._db = db
self._permissions = permissions
self._levels = levels
self._level_service = level_service
self.set_field("updateUser", self.resolve_update_user)
@@ -33,8 +39,13 @@ class UserMutation(QueryABC):
user.xp = input["xp"] if "xp" in input else user.xp
if "levelId" in input:
level = self._levels.get_level_by_id(input["levelId"])
user.xp = level.min_xp
self._users.update_user(user)
self._db.save_changes()
self._level_service.set_level(user)
user = self._users.get_user_by_id(input["id"])
return user

View File

@@ -57,6 +57,7 @@ class UserQuery(DataQueryABC):
UserJoinedGameServerFilter,
)
self.set_field("server", self.resolve_server)
self.set_field("leftServer", self.resolve_left_server)
@staticmethod
def resolve_id(user: User, *_):
@@ -88,3 +89,6 @@ class UserQuery(DataQueryABC):
@staticmethod
def resolve_server(user: User, *_):
return user.server
def resolve_left_server(self, user: User, *_):
return self._ujs.find_active_user_joined_server_by_user_id(user.user_id) is None