From 25bbddf459b909a60499bf76b61cf4d6036aeea4 Mon Sep 17 00:00:00 2001 From: adator <85586985+adator85@users.noreply.github.com> Date: Mon, 25 Aug 2025 23:22:50 +0200 Subject: [PATCH] Adding language field to admin db and local variable --- README.md | 2 +- core/base.py | 5 +++-- core/classes/admin.py | 18 +++++++++++++++++- core/definition.py | 2 ++ core/irc.py | 29 +++++++++++++++++------------ defender.py | 2 +- 6 files changed, 41 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index a2a672e..ecae94a 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Pour Les prochains lancement de defender vous devez utiliser la commande suivant $ cd IRC_DEFENDER_MODULES $ python3 -m venv .pyenv $ source .pyenv/bin/activate - (pyenv)$ pip install sqlalchemy, psutil, requests, faker, unrealircd_rpc_py + (pyenv)$ pip install sqlalchemy, psutil, requests, faker, unrealircd_rpc_py, pyyaml # Créer un service nommé "defender.service" # pour votre service et placer le dans "/PATH/TO/USER/.config/systemd/user/" diff --git a/core/base.py b/core/base.py index cd59aaf..9fcb0f5 100644 --- a/core/base.py +++ b/core/base.py @@ -296,13 +296,14 @@ class Base: 'password': password, 'hostname': '*', 'vhost': '*', + 'language': 'EN', 'level': 5 } self.db_execute_query(f""" INSERT INTO {self.Config.TABLE_ADMIN} - (createdOn, user, password, hostname, vhost, level) + (createdOn, user, password, hostname, vhost, language, level) VALUES - (:createdOn, :user, :password, :hostname, :vhost, :level)""" + (:createdOn, :user, :password, :hostname, :vhost, :language, :level)""" , mes_donnees) return None diff --git a/core/classes/admin.py b/core/classes/admin.py index 3fa1750..83444dd 100644 --- a/core/classes/admin.py +++ b/core/classes/admin.py @@ -152,4 +152,20 @@ class Admin: if record.uid == uidornickname: return record.nickname - return None \ No newline at end of file + return None + + def get_language(self, uidornickname: str) -> Optional[str]: + """Get the language of the admin + + Args: + uidornickname (str): The user ID or the Nickname of the admin + + Returns: + Optional[str]: The language selected by the admin. + """ + admin = self.get_admin(uidornickname) + + if admin is None: + return None + + return admin.language \ No newline at end of file diff --git a/core/definition.py b/core/definition.py index c476066..657a01f 100644 --- a/core/definition.py +++ b/core/definition.py @@ -76,6 +76,7 @@ class MAdmin(MainModel): score_connexion: int = 0 geoip: str = None connexion_datetime: datetime = field(default=datetime.now()) + language: str = "EN" level: int = 0 @dataclass @@ -362,5 +363,6 @@ class MSasl(MainModel): username: Optional[str] = None password: Optional[str] = None fingerprint: Optional[str] = None + language: str = "EN" auth_success: bool = False level: int = 0 \ No newline at end of file diff --git a/core/irc.py b/core/irc.py index 39961ab..81fc338 100644 --- a/core/irc.py +++ b/core/irc.py @@ -313,15 +313,15 @@ class Irc: def db_get_admin_info(*, username: Optional[str] = None, password: Optional[str] = None, fingerprint: Optional[str] = None) -> Optional[dict[str, Any]]: if fingerprint: mes_donnees = {'fingerprint': fingerprint} - query = f"SELECT user, level FROM {self.Config.TABLE_ADMIN} WHERE fingerprint = :fingerprint" + query = f"SELECT user, level, language FROM {self.Config.TABLE_ADMIN} WHERE fingerprint = :fingerprint" else: mes_donnees = {'user': username, 'password': self.Utils.hash_password(password)} - query = f"SELECT user, level FROM {self.Config.TABLE_ADMIN} WHERE user = :user AND password = :password" + query = f"SELECT user, level, language FROM {self.Config.TABLE_ADMIN} WHERE user = :user AND password = :password" result = self.Base.db_execute_query(query, mes_donnees) user_from_db = result.fetchone() if user_from_db: - return {'user': user_from_db[0], 'level': user_from_db[1]} + return {'user': user_from_db[0], 'level': user_from_db[1], 'language': user_from_db[2]} else: return None @@ -331,6 +331,7 @@ class Irc: if admin_info is not None: s.auth_success = True s.level = admin_info.get('level', 0) + s.language = admin_info.get('language', 'EN') self.Protocol.send2socket(f":{self.Config.SERVEUR_LINK} SASL {self.Settings.MAIN_SERVER_HOSTNAME} {s.client_uid} D S") self.Protocol.send2socket(f":{self.Config.SERVEUR_LINK} 903 {s.username} :SASL authentication successful") else: @@ -345,6 +346,7 @@ class Irc: s.auth_success = True s.level = admin_info.get('level', 0) s.username = admin_info.get('user', None) + s.language = admin_info.get('language', 'EN') self.Protocol.send2socket(f":{self.Config.SERVEUR_LINK} SASL {self.Settings.MAIN_SERVER_HOSTNAME} {s.client_uid} D S") self.Protocol.send2socket(f":{self.Config.SERVEUR_LINK} 903 {s.username} :SASL authentication successful") else: @@ -380,14 +382,16 @@ class Irc: time.sleep(beat) self.Base.execute_periodic_action() - def insert_db_admin(self, uid: str, account: str, level: int) -> None: + def insert_db_admin(self, uid: str, account: str, level: int, language: str) -> None: user_obj = self.User.get_user(uid) + if user_obj is None: return None - + self.Admin.insert( self.Loader.Definition.MAdmin( **user_obj.to_dict(), + language=language, account=account, level=int(level) ) @@ -515,7 +519,7 @@ class Irc: sasl_obj = self.Sasl.get_sasl_obj(uid) if sasl_obj: if sasl_obj.auth_success: - self.insert_db_admin(sasl_obj.client_uid, sasl_obj.username, sasl_obj.level) + self.insert_db_admin(sasl_obj.client_uid, sasl_obj.username, sasl_obj.level, sasl_obj.language) self.Protocol.send_priv_msg(nick_from=dnickname, msg=tr("[ %sSASL AUTH%s ] - %s (%s) is now connected successfuly to %s", GREEN, NOGC, nickname, sasl_obj.username, dnickname), channel=dchanlog) @@ -736,7 +740,7 @@ class Irc: if cmd_owner == config_owner and cmd_password == config_password: self.Base.db_create_first_admin() - self.insert_db_admin(current_uid, cmd_owner, 5) + self.insert_db_admin(current_uid, cmd_owner, 5, self.Config.LANG) self.Protocol.send_priv_msg( msg=f"[ {self.Config.COLORS.green}{str(current_command).upper()} ]{self.Config.COLORS.black} - {self.User.get_nickname(fromuser)} est désormais connecté a {dnickname}", nick_from=dnickname, @@ -787,14 +791,15 @@ class Irc: return None mes_donnees = {'user': user_to_log, 'password': self.Loader.Utils.hash_password(password)} - query = f"SELECT id, user, level FROM {self.Config.TABLE_ADMIN} WHERE user = :user AND password = :password" + query = f"SELECT id, user, level, language FROM {self.Config.TABLE_ADMIN} WHERE user = :user AND password = :password" result = self.Base.db_execute_query(query, mes_donnees) user_from_db = result.fetchone() if user_from_db: - account = user_from_db[1] - level = user_from_db[2] - self.insert_db_admin(current_client.uid, account, level) + account = str(user_from_db[1]) + level = int(user_from_db[2]) + language = str(user_from_db[3]) + self.insert_db_admin(current_client.uid, account, level, language) self.Protocol.send_priv_msg(nick_from=dnickname, msg=f"[ {GREEN}{str(current_command).upper()}{NOGC} ] - {current_client.nickname} ({account}) est désormais connecté a {dnickname}", channel=dchanlog) @@ -1269,7 +1274,7 @@ class Irc: self.Protocol.send_notice( nick_from=dnickname, nick_to=fromuser, - msg=f"UID : {db_admin.uid} - Nickname: {db_admin.nickname} - Account: {db_admin.account} - Level: {db_admin.level} - Connection: {db_admin.connexion_datetime}" + msg=f"UID : {db_admin.uid} - Nickname: {db_admin.nickname} - Account: {db_admin.account} - Level: {db_admin.level} - Language: {db_admin.language} - Connection: {db_admin.connexion_datetime}" ) return None diff --git a/defender.py b/defender.py index 2248040..ace6ab3 100644 --- a/defender.py +++ b/defender.py @@ -5,7 +5,7 @@ from core import installation # Requierements : # # Python3.10 or higher # # SQLAlchemy, requests, psutil # -# unrealircd-rpc-py # +# unrealircd-rpc-py, pyyaml # # UnrealIRCD 6.2.2 or higher # #############################################