From b7b61081be7dfd318db173761bb3c38a23ebd054 Mon Sep 17 00:00:00 2001 From: adator <85586985+adator85@users.noreply.github.com> Date: Sat, 25 Oct 2025 00:10:32 +0200 Subject: [PATCH] Fix get_datetime call and update some docstring. --- core/classes/commands.py | 4 +- core/classes/config.py | 4 +- core/classes/protocols/interface.py | 113 +++++++++++++++------------- core/classes/protocols/unreal6.py | 22 +++++- defender.py | 3 - mods/defender/mod_defender.py | 2 +- mods/defender/utils.py | 9 +-- version.json | 2 +- 8 files changed, 90 insertions(+), 69 deletions(-) diff --git a/core/classes/commands.py b/core/classes/commands.py index 29863a9..412756a 100644 --- a/core/classes/commands.py +++ b/core/classes/commands.py @@ -36,7 +36,7 @@ class Command: def get_command(self, command_name: str, module_name: str) -> Optional[MCommand]: for command in self.DB_COMMANDS: - if command.command_name.lower() == command_name and command.module_name == module_name: + if command.command_name.lower() == command_name.lower() and command.module_name.lower() == module_name.lower(): return command return None @@ -90,7 +90,7 @@ class Command: admin_level = admin.level if admin else 0 commands = self.get_commands_by_level(admin_level) - if command_name in [command.command_name for command in commands]: + if command_name.lower() in [command.command_name.lower() for command in commands]: return True return False diff --git a/core/classes/config.py b/core/classes/config.py index 724ee2a..d5dbe7e 100644 --- a/core/classes/config.py +++ b/core/classes/config.py @@ -42,11 +42,11 @@ class Configuration: try: import_config = self.__load_json_service_configuration() - Model_keys = MConfig().to_dict() + model_keys = MConfig().to_dict() model_key_list: list = [] json_config_key_list: list = [] - for key in Model_keys: + for key in model_keys: model_key_list.append(key) for key in import_config: diff --git a/core/classes/protocols/interface.py b/core/classes/protocols/interface.py index 676d383..dc3546d 100644 --- a/core/classes/protocols/interface.py +++ b/core/classes/protocols/interface.py @@ -288,46 +288,46 @@ class IProtocol(ABC): # ------------------------------------------------------------------------ @abstractmethod - def parse_uid(self, server_msg: list[str]) -> dict[str, str]: + def parse_uid(self, serverMsg: list[str]) -> dict[str, str]: """Parse UID and return dictionary. Args: - server_msg (list[str]): The UID IRCD message + serverMsg (list[str]): The UID IRCD message Returns: dict[str, str]: The response as dictionary. """ @abstractmethod - def parse_quit(self, server_msg: list[str]) -> dict[str, str]: + def parse_quit(self, serverMsg: list[str]) -> dict[str, str]: """Parse quit and return dictionary. >>> [':97KAAAAAB', 'QUIT', ':Quit:', 'this', 'is', 'my', 'reason', 'to', 'quit'] Args: - server_msg (list[str]): The server message to parse + serverMsg (list[str]): The server message to parse Returns: dict[str, str]: The response as dictionary. """ @abstractmethod - def parse_nick(self, server_msg: list[str]) -> dict[str, str]: + def parse_nick(self, serverMsg: list[str]) -> dict[str, str]: """Parse nick changes and return dictionary. >>> [':97KAAAAAC', 'NICK', 'testinspir', '1757360740'] Args: - server_msg (list[str]): The server message to parse + serverMsg (list[str]): The server message to parse Returns: dict[str, str]: The response as dictionary. """ @abstractmethod - def parse_privmsg(self, server_msg: list[str]) -> dict[str, str]: + def parse_privmsg(self, serverMsg: list[str]) -> dict[str, str]: """Parse PRIVMSG message. >>> [':97KAAAAAE', 'PRIVMSG', '#welcome', ':This', 'is', 'my', 'public', 'message'] Args: - server_msg (list[str]): The server message to parse + serverMsg (list[str]): The server message to parse Returns: dict[str, str]: The response as dictionary. @@ -345,174 +345,174 @@ class IProtocol(ABC): # ------------------------------------------------------------------------ @abstractmethod - def on_svs2mode(self, server_msg: list[str]) -> None: + def on_svs2mode(self, serverMsg: list[str]) -> None: """Handle svs2mode coming from a server >>> [':00BAAAAAG', 'SVS2MODE', '001U01R03', '-r'] Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_mode(self, server_msg: list[str]) -> None: + def on_mode(self, serverMsg: list[str]) -> None: """Handle mode coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_umode2(self, server_msg: list[str]) -> None: + def on_umode2(self, serverMsg: list[str]) -> None: """Handle umode2 coming from a server >>> [':adator_', 'UMODE2', '-i'] Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_quit(self, server_msg: list[str]) -> None: + def on_quit(self, serverMsg: list[str]) -> None: """Handle quit coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_squit(self, server_msg: list[str]) -> None: + def on_squit(self, serverMsg: list[str]) -> None: """Handle squit coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_protoctl(self, server_msg: list[str]) -> None: + def on_protoctl(self, serverMsg: list[str]) -> None: """Handle protoctl coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_nick(self, server_msg: list[str]) -> None: + def on_nick(self, serverMsg: list[str]) -> None: """Handle nick coming from a server new nickname Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_sjoin(self, server_msg: list[str]) -> None: + def on_sjoin(self, serverMsg: list[str]) -> None: """Handle sjoin coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_part(self, server_msg: list[str]) -> None: + def on_part(self, serverMsg: list[str]) -> None: """Handle part coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_eos(self, server_msg: list[str]) -> None: + def on_eos(self, serverMsg: list[str]) -> None: """Handle EOS coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_reputation(self, server_msg: list[str]) -> None: + def on_reputation(self, serverMsg: list[str]) -> None: """Handle REPUTATION coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_uid(self, server_msg: list[str]) -> None: + def on_uid(self, serverMsg: list[str]) -> None: """Handle uid message coming from the server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_privmsg(self, server_msg: list[str]) -> None: + def on_privmsg(self, serverMsg: list[str]) -> None: """Handle PRIVMSG message coming from the server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_server_ping(self, server_msg: list[str]) -> None: + def on_server_ping(self, serverMsg: list[str]) -> None: """Send a PONG message to the server Args: - server_msg (list[str]): List of str coming from the server + serverMsg (list[str]): List of str coming from the server """ @abstractmethod - def on_server(self, server_msg: list[str]) -> None: + def on_server(self, serverMsg: list[str]) -> None: """_summary_ Args: - server_msg (list[str]): _description_ + serverMsg (list[str]): _description_ """ @abstractmethod - def on_version(self, server_msg: list[str]) -> None: + def on_version(self, serverMsg: list[str]) -> None: """Sending Server Version to the server Args: - server_msg (list[str]): List of str coming from the server + serverMsg (list[str]): List of str coming from the server """ @abstractmethod - def on_time(self, server_msg: list[str]) -> None: + def on_time(self, serverMsg: list[str]) -> None: """Sending TIME answer to a requestor Args: - server_msg (list[str]): List of str coming from the server + serverMsg (list[str]): List of str coming from the server """ @abstractmethod - def on_ping(self, server_msg: list[str]) -> None: + def on_ping(self, serverMsg: list[str]) -> None: """Sending a PING answer to requestor Args: - server_msg (list[str]): List of str coming from the server + serverMsg (list[str]): List of str coming from the server """ @abstractmethod - def on_version_msg(self, server_msg: list[str]) -> None: + def on_version_msg(self, serverMsg: list[str]) -> None: """Handle version coming from the server \n ex. /version Defender Args: - server_msg (list[str]): Original message from the server + serverMsg (list[str]): Original message from the server """ @abstractmethod - def on_smod(self, server_msg: list[str]) -> None: + def on_smod(self, serverMsg: list[str]) -> None: """Handle SMOD message coming from the server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message """ @abstractmethod - def on_sasl(self, server_msg: list[str]) -> Optional['MSasl']: + def on_sasl(self, serverMsg: list[str]) -> Optional['MSasl']: """Handle SASL coming from a server Args: - server_msg (list[str]): Original server message + serverMsg (list[str]): Original server message Returns: @@ -530,9 +530,18 @@ class IProtocol(ABC): """ @abstractmethod - def on_md(self, server_msg: list[str]) -> None: + def on_md(self, serverMsg: list[str]) -> None: """Handle MD responses [':001', 'MD', 'client', '001MYIZ03', 'certfp', ':d1235648...'] Args: - server_msg (list[str]): The server reply + serverMsg (list[str]): The server reply + """ + + @abstractmethod + def on_kick(self, serverMsg: list[str]) -> None: + """When a user is kicked out from a channel + + Eg. ['@unrealircd.org...', ':001', 'KICK', '#jsonrpc', '001ELW13T', ':Kicked', 'from', 'JSONRPC', 'User'] + Args: + serverMsg (list[str]): The server message """ diff --git a/core/classes/protocols/unreal6.py b/core/classes/protocols/unreal6.py index 8d25c18..66933de 100644 --- a/core/classes/protocols/unreal6.py +++ b/core/classes/protocols/unreal6.py @@ -76,6 +76,7 @@ class Unrealircd6(IProtocol): self.Handler.register(m(command_name="SASL", func=self.on_sasl)) self.Handler.register(m(command_name="MD", func=self.on_md)) self.Handler.register(m(command_name="PRIVMSG", func=self.on_privmsg)) + self.Handler.register(m(command_name="KICK", func=self.on_kick)) return None @@ -699,7 +700,9 @@ class Unrealircd6(IProtocol): serverMsg (list[str]): The server message to parse Returns: - dict[str, str]: The response as dictionary. + dict: The response as dictionary. + + >>> {"uid": "", "newnickname": "", "timestamp": ""} """ scopy = serverMsg.copy() if scopy[0].startswith('@'): @@ -1611,4 +1614,19 @@ class Unrealircd6(IProtocol): ... except Exception as e: - self.__Logs.error(f"General Error: {e}") \ No newline at end of file + self.__Logs.error(f"General Error: {e}") + + def on_kick(self, serverMsg: list[str]) -> None: + """When a user is kicked out from a channel + + ['@unrealircd.org/issued-by=RPC:admin-for-test@...', ':001', 'KICK', '#jsonrpc', '001ELW13T', ':Kicked', 'from', 'JSONRPC', 'User'] + Args: + serverMsg (list[str]): The server message + """ + scopy = serverMsg.copy() + uid = scopy[4] + channel = scopy[3] + + # Delete the user from the channel. + self.__Irc.Channel.delete_user_from_channel(channel, uid) + return None \ No newline at end of file diff --git a/defender.py b/defender.py index 4a6ca45..ab6a6dd 100644 --- a/defender.py +++ b/defender.py @@ -16,9 +16,6 @@ try: from core.loader import Loader loader = Loader() loader.Irc.init_irc() - # from core.irc import Irc - # ircInstance = Irc(Loader()) - # ircInstance.init_irc(ircInstance) except AssertionError as ae: print(f'Assertion Error -> {ae}') diff --git a/mods/defender/mod_defender.py b/mods/defender/mod_defender.py index c5a674d..d727f9c 100644 --- a/mods/defender/mod_defender.py +++ b/mods/defender/mod_defender.py @@ -217,7 +217,7 @@ class Defender: if response is not None: q_insert = "INSERT INTO def_trusted (datetime, user, host, vhost) VALUES (?, ?, ?, ?)" - mes_donnees = {'datetime': self.Base.get_datetime(), 'user': nickname, 'host': '*', 'vhost': '*'} + mes_donnees = {'datetime': self.Loader.Utils.get_datetime(), 'user': nickname, 'host': '*', 'vhost': '*'} exec_query = self.Base.db_execute_query(q_insert, mes_donnees) pass diff --git a/mods/defender/utils.py b/mods/defender/utils.py index 5c3d155..32fb911 100644 --- a/mods/defender/utils.py +++ b/mods/defender/utils.py @@ -383,14 +383,11 @@ def action_apply_reputation_santions(uplink: 'Defender') -> None: color_red = gconfig.COLORS.red nogc = gconfig.COLORS.nogc salon_jail = gconfig.SALON_JAIL - - if reputation_flag == 0: - return None - elif reputation_timer == 0: - return None - uid_to_clean = [] + if reputation_flag == 0 or reputation_timer == 0: + return None + for user in irc.Reputation.UID_REPUTATION_DB: if not user.isWebirc: # Si il ne vient pas de WebIRC if irc.User.get_user_uptime_in_minutes(user.uid) >= reputation_timer and int(user.score_connexion) <= int(reputation_seuil): diff --git a/version.json b/version.json index bc371e8..8c87f36 100644 --- a/version.json +++ b/version.json @@ -1,5 +1,5 @@ { - "version": "6.3.0", + "version": "6.3.1", "requests": "2.32.3", "psutil": "6.0.0",