Added logic to make achievement config more generic #268_achievements
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
type AchievementAttribute {
|
||||
name: String
|
||||
type: String
|
||||
}
|
||||
|
||||
type Achievement implements TableWithHistoryQuery {
|
||||
id: ID
|
||||
name: String
|
||||
|
@@ -31,6 +31,8 @@ type Query {
|
||||
|
||||
achievementCount: Int
|
||||
achievements(filter: AchievementFilter, page: Page, sort: Sort): [Achievement]
|
||||
AchievementAttributes: [AchievementAttribute]
|
||||
AchievementOperators: [String]
|
||||
|
||||
guilds(filter: GuildFilter): [Guild]
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
from bot_graphql.abc.data_query_abc import DataQueryABC
|
||||
|
||||
|
||||
class AchievementQuery(DataQueryABC):
|
||||
def __init__(
|
||||
self,
|
||||
):
|
||||
DataQueryABC.__init__(self, "AchievementAttribute")
|
||||
|
||||
self.set_field("name", lambda x, *_: x.name)
|
||||
self.set_field("type", lambda x, *_: x.type)
|
@@ -21,6 +21,7 @@ from bot_graphql.filter.user_filter import UserFilter
|
||||
from bot_graphql.filter.user_joined_game_server_filter import UserJoinedGameServerFilter
|
||||
from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter
|
||||
from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter
|
||||
from modules.achievements.achievement_service import AchievementService
|
||||
|
||||
|
||||
class Query(QueryABC):
|
||||
@@ -37,6 +38,7 @@ class Query(QueryABC):
|
||||
user_joined_game_server: UserJoinedGameServerRepositoryABC,
|
||||
users: UserRepositoryABC,
|
||||
achievements: AchievementRepositoryABC,
|
||||
achievement_service: AchievementService,
|
||||
):
|
||||
QueryABC.__init__(self, "Query")
|
||||
|
||||
@@ -65,6 +67,8 @@ class Query(QueryABC):
|
||||
self.add_collection("achievement", lambda *_: achievements.get_achievements(), AchievementFilter)
|
||||
|
||||
self.set_field("guilds", self._resolve_guilds)
|
||||
self.set_field("AchievementAttributes", lambda x, *_: achievement_service.get_attributes())
|
||||
self.set_field("AchievementOperators", lambda x, *_: ["==", "!=", "<=", ">=", "<", ">"])
|
||||
|
||||
def _resolve_guilds(self, *_, filter=None):
|
||||
if filter is None or "id" not in filter:
|
||||
|
@@ -2,6 +2,7 @@ from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.database.context import DatabaseContextABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
from cpl_query.extension import List
|
||||
from cpl_translation import TranslatePipe
|
||||
|
||||
from bot_core.configuration.server_settings import ServerSettings
|
||||
@@ -10,6 +11,7 @@ from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
|
||||
from bot_data.model.achievement import Achievement
|
||||
from bot_data.model.user import User
|
||||
from bot_data.model.user_got_achievement import UserGotAchievement
|
||||
from modules.achievements.model.achievement_attribute import AchievementAttribute
|
||||
|
||||
|
||||
class AchievementService:
|
||||
@@ -31,6 +33,17 @@ class AchievementService:
|
||||
self._message_service = message_service
|
||||
self._t = t
|
||||
|
||||
def get_attributes(self) -> List[AchievementAttribute]:
|
||||
attributes = List(AchievementAttribute)
|
||||
|
||||
attributes.add(AchievementAttribute("xp", lambda user: user.xp, "number"))
|
||||
attributes.add(AchievementAttribute("message_count", lambda user: user.message_count, "number"))
|
||||
attributes.add(AchievementAttribute("reaction_count", lambda user: user.reaction_count, "number"))
|
||||
attributes.add(AchievementAttribute("ontime", lambda user: user.ontime, "number"))
|
||||
attributes.add(AchievementAttribute("level", lambda user: user.level, "Level"))
|
||||
|
||||
return attributes
|
||||
|
||||
def _match(self, value: str, operator: str, expected_value: str) -> bool:
|
||||
match operator:
|
||||
case "==":
|
||||
|
1
kdb-bot/src/modules/achievements/model/__init__.py
Normal file
1
kdb-bot/src/modules/achievements/model/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# imports
|
@@ -0,0 +1,20 @@
|
||||
from typing import Callable
|
||||
|
||||
|
||||
class AchievementAttribute:
|
||||
# frontend type = TypeScript types
|
||||
def __init__(self, name: str, resolver: Callable, frontend_type: str):
|
||||
self._name = name
|
||||
self._resolver = resolver
|
||||
self._frontend_type = frontend_type
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def type(self) -> str:
|
||||
return self._frontend_type
|
||||
|
||||
def resolve(self, *args, **kwargs):
|
||||
return self._resolver(*args, **kwargs)
|
Reference in New Issue
Block a user