mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-26 15:34:26 +00:00
feat: 支持同时运行多个平台适配器
This commit is contained in:
@@ -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
@@ -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()}")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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__
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
@@ -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]
|
||||
):
|
||||
"""注销事件监听器
|
||||
|
||||
|
||||
Reference in New Issue
Block a user