1313from arclet .letoderea import BaseAuxiliary , Provider , Publisher , StepOut , system_ctx
1414from arclet .letoderea .builtin .breakpoint import R
1515from arclet .letoderea .typing import TTarget
16+ from creart import it
17+ from launart import Launart , Service
1618from satori .client import Account
1719
18- from .service import service
20+ from .service import plugin_service
1921
2022if TYPE_CHECKING :
2123 from ..event import Event
@@ -113,6 +115,7 @@ class Plugin:
113115 module : ModuleType
114116 dispatchers : dict [str , PluginDispatcher ] = field (default_factory = dict )
115117 submodules : dict [str , ModuleType ] = field (default_factory = dict )
118+ config : dict [str , Any ] = field (default_factory = dict )
116119 _metadata : PluginMetadata | None = None
117120 _is_disposed : bool = False
118121
@@ -121,6 +124,8 @@ class Plugin:
121124 _connected : list [_AccountUpdate ] = field (init = False , default_factory = list )
122125 _disconnected : list [_AccountUpdate ] = field (init = False , default_factory = list )
123126
127+ _services : dict [str , Service ] = field (init = False , default_factory = dict )
128+
124129 def on_prepare (self , func : _Lifespan ):
125130 self ._preparing .append (func )
126131 return func
@@ -149,15 +154,15 @@ def metadata(self) -> PluginMetadata | None:
149154 return self ._metadata
150155
151156 def __post_init__ (self ):
152- service .plugins [self .id ] = self
153- if self .id not in service ._keep_values :
154- service ._keep_values [self .id ] = {}
155- if self .id not in service ._referents :
156- service ._referents [self .id ] = set ()
157+ plugin_service .plugins [self .id ] = self
158+ if self .id not in plugin_service ._keep_values :
159+ plugin_service ._keep_values [self .id ] = {}
160+ if self .id not in plugin_service ._referents :
161+ plugin_service ._referents [self .id ] = set ()
157162 finalize (self , self .dispose )
158163
159164 def dispose (self ):
160- service ._unloaded .add (self .id )
165+ plugin_service ._unloaded .add (self .id )
161166 if self ._is_disposed :
162167 return
163168 self ._is_disposed = True
@@ -168,15 +173,21 @@ def dispose(self):
168173 for submod in self .submodules .values ():
169174 delattr (submod , "__plugin__" )
170175 sys .modules .pop (submod .__name__ , None )
171- service ._submoded .pop (submod .__name__ , None )
176+ plugin_service ._submoded .pop (submod .__name__ , None )
172177 if submod .__spec__ and submod .__spec__ .cached :
173178 Path (submod .__spec__ .cached ).unlink (missing_ok = True )
174179 self .submodules .clear ()
175180 for disp in self .dispatchers .values ():
176181 disp .dispose ()
177182 self .dispatchers .clear ()
178- del service .plugins [self .id ]
183+ del plugin_service .plugins [self .id ]
179184 del self .module
185+ for serv in self ._services .values ():
186+ try :
187+ it (Launart ).remove_component (serv )
188+ except ValueError :
189+ pass
190+ self ._services .clear ()
180191
181192 def dispatch (self , * events : type [Event ], predicate : Callable [[Event ], bool ] | None = None ):
182193 disp = PluginDispatcher (self , * events , predicate = predicate )
@@ -202,6 +213,14 @@ def proxy(self):
202213 def subproxy (self , sub_id : str ):
203214 return _ProxyModule (self .id , sub_id )
204215
216+ def service (self , serv : Service | type [Service ]):
217+ if isinstance (serv , type ):
218+ serv = serv ()
219+ self ._services [serv .id ] = serv
220+ if plugin_service .status .blocking :
221+ it (Launart ).add_component (serv )
222+ return serv
223+
205224
206225class KeepingVariable :
207226 def __init__ (self , obj : T , dispose : Callable [[T ], None ] | None = None ):
@@ -222,10 +241,10 @@ def dispose(self):
222241def keeping (id_ : str , obj : T , dispose : Callable [[T ], None ] | None = None ) -> T :
223242 if not (plug := _current_plugin .get (None )):
224243 raise LookupError ("no plugin context found" )
225- if id_ not in service ._keep_values [plug .id ]:
226- service ._keep_values [plug .id ][id_ ] = KeepingVariable (obj , dispose )
244+ if id_ not in plugin_service ._keep_values [plug .id ]:
245+ plugin_service ._keep_values [plug .id ][id_ ] = KeepingVariable (obj , dispose )
227246 else :
228- obj = service ._keep_values [plug .id ][id_ ].obj # type: ignore
247+ obj = plugin_service ._keep_values [plug .id ][id_ ].obj # type: ignore
229248 return obj
230249
231250
@@ -240,12 +259,12 @@ def __get_module(self) -> ModuleType:
240259 def __init__ (self , plugin_id : str , sub_id : str | None = None ) -> None :
241260 self .__plugin_id = plugin_id
242261 self .__sub_id = sub_id
243- if self .__plugin_id not in service .plugins :
262+ if self .__plugin_id not in plugin_service .plugins :
244263 raise NameError (f"Plugin { self .__plugin_id !r} is not loaded" )
245264 if self .__sub_id :
246- self .__origin = ref (service .plugins [self .__plugin_id ].submodules [self .__sub_id ])
265+ self .__origin = ref (plugin_service .plugins [self .__plugin_id ].submodules [self .__sub_id ])
247266 else :
248- self .__origin = ref (service .plugins [self .__plugin_id ].module )
267+ self .__origin = ref (plugin_service .plugins [self .__plugin_id ].module )
249268 super ().__init__ (self .__get_module ().__name__ )
250269 self .__doc__ = self .__get_module ().__doc__
251270 self .__file__ = self .__get_module ().__file__
@@ -278,14 +297,14 @@ def __getattr__(self, name: str):
278297 "__spec__" ,
279298 ):
280299 return super ().__getattribute__ (name )
281- if self .__plugin_id not in service .plugins :
300+ if self .__plugin_id not in plugin_service .plugins :
282301 raise NameError (f"Plugin { self .__plugin_id !r} is not loaded" )
283302 if plug := inspect .currentframe ().f_back .f_globals .get ("__plugin__" ): # type: ignore
284303 if plug .id != self .__plugin_id :
285- service ._referents [self .__plugin_id ].add (plug .id )
304+ plugin_service ._referents [self .__plugin_id ].add (plug .id )
286305 elif plug := inspect .currentframe ().f_back .f_back .f_globals .get ("__plugin__" ): # type: ignore
287306 if plug .id != self .__plugin_id :
288- service ._referents [self .__plugin_id ].add (plug .id )
307+ plugin_service ._referents [self .__plugin_id ].add (plug .id )
289308 return getattr (self .__get_module (), name )
290309
291310 def __setattr__ (self , name : str , value ):
0 commit comments