55webhooks), custom commands, or other extensions.
66"""
77
8- import logging
9- import json
108import importlib .util
9+ import json
10+ import logging
1111import sys
12- from pathlib import Path
13- from typing import Dict , List , Optional , Any , Type
1412from abc import ABC , abstractmethod
13+ from pathlib import Path
14+ from typing import Any , Dict , List , Optional , Type
1515
1616logger = logging .getLogger (__name__ )
1717
@@ -59,6 +59,8 @@ def __init__(self, bot: Any, config: Dict[str, Any], metadata: PluginMetadata):
5959 self .config = config
6060 self .metadata = metadata
6161 self .logger = logging .getLogger (f"plugin.{ metadata .name } " )
62+ # Track runtime enabled state (True if plugin is loaded and initialized)
63+ self ._enabled = True
6264
6365 @abstractmethod
6466 async def initialize (self ) -> bool :
@@ -106,7 +108,7 @@ def get_status(self) -> Dict[str, Any]:
106108 "version" : self .metadata .version ,
107109 "type" : self .metadata .plugin_type ,
108110 "category" : self .metadata .category ,
109- "enabled" : self .metadata . enabled ,
111+ "enabled" : self ._enabled ,
110112 }
111113
112114
@@ -199,7 +201,9 @@ def load_plugin_metadata(self, plugin_dir: Path) -> Optional[PluginMetadata]:
199201 data = json .load (f )
200202
201203 metadata = PluginMetadata (data , plugin_dir )
202- logger .debug (f"Loaded metadata for plugin: { metadata .name } v{ metadata .version } " )
204+ logger .debug (
205+ f"Loaded metadata for plugin: { metadata .name } v{ metadata .version } "
206+ )
203207 return metadata
204208
205209 except json .JSONDecodeError as e :
@@ -209,7 +213,9 @@ def load_plugin_metadata(self, plugin_dir: Path) -> Optional[PluginMetadata]:
209213 logger .error (f"Error loading metadata from { meta_file } : { e } " )
210214 return None
211215
212- def load_plugin_config (self , plugin_dir : Path , metadata : PluginMetadata ) -> Dict [str , Any ]:
216+ def load_plugin_config (
217+ self , plugin_dir : Path , metadata : PluginMetadata
218+ ) -> Dict [str , Any ]:
213219 """Load plugin configuration from plugin.json file.
214220
215221 Args:
@@ -340,7 +346,9 @@ async def load_plugin(self, plugin_dir: Path) -> bool:
340346 # Track task monitor plugins separately
341347 if isinstance (plugin , TaskMonitorPlugin ):
342348 self .task_monitor = plugin
343- logger .info (f"Loaded task monitor plugin: { metadata .name } v{ metadata .version } " )
349+ logger .info (
350+ f"Loaded task monitor plugin: { metadata .name } v{ metadata .version } "
351+ )
344352 else :
345353 logger .info (f"Loaded plugin: { metadata .name } v{ metadata .version } " )
346354
@@ -378,7 +386,10 @@ async def load_all_plugins(self) -> int:
378386
379387 if enabled :
380388 # Enforce mutual exclusion: only one TaskMonitorPlugin may be loaded
381- if metadata .plugin_type == "task_monitor" and self .task_monitor is not None :
389+ if (
390+ metadata .plugin_type == "task_monitor"
391+ and self .task_monitor is not None
392+ ):
382393 logger .info (
383394 f"Skipping task monitor plugin '{ metadata .name } ' because '{ self .task_monitor .metadata .name } ' is already active"
384395 )
0 commit comments