[-] hosts.*.meta.history

[+] debug log
[+] [PERMS] some checks
[+] parents support
[+] is_allowed to prepare for new...
This commit is contained in:
2024-01-16 18:23:44 +03:00
parent a56a6506d6
commit 186053f8ec
2 changed files with 52 additions and 21 deletions

View File

@@ -71,8 +71,9 @@ hosts:
# Разрешение: bot.rcon.<name>; bot.online.<name>; bot.history.<name>
# При запуске бота будет проверка доступности всего
rcon: 2 # RCON будет доступен по команде .rcon lobby <cmd> (разрешение: bot.rcon.lobby)
online: 2 # !online будет доступен по команде !online lobby (разрешение: bot.online.lobby)
history: 2 # !history будет доступен по команде !history lobby (разрешение: bot.history.lobby)
# !online будет доступен по команде !online lobby (разрешение: bot.online.lobby)
# !history будет доступен по команде !history lobby (разрешение: bot.history.lobby)
online: 2
rcon: # RCON подключение
host: 192.168.0.31
port: 15101
@@ -88,7 +89,6 @@ hosts:
java: true
rcon: 1
online: 2
history: 2
rcon:
host: 192.168.0.31
port: 15100
@@ -104,7 +104,6 @@ hosts:
java: true
rcon: 2
online: 2
history: 0
rcon:
host: 192.168.0.31
port: 15108
@@ -120,7 +119,6 @@ hosts:
important: true
rcon: 0
online: 1
history: 1
rcon: null
mine:
host: 192.168.0.31
@@ -141,6 +139,7 @@ if not os.path.exists(config_dir):
def init_logger():
log_debug = "./logs/debug.log"
log_file = "./logs/latest.log"
log_dir = os.path.dirname(log_file) + "/"
if not os.path.exists(log_dir):
@@ -160,9 +159,10 @@ def init_logger():
zipf.write(file, os.path.basename(file))
os.remove(file)
logger.remove(0)
logger.add(log_file)
logger.add(log_debug, level=0)
logger.add(log_file, format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {message}", level="INFO")
logger.add(sys.stdout, format="\r<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<level>{level: <8}</level> | {message}")
"<level>{level: <8}</level> | {message}", level="INFO")
init_logger()

View File

@@ -3,27 +3,54 @@ from pathlib import Path
from loguru import logger
from modules import yaml, raw_config_perms
from modules import yaml, raw_config_perms, enter_to_exit
class Permissions:
perm_file = Path("permissions.yml")
def __init__(self, **kwargs):
logger.debug(f"[PERMS] Initializing Permissions")
logger.debug(f"[PERMS] {kwargs=}")
self._no_role = kwargs.get("noRole")
self._no_nick = kwargs.get("noNick")
self.no_rights = kwargs.get("noRights")
self._perms = kwargs['perms']
self._nicks = kwargs['nicks']
self._perms = kwargs.get('perms')
if not self._perms or not isinstance(self._perms, dict):
logger.error(f"[PERMS] Блок: {"perms"!r}, в {self.perm_file!r} - Не валидный")
logger.debug(f"perms: {type(self._perms)}")
logger.debug(self._perms)
enter_to_exit()
self._nicks = kwargs.get('nicks', {})
self._members = {}
self.__handle_members()
logger.info(f"[PERMS] Права загружены")
def __handle_parents(self, p=None):
if p is None:
p = {}
for parent, v in self._perms.items():
for child in v.get("parent", []):
p[child] = parent
if p.get(child) == parent and p.get(parent) == child:
logger.warning(f"[PERMS] Рекурсивное присваивание запрещено: "
f"perms.{child}.parent.{parent} - perms.{parent}.parent.{child} ({self.perm_file!r})")
del p[parent]
for child, parent in p.items():
_parent = self._perms.get(child)
if _parent:
logger.debug(f"[PERMS] Add {child}.allow to {parent}.allow")
self._perms[parent]['allow'] += self._perms[child]['allow']
logger.debug(self._perms[parent]['allow'])
else:
logger.warning(f"[PERMS] Группа {child!r} - не найдена (perms.{parent}.parent.{child})")
def __handle_members(self):
self.__handle_parents()
for role, role_data in self._perms.items():
members = role_data.get("ids", [])
allow = role_data.get("allow", [])
allow = set(allow)
allow = set(role_data.get("allow", []))
if len(allow) > 0:
for member in members:
if member in self._members:
@@ -35,16 +62,20 @@ class Permissions:
"nick": self._nicks.get(member) or self._no_nick,
"allow": allow
}
logger.debug(f"{self._members=}")
def is_allowed(self, member, cmd):
u = self._members.get(member)
if u:
friendly = u['friendly']
allow = u['allow']
if ("*" in allow) or (cmd in allow):
return True, friendly
return False, friendly
return False, self._no_role
def is_allowed(self, member: int, _perms: str | list) -> tuple[bool, str]:
if isinstance(_perms, str):
_perms = [_perms]
for perm in _perms:
user = self._members.get(member)
if user:
friendly = user['friendly']
allow = user['allow']
if (("*" in allow) or (perm in allow)) and (f"-{perm}" not in allow):
return True, friendly
return False, friendly
return False, self._no_role
def get_role(self, member):
u = self._members.get(member)