Beta/core/permissions.py

104 lines
3.4 KiB
Python
Raw Permalink Normal View History

2026-02-06 22:23:20 +01:00
"""Permissions and whitelist handling for Superviseur bot."""
import json
import logging
from typing import Dict, Optional
logger = logging.getLogger('Superviseur')
class WhitelistManager:
"""Manages user whitelist and permissions."""
def __init__(self, whitelist_file: str = 'whitelist.json'):
self.whitelist_file = whitelist_file
self.whitelist = None
self.load_whitelist()
def load_whitelist(self) -> None:
"""Load whitelist from JSON file."""
try:
with open(self.whitelist_file, 'r', encoding='utf-8') as f:
self.whitelist = json.load(f)
logger.info("Whitelist loaded successfully")
except FileNotFoundError:
# Supprimer le message de warning pour whitelist.json
self.whitelist = None
except json.JSONDecodeError as e:
logger.error(f"Error parsing whitelist.json: {e}")
self.whitelist = None
def get_user_level(self, user_id: int, user_name: Optional[str] = None) -> Optional[str]:
"""Get user's whitelist level by ID or name."""
if not self.whitelist:
return None
user_levels = self.whitelist.get('user_levels', {})
# Try by ID first
level = user_levels.get(str(user_id))
if level:
return level
# Try by name if provided
if user_name:
level = user_levels.get(user_name)
if level:
return level
return None
def has_permission(self, user_id: int, required_level: str, user_name: Optional[str] = None) -> bool:
"""Check if user has required whitelist level."""
level = self.get_user_level(user_id, user_name)
if not level:
return False
levels = ['wl', 'wl+']
try:
user_index = levels.index(level)
req_index = levels.index(required_level)
return user_index >= req_index
except ValueError:
return False
def get_required_level(self, action: str) -> Optional[str]:
"""Get required whitelist level for an action."""
if not self.whitelist:
return None
return self.whitelist.get('commands_permissions', {}).get(action)
def check_is_admin(permissions) -> bool:
"""Check if user has admin permissions."""
if not permissions:
return False
return (
permissions.administrator or
permissions.manage_guild or
permissions.manage_roles or
permissions.manage_channels or
permissions.kick_members or
permissions.ban_members or
permissions.moderate_members
)
def get_permissions_info(permissions, user_level: str = 'none', role_name: str = 'Sujet') -> str:
"""Get formatted permissions info string including role awareness."""
if not permissions:
return f"RÔLE: {role_name}, Permissions (DM): non, Niveau whitelist: {user_level}"
has_permissions = (
permissions.administrator or
permissions.manage_guild or
permissions.manage_roles or
permissions.manage_channels or
permissions.kick_members or
permissions.ban_members or
permissions.moderate_members or
permissions.manage_messages
)
return f"RÔLE: {role_name}, Permissions: {'oui' if has_permissions else 'non'}, Niveau whitelist: {user_level}"