#268_achievements #325
							
								
								
									
										60
									
								
								kdb-bot/src/bot_graphql/filter/achievement_filter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								kdb-bot/src/bot_graphql/filter/achievement_filter.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_data.model.user import User | ||||
| from bot_graphql.abc.filter_abc import FilterABC | ||||
|  | ||||
|  | ||||
| class AchievementFilter(FilterABC): | ||||
|     def __init__(self): | ||||
|         FilterABC.__init__(self) | ||||
|  | ||||
|         self._id = None | ||||
|         self._name = None | ||||
|         self._attribute = None | ||||
|         self._operator = None | ||||
|         self._value = None | ||||
|         self._server = None | ||||
|  | ||||
|     def from_dict(self, values: dict): | ||||
|         if "id" in values: | ||||
|             self._id = int(values["id"]) | ||||
|  | ||||
|         if "name" in values: | ||||
|             self._name = values["name"] | ||||
|  | ||||
|         if "attribute" in values: | ||||
|             self._attribute = values["attribute"] | ||||
|  | ||||
|         if "operator" in values: | ||||
|             self._operator = values["operator"] | ||||
|  | ||||
|         if "value" in values: | ||||
|             self._value = values["value"] | ||||
|  | ||||
|         if "server" in values: | ||||
|             from bot_graphql.filter.server_filter import ServerFilter | ||||
|  | ||||
|             self._server: ServerFilter = self._services.get_service(ServerFilter) | ||||
|             self._server.from_dict(values["server"]) | ||||
|  | ||||
|     def filter(self, query: List[User]) -> List[User]: | ||||
|         if self._id is not None: | ||||
|             query = query.where(lambda x: x.id == self._id) | ||||
|  | ||||
|         if self._name is not None: | ||||
|             query = query.where(lambda x: x.name == self._name) | ||||
|  | ||||
|         if self._attribute is not None: | ||||
|             query = query.where(lambda x: x.attribute == self._attribute) | ||||
|  | ||||
|         if self._operator is not None: | ||||
|             query = query.where(lambda x: x.operator == self._operator) | ||||
|  | ||||
|         if self._value is not None: | ||||
|             query = query.where(lambda x: x.value == self._value) | ||||
|  | ||||
|         if self._server is not None: | ||||
|             servers = self._server.filter(query.select(lambda x: x.server)).select(lambda x: x.id) | ||||
|             query = query.where(lambda x: x.server.id in servers) | ||||
|  | ||||
|         return query | ||||
| @@ -8,6 +8,7 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_data.service.seeder_service import SeederService | ||||
| from bot_graphql.abc.filter_abc import FilterABC | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
| from bot_graphql.filter.achievement_filter import AchievementFilter | ||||
| from bot_graphql.filter.auto_role_filter import AutoRoleFilter | ||||
| from bot_graphql.filter.auto_role_rule_filter import AutoRoleRuleFilter | ||||
| from bot_graphql.filter.client_filter import ClientFilter | ||||
| @@ -19,11 +20,13 @@ from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter | ||||
| from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter | ||||
| from bot_graphql.graphql_service import GraphQLService | ||||
| from bot_graphql.mutation import Mutation | ||||
| from bot_graphql.mutations.achievement_mutation import AchievementMutation | ||||
| from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation | ||||
| from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation | ||||
| from bot_graphql.mutations.level_mutation import LevelMutation | ||||
| from bot_graphql.mutations.user_joined_game_server_mutation import UserJoinedGameServerMutation | ||||
| from bot_graphql.mutations.user_mutation import UserMutation | ||||
| from bot_graphql.queries.achievement_query import AchievementQuery | ||||
| from bot_graphql.queries.auto_role_history_query import AutoRoleHistoryQuery | ||||
| from bot_graphql.queries.auto_role_query import AutoRoleQuery | ||||
| from bot_graphql.queries.auto_role_rule_history_query import AutoRoleRuleHistoryQuery | ||||
| @@ -76,6 +79,7 @@ class GraphQLModule(ModuleABC): | ||||
|         services.add_transient(QueryABC, ServerQuery) | ||||
|         services.add_transient(QueryABC, UserHistoryQuery) | ||||
|         services.add_transient(QueryABC, UserQuery) | ||||
|         services.add_transient(QueryABC, AchievementQuery) | ||||
|         services.add_transient(QueryABC, UserJoinedServerHistoryQuery) | ||||
|         services.add_transient(QueryABC, UserJoinedServerQuery) | ||||
|         services.add_transient(QueryABC, UserJoinedVoiceChannelHistoryQuery) | ||||
| @@ -90,6 +94,7 @@ class GraphQLModule(ModuleABC): | ||||
|         services.add_transient(FilterABC, LevelFilter) | ||||
|         services.add_transient(FilterABC, ServerFilter) | ||||
|         services.add_transient(FilterABC, UserFilter) | ||||
|         services.add_transient(FilterABC, AchievementFilter) | ||||
|         services.add_transient(FilterABC, UserJoinedServerFilter) | ||||
|         services.add_transient(FilterABC, UserJoinedVoiceChannelFilter) | ||||
|         services.add_transient(FilterABC, UserJoinedGameServerFilter) | ||||
| @@ -99,6 +104,7 @@ class GraphQLModule(ModuleABC): | ||||
|         services.add_transient(QueryABC, AutoRoleRuleMutation) | ||||
|         services.add_transient(QueryABC, LevelMutation) | ||||
|         services.add_transient(QueryABC, UserMutation) | ||||
|         services.add_transient(QueryABC, AchievementMutation) | ||||
|         services.add_transient(QueryABC, UserJoinedGameServerMutation) | ||||
|  | ||||
|         services.add_transient(SeederService) | ||||
|   | ||||
							
								
								
									
										52
									
								
								kdb-bot/src/bot_graphql/model/achievement.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								kdb-bot/src/bot_graphql/model/achievement.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| type Achievement implements TableWithHistoryQuery { | ||||
|     id: ID | ||||
|     name: String | ||||
|     attribute: String | ||||
|     operator: String | ||||
|     value: String | ||||
|  | ||||
|     server: Server | ||||
|  | ||||
|     createdAt: String | ||||
|     modifiedAt: String | ||||
|  | ||||
|     history: [AchievementHistory] | ||||
| } | ||||
|  | ||||
| type AchievementHistory implements HistoryTableQuery { | ||||
|     id: ID | ||||
|     name: String | ||||
|     attribute: String | ||||
|     operator: String | ||||
|     value: String | ||||
|  | ||||
|     server: Server | ||||
|  | ||||
|     deleted: Boolean | ||||
|     dateFrom: String | ||||
|     dateTo: String | ||||
| } | ||||
|  | ||||
| input AchievementFilter { | ||||
|     id: ID | ||||
|     name: String | ||||
|     attribute: String | ||||
|     operator: String | ||||
|     value: String | ||||
|     server: ServerFilter | ||||
| } | ||||
|  | ||||
| type AchievementMutation { | ||||
|     createAchievement(input: AchievementInput!): Achievement | ||||
|     updateAchievement(input: AchievementInput!): Achievement | ||||
|     deleteAchievement(id: ID): Achievement | ||||
| } | ||||
|  | ||||
| input AchievementInput { | ||||
|     id: ID | ||||
|     name: String | ||||
|     attribute: String | ||||
|     operator: String | ||||
|     value: String | ||||
|     serverId: ID | ||||
| } | ||||
| @@ -4,4 +4,5 @@ type Mutation { | ||||
|     level: LevelMutation | ||||
|     user: UserMutation | ||||
|     userJoinedGameServer: UserJoinedGameServerMutation | ||||
|     achievement: AchievementMutation | ||||
| } | ||||
| @@ -29,5 +29,8 @@ type Query { | ||||
|     userCount: Int | ||||
|     users(filter: UserFilter, page: Page, sort: Sort): [User] | ||||
|  | ||||
|     achievementCount: Int | ||||
|     achievements(filter: AchievementFilter, page: Page, sort: Sort): [Achievement] | ||||
|  | ||||
|     guilds(filter: GuildFilter): [Guild] | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| from ariadne import MutationType | ||||
|  | ||||
| from bot_data.model.user_joined_game_server import UserJoinedGameServer | ||||
| from bot_graphql.mutations.achievement_mutation import AchievementMutation | ||||
| from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation | ||||
| from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation | ||||
| from bot_graphql.mutations.level_mutation import LevelMutation | ||||
| @@ -15,6 +15,7 @@ class Mutation(MutationType): | ||||
|         auto_role_rule_mutation: AutoRoleRuleMutation, | ||||
|         level_mutation: LevelMutation, | ||||
|         user_mutation: UserMutation, | ||||
|         achievement_mutation: AchievementMutation, | ||||
|         user_joined_game_server: UserJoinedGameServerMutation, | ||||
|     ): | ||||
|         MutationType.__init__(self) | ||||
| @@ -23,4 +24,5 @@ class Mutation(MutationType): | ||||
|         self.set_field("autoRoleRule", lambda *_: auto_role_rule_mutation) | ||||
|         self.set_field("level", lambda *_: level_mutation) | ||||
|         self.set_field("user", lambda *_: user_mutation) | ||||
|         self.set_field("achievement", lambda *_: achievement_mutation) | ||||
|         self.set_field("userJoinedGameServer", lambda *_: user_joined_game_server) | ||||
|   | ||||
							
								
								
									
										43
									
								
								kdb-bot/src/bot_graphql/mutations/achievement_mutation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								kdb-bot/src/bot_graphql/mutations/achievement_mutation.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| from cpl_core.database.context import DatabaseContextABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
|  | ||||
| from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.model.user_role_enum import UserRoleEnum | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
| from modules.permission.service.permission_service import PermissionService | ||||
|  | ||||
|  | ||||
| class AchievementMutation(QueryABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         servers: ServerRepositoryABC, | ||||
|         achievements: AchievementRepositoryABC, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         db: DatabaseContextABC, | ||||
|         permissions: PermissionService, | ||||
|     ): | ||||
|         QueryABC.__init__(self, "AchievementMutation") | ||||
|  | ||||
|         self._servers = servers | ||||
|         self._achievements = achievements | ||||
|         self._bot = bot | ||||
|         self._db = db | ||||
|         self._permissions = permissions | ||||
|  | ||||
|         self.set_field("updateAchievement", self.resolve_update_achievement) | ||||
|  | ||||
|     def resolve_update_achievement(self, *_, input: dict): | ||||
|         achievement = self._achievements.get_achievement_by_id(input["id"]) | ||||
|         self._can_user_mutate_data(achievement.server, UserRoleEnum.moderator) | ||||
|  | ||||
|         achievement.name = input["name"] if "name" in input else achievement.name | ||||
|         achievement.attribute = input["attribute"] if "attribute" in input else achievement.attribute | ||||
|         achievement.operator = input["operator"] if "operator" in input else achievement.operator | ||||
|         achievement.value = input["value"] if "value" in input else achievement.value | ||||
|  | ||||
|         self._achievements.update_achievement(achievement) | ||||
|         self._db.save_changes() | ||||
|  | ||||
|         achievement = self._achievements.get_achievement_by_id(input["id"]) | ||||
|         return achievement | ||||
							
								
								
									
										19
									
								
								kdb-bot/src/bot_graphql/queries/achievement_query.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								kdb-bot/src/bot_graphql/queries/achievement_query.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| from cpl_core.database.context import DatabaseContextABC | ||||
|  | ||||
| from bot_data.model.user_history import UserHistory | ||||
| from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC | ||||
|  | ||||
|  | ||||
| class AchievementQuery(DataQueryWithHistoryABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         db: DatabaseContextABC, | ||||
|     ): | ||||
|         DataQueryWithHistoryABC.__init__(self, "Achievement", "AchievementsHistory", UserHistory, db) | ||||
|  | ||||
|         self.set_field("id", lambda x: x.id) | ||||
|         self.set_field("name", lambda x: x.name) | ||||
|         self.set_field("attribute", lambda x: x.attribute) | ||||
|         self.set_field("operator", lambda x: x.operator) | ||||
|         self.set_field("value", lambda x: x.value) | ||||
|         self.set_field("server", lambda x: x.server) | ||||
| @@ -1,5 +1,6 @@ | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
|  | ||||
| from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC | ||||
| from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC | ||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||
| from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC | ||||
| @@ -10,6 +11,7 @@ from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepos | ||||
| from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC | ||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
| from bot_graphql.filter.achievement_filter import AchievementFilter | ||||
| from bot_graphql.filter.auto_role_filter import AutoRoleFilter | ||||
| from bot_graphql.filter.auto_role_rule_filter import AutoRoleRuleFilter | ||||
| from bot_graphql.filter.client_filter import ClientFilter | ||||
| @@ -34,6 +36,7 @@ class Query(QueryABC): | ||||
|         user_joined_voice_channels: UserJoinedVoiceChannelRepositoryABC, | ||||
|         user_joined_game_server: UserJoinedGameServerRepositoryABC, | ||||
|         users: UserRepositoryABC, | ||||
|         achievements: AchievementRepositoryABC, | ||||
|     ): | ||||
|         QueryABC.__init__(self, "Query") | ||||
|  | ||||
| @@ -59,6 +62,7 @@ class Query(QueryABC): | ||||
|             UserJoinedGameServerFilter, | ||||
|         ) | ||||
|         self.add_collection("user", lambda *_: users.get_users(), UserFilter) | ||||
|         self.add_collection("achievement", lambda *_: achievements.get_achievements(), AchievementFilter) | ||||
|  | ||||
|         self.set_field("guilds", self._resolve_guilds) | ||||
|  | ||||
|   | ||||
| @@ -51,4 +51,4 @@ | ||||
|         "tslib": "^2.4.1", | ||||
|         "typescript": "~4.9.5" | ||||
|     } | ||||
| } | ||||
| } | ||||
| @@ -25,4 +25,4 @@ | ||||
|             "Name": "sh-edraft-dark-theme" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user