QChatGPT/pkg/platform/manager.py

186 lines
6.5 KiB
Python
Raw Normal View History

2024-01-23 20:55:20 +08:00
from __future__ import annotations
2022-12-11 17:17:33 +08:00
import json
import os
2023-11-13 21:59:23 +08:00
import logging
import asyncio
2024-01-30 14:58:34 +08:00
import traceback
2023-11-26 23:04:14 +08:00
from mirai import At, GroupMessage, MessageEvent, StrangerMessage, \
FriendMessage, Image, MessageChain, Plain
import mirai
2024-01-28 19:20:10 +08:00
from ..platform import adapter as msadapter
from ..core import app, entities as core_entities
2024-01-30 21:45:17 +08:00
from ..plugin import events
2024-01-23 20:55:20 +08:00
2022-12-11 16:10:12 +08:00
# 控制QQ消息输入输出的类
2024-01-30 21:45:17 +08:00
class PlatformManager:
2024-01-28 18:38:47 +08:00
# adapter: msadapter.MessageSourceAdapter = None
adapters: list[msadapter.MessageSourceAdapter] = []
2022-12-07 23:37:52 +08:00
# modern
ap: app.Application = None
2024-01-28 18:38:47 +08:00
def __init__(self, ap: app.Application = None):
self.ap = ap
self.adapters = []
async def initialize(self):
2024-02-08 13:12:33 +08:00
from .sources import yirimirai, nakuru, aiocqhttp, qqbotpy
async def on_friend_message(event: FriendMessage, adapter: msadapter.MessageSourceAdapter):
2024-01-30 21:45:17 +08:00
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
)
)
2024-01-30 21:45:17 +08:00
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
2024-01-30 21:45:17 +08:00
)
async def on_stranger_message(event: StrangerMessage, adapter: msadapter.MessageSourceAdapter):
2024-01-30 21:45:17 +08:00
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
)
)
2024-01-30 21:45:17 +08:00
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
2024-01-30 21:45:17 +08:00
)
async def on_group_message(event: GroupMessage, adapter: msadapter.MessageSourceAdapter):
2024-01-30 21:45:17 +08:00
event_ctx = await self.ap.plugin_mgr.emit_event(
event=events.GroupMessageReceived(
launcher_type='group',
launcher_id=event.group.id,
2024-01-30 21:45:17 +08:00
sender_id=event.sender.id,
message_chain=event.message_chain,
query=None
)
)
2024-01-30 21:45:17 +08:00
if not event_ctx.is_prevented_default():
await self.ap.query_pool.add_query(
launcher_type=core_entities.LauncherTypes.GROUP,
launcher_id=event.group.id,
sender_id=event.sender.id,
message_event=event,
message_chain=event.message_chain,
adapter=adapter
2024-01-30 21:45:17 +08:00
)
2024-02-12 13:37:41 +08:00
index = 0
for adap_cfg in self.ap.platform_cfg.data['platform-adapters']:
if adap_cfg['enable']:
2024-02-12 13:37:41 +08:00
self.ap.logger.info(f'初始化平台适配器 {index}: {adap_cfg["adapter"]}')
index += 1
cfg_copy = adap_cfg.copy()
del cfg_copy['enable']
adapter_name = cfg_copy['adapter']
del cfg_copy['adapter']
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)
if len(self.adapters) == 0:
self.ap.logger.warning('未运行平台适配器,请根据文档配置并启用平台适配器。')
2024-03-22 11:05:58 +08:00
async def send(self, event: mirai.MessageEvent, msg: mirai.MessageChain, adapter: msadapter.MessageSourceAdapter, check_quote=True, check_at_sender=True):
2024-02-06 23:57:21 +08:00
if check_at_sender and self.ap.platform_cfg.data['at-sender'] and isinstance(event, GroupMessage):
2024-02-07 23:21:32 +08:00
2024-02-06 21:26:03 +08:00
msg.insert(
0,
At(
event.sender.id
)
2024-02-06 21:26:03 +08:00
)
await adapter.reply_message(
event,
msg,
2024-02-06 21:26:03 +08:00
quote_origin=True if self.ap.platform_cfg.data['quote-origin'] and check_quote else False
)
async def run(self):
2024-01-30 14:58:34 +08:00
try:
tasks = []
for adapter in self.adapters:
2024-02-12 13:37:41 +08:00
async def exception_wrapper(adapter):
try:
await adapter.run_async()
except Exception as e:
self.ap.logger.error('平台适配器运行出错: ' + str(e))
self.ap.logger.debug(f"Traceback: {traceback.format_exc()}")
tasks.append(exception_wrapper(adapter))
2024-02-11 23:35:05 +08:00
for task in tasks:
asyncio.create_task(task)
2024-01-30 14:58:34 +08:00
except Exception as e:
self.ap.logger.error('平台适配器运行出错: ' + str(e))
self.ap.logger.debug(f"Traceback: {traceback.format_exc()}")
2024-02-12 13:37:41 +08:00