103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
"""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}"
|
|
|