Added played_on_game_server achievement logic #268_achievements

This commit is contained in:
2023-07-15 14:42:01 +02:00
parent 6b86cc3ca8
commit 642a4d4dac
21 changed files with 188 additions and 27 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -0,0 +1 @@
# imports

View File

@@ -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")