""" 匹配规则管理器模块 管理匹配规则和参数 """ import time from typing import Dict, Any, List, Optional class RuleManager: """ 匹配规则管理器 管理匹配规则和参数 """ def __init__(self, plugin): """ 初始化匹配规则管理器 Args: plugin: 匹配系统插件实例 """ self.plugin = plugin self.enabled = False self.initialized = False # 规则配置 self.rule_config = { "default_rules": { "min_players": 2, "max_players": 8, "skill_range": 100, "max_wait_time": 120.0, "region_matching": True, "platform_matching": True, "language_matching": True }, "game_mode_rules": {}, # 不同游戏模式的规则 "custom_rules": {}, # 自定义规则 "enable_rule_validation": True, "enable_dynamic_rules": True } # 规则状态 self.rule_state = { "active_rules": "default", "total_rules": 1, # 默认规则 "custom_rules_count": 0, "rules_modified": 0 } # 规则统计 self.rule_stats = { "rules_applied": 0, "rules_violated": 0, "rule_errors": 0 } # 回调函数 self.rule_callbacks = { "rule_applied": [], "rule_violated": [], "rule_updated": [], "rule_error": [] } # 时间戳记录 self.last_rule_application = 0.0 self.last_stats_reset = 0.0 print("✓ 匹配规则管理器已创建") def initialize(self) -> bool: """ 初始化匹配规则管理器 Returns: 是否初始化成功 """ try: print("正在初始化匹配规则管理器...") self.initialized = True print("✓ 匹配规则管理器初始化完成") return True except Exception as e: print(f"✗ 匹配规则管理器初始化失败: {e}") self.rule_stats["rule_errors"] += 1 import traceback traceback.print_exc() return False def enable(self) -> bool: """ 启用匹配规则管理器 Returns: 是否启用成功 """ try: if not self.initialized: print("✗ 匹配规则管理器未初始化") return False self.enabled = True print("✓ 匹配规则管理器已启用") return True except Exception as e: print(f"✗ 匹配规则管理器启用失败: {e}") self.rule_stats["rule_errors"] += 1 import traceback traceback.print_exc() return False def disable(self): """禁用匹配规则管理器""" try: self.enabled = False print("✓ 匹配规则管理器已禁用") except Exception as e: print(f"✗ 匹配规则管理器禁用失败: {e}") self.rule_stats["rule_errors"] += 1 import traceback traceback.print_exc() def finalize(self): """清理匹配规则管理器资源""" try: # 禁用匹配规则管理器 if self.enabled: self.disable() # 清理回调 self.rule_callbacks.clear() self.initialized = False print("✓ 匹配规则管理器资源已清理") except Exception as e: print(f"✗ 匹配规则管理器资源清理失败: {e}") import traceback traceback.print_exc() def update(self, dt: float): """ 更新匹配规则管理器状态 Args: dt: 时间增量(秒) """ try: if not self.enabled: return self.last_rule_application = time.time() except Exception as e: print(f"✗ 匹配规则管理器更新失败: {e}") self.rule_stats["rule_errors"] += 1 import traceback traceback.print_exc() def apply_rules(self, players: List[Dict[str, Any]], game_mode: str = "default") -> bool: """ 应用匹配规则 Args: players: 玩家列表 game_mode: 游戏模式 Returns: 是否符合规则 """ try: if not self.enabled: return True # 如果未启用,跳过规则检查 self.rule_stats["rules_applied"] += 1 # 获取适用的规则 rules = self.get_active_rules(game_mode) # 检查玩家数量 min_players = rules.get("min_players", 2) max_players = rules.get("max_players", 8) if len(players) < min_players: print(f"✗ 玩家数量不足: {len(players)} < {min_players}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "min_players", "required": min_players, "actual": len(players), "timestamp": time.time() }) return False if len(players) > max_players: print(f"✗ 玩家数量超限: {len(players)} > {max_players}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "max_players", "required": max_players, "actual": len(players), "timestamp": time.time() }) return False # 检查技能范围 if rules.get("skill_range") is not None: skill_range = rules["skill_range"] skills = [p.get("skill_level", 0) for p in players] min_skill = min(skills) max_skill = max(skills) if max_skill - min_skill > skill_range: print(f"✗ 技能范围超限: {max_skill - min_skill} > {skill_range}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "skill_range", "required": skill_range, "actual": max_skill - min_skill, "timestamp": time.time() }) return False # 检查区域匹配 if rules.get("region_matching", False): regions = [p.get("region", "global") for p in players] if len(set(regions)) > 1: print(f"✗ 区域不匹配: {set(regions)}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "region_matching", "regions": list(set(regions)), "timestamp": time.time() }) return False # 检查平台匹配 if rules.get("platform_matching", False): platforms = [p.get("platform", "pc") for p in players] if len(set(platforms)) > 1: print(f"✗ 平台不匹配: {set(platforms)}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "platform_matching", "platforms": list(set(platforms)), "timestamp": time.time() }) return False # 检查语言匹配 if rules.get("language_matching", False): languages = [p.get("language", "en") for p in players] if len(set(languages)) > 1: print(f"✗ 语言不匹配: {set(languages)}") self.rule_stats["rules_violated"] += 1 # 触发规则违反回调 self._trigger_rule_callback("rule_violated", { "rule": "language_matching", "languages": list(set(languages)), "timestamp": time.time() }) return False # 触发规则应用回调 self._trigger_rule_callback("rule_applied", { "players": len(players), "game_mode": game_mode, "rules": rules, "timestamp": time.time() }) print(f"✓ 规则检查通过: {len(players)}名玩家, 游戏模式: {game_mode}") return True except Exception as e: print(f"✗ 规则应用失败: {e}") self.rule_stats["rule_errors"] += 1 return False def get_active_rules(self, game_mode: str = "default") -> Dict[str, Any]: """ 获取活动规则 Args: game_mode: 游戏模式 Returns: 规则字典 """ try: # 检查是否有特定游戏模式的规则 if game_mode in self.rule_config["game_mode_rules"]: return self.rule_config["game_mode_rules"][game_mode] # 检查是否有自定义规则 if self.rule_state["active_rules"] in self.rule_config["custom_rules"]: return self.rule_config["custom_rules"][self.rule_state["active_rules"]] # 返回默认规则 return self.rule_config["default_rules"] except Exception as e: print(f"✗ 获取活动规则失败: {e}") self.rule_stats["rule_errors"] += 1 return self.rule_config["default_rules"] def set_active_rules(self, rule_set_name: str) -> bool: """ 设置活动规则集 Args: rule_set_name: 规则集名称 Returns: 是否设置成功 """ try: # 验证规则集存在 if (rule_set_name != "default" and rule_set_name not in self.rule_config["custom_rules"] and rule_set_name not in self.rule_config["game_mode_rules"]): print(f"✗ 规则集不存在: {rule_set_name}") return False self.rule_state["active_rules"] = rule_set_name # 触发规则更新回调 self._trigger_rule_callback("rule_updated", { "rule_set": rule_set_name, "timestamp": time.time() }) print(f"✓ 活动规则集已设置为: {rule_set_name}") return True except Exception as e: print(f"✗ 活动规则集设置失败: {e}") self.rule_stats["rule_errors"] += 1 return False def add_custom_rule_set(self, rule_set_name: str, rules: Dict[str, Any]) -> bool: """ 添加自定义规则集 Args: rule_set_name: 规则集名称 rules: 规则字典 Returns: 是否添加成功 """ try: if not self.enabled: return False # 验证规则 if self.rule_config["enable_rule_validation"]: if not self._validate_rules(rules): print(f"✗ 规则验证失败: {rule_set_name}") self.rule_stats["rule_errors"] += 1 return False self.rule_config["custom_rules"][rule_set_name] = rules self.rule_state["custom_rules_count"] = len(self.rule_config["custom_rules"]) self.rule_state["total_rules"] += 1 self.rule_state["rules_modified"] += 1 print(f"✓ 自定义规则集已添加: {rule_set_name}") return True except Exception as e: print(f"✗ 自定义规则集添加失败: {e}") self.rule_stats["rule_errors"] += 1 return False def remove_custom_rule_set(self, rule_set_name: str) -> bool: """ 移除自定义规则集 Args: rule_set_name: 规则集名称 Returns: 是否移除成功 """ try: if rule_set_name in self.rule_config["custom_rules"]: del self.rule_config["custom_rules"][rule_set_name] self.rule_state["custom_rules_count"] = len(self.rule_config["custom_rules"]) self.rule_state["total_rules"] -= 1 self.rule_state["rules_modified"] += 1 # 如果删除的是活动规则集,切换回默认规则 if self.rule_state["active_rules"] == rule_set_name: self.rule_state["active_rules"] = "default" print(f"✓ 自定义规则集已移除: {rule_set_name}") return True else: print(f"✗ 自定义规则集不存在: {rule_set_name}") return False except Exception as e: print(f"✗ 自定义规则集移除失败: {e}") self.rule_stats["rule_errors"] += 1 return False def _validate_rules(self, rules: Dict[str, Any]) -> bool: """ 验证规则 Args: rules: 规则字典 Returns: 是否验证通过 """ try: # 检查基本规则参数 if "min_players" in rules: if not isinstance(rules["min_players"], int) or rules["min_players"] < 1: return False if "max_players" in rules: if not isinstance(rules["max_players"], int) or rules["max_players"] < 1: return False if "min_players" in rules and "max_players" in rules: if rules["min_players"] > rules["max_players"]: return False if "skill_range" in rules: if not isinstance(rules["skill_range"], (int, float)) or rules["skill_range"] < 0: return False if "max_wait_time" in rules: if not isinstance(rules["max_wait_time"], (int, float)) or rules["max_wait_time"] < 0: return False return True except Exception as e: print(f"✗ 规则验证失败: {e}") self.rule_stats["rule_errors"] += 1 return False def add_game_mode_rules(self, game_mode: str, rules: Dict[str, Any]) -> bool: """ 添加游戏模式规则 Args: game_mode: 游戏模式 rules: 规则字典 Returns: 是否添加成功 """ try: if not self.enabled: return False # 验证规则 if self.rule_config["enable_rule_validation"]: if not self._validate_rules(rules): print(f"✗ 游戏模式规则验证失败: {game_mode}") self.rule_stats["rule_errors"] += 1 return False self.rule_config["game_mode_rules"][game_mode] = rules self.rule_state["total_rules"] += 1 self.rule_state["rules_modified"] += 1 print(f"✓ 游戏模式规则已添加: {game_mode}") return True except Exception as e: print(f"✗ 游戏模式规则添加失败: {e}") self.rule_stats["rule_errors"] += 1 return False def remove_game_mode_rules(self, game_mode: str) -> bool: """ 移除游戏模式规则 Args: game_mode: 游戏模式 Returns: 是否移除成功 """ try: if game_mode in self.rule_config["game_mode_rules"]: del self.rule_config["game_mode_rules"][game_mode] self.rule_state["total_rules"] -= 1 self.rule_state["rules_modified"] += 1 print(f"✓ 游戏模式规则已移除: {game_mode}") return True else: print(f"✗ 游戏模式规则不存在: {game_mode}") return False except Exception as e: print(f"✗ 游戏模式规则移除失败: {e}") self.rule_stats["rule_errors"] += 1 return False def get_rule_stats(self) -> Dict[str, Any]: """ 获取规则统计信息 Returns: 规则统计字典 """ return { "state": self.rule_state.copy(), "stats": self.rule_stats.copy(), "config": self.rule_config.copy() } def reset_stats(self): """重置规则统计信息""" try: self.rule_stats = { "rules_applied": 0, "rules_violated": 0, "rule_errors": 0 } print("✓ 规则统计信息已重置") except Exception as e: print(f"✗ 规则统计信息重置失败: {e}") def set_rule_config(self, config: Dict[str, Any]) -> bool: """ 设置规则配置 Args: config: 规则配置字典 Returns: 是否设置成功 """ try: self.rule_config.update(config) print(f"✓ 规则配置已更新: {self.rule_config}") return True except Exception as e: print(f"✗ 规则配置设置失败: {e}") return False def get_rule_config(self) -> Dict[str, Any]: """ 获取规则配置 Returns: 规则配置字典 """ return self.rule_config.copy() def _trigger_rule_callback(self, callback_type: str, data: Dict[str, Any]): """ 触发规则回调 Args: callback_type: 回调类型 data: 回调数据 """ try: if callback_type in self.rule_callbacks: for callback in self.rule_callbacks[callback_type]: try: callback(data) except Exception as e: print(f"✗ 规则回调执行失败: {callback_type} - {e}") except Exception as e: print(f"✗ 规则回调触发失败: {e}") def register_rule_callback(self, callback_type: str, callback: callable): """ 注册规则回调 Args: callback_type: 回调类型 callback: 回调函数 """ try: if callback_type in self.rule_callbacks: self.rule_callbacks[callback_type].append(callback) print(f"✓ 规则回调已注册: {callback_type}") else: print(f"✗ 无效的回调类型: {callback_type}") except Exception as e: print(f"✗ 规则回调注册失败: {e}") def unregister_rule_callback(self, callback_type: str, callback: callable): """ 注销规则回调 Args: callback_type: 回调类型 callback: 回调函数 """ try: if callback_type in self.rule_callbacks: if callback in self.rule_callbacks[callback_type]: self.rule_callbacks[callback_type].remove(callback) print(f"✓ 规则回调已注销: {callback_type}") else: print(f"✗ 无效的回调类型: {callback_type}") except Exception as e: print(f"✗ 规则回调注销失败: {e}")