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
+1 -1
View File
@@ -34,7 +34,7 @@ class APIGroup(metaclass=abc.ABCMeta):
headers: dict = {}, headers: dict = {},
**kwargs **kwargs
): ):
self._runtime_info['account_id'] = "{}".format(self.ap.im_mgr.bot_account_id) self._runtime_info['account_id'] = "-1"
url = self.prefix + path url = self.prefix + path
data = json.dumps(data) data = json.dumps(data)
+2 -1
View File
@@ -70,7 +70,8 @@ class Controller:
if result.user_notice: if result.user_notice:
await self.ap.im_mgr.send( await self.ap.im_mgr.send(
query.message_event, query.message_event,
result.user_notice result.user_notice,
query.adapter
) )
if result.debug_notice: if result.debug_notice:
self.ap.logger.debug(result.debug_notice) self.ap.logger.debug(result.debug_notice)
+7
View File
@@ -12,6 +12,7 @@ from ..provider import entities as llm_entities
from ..provider.requester import entities from ..provider.requester import entities
from ..provider.sysprompt import entities as sysprompt_entities from ..provider.sysprompt import entities as sysprompt_entities
from ..provider.tools import entities as tools_entities from ..provider.tools import entities as tools_entities
from ..platform import adapter as msadapter
class LauncherTypes(enum.Enum): class LauncherTypes(enum.Enum):
@@ -44,6 +45,9 @@ class Query(pydantic.BaseModel):
message_chain: mirai.MessageChain message_chain: mirai.MessageChain
"""消息链,platform收到的消息链""" """消息链,platform收到的消息链"""
adapter: msadapter.MessageSourceAdapter
"""适配器对象"""
session: typing.Optional[Session] = None session: typing.Optional[Session] = None
"""会话对象,由前置处理器设置""" """会话对象,由前置处理器设置"""
@@ -68,6 +72,9 @@ class Query(pydantic.BaseModel):
resp_message_chain: typing.Optional[mirai.MessageChain] = None resp_message_chain: typing.Optional[mirai.MessageChain] = None
"""回复消息链,从resp_messages包装而得""" """回复消息链,从resp_messages包装而得"""
class Config:
arbitrary_types_allowed = True
class Conversation(pydantic.BaseModel): class Conversation(pydantic.BaseModel):
"""对话""" """对话"""
+5 -2
View File
@@ -5,6 +5,7 @@ import asyncio
import mirai import mirai
from . import entities from . import entities
from ..platform import adapter as msadapter
class QueryPool: class QueryPool:
@@ -29,7 +30,8 @@ class QueryPool:
launcher_id: int, launcher_id: int,
sender_id: int, sender_id: int,
message_event: mirai.MessageEvent, message_event: mirai.MessageEvent,
message_chain: mirai.MessageChain message_chain: mirai.MessageChain,
adapter: msadapter.MessageSourceAdapter
) -> entities.Query: ) -> entities.Query:
async with self.condition: async with self.condition:
query = entities.Query( query = entities.Query(
@@ -40,7 +42,8 @@ class QueryPool:
message_event=message_event, message_event=message_event,
message_chain=message_chain, message_chain=message_chain,
resp_messages=[], resp_messages=[],
resp_message_chain=None resp_message_chain=None,
adapter=adapter
) )
self.queries.append(query) self.queries.append(query)
self.query_id_counter += 1 self.query_id_counter += 1
+1 -1
View File
@@ -52,7 +52,7 @@ class LongTextProcessStage(stage.PipelineStage):
async def process(self, query: core_entities.Query, stage_inst_name: str) -> entities.StageProcessResult: async def process(self, query: core_entities.Query, stage_inst_name: str) -> entities.StageProcessResult:
if len(str(query.resp_message_chain)) > self.ap.platform_cfg.data['long-text-process']['threshold']: if len(str(query.resp_message_chain)) > self.ap.platform_cfg.data['long-text-process']['threshold']:
query.resp_message_chain = MessageChain(await self.strategy_impl.process(str(query.resp_message_chain))) query.resp_message_chain = MessageChain(await self.strategy_impl.process(str(query.resp_message_chain), query))
return entities.StageProcessResult( return entities.StageProcessResult(
result_type=entities.ResultType.CONTINUE, result_type=entities.ResultType.CONTINUE,
new_query=query new_query=query
+3 -2
View File
@@ -7,6 +7,7 @@ from mirai.models.message import MessageComponent, ForwardMessageNode
from mirai.models.base import MiraiBaseModel from mirai.models.base import MiraiBaseModel
from .. import strategy as strategy_model from .. import strategy as strategy_model
from ....core import entities as core_entities
class ForwardMessageDiaplay(MiraiBaseModel): class ForwardMessageDiaplay(MiraiBaseModel):
@@ -37,7 +38,7 @@ class Forward(MessageComponent):
class ForwardComponentStrategy(strategy_model.LongTextStrategy): class ForwardComponentStrategy(strategy_model.LongTextStrategy):
async def process(self, message: str) -> list[MessageComponent]: async def process(self, message: str, query: core_entities.Query) -> list[MessageComponent]:
display = ForwardMessageDiaplay( display = ForwardMessageDiaplay(
title="群聊的聊天记录", title="群聊的聊天记录",
brief="[聊天记录]", brief="[聊天记录]",
@@ -48,7 +49,7 @@ class ForwardComponentStrategy(strategy_model.LongTextStrategy):
node_list = [ node_list = [
ForwardMessageNode( ForwardMessageNode(
sender_id=self.ap.im_mgr.bot_account_id, sender_id=query.adapter.bot_account_id,
sender_name='QQ用户', sender_name='QQ用户',
message_chain=MessageChain([message]) message_chain=MessageChain([message])
) )
+2 -1
View File
@@ -12,6 +12,7 @@ from mirai.models import MessageChain, Image as ImageComponent
from mirai.models.message import MessageComponent from mirai.models.message import MessageComponent
from .. import strategy as strategy_model from .. import strategy as strategy_model
from ....core import entities as core_entities
class Text2ImageStrategy(strategy_model.LongTextStrategy): class Text2ImageStrategy(strategy_model.LongTextStrategy):
@@ -21,7 +22,7 @@ class Text2ImageStrategy(strategy_model.LongTextStrategy):
async def initialize(self): async def initialize(self):
self.text_render_font = ImageFont.truetype(self.ap.platform_cfg.data['long-text-process']['font-path'], 32, encoding="utf-8") self.text_render_font = ImageFont.truetype(self.ap.platform_cfg.data['long-text-process']['font-path'], 32, encoding="utf-8")
async def process(self, message: str) -> list[MessageComponent]: async def process(self, message: str, query: core_entities.Query) -> list[MessageComponent]:
img_path = self.text_to_image( img_path = self.text_to_image(
text_str=message, text_str=message,
save_as='temp/{}.png'.format(int(time.time())) save_as='temp/{}.png'.format(int(time.time()))
+2 -1
View File
@@ -6,6 +6,7 @@ import mirai
from mirai.models.message import MessageComponent from mirai.models.message import MessageComponent
from ...core import app from ...core import app
from ...core import entities as core_entities
class LongTextStrategy(metaclass=abc.ABCMeta): class LongTextStrategy(metaclass=abc.ABCMeta):
@@ -18,5 +19,5 @@ class LongTextStrategy(metaclass=abc.ABCMeta):
pass pass
@abc.abstractmethod @abc.abstractmethod
async def process(self, message: str) -> list[MessageComponent]: async def process(self, message: str, query: core_entities.Query) -> list[MessageComponent]:
return [] return []
+2 -1
View File
@@ -31,7 +31,8 @@ class SendResponseBackStage(stage.PipelineStage):
await self.ap.im_mgr.send( await self.ap.im_mgr.send(
query.message_event, query.message_event,
query.resp_message_chain query.resp_message_chain,
adapter=query.adapter
) )
return entities.StageProcessResult( return entities.StageProcessResult(
+1 -1
View File
@@ -47,7 +47,7 @@ class GroupRespondRuleCheckStage(stage.PipelineStage):
use_rule = use_rule[str(query.launcher_id)] use_rule = use_rule[str(query.launcher_id)]
for rule_matcher in self.rule_matchers: # 任意一个匹配就放行 for rule_matcher in self.rule_matchers: # 任意一个匹配就放行
res = await rule_matcher.match(str(query.message_chain), query.message_chain, use_rule) res = await rule_matcher.match(str(query.message_chain), query.message_chain, use_rule, query)
if res.matching: if res.matching:
query.message_chain = res.replacement query.message_chain = res.replacement
+3 -2
View File
@@ -3,7 +3,7 @@ import abc
import mirai import mirai
from ...core import app from ...core import app, entities as core_entities
from . import entities from . import entities
@@ -24,7 +24,8 @@ class GroupRespondRule(metaclass=abc.ABCMeta):
self, self,
message_text: str, message_text: str,
message_chain: mirai.MessageChain, message_chain: mirai.MessageChain,
rule_dict: dict rule_dict: dict,
query: core_entities.Query
) -> entities.RuleJudgeResult: ) -> entities.RuleJudgeResult:
"""判断消息是否匹配规则 """判断消息是否匹配规则
""" """
+5 -3
View File
@@ -4,6 +4,7 @@ import mirai
from .. import rule as rule_model from .. import rule as rule_model
from .. import entities from .. import entities
from ....core import entities as core_entities
class AtBotRule(rule_model.GroupRespondRule): class AtBotRule(rule_model.GroupRespondRule):
@@ -12,11 +13,12 @@ class AtBotRule(rule_model.GroupRespondRule):
self, self,
message_text: str, message_text: str,
message_chain: mirai.MessageChain, message_chain: mirai.MessageChain,
rule_dict: dict rule_dict: dict,
query: core_entities.Query
) -> entities.RuleJudgeResult: ) -> entities.RuleJudgeResult:
if message_chain.has(mirai.At(self.ap.im_mgr.bot_account_id)) and rule_dict['at']: if message_chain.has(mirai.At(query.adapter.bot_account_id)) and rule_dict['at']:
message_chain.remove(mirai.At(self.ap.im_mgr.bot_account_id)) message_chain.remove(mirai.At(query.adapter.bot_account_id))
return entities.RuleJudgeResult( return entities.RuleJudgeResult(
matching=True, matching=True,
replacement=message_chain, replacement=message_chain,
+3 -1
View File
@@ -2,6 +2,7 @@ import mirai
from .. import rule as rule_model from .. import rule as rule_model
from .. import entities from .. import entities
from ....core import entities as core_entities
class PrefixRule(rule_model.GroupRespondRule): class PrefixRule(rule_model.GroupRespondRule):
@@ -10,7 +11,8 @@ class PrefixRule(rule_model.GroupRespondRule):
self, self,
message_text: str, message_text: str,
message_chain: mirai.MessageChain, message_chain: mirai.MessageChain,
rule_dict: dict rule_dict: dict,
query: core_entities.Query
) -> entities.RuleJudgeResult: ) -> entities.RuleJudgeResult:
prefixes = rule_dict['prefix'] prefixes = rule_dict['prefix']
+1
View File
@@ -4,6 +4,7 @@ import mirai
from .. import rule as rule_model from .. import rule as rule_model
from .. import entities from .. import entities
from ....core import entities as core_entities
class RandomRespRule(rule_model.GroupRespondRule): class RandomRespRule(rule_model.GroupRespondRule):
+1
View File
@@ -4,6 +4,7 @@ import mirai
from .. import rule as rule_model from .. import rule as rule_model
from .. import entities from .. import entities
from ....core import entities as core_entities
class RegExpRule(rule_model.GroupRespondRule): class RegExpRule(rule_model.GroupRespondRule):
+2 -2
View File
@@ -71,7 +71,7 @@ class MessageSourceAdapter(metaclass=abc.ABCMeta):
def register_listener( def register_listener(
self, self,
event_type: typing.Type[mirai.Event], 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( def unregister_listener(
self, self,
event_type: typing.Type[mirai.Event], event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None] callback: typing.Callable[[mirai.Event, MessageSourceAdapter], None]
): ):
"""注销事件监听器 """注销事件监听器
+79 -62
View File
@@ -17,11 +17,8 @@ from ..plugin import events
# 控制QQ消息输入输出的类 # 控制QQ消息输入输出的类
class PlatformManager: class PlatformManager:
adapter: msadapter.MessageSourceAdapter = None # adapter: msadapter.MessageSourceAdapter = None
adapters: list[msadapter.MessageSourceAdapter] = []
@property
def bot_account_id(self):
return self.adapter.bot_account_id
# modern # modern
ap: app.Application = None ap: app.Application = None
@@ -29,54 +26,13 @@ class PlatformManager:
def __init__(self, ap: app.Application = None): def __init__(self, ap: app.Application = None):
self.ap = ap self.ap = ap
self.adapters = []
async def initialize(self): async def initialize(self):
from .sources import yirimirai, nakuru, aiocqhttp, qqbotpy from .sources import yirimirai, nakuru, aiocqhttp, qqbotpy
adapter_cls = None async def on_friend_message(event: FriendMessage, adapter: msadapter.MessageSourceAdapter):
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):
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.PersonMessageReceived(
launcher_type='person',
launcher_id=event.sender.id,
sender_id=event.sender.id,
message_chain=event.message_chain,
query=None
)
)
if not event_ctx.is_prevented_default():
await self.ap.query_pool.add_query(
launcher_type=core_entities.LauncherTypes.PERSON,
launcher_id=event.sender.id,
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain
)
self.adapter.register_listener(
FriendMessage,
on_friend_message
)
async def on_stranger_message(event: StrangerMessage):
event_ctx = await self.ap.plugin_mgr.emit_event( event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.PersonMessageReceived( event=events.PersonMessageReceived(
@@ -96,16 +52,40 @@ class PlatformManager:
sender_id=event.sender.id, sender_id=event.sender.id,
message_event=event, message_event=event,
message_chain=event.message_chain, message_chain=event.message_chain,
adapter=adapter
)
async def on_stranger_message(event: StrangerMessage, adapter: msadapter.MessageSourceAdapter):
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.PersonMessageReceived(
launcher_type='person',
launcher_id=event.sender.id,
sender_id=event.sender.id,
message_chain=event.message_chain,
query=None
)
)
if not event_ctx.is_prevented_default():
await self.ap.query_pool.add_query(
launcher_type=core_entities.LauncherTypes.PERSON,
launcher_id=event.sender.id,
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain,
adapter=adapter
) )
# nakuru不区分好友和陌生人,故仅为yirimirai注册陌生人事件 # nakuru不区分好友和陌生人,故仅为yirimirai注册陌生人事件
if self.ap.platform_cfg.data['platform-adapter'] == 'yiri-mirai': # if self.ap.platform_cfg.data['platform-adapter'] == 'yiri-mirai':
self.adapter.register_listener( # self.adapter.register_listener(
StrangerMessage, # StrangerMessage,
on_stranger_message # 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_ctx = await self.ap.plugin_mgr.emit_event(
event=events.GroupMessageReceived( event=events.GroupMessageReceived(
@@ -124,15 +104,49 @@ class PlatformManager:
launcher_id=event.group.id, launcher_id=event.group.id,
sender_id=event.sender.id, sender_id=event.sender.id,
message_event=event, message_event=event,
message_chain=event.message_chain message_chain=event.message_chain,
adapter=adapter
) )
self.adapter.register_listener( for adap_cfg in self.ap.platform_cfg.data['platform-adapters']:
GroupMessage, if adap_cfg['enable']:
on_group_message cfg_copy = adap_cfg.copy()
) del cfg_copy['enable']
adapter_name = cfg_copy['adapter']
del cfg_copy['adapter']
async def send(self, event, msg, check_quote=True, check_at_sender=True): found = False
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): 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, event,
msg, msg,
quote_origin=True if self.ap.platform_cfg.data['quote-origin'] and check_quote else False 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): async def run(self):
try: 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: except Exception as e:
self.ap.logger.error('平台适配器运行出错: ' + str(e)) self.ap.logger.error('平台适配器运行出错: ' + str(e))
self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") self.ap.logger.debug(f"Traceback: {traceback.format_exc()}")
+3 -3
View File
@@ -240,12 +240,12 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
def register_listener( def register_listener(
self, self,
event_type: typing.Type[mirai.Event], 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): async def on_message(event: aiocqhttp.Event):
self.bot_account_id = event.self_id self.bot_account_id = event.self_id
try: try:
return await callback(self.event_converter.target2yiri(event)) return await callback(self.event_converter.target2yiri(event), self)
except: except:
traceback.print_exc() traceback.print_exc()
@@ -257,7 +257,7 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
def unregister_listener( def unregister_listener(
self, self,
event_type: typing.Type[mirai.Event], 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) return super().unregister_listener(event_type, callback)
+3 -4
View File
@@ -257,14 +257,13 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def register_listener( def register_listener(
self, self,
event_type: typing.Type[mirai.Event], event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None] callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
): ):
try: try:
# 包装函数 # 包装函数
async def listener_wrapper(app: nakuru.CQHTTP, source: NakuruProjectAdapter.event_converter.yiri2target(event_type)): async def listener_wrapper(app: nakuru.CQHTTP, source: NakuruProjectAdapter.event_converter.yiri2target(event_type)):
print(1111) await callback(self.event_converter.target2yiri(source), self)
await callback(self.event_converter.target2yiri(source))
# 将包装函数和原函数的对应关系存入列表 # 将包装函数和原函数的对应关系存入列表
self.listener_list.append( self.listener_list.append(
@@ -284,7 +283,7 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener( def unregister_listener(
self, self,
event_type: typing.Type[mirai.Event], 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__ 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( def register_listener(
self, self,
event_type: typing.Type[mirai.Event], event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None] callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
): ):
try: try:
async def wrapper(message: typing.Union[botpy_message.Message, botpy_message.DirectMessage, botpy_message.GroupMessage]): async def wrapper(message: typing.Union[botpy_message.Message, botpy_message.DirectMessage, botpy_message.GroupMessage]):
self.cached_official_messages[str(message.id)] = message 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]: for event_handler in event_handler_mapping[event_type]:
setattr(self.bot, event_handler, wrapper) setattr(self.bot, event_handler, wrapper)
@@ -380,7 +380,7 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener( def unregister_listener(
self, self,
event_type: typing.Type[mirai.Event], 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]) delattr(self.bot, event_handler_mapping[event_type])
+5 -3
View File
@@ -87,7 +87,7 @@ class YiriMiraiAdapter(adapter_model.MessageSourceAdapter):
def register_listener( def register_listener(
self, self,
event_type: typing.Type[mirai.Event], 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事件类型 event_type (typing.Type[mirai.Event]): YiriMirai事件类型
callback (typing.Callable[[mirai.Event], None]): 回调函数,接收一个参数,为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( def unregister_listener(
self, self,
event_type: typing.Type[mirai.Event], event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event], None] callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
): ):
"""注销事件监听器 """注销事件监听器
+34
View File
@@ -25,6 +25,40 @@
"direct_message" "direct_message"
] ]
}, },
"platform-adapters": [
{
"adapter": "yiri-mirai",
"enable": false,
"host": "127.0.0.1",
"port": 8080,
"verifyKey": "yirimirai",
"qq": 123456789
},
{
"adapter": "nakuru",
"enable": false,
"host": "127.0.0.1",
"ws_port": 8080,
"http_port": 5700,
"token": ""
},
{
"adapter": "aiocqhttp",
"enable": false,
"host": "127.0.0.1",
"port": 8080
},
{
"adapter": "qq-botpy",
"enable": false,
"appid": "",
"secret": "",
"intents": [
"public_guild_messages",
"direct_message"
]
}
],
"track-function-calls": true, "track-function-calls": true,
"quote-origin": false, "quote-origin": false,
"at-sender": false, "at-sender": false,