From 322759c5ef8a0125f4bb48a53d6bde73fd54f13e Mon Sep 17 00:00:00 2001 From: adator <85586985+adator85@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:15:24 +0200 Subject: [PATCH] V5.1.6 --- README.md | 22 ++++++--- core/base.py | 6 +-- core/installation.py | 4 +- core/loadConf.py | 2 +- mods/mod_command.py | 105 +++++++++++++++++++++++++++++++------------ mods/mod_test.py | 2 +- mods/mod_votekick.py | 25 ++++++++++- version.json | 2 +- 8 files changed, 122 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index ee97af0..bd8860f 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ Pour Les prochains lancement de defender vous devez utiliser la commande suivant SERVEUR_PASSWORD: Mot de passe d'enregistrement du service sur le serveur IRC. SERVEUR_ID: Identifiant unique du service. SERVEUR_SSL: Active la connexion SSL sécurisée au serveur IRC (true/false). + SERVICE (Service) SERVICE_NAME: Nom du service IRC. SERVICE_NICKNAME: Surnom utilisé par le service sur le serveur IRC. @@ -72,35 +73,46 @@ Pour Les prochains lancement de defender vous devez utiliser la commande suivant SERVICE_CMODES: Modes de canal appliqués aux canaux rejoints par le service. SERVICE_UMODES: Modes utilisateur appliqués au service. SERVICE_PREFIX: Caractère utilisé comme préfixe des commandes du service. + COMPTE (Compte) OWNER: Nom d'utilisateur possédant les droits d'administration du service. PASSWORD: Mot de passe de l'administrateur du service. + CANAUX (Canaux) SALON_JAIL: Canal utilisé comme prison pour les utilisateurs sanctionnés. SALON_JAIL_MODES: Modes appliqués au canal de prison. SALON_LIBERER: Canal utilisé pour la libération des utilisateurs sanctionnés. + API (API) API_TIMEOUT: Durée maximale d'attente d'une réponse de l'API en secondes. + SCANNER (Scanner) PORTS_TO_SCAN: Liste des ports à scanner pour détecter des serveurs potentiellement malveillants. + SÉCURITÉ (Sécurité) WHITELISTED_IP: Liste d'adresses IP autorisées à contourner certaines restrictions. GLINE_DURATION: Durée de bannissement temporaire d'un utilisateur en minutes. + DEBUG (Debug) DEBUG_LEVEL: Niveau de verbosité des messages de debug (plus grand est le nombre, plus il y a d'informations). + COULEURS (Couleurs) CONFIG_COLOR: Dictionnaire contenant des codes de couleurs IRC pour un meilleur affichage des messages. Modification de la configuration - Vous devez modifier le fichier config.json en remplaçant les valeurs par défaut avec vos propres informations. Assurez-vous de bien lire la description de chaque paramètre pour une configuration optimale du service. + Vous devez modifier le fichier configuration.json en remplaçant les valeurs par défaut avec vos propres informations. Assurez-vous de bien lire la description de chaque paramètre pour une configuration optimale du service. - Attention +# \\!/ Attention \\!/ +Le mot de passe de l'administrateur et le mot de passe du service doivent être modifiés pour des raisons de sécurité. +Ne partagez pas vos informations de connexion au serveur IRC avec des tiers. +a votre premiere connexion vous devez tapez - Le mot de passe de l'administrateur et le mot de passe du service doivent être modifiés pour des raisons de sécurité. - Ne partagez pas vos informations de connexion au serveur IRC avec des tiers. + /msg [NomDuService] auth [nickname] [password] + -- Une fois identifié tapez la commande suivante + /msg [NomDuService] editaccess [nickname] [Nouveau-Password] 5 -#Extension: +# Extension: Le code est modulaire et conçu pour être facilement étendu. Vous pouvez ajouter de nouvelles commandes, de nouvelles fonctionnalités (mods/mod_test.py est un exemple pour bien demarrer la création de son module). # Contributions: diff --git a/core/base.py b/core/base.py index 2c55877..ba99e9c 100644 --- a/core/base.py +++ b/core/base.py @@ -9,10 +9,6 @@ from core.loadConf import ConfigDataModel class Base: - # CORE_DB_PATH = 'core' + os.sep + 'db' + os.sep # Le dossier bases de données core - # MODS_DB_PATH = 'mods' + os.sep + 'db' + os.sep # Le dossier bases de données des modules - # PYTHON_MIN_VERSION = '3.10' # Version min de python - def __init__(self, Config: ConfigDataModel) -> None: self.Config = Config # Assigner l'objet de configuration @@ -749,4 +745,4 @@ class Base: except TypeError as te: self.logs.error(f'TypeError: [{channelToCheck}] - {te}') except Exception as err: - self.logs.error(f'TypeError: {err}') + self.logs.error(f'Error Not defined: {err}') diff --git a/core/installation.py b/core/installation.py index 4fe97e9..fb68d56 100644 --- a/core/installation.py +++ b/core/installation.py @@ -133,11 +133,11 @@ class Install: min_major, min_minor = tuple((python_required_version[0], python_required_version[1])) if int(sys_major) < int(min_major): - print(f"## Your python version must be greather than or equal to {self.config.python_current_version} ##") + print(f"## Your python version must be greather than or equal to {self.config.python_min_version} ##") return False elif (int(sys_major) <= int(min_major)) and (int(sys_minor) < int(min_minor)): - print(f"## Your python version must be greather than or equal to {self.config.python_current_version} ##") + print(f"## Your python version must be greather than or equal to {self.config.python_min_version} ##") return False print(f"> Version of python : {self.config.python_current_version} ==> OK") diff --git a/core/loadConf.py b/core/loadConf.py index 7002207..e6b676d 100644 --- a/core/loadConf.py +++ b/core/loadConf.py @@ -94,7 +94,7 @@ class ConfigDataModel: GLINE_DURATION: str """Gline duration""" - DEBUG_LEVEL:Literal[10, 20, 30, 40, 50] # Le niveau des logs DEBUG 10 | INFO 20 | WARNING 30 | ERROR 40 | CRITICAL 50 + DEBUG_LEVEL:Literal[10, 20, 30, 40, 50] """Logs level: DEBUG 10 | INFO 20 | WARNING 30 | ERROR 40 | CRITICAL 50""" CONFIG_COLOR: dict[str, str] diff --git a/mods/mod_command.py b/mods/mod_command.py index 3ca0972..38a3dae 100644 --- a/mods/mod_command.py +++ b/mods/mod_command.py @@ -178,6 +178,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd OP: {str(e)}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'devoiceall': try: @@ -185,40 +187,52 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd OP: {str(e)}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'voiceall': - chan_info = self.Channel.get_Channel(fromchannel) - set_mode = 'v' - mode:str = '' - users:str = '' - uids_split = [chan_info.uids[i:i + 6] for i in range(0, len(chan_info.uids), 6)] + try: + chan_info = self.Channel.get_Channel(fromchannel) + set_mode = 'v' + mode:str = '' + users:str = '' + uids_split = [chan_info.uids[i:i + 6] for i in range(0, len(chan_info.uids), 6)] - self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{set_mode} {dnickname}") - for uid in uids_split: - for i in range(0, len(uid)): - mode += set_mode - users += f'{self.User.get_nickname(self.Base.clean_uid(uid[i]))} ' - if i == len(uid) - 1: - self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{mode} {users}") - mode = '' - users = '' + self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{set_mode} {dnickname}") + for uid in uids_split: + for i in range(0, len(uid)): + mode += set_mode + users += f'{self.User.get_nickname(self.Base.clean_uid(uid[i]))} ' + if i == len(uid) - 1: + self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{mode} {users}") + mode = '' + users = '' + except IndexError as e: + self.Logs.warning(f'_hcmd OP: {str(e)}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'opall': - chan_info = self.Channel.get_Channel(fromchannel) - set_mode = 'o' - mode:str = '' - users:str = '' - uids_split = [chan_info.uids[i:i + 6] for i in range(0, len(chan_info.uids), 6)] + try: + chan_info = self.Channel.get_Channel(fromchannel) + set_mode = 'o' + mode:str = '' + users:str = '' + uids_split = [chan_info.uids[i:i + 6] for i in range(0, len(chan_info.uids), 6)] - self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{set_mode} {dnickname}") - for uid in uids_split: - for i in range(0, len(uid)): - mode += set_mode - users += f'{self.User.get_nickname(self.Base.clean_uid(uid[i]))} ' - if i == len(uid) - 1: - self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{mode} {users}") - mode = '' - users = '' + self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{set_mode} {dnickname}") + for uid in uids_split: + for i in range(0, len(uid)): + mode += set_mode + users += f'{self.User.get_nickname(self.Base.clean_uid(uid[i]))} ' + if i == len(uid) - 1: + self.Irc.send2socket(f":{service_id} MODE {fromchannel} +{mode} {users}") + mode = '' + users = '' + except IndexError as e: + self.Logs.warning(f'_hcmd OP: {str(e)}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'op': # /mode #channel +o user @@ -246,6 +260,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd OP: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} op [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'deop': # /mode #channel -o user @@ -271,6 +287,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd DEOP: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} deop [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'owner': # /mode #channel +q user @@ -296,6 +314,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd OWNER: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} owner [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'deowner': # /mode #channel -q user @@ -321,6 +341,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd DEOWNER: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} deowner [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'halfop': # /mode #channel +h user @@ -346,6 +368,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd halfop: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} halfop [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'dehalfop': # /mode #channel -h user @@ -371,6 +395,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd DEHALFOP: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} dehalfop [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'voice': # /mode #channel +v user @@ -396,6 +422,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd VOICE: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} voice [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'devoice': # /mode #channel -v user @@ -421,6 +449,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd DEVOICE: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} devoice [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'ban': # .ban #channel nickname @@ -437,6 +467,8 @@ class Command(): except IndexError as e: self.Logs.warning(f'_hcmd BAN: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} ban [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'unban': # .unban #channel nickname @@ -449,9 +481,12 @@ class Command(): self.Irc.send2socket(f":{service_id} MODE {sentchannel} -b {nickname}!*@*") self.Logs.debug(f'{fromuser} has unbanned {nickname} from {sentchannel}') + except IndexError as e: self.Logs.warning(f'_hcmd UNBAN: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} unban [#SALON] [NICKNAME]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'kick': # .kick #channel nickname reason @@ -470,9 +505,12 @@ class Command(): self.Irc.send2socket(f":{service_id} KICK {sentchannel} {nickname} {final_reason}") self.Logs.debug(f'{fromuser} has kicked {nickname} from {sentchannel} : {final_reason}') + except IndexError as e: self.Logs.warning(f'_hcmd KICK: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} kick [#SALON] [NICKNAME] [REASON]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'kickban': # .kickban #channel nickname reason @@ -492,9 +530,12 @@ class Command(): self.Irc.send2socket(f":{service_id} KICK {sentchannel} {nickname} {final_reason}") self.Irc.send2socket(f":{service_id} MODE {sentchannel} +b {nickname}!*@*") self.Logs.debug(f'{fromuser} has kicked and banned {nickname} from {sentchannel} : {final_reason}') + except IndexError as e: self.Logs.warning(f'_hcmd KICKBAN: {str(e)}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} : Right command : /msg {dnickname} kickban [#SALON] [NICKNAME] [REASON]') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'join': @@ -510,6 +551,8 @@ class Command(): except IndexError as ie: self.Logs.error(f'{ie}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'part': @@ -529,6 +572,8 @@ class Command(): except IndexError as ie: self.Logs.error(f'{ie}') + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') case 'umode': try: @@ -538,4 +583,6 @@ class Command(): self.send2socket(f':{dnickname} SVSMODE {nickname} {umode}') except KeyError as ke: - self.Base.logs.error(ke) \ No newline at end of file + self.Base.logs.error(ke) + except Exception as err: + self.Logs.warning(f'Unknown Error: {str(err)}') \ No newline at end of file diff --git a/mods/mod_test.py b/mods/mod_test.py index 6942bc0..4c3ddce 100644 --- a/mods/mod_test.py +++ b/mods/mod_test.py @@ -152,4 +152,4 @@ class Test(): self.Logs.debug(f"Test logs ready") except Exception as err: - self.Logs.error(f"{err}") \ No newline at end of file + self.Logs.error(f"Unknown Error: {err}") \ No newline at end of file diff --git a/mods/mod_votekick.py b/mods/mod_votekick.py index f7df5aa..34b7093 100644 --- a/mods/mod_votekick.py +++ b/mods/mod_votekick.py @@ -48,8 +48,7 @@ class Votekick(): # Créer les nouvelles commandes du module self.commands_level = { - 0: ['vote'], - 1: ['activate', 'deactivate', 'submit', 'vote_stat', 'vote_verdict', 'vote_cancel'] + 0: ['vote'] } # Init the module @@ -60,6 +59,7 @@ class Votekick(): def __init_module(self) -> None: + # Add admin object to retrieve admin users self.Admin = self.Irc.Admin self.__set_commands(self.commands_level) @@ -264,6 +264,17 @@ class Votekick(): match command: case 'vote': option = str(cmd[1]).lower() + + if len(command) == 1: + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote activate #channel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote deactivate #channel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote +') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote -') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote cancel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote status') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote submit nickname') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote verdict') + match option: case 'activate': @@ -472,3 +483,13 @@ class Votekick(): self.Logs.error(f'{err}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} {command} {option}') self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :Exemple /msg {dnickname} {command} {option}') + + case _: + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote activate #channel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote deactivate #channel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote +') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote -') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote cancel') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote status') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote submit nickname') + self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :/msg {dnickname} vote verdict') \ No newline at end of file diff --git a/version.json b/version.json index 7bffc70..c5baee8 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "5.1.5" + "version": "5.1.6" } \ No newline at end of file