Skip to content

Commit 68ade48

Browse files
authored
fix(plugin): 修复事件处理器返回类型检查及上下文处理问题 (#83)
修复BasePlugin中事件处理器返回类型不一致的问题,添加类型检查 修正PluginManager和PluginManagerUI中的上下文处理逻辑 优化History插件的事件处理器返回
1 parent 09acea4 commit 68ade48

File tree

4 files changed

+27
-20
lines changed

4 files changed

+27
-20
lines changed

src/mp_plugins/base/plugin.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ def __message_dispatching(self, message: Message) -> None:
151151
return
152152
for handler in self._event_handlers[message.data.__class__]:
153153
event = handler(self, message.data)
154+
if event.__class__ != message.data.__class__:
155+
raise TypeError(
156+
f"Event handler must return the same event type got {event.__class__.__name__} expected {message.data.__class__.__name__}"
157+
)
154158
message.data = event
155159
self.__message_queue.put(message)
156160
else:
@@ -163,7 +167,7 @@ def __message_dispatching(self, message: Message) -> None:
163167
if hasattr(self, "_context"):
164168
self._context = message.data
165169
self.initialize()
166-
self._context = message.class_name
170+
self._context = message.data
167171
elif message.mode == MessageMode.Error:
168172
pass
169173
elif message.mode == MessageMode.Unknown:

src/mp_plugins/plugin_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def __init__(self) -> None:
5656
self.__error_callback = None
5757

5858
self.__running = False
59-
self.__context: BaseContext = None
59+
self.__context: BaseContext | None = None
6060

6161
# -------------------------
6262
# 单例
@@ -78,7 +78,7 @@ def port(self):
7878

7979
@property
8080
def context(self) -> BaseContext:
81-
return self.__context
81+
return self.__context # type: ignore
8282

8383
@context.setter
8484
def context(self, context: BaseContext):
@@ -230,7 +230,7 @@ def send_event(
230230
if message.id in self.__event_dict:
231231
del self.__event_dict[message.id]
232232

233-
return result
233+
return result # type: ignore
234234

235235
# -------------------------
236236
# 发消息入口(入队)

src/pluginDialog.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
_translate = QCoreApplication.translate
3939

4040

41-
class PluginManagerUI(RoundQDialog):
41+
class PluginManagerUI(QDialog):
4242

4343
def __init__(self, plugin_names: list[str]):
4444
"""
@@ -64,8 +64,10 @@ def __init__(self, plugin_names: list[str]):
6464
# ================= 左侧插件列表 =================
6565
self.list_widget = QListWidget()
6666
for name in self.plugin_names:
67-
self.list_widget.addItem(
68-
PluginManager.instance().Get_Context_By_Name(name).display_name)
67+
ctx = PluginManager.instance().Get_Context_By_Name(name)
68+
if ctx is None:
69+
continue
70+
self.list_widget.addItem(ctx.display_name)
6971

7072
self.list_widget.currentRowChanged.connect(self.on_plugin_selected)
7173
root_layout.addWidget(self.list_widget, 1)
@@ -167,6 +169,8 @@ def update_context(self, index: int):
167169

168170
ctx = PluginManager.instance().Get_Context_By_Name(
169171
self.plugin_names[index])
172+
if ctx is None:
173+
return
170174

171175
# --- PluginContext 原样填充 ---
172176
for key, value in msgspec.structs.asdict(ctx).items():
@@ -184,8 +188,11 @@ def load_settings(self, settings: Dict[str, BaseSetting]):
184188
# 清空原控件
185189
while self.scroll_layout.count():
186190
item = self.scroll_layout.takeAt(0)
187-
if item.widget():
188-
item.widget().deleteLater()
191+
if item is None:
192+
continue
193+
widget = item.widget()
194+
if widget is not None:
195+
widget.deleteLater()
189196

190197
self.current_settings_widgets.clear()
191198

@@ -221,14 +228,11 @@ def load_settings(self, settings: Dict[str, BaseSetting]):
221228
# 保存按钮
222229
# ===================================================================
223230
def on_save_clicked(self):
224-
ctx = self.plugin_contexts[self.list_widget.currentRow()]
225-
226-
# --- PluginContext 原样填充 ---
227-
for key, label in self.detail_labels.items():
228-
value = getattr(ctx, key)
229-
if isinstance(value, list):
230-
value = ", ".join(value)
231-
label.setText(str(value))
231+
ctx = PluginManager.instance().Get_Context_By_Name(
232+
self.plugin_names[self.list_widget.currentRow()]
233+
)
234+
if ctx is None:
235+
return
232236

233237
# --- 你自己的获取 settings 的函数 ---
234238
settings_dict = PluginManager.instance().Get_Settings(ctx.name)

src/plugins/History/History.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import sys
32
import os
43
import msgspec
@@ -78,8 +77,8 @@ def shutdown(self) -> None:
7877
return super().shutdown()
7978

8079
@BasePlugin.event_handler(GameEndEvent)
81-
def on_game_end(self, event: GameEndEvent) -> None:
82-
pass
80+
def on_game_end(self, event: GameEndEvent):
81+
return event
8382

8483

8584
if __name__ == "__main__":

0 commit comments

Comments
 (0)