| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				@@ -0,0 +1,147 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				import discord
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from cpl_core.configuration import ConfigurationABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from cpl_core.database.context import DatabaseContextABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from cpl_discord.command import DiscordCommandABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from cpl_discord.service import DiscordBotServiceABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from cpl_translation import TranslatePipe
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from discord import app_commands
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from discord.ext import commands
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from discord.ext.commands import Context
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_core.abc.client_utils_abc import ClientUtilsABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_core.abc.message_service_abc import MessageServiceABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				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 bot_data.model.server_config import ServerConfig
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_data.model.technician_config import TechnicianConfig
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from bot_data.model.user import User
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				from modules.permission.abc.permission_service_abc import PermissionServiceABC
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				class SyncXpGroup(DiscordCommandABC):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def __init__(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        logger: CommandLogger,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        config: ConfigurationABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        message_service: MessageServiceABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        bot: DiscordBotServiceABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        client_utils: ClientUtilsABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        translate: TranslatePipe,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        servers: ServerRepositoryABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        users: UserRepositoryABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        permissions: PermissionServiceABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        settings: TechnicianConfig,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        db: DatabaseContextABC,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    ):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        DiscordCommandABC.__init__(self)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger = logger
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._config = config
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._message_service = message_service
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._bot = bot
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._client_utils = client_utils
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._t = translate
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._servers = servers
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._users = users
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._permissions = permissions
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._settings = settings
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._db = db
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger.trace(__name__, f"Loaded command service: {type(self).__name__}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @commands.hybrid_group(name="sync-xp")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @commands.guild_only()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    async def sync_xp(self, ctx: Context):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        pass
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @sync_xp.command(name="all-members")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @commands.guild_only()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @CommandChecks.check_is_ready()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @CommandChecks.check_is_member_technician()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    async def all_members(self, ctx: Context, server_id: int):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger.debug(__name__, f"Received command sync xp {ctx}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if ctx.guild is None:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if not FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum.sync_xp):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            await self._message_service.send_ctx_msg(ctx, self._t.transform("common.feature_not_activated"))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        other_server = self._servers.get_server_by_id(server_id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        users_on_other_server = self._users.get_users_by_server_id(other_server.id).where(lambda x: not x.left_server)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        discord_ids_on_other_server = users_on_other_server.select(lambda x: x.discord_id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for user in self._users.get_users_by_server_id(self._servers.get_server_by_discord_id(ctx.guild.id).id).where(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            lambda x: not x.left_server
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            try:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if user.discord_id not in discord_ids_on_other_server:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    continue
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                user_on_other_server: User = users_on_other_server.where(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    lambda x: x.discord_id == user.discord_id
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                ).first_or_default()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if user_on_other_server is None or user_on_other_server.xp <= user.xp:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    continue
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                user.xp = user_on_other_server.xp
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                self._users.update_user(user)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                self._db.save_changes()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            except Exception as e:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                self._logger.error(__name__, f"Cannot sync user {user.name}", e)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.technician.synced_message"))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger.trace(__name__, f"Finished sync xp command")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @sync_xp.command(name="by_member")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @commands.guild_only()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @CommandChecks.check_is_ready()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @CommandChecks.check_is_member_technician()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    async def by_member(self, ctx: Context, server_id: int, member: discord.Member):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger.debug(__name__, f"Received command sync xp {ctx}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if ctx.guild is None:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if not FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum.sync_xp):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            await self._message_service.send_ctx_msg(ctx, self._t.transform("common.feature_not_activated"))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        other_server = self._servers.get_server_by_id(server_id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        user = self._users.get_user_by_discord_id_and_server_id(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self._servers.get_server_by_discord_id(ctx.guild.id).id, member.id
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        try:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            user_on_other_server = (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                self._users.get_users_by_server_id(other_server.id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                .where(lambda x: x.discord_id == member.id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                .first_or_default()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if user_on_other_server is None or user_on_other_server.xp <= user.xp:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            user.xp = user_on_other_server.xp
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self._users.update_user(user)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self._db.save_changes()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        except Exception as e:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self._logger.error(__name__, f"Cannot sync user {user.name}", e)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.technician.synced_message"))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        self._logger.trace(__name__, f"Finished sync xp command")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    @sync_xp.autocomplete("server_id")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    async def list_autocomplete(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            app_commands.Choice(name=server.name, value=server.id)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            for server in self._client_utils.get_auto_complete_list(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                self._servers.get_servers(), current, lambda x: x.name
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ]
 |