Merge branch 'MaiM-with-u:main' into main
commit
bf6f875f9d
58
README.md
58
README.md
|
|
@ -10,13 +10,14 @@
|
||||||
[Nickname] # 现在没用
|
[Nickname] # 现在没用
|
||||||
nickname = ""
|
nickname = ""
|
||||||
|
|
||||||
[Napcat_Server] # Napvat连接的ws服务设置
|
[Napcat_Server] # Napcat连接的ws服务设置
|
||||||
host = "localhost" # Napcat设定的url地址
|
host = "localhost" # Napcat设定的url地址
|
||||||
port = 8095 # Napcat设定的ws端口
|
port = 8095 # Napcat设定的ws端口
|
||||||
|
|
||||||
[MaiBot_Server] # 连接麦麦的ws服务设置
|
[MaiBot_Server] # 连接麦麦的ws服务设置
|
||||||
host = "localhost" # 麦麦在.env文件中设置的url地址
|
platform_name = "qq" # 标识adapter的名称(必填)
|
||||||
port = 8000 # 麦麦在.env文件中设置的ws端口
|
host = "localhost" # 麦麦在.env文件中设置的url地址
|
||||||
|
port = 8000 # 麦麦在.env文件中设置的ws端口
|
||||||
|
|
||||||
[Napcat]
|
[Napcat]
|
||||||
heartbeat = 30 # 与Napcat设置的心跳相同(按秒计)
|
heartbeat = 30 # 与Napcat设置的心跳相同(按秒计)
|
||||||
|
|
@ -25,12 +26,59 @@ heartbeat = 30 # 与Napcat设置的心跳相同(按秒计)
|
||||||
group_list = []
|
group_list = []
|
||||||
private_list = []
|
private_list = []
|
||||||
enable_temp = false
|
enable_temp = false
|
||||||
|
|
||||||
|
[Debug]
|
||||||
|
level = "INFO" # 日志等级(DEBUG, INFO, WARNING, ERROR)
|
||||||
```
|
```
|
||||||
|
|
||||||
你需要的就是把template_config.toml复制到根目录,然后改
|
你需要的就是把template_config.toml复制到根目录,然后改
|
||||||
|
|
||||||
至于requirements,需要maim_message,安装略
|
至于requirements,需要maim_message,安装略
|
||||||
|
|
||||||
|
# 消息流转过程
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Napcat as Napcat客户端
|
||||||
|
participant Adapter as MaiBot-Napcat适配器
|
||||||
|
participant Queue as 消息队列
|
||||||
|
participant Handler as 消息处理器
|
||||||
|
participant MaiBot as MaiBot服务
|
||||||
|
|
||||||
|
Note over Napcat,MaiBot: 初始化阶段
|
||||||
|
Napcat->>Adapter: WebSocket连接(ws://localhost:8095)
|
||||||
|
Adapter->>MaiBot: WebSocket连接(ws://localhost:8000)
|
||||||
|
|
||||||
|
Note over Napcat,MaiBot: 心跳检测
|
||||||
|
loop 每30秒
|
||||||
|
Napcat->>Adapter: 发送心跳包
|
||||||
|
Adapter->>Napcat: 心跳响应
|
||||||
|
end
|
||||||
|
|
||||||
|
Note over Napcat,MaiBot: 消息处理流程
|
||||||
|
Napcat->>Adapter: 发送消息
|
||||||
|
Adapter->>Queue: 消息入队(message_queue)
|
||||||
|
Queue->>Handler: 消息出队处理
|
||||||
|
Handler->>Handler: 解析消息类型
|
||||||
|
alt 文本消息
|
||||||
|
Handler->>MaiBot: 发送文本消息
|
||||||
|
else 图片消息
|
||||||
|
Handler->>MaiBot: 发送图片消息
|
||||||
|
else 混合消息
|
||||||
|
Handler->>MaiBot: 发送混合消息
|
||||||
|
else 转发消息
|
||||||
|
Handler->>MaiBot: 发送转发消息
|
||||||
|
end
|
||||||
|
MaiBot-->>Adapter: 消息响应
|
||||||
|
Adapter-->>Napcat: 消息响应
|
||||||
|
|
||||||
|
Note over Napcat,MaiBot: 优雅关闭
|
||||||
|
Adapter->>MaiBot: 关闭连接
|
||||||
|
Adapter->>Queue: 清空消息队列
|
||||||
|
Adapter->>Napcat: 关闭连接
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
# TO DO List
|
# TO DO List
|
||||||
- [x] 读取自动心跳测试连接
|
- [x] 读取自动心跳测试连接
|
||||||
- [x] 接受消息解析
|
- [x] 接受消息解析
|
||||||
|
|
@ -39,11 +87,11 @@ enable_temp = false
|
||||||
- [x] 文本与消息混合解析
|
- [x] 文本与消息混合解析
|
||||||
- [x] 转发解析(含图片动态解析)
|
- [x] 转发解析(含图片动态解析)
|
||||||
- [ ] 群公告解析
|
- [ ] 群公告解析
|
||||||
- [ ] 回复解析(?)
|
- [x] 回复解析
|
||||||
- [ ] 群临时消息(可能不做)
|
- [ ] 群临时消息(可能不做)
|
||||||
- [ ] 链接解析
|
- [ ] 链接解析
|
||||||
- [x] 戳一戳解析
|
- [x] 戳一戳解析
|
||||||
- [ ] 读取戳一戳的自定义内容(?)
|
- [x] 读取戳一戳的自定义内容
|
||||||
- [ ] 语音解析(?)
|
- [ ] 语音解析(?)
|
||||||
- [ ] 所有的notice类
|
- [ ] 所有的notice类
|
||||||
- [ ] <del>撤回</del>
|
- [ ] <del>撤回</del>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from .send_handler import send_handler
|
||||||
|
|
||||||
route_config = RouteConfig(
|
route_config = RouteConfig(
|
||||||
route_config={
|
route_config={
|
||||||
"qq": TargetConfig(
|
global_config.platform: TargetConfig(
|
||||||
url=f"ws://{global_config.mai_host}:{global_config.mai_port}/ws",
|
url=f"ws://{global_config.mai_host}:{global_config.mai_port}/ws",
|
||||||
token=None,
|
token=None,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ from .utils import (
|
||||||
get_image_base64,
|
get_image_base64,
|
||||||
get_self_info,
|
get_self_info,
|
||||||
get_stranger_info,
|
get_stranger_info,
|
||||||
|
get_message_detail,
|
||||||
)
|
)
|
||||||
from .message_queue import get_response
|
from .message_queue import get_response
|
||||||
|
|
||||||
|
|
@ -256,11 +257,14 @@ class RecvHandler:
|
||||||
logger.warning("暂时不支持窗口抖动解析")
|
logger.warning("暂时不支持窗口抖动解析")
|
||||||
pass
|
pass
|
||||||
case RealMessageType.share:
|
case RealMessageType.share:
|
||||||
logger.warning("链接分享?啊?你搞我啊?")
|
logger.warning("暂时不支持链接解析")
|
||||||
pass
|
pass
|
||||||
case RealMessageType.reply:
|
case RealMessageType.reply:
|
||||||
logger.warning("暂时不支持回复解析")
|
ret_seg = await self.handle_reply_message(sub_message)
|
||||||
pass
|
if ret_seg:
|
||||||
|
seg_message.append(ret_seg)
|
||||||
|
else:
|
||||||
|
logger.warning("reply处理失败")
|
||||||
case RealMessageType.forward:
|
case RealMessageType.forward:
|
||||||
forward_message_id = sub_message.get("data").get("id")
|
forward_message_id = sub_message.get("data").get("id")
|
||||||
payload = json.dumps(
|
payload = json.dumps(
|
||||||
|
|
@ -353,7 +357,7 @@ class RecvHandler:
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
member_info: dict = await get_member_info(self.server_connection, group_id=group_id, user_id=self_id)
|
member_info: dict = await get_member_info(self.server_connection, group_id=group_id, user_id=qq_id)
|
||||||
if member_info:
|
if member_info:
|
||||||
return Seg(
|
return Seg(
|
||||||
type=RealMessageType.text,
|
type=RealMessageType.text,
|
||||||
|
|
@ -362,6 +366,22 @@ class RecvHandler:
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
async def handle_reply_message(self, raw_message: dict) -> None:
|
||||||
|
"""
|
||||||
|
处理回复消息
|
||||||
|
|
||||||
|
"""
|
||||||
|
message_id = raw_message.get("data").get("id")
|
||||||
|
message_detail: dict = await get_message_detail(self.server_connection, message_id)
|
||||||
|
sender_info: dict = message_detail.get("sender")
|
||||||
|
sender_nickname: str = sender_info.get("nickname")
|
||||||
|
if not sender_nickname:
|
||||||
|
logger.warning("无法获取被引用的人的昵称,返回默认值")
|
||||||
|
return Seg(type="text", data="回复QQ用户的消息,说:")
|
||||||
|
else:
|
||||||
|
return Seg(type="text", data=f"回复{sender_nickname}的消息,说:")
|
||||||
|
|
||||||
|
|
||||||
async def handle_notice(self, raw_message: dict) -> None:
|
async def handle_notice(self, raw_message: dict) -> None:
|
||||||
notice_type = raw_message.get("notice_type")
|
notice_type = raw_message.get("notice_type")
|
||||||
# message_time: int = raw_message.get("time")
|
# message_time: int = raw_message.get("time")
|
||||||
|
|
|
||||||
15
src/utils.py
15
src/utils.py
|
|
@ -126,3 +126,18 @@ async def get_stranger_info(websocket: Server.ServerConnection, user_id: int) ->
|
||||||
response: dict = await get_response()
|
response: dict = await get_response()
|
||||||
logger.debug(response)
|
logger.debug(response)
|
||||||
return response.get("data")
|
return response.get("data")
|
||||||
|
|
||||||
|
async def get_message_detail(websocket: Server.ServerConnection, message_id: str) -> dict:
|
||||||
|
"""
|
||||||
|
获取消息详情
|
||||||
|
Parameters:
|
||||||
|
websocket: WebSocket连接对象
|
||||||
|
message_id: 消息ID
|
||||||
|
Returns:
|
||||||
|
dict: 返回的消息详情
|
||||||
|
"""
|
||||||
|
payload = json.dumps({"action": "get_msg", "params": {"message_id": message_id}})
|
||||||
|
await websocket.send(payload)
|
||||||
|
response: dict = await get_response()
|
||||||
|
logger.debug(response)
|
||||||
|
return response.get("data")
|
||||||
Loading…
Reference in New Issue