feat: 支持同时运行多个平台适配器

This commit is contained in:
RockChinQ
2024-02-11 23:07:38 +08:00
parent f951625025
commit 9cad94e961
22 changed files with 148 additions and 74 deletions
+2 -2
View File
@@ -71,7 +71,7 @@ class MessageSourceAdapter(metaclass=abc.ABCMeta):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, MessageSourceAdapter], None]
):
"""注册事件监听器
@@ -84,7 +84,7 @@ class MessageSourceAdapter(metaclass=abc.ABCMeta):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, MessageSourceAdapter], None]
):
"""注销事件监听器
+59 -42
View File
@@ -17,11 +17,8 @@ from ..plugin import events
# 控制QQ消息输入输出的类
class PlatformManager:
adapter: msadapter.MessageSourceAdapter = None
@property
def bot_account_id(self):
return self.adapter.bot_account_id
# adapter: msadapter.MessageSourceAdapter = None
adapters: list[msadapter.MessageSourceAdapter] = []
# modern
ap: app.Application = None
@@ -29,27 +26,13 @@ class PlatformManager:
def __init__(self, ap: app.Application = None):
self.ap = ap
self.adapters = []
async def initialize(self):
from .sources import yirimirai, nakuru, aiocqhttp, qqbotpy
adapter_cls = None
for adapter in msadapter.preregistered_adapters:
if adapter.name == self.ap.platform_cfg.data['platform-adapter']:
adapter_cls = adapter
break
if adapter_cls is None:
raise Exception('未知的平台适配器: ' + self.ap.platform_cfg.data['platform-adapter'])
cfg_key = self.ap.platform_cfg.data['platform-adapter'] + '-config'
self.adapter = adapter_cls(
self.ap.platform_cfg.data[cfg_key],
self.ap
)
async def on_friend_message(event: FriendMessage):
async def on_friend_message(event: FriendMessage, adapter: msadapter.MessageSourceAdapter):
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.PersonMessageReceived(
@@ -68,15 +51,11 @@ class PlatformManager:
launcher_id=event.sender.id,
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain
message_chain=event.message_chain,
adapter=adapter
)
self.adapter.register_listener(
FriendMessage,
on_friend_message
)
async def on_stranger_message(event: StrangerMessage):
async def on_stranger_message(event: StrangerMessage, adapter: msadapter.MessageSourceAdapter):
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.PersonMessageReceived(
@@ -96,16 +75,17 @@ class PlatformManager:
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain,
adapter=adapter
)
# nakuru不区分好友和陌生人,故仅为yirimirai注册陌生人事件
if self.ap.platform_cfg.data['platform-adapter'] == 'yiri-mirai':
self.adapter.register_listener(
StrangerMessage,
on_stranger_message
)
# if self.ap.platform_cfg.data['platform-adapter'] == 'yiri-mirai':
# self.adapter.register_listener(
# StrangerMessage,
# on_stranger_message
# )
async def on_group_message(event: GroupMessage):
async def on_group_message(event: GroupMessage, adapter: msadapter.MessageSourceAdapter):
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.GroupMessageReceived(
@@ -124,15 +104,49 @@ class PlatformManager:
launcher_id=event.group.id,
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain
message_chain=event.message_chain,
adapter=adapter
)
for adap_cfg in self.ap.platform_cfg.data['platform-adapters']:
if adap_cfg['enable']:
cfg_copy = adap_cfg.copy()
del cfg_copy['enable']
adapter_name = cfg_copy['adapter']
del cfg_copy['adapter']
self.adapter.register_listener(
GroupMessage,
on_group_message
)
found = False
async def send(self, event, msg, check_quote=True, check_at_sender=True):
for adapter in msadapter.preregistered_adapters:
if adapter.name == adapter_name:
found = True
adapter_cls = adapter
adapter_inst = adapter_cls(
cfg_copy,
self.ap
)
self.adapters.append(adapter_inst)
if adapter_name == 'yiri-mirai':
adapter_inst.register_listener(
StrangerMessage,
on_stranger_message
)
adapter_inst.register_listener(
FriendMessage,
on_friend_message
)
adapter_inst.register_listener(
GroupMessage,
on_group_message
)
if not found:
raise Exception('platform.json 中启用了未知的平台适配器: ' + adapter_name)
async def send(self, event, msg, adapter: msadapter.MessageSourceAdapter, check_quote=True, check_at_sender=True):
if check_at_sender and self.ap.platform_cfg.data['at-sender'] and isinstance(event, GroupMessage):
@@ -143,7 +157,7 @@ class PlatformManager:
)
)
await self.adapter.reply_message(
await adapter.reply_message(
event,
msg,
quote_origin=True if self.ap.platform_cfg.data['quote-origin'] and check_quote else False
@@ -170,7 +184,10 @@ class PlatformManager:
async def run(self):
try:
await self.adapter.run_async()
tasks = []
for adapter in self.adapters:
tasks.append(adapter.run_async())
await asyncio.gather(*tasks)
except Exception as e:
self.ap.logger.error('平台适配器运行出错: ' + str(e))
self.ap.logger.debug(f"Traceback: {traceback.format_exc()}")
+3 -3
View File
@@ -240,12 +240,12 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None],
callback: typing.Callable[[mirai.Event, adapter.MessageSourceAdapter], None],
):
async def on_message(event: aiocqhttp.Event):
self.bot_account_id = event.self_id
try:
return await callback(self.event_converter.target2yiri(event))
return await callback(self.event_converter.target2yiri(event), self)
except:
traceback.print_exc()
@@ -257,7 +257,7 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None],
callback: typing.Callable[[mirai.Event, adapter.MessageSourceAdapter], None],
):
return super().unregister_listener(event_type, callback)
+3 -4
View File
@@ -257,14 +257,13 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
try:
# 包装函数
async def listener_wrapper(app: nakuru.CQHTTP, source: NakuruProjectAdapter.event_converter.yiri2target(event_type)):
print(1111)
await callback(self.event_converter.target2yiri(source))
await callback(self.event_converter.target2yiri(source), self)
# 将包装函数和原函数的对应关系存入列表
self.listener_list.append(
@@ -284,7 +283,7 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
nakuru_event_name = self.event_converter.yiri2target(event_type).__name__
+3 -3
View File
@@ -362,14 +362,14 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
try:
async def wrapper(message: typing.Union[botpy_message.Message, botpy_message.DirectMessage, botpy_message.GroupMessage]):
self.cached_official_messages[str(message.id)] = message
await callback(OfficialEventConverter.target2yiri(message))
await callback(OfficialEventConverter.target2yiri(message), self)
for event_handler in event_handler_mapping[event_type]:
setattr(self.bot, event_handler, wrapper)
@@ -380,7 +380,7 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
delattr(self.bot, event_handler_mapping[event_type])
+5 -3
View File
@@ -87,7 +87,7 @@ class YiriMiraiAdapter(adapter_model.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
"""注册事件监听器
@@ -95,12 +95,14 @@ class YiriMiraiAdapter(adapter_model.MessageSourceAdapter):
event_type (typing.Type[mirai.Event]): YiriMirai事件类型
callback (typing.Callable[[mirai.Event], None]): 回调函数,接收一个参数,为YiriMirai事件
"""
self.bot.on(event_type)(callback)
async def wrapper(event: mirai.Event):
await callback(event, self)
self.bot.on(event_type)(wrapper)
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None]
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
"""注销事件监听器