diff options
Diffstat (limited to 'examples/plugin_system_demo.py')
| -rw-r--r-- | examples/plugin_system_demo.py | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/examples/plugin_system_demo.py b/examples/plugin_system_demo.py new file mode 100644 index 0000000..1899b34 --- /dev/null +++ b/examples/plugin_system_demo.py @@ -0,0 +1,173 @@ +import sys +import os +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent.parent / "src")) + +from conventionalrp.plugins import PluginManager +from conventionalrp.core.parser import Parser + +sys.path.insert(0, str(Path(__file__).parent / "plugins")) +from dice_analyzer_plugin import DiceAnalyzerPlugin +from combat_tracker_plugin import CombatTrackerPlugin + + +def demo_basic_plugin_usage(): + manager = PluginManager() + + dice_analyzer = DiceAnalyzerPlugin() + dice_analyzer.initialize() + manager.register_plugin(dice_analyzer) + + combat_tracker = CombatTrackerPlugin() + combat_tracker.initialize() + manager.register_plugin(combat_tracker) + + print("\nRegistered Plugins:") + for plugin_info in manager.list_plugins(): + print(f" - {plugin_info['name']} v{plugin_info['version']} (type: {plugin_info['type']})") + + stats = manager.get_statistics() + print(f"\nPlugin Statistics: {stats}") + + +def demo_processor_plugin(): + manager = PluginManager() + + combat_tracker = CombatTrackerPlugin() + combat_tracker.initialize() + manager.register_plugin(combat_tracker) + + combat_log = [ + {"type": "dialogue", "speaker": "战士", "content": "我攻击兽人,造成12点伤害!"}, + {"type": "dialogue", "speaker": "法师", "content": "火球术!造成28点火焰伤害"}, + {"type": "dialogue", "speaker": "牧师", "content": "治疗之光,恢复15点生命值"}, + {"type": "dialogue", "speaker": "战士", "content": "重击!造成18点伤害"}, + {"type": "dialogue", "speaker": "牧师", "content": "群体治疗,恢复10点生命值"}, + ] + + print("\nProcessing Combat Log:") + from conventionalrp.plugins.base import ProcessorPlugin + processed_log = manager.execute_plugins(combat_log, plugin_type=ProcessorPlugin) + + for token in processed_log: + if "combat_data" in token: + print(f" {token['speaker']}: {token['content']}") + print(f" -> {token['combat_data']}") + + print("\nCombat Summary:") + summary = combat_tracker.get_combat_summary() + print(f" 总伤害: {summary['total_damage']}") + print(f" 总治疗: {summary['total_healing']}") + print(f" 净伤害: {summary['net_damage']}") + print("\n 角色统计:") + for character, stats in summary['character_stats'].items(): + print(f" {character}: 造成伤害={stats['damage_dealt']}, 治疗={stats['healing_done']}") + + +def demo_analyzer_plugin(): + manager = PluginManager() + + dice_analyzer = DiceAnalyzerPlugin() + dice_analyzer.initialize() + manager.register_plugin(dice_analyzer) + + dice_rolls = [ + {"type": "dice", "content": "d20=15", "result": 15}, + {"type": "success", "content": "检定成功"}, + {"type": "dice", "content": "d6=4", "result": 4}, + {"type": "dice", "content": "d20=20", "result": 20}, + {"type": "success", "content": "大成功!Critical hit!"}, + {"type": "dice", "content": "d20=1", "result": 1}, + {"type": "failure", "content": "大失败..."}, + {"type": "dice", "content": "d20=12", "result": 12}, + {"type": "dice", "content": "d6=3", "result": 3}, + {"type": "success", "content": "检定成功"}, + ] + + print("\nDice Roll Data:") + for roll in dice_rolls: + if roll["type"] == "dice": + print(f" {roll['content']}") + + from conventionalrp.plugins.base import AnalyzerPlugin + analysis = manager.execute_plugins(dice_rolls, plugin_type=AnalyzerPlugin) + + print("\nAnalyze result:") + print(f" 总投掷次数: {analysis['total_rolls']}") + print(f" 骰子类型分布: {analysis['dice_types']}") + print(f" 成功次数: {analysis['success_count']}") + print(f" 失败次数: {analysis['failure_count']}") + print(f" 大成功次数: {analysis['critical_hits']}") + print(f" 大失败次数: {analysis['critical_fails']}") + print(f" 成功率: {analysis['success_rate']:.1%}") + print(f" 出现极值比率: {analysis['critical_rate']:.1%}") + + +def demo_plugin_enable_disable(): + manager = PluginManager() + dice_analyzer = DiceAnalyzerPlugin() + dice_analyzer.initialize() + manager.register_plugin(dice_analyzer) + + combat_tracker = CombatTrackerPlugin() + combat_tracker.initialize() + manager.register_plugin(combat_tracker) + + print("\nInitial State:") + for plugin_info in manager.list_plugins(): + print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}") + + # Disable DiceAnalyzer + print("\nDisabling DiceAnalyzer...") + manager.disable_plugin("DiceAnalyzer") + + print("\nCurrent State:") + for plugin_info in manager.list_plugins(): + print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}") + + print("\nRe-enabling DiceAnalyzer...") + manager.enable_plugin("DiceAnalyzer") + + print("\nFinal State:") + for plugin_info in manager.list_plugins(): + print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}") + + +def demo_plugin_discovery(): + plugin_dir = Path(__file__).parent / "plugins" + manager = PluginManager(plugin_dirs=[str(plugin_dir)]) + + print(f"\nSearching for plugins in directory: {plugin_dir}") + discovered = manager.discover_plugins() + + print(f"\nFound {len(discovered)} plugin modules:") + for module in discovered: + print(f" - {module}") + + print("\nLoading plugins...") + for py_file in plugin_dir.glob("*.py"): + if py_file.name.startswith("_"): + continue + + plugin_class = manager.load_plugin_from_file(str(py_file)) + if plugin_class: + print(f" ✓ Successfully loaded: {py_file.name}") + + +def main(): + try: + demo_basic_plugin_usage() + demo_processor_plugin() + demo_analyzer_plugin() + demo_plugin_enable_disable() + demo_plugin_discovery() + + except Exception as e: + print(f"\n{e!r}: {e}") + import traceback + traceback.print_exc() + + +if __name__ == "__main__": + main() |
