mirror of
https://github.com/SantaSpeen/Rcon-VK-Bot.git
synced 2026-02-16 02:20:45 +00:00
[-] hosts.*.meta.history
[+] debug log [+] [PERMS] some checks [+] parents support [+] is_allowed to prepare for new...
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user