1
1
import asyncio
2
2
from typing import Dict
3
3
4
- from framework .config .global_config import GlobalConfig
4
+ from framework .config .global_config import GlobalConfig , IMConfig
5
5
from framework .im .adapter import IMAdapter
6
6
from framework .im .im_registry import IMRegistry
7
7
from framework .ioc .container import DependencyContainer
@@ -26,40 +26,76 @@ def __init__(self, container: DependencyContainer, config: GlobalConfig, adapter
26
26
self .im_registry = adapter_registry
27
27
self .adapters : Dict [str , any ] = {}
28
28
29
+ def get_adapter_type (self , name : str ) -> str :
30
+ """
31
+ 获取指定名称的 adapter 类型。
32
+ :param name: adapter 的名称
33
+ :return: adapter 的类型
34
+ """
35
+ return self .get_adapter_config (name ).adapter
36
+
37
+ def has_adapter (self , name : str ) -> bool :
38
+ """
39
+ 检查指定名称的 adapter 是否存在。
40
+ :param name: adapter 的名称
41
+ :return: 如果 adapter 存在返回 True,否则返回 False
42
+ """
43
+ return name in self .adapters
44
+
45
+ def get_adapter_config (self , name : str ) -> IMConfig :
46
+ """
47
+ 获取指定名称的 adapter 的配置。
48
+ :param name: adapter 的名称
49
+ :return: adapter 的配置
50
+ """
51
+ for im in self .config .ims :
52
+ if im .name == name :
53
+ return im
54
+ raise ValueError (f"Adapter { name } not found" )
55
+
56
+ def update_adapter_config (self , name : str , config : IMConfig ):
57
+ """
58
+ 更新指定名称的 adapter 的配置。
59
+ :param name: adapter 的名称
60
+ :param config: adapter 的配置
61
+ """
62
+ self .get_adapter_config (name ).config = config
63
+
64
+ def delete_adapter (self , name : str ):
65
+ """
66
+ 删除指定名称的 adapter。
67
+ :param name: adapter 的名称
68
+ """
69
+ self .adapters .pop (name )
70
+ self .config .ims = [im for im in self .config .ims if im .name != name ]
29
71
30
72
def start_adapters (self , loop = None ):
31
73
"""
32
74
根据配置文件中的 enable_ims 启动对应的 adapter。
33
75
:param loop: 负责执行的 event loop
34
76
"""
35
- if loop is None :
36
- loop = asyncio .get_event_loop ()
37
-
38
- enable_ims = self .config .ims .enable
39
- credentials = self .config .ims .configs
40
77
41
- for platform , adapter_keys in enable_ims .items ():
78
+
79
+ if loop is None :
80
+ loop = asyncio .new_event_loop ()
81
+ tasks = []
82
+ for im in self .config .ims :
42
83
# 动态获取 adapter 类
43
- adapter_class = self .im_registry .get (platform )
84
+ adapter_class = self .im_registry .get (im . adapter )
44
85
# 动态获取 adapter 的配置类
45
- config_class = self .im_registry .get_config_class (platform )
46
- tasks = []
47
- for key in adapter_keys :
48
- # 从 credentials 中读取配置
49
- if key not in credentials :
50
- raise ValueError (f"Credential for key '{ key } ' is missing in credentials." )
51
- credential = credentials [key ]
86
+ config_class = self .im_registry .get_config_class (im .adapter )
87
+ # 动态实例化 adapter 的配置对象
88
+ adapter_config = config_class (** im .config )
52
89
53
- # 动态实例化 adapter 的配置对象
54
- adapter_config = config_class (** credential )
90
+ # 创建 adapter 实例
91
+ with self .container .scoped () as scoped_container :
92
+ scoped_container .register (config_class , adapter_config )
93
+ adapter = Inject (scoped_container ).create (adapter_class )()
94
+ self .adapters [im .name ] = adapter
95
+ if im .enable :
96
+ tasks .append (asyncio .ensure_future (self ._start_adapter (im .name , adapter ), loop = loop ))
97
+ loop .run_until_complete (asyncio .gather (* tasks , return_exceptions = True ))
55
98
56
- # 创建 adapter 实例
57
- with self .container .scoped () as scoped_container :
58
- scoped_container .register (config_class , adapter_config )
59
- adapter = Inject (scoped_container ).create (adapter_class )()
60
- self .adapters [key ] = adapter
61
- tasks .append (asyncio .ensure_future (self ._start_adapter (key , adapter , loop ), loop = loop ))
62
- loop .run_until_complete (asyncio .gather (* tasks , return_exceptions = True ))
63
99
64
100
def stop_adapters (self , loop = None ):
65
101
"""
@@ -70,9 +106,8 @@ def stop_adapters(self, loop=None):
70
106
loop = asyncio .get_event_loop ()
71
107
72
108
for key , adapter in self .adapters .items ():
73
- loop .run_until_complete (self ._stop_adapter (key , adapter , loop ))
109
+ loop .run_until_complete (self ._stop_adapter (key , adapter ))
74
110
75
-
76
111
def get_adapters (self ) -> Dict [str , any ]:
77
112
"""
78
113
获取所有已启动的 adapter。
@@ -88,12 +123,36 @@ def get_adapter(self, key: str) -> IMAdapter:
88
123
"""
89
124
return self .adapters [key ]
90
125
91
- async def _start_adapter (self , key , adapter , loop ):
126
+ async def _start_adapter (self , key : str , adapter : IMAdapter ):
92
127
logger .info (f"Starting adapter: { key } " )
128
+ adapter .is_running = True
93
129
await adapter .start ()
94
130
logger .info (f"Started adapter: { key } " )
95
131
96
- async def _stop_adapter (self , key , adapter , loop ):
132
+ async def _stop_adapter (self , key : str , adapter : IMAdapter ):
97
133
logger .info (f"Stopping adapter: { key } " )
134
+ adapter .is_running = False
98
135
await adapter .stop ()
99
- logger .info (f"Stopped adapter: { key } " )
136
+ logger .info (f"Stopped adapter: { key } " )
137
+
138
+ def stop_adapter (self , adapter_id : str , loop : asyncio .AbstractEventLoop ):
139
+ if adapter_id not in self .adapters :
140
+ raise ValueError (f"Adapter { adapter_id } not found" )
141
+ adapter = self .adapters [adapter_id ]
142
+ return asyncio .ensure_future (self ._stop_adapter (adapter_id , adapter ), loop = loop )
143
+
144
+ def start_adapter (self , adapter_id : str , loop : asyncio .AbstractEventLoop ):
145
+ if adapter_id not in self .adapters :
146
+ raise ValueError (f"Adapter { adapter_id } not found" )
147
+ adapter = self .adapters [adapter_id ]
148
+ return asyncio .ensure_future (self ._start_adapter (adapter_id , adapter ), loop = loop )
149
+
150
+ def is_adapter_running (self , key : str ) -> bool :
151
+ """
152
+ 检查指定 key 的 adapter 是否正在运行。
153
+ :param key: adapter 的 key
154
+ :return: 如果 adapter 正在运行返回 True,否则返回 False
155
+ """
156
+
157
+ return key in self .adapters and getattr (self .adapters [key ], "is_running" , False )
158
+
0 commit comments