Added played_on_game_server achievement logic #268_achievements
This commit is contained in:
@@ -3,6 +3,7 @@ from typing import List
|
||||
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.game_server_repository_abc import GameServerRepositoryABC
|
||||
from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
|
||||
from bot_data.abc.level_repository_abc import LevelRepositoryABC
|
||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||
@@ -21,6 +22,7 @@ class AchievementAttributeResolver:
|
||||
known_users: KnownUserRepositoryABC,
|
||||
levels: LevelRepositoryABC,
|
||||
servers: ServerRepositoryABC,
|
||||
game_servers: GameServerRepositoryABC,
|
||||
user_joined_servers: UserJoinedServerRepositoryABC,
|
||||
user_joined_voice_channels: UserJoinedVoiceChannelRepositoryABC,
|
||||
user_joined_game_server: UserJoinedGameServerRepositoryABC,
|
||||
@@ -32,6 +34,7 @@ class AchievementAttributeResolver:
|
||||
self._known_users = known_users
|
||||
self._levels = levels
|
||||
self._servers = servers
|
||||
self._game_servers = game_servers
|
||||
self._user_joined_servers = user_joined_servers
|
||||
self._user_joined_voice_channels = user_joined_voice_channels
|
||||
self._user_joined_game_server = user_joined_game_server
|
||||
@@ -40,4 +43,4 @@ class AchievementAttributeResolver:
|
||||
|
||||
def get_played_on_game_server(self, user: User) -> List[str]:
|
||||
joins = self._user_joined_game_server.get_user_joined_game_servers_by_user_id(user.id)
|
||||
return joins.select(lambda x: x.name)
|
||||
return joins.select(lambda x: x.game_server.name)
|
||||
|
@@ -68,7 +68,7 @@ class AchievementService:
|
||||
def get_attributes(self) -> List[AchievementAttribute]:
|
||||
return self._attributes
|
||||
|
||||
def _match(self, value: str, operator: str, expected_value: str) -> bool:
|
||||
def _match(self, value: any, operator: str, expected_value: str) -> bool:
|
||||
return self._operators[operator](value, expected_value)
|
||||
|
||||
def has_user_achievement_already(self, user: User, achievement: Achievement) -> bool:
|
||||
@@ -77,7 +77,7 @@ class AchievementService:
|
||||
|
||||
def has_user_achievement(self, user: User, achievement: Achievement) -> bool:
|
||||
attribute: AchievementAttribute = self._attributes.where(lambda x: x.name == achievement.attribute).single()
|
||||
return self._match(str(attribute.resolve(user)), achievement.operator, achievement.value)
|
||||
return self._match(attribute.resolve(user), achievement.operator, achievement.value)
|
||||
|
||||
async def validate_achievements_for_user(self, user: User):
|
||||
achievements = self._achievements.get_achievements_by_server_id(user.server.id)
|
||||
|
@@ -6,7 +6,9 @@ from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
|
||||
|
||||
from bot_core.abc.module_abc import ModuleABC
|
||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||
from modules.achievements.achievement_attribute_resolver import AchievementAttributeResolver
|
||||
from modules.achievements.achievement_service import AchievementService
|
||||
from modules.achievements.commands.achievements_group import AchievementGroup
|
||||
from modules.achievements.events.achievement_on_message_event import AchievementOnMessageEvent
|
||||
|
||||
|
||||
@@ -18,5 +20,9 @@ class AchievementsModule(ModuleABC):
|
||||
pass
|
||||
|
||||
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
||||
services.add_transient(AchievementAttributeResolver)
|
||||
services.add_transient(AchievementService)
|
||||
|
||||
self._dc.add_command(AchievementGroup)
|
||||
|
||||
self._dc.add_event(DiscordEventTypesEnum.on_message.value, AchievementOnMessageEvent)
|
||||
|
1
kdb-bot/src/modules/achievements/commands/__init__.py
Normal file
1
kdb-bot/src/modules/achievements/commands/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# imports
|
@@ -0,0 +1,57 @@
|
||||
import discord
|
||||
from cpl_discord.command import DiscordCommandABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
from cpl_translation import TranslatePipe
|
||||
from discord.ext import commands
|
||||
from discord.ext.commands import Context
|
||||
|
||||
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||
from bot_core.helper.command_checks import CommandChecks
|
||||
from bot_core.logging.command_logger import CommandLogger
|
||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
||||
from modules.achievements.achievement_service import AchievementService
|
||||
|
||||
|
||||
class AchievementGroup(DiscordCommandABC):
|
||||
def __init__(
|
||||
self,
|
||||
logger: CommandLogger,
|
||||
message_service: MessageServiceABC,
|
||||
bot: DiscordBotServiceABC,
|
||||
servers: ServerRepositoryABC,
|
||||
users: UserRepositoryABC,
|
||||
achievement_service: AchievementService,
|
||||
translate: TranslatePipe,
|
||||
):
|
||||
DiscordCommandABC.__init__(self)
|
||||
|
||||
self._logger = logger
|
||||
self._message_service = message_service
|
||||
self._bot = bot
|
||||
self._servers = servers
|
||||
self._users = users
|
||||
self._achievement_service = achievement_service
|
||||
self._t = translate
|
||||
|
||||
@commands.hybrid_group()
|
||||
@commands.guild_only()
|
||||
async def achievement(self, ctx: Context):
|
||||
pass
|
||||
|
||||
@achievement.command()
|
||||
@commands.guild_only()
|
||||
@CommandChecks.check_is_ready()
|
||||
@CommandChecks.check_is_member_moderator()
|
||||
async def check(self, ctx: Context, member: discord.Member):
|
||||
self._logger.debug(__name__, f"Received command achievement check {ctx}")
|
||||
|
||||
server = self._servers.get_server_by_discord_id(member.guild.id)
|
||||
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.id)
|
||||
await self._message_service.send_ctx_msg(
|
||||
ctx,
|
||||
self._t.transform("modules.achievements.commands.check"),
|
||||
)
|
||||
await self._achievement_service.validate_achievements_for_user(user)
|
||||
|
||||
self._logger.trace(__name__, f"Finished command achievement check")
|
Reference in New Issue
Block a user