2024-02-06 13:47:11 +08:00

134 lines
5.8 KiB
TypeScript

import {OB11MessageDataType, OB11GroupMemberRole, OB11Message, OB11MessageData} from "./types";
import {AtType, ChatType, RawMessage} from "../common/types";
import {getFriend, getGroupMember, getHistoryMsgBySeq, msgHistory, selfInfo} from "../common/data";
import {file2base64, getConfigUtil} from "../common/utils";
export class OB11Construct {
static async constructMessage(msg: RawMessage): Promise<OB11Message> {
const {debug, enableBase64} = getConfigUtil().getConfig()
const message_type = msg.chatType == ChatType.group ? "group" : "private";
const resMsg: OB11Message = {
self_id: selfInfo.user_id,
user_id: msg.senderUin,
time: parseInt(msg.msgTime) || 0,
message_id: msg.msgId,
real_id: msg.msgId,
message_type: msg.chatType == ChatType.group ? "group" : "private",
sender: {
user_id: msg.senderUin,
nickname: msg.sendNickName,
card: msg.sendMemberName || "",
},
raw_message: "",
font: 14,
sub_type: "friend",
message: [],
post_type: "message",
}
if (msg.chatType == ChatType.group) {
resMsg.group_id = msg.peerUin
const member = getGroupMember(msg.peerUin, msg.senderUin);
if (member) {
resMsg.sender.role = OB11Construct.constructGroupMemberRole(member.role);
}
} else if (msg.chatType == ChatType.friend) {
resMsg.sub_type = "friend"
const friend = getFriend(msg.senderUin);
if (friend) {
resMsg.sender.nickname = friend.nickName;
}
} else if (msg.chatType == ChatType.temp) {
resMsg.sub_type = "group"
}
if (debug) {
resMsg.raw = msg
}
for (let element of msg.elements) {
let message_data: any = {
data: {},
type: "unknown"
}
if (element.textElement && element.textElement?.atType !== AtType.notAt) {
message_data["type"] = OB11MessageDataType.at
if (element.textElement.atType == AtType.atAll) {
message_data["data"]["mention"] = "all"
message_data["data"]["qq"] = "all"
} else {
let uid = element.textElement.atNtUid
let atMember = getGroupMember(msg.peerUin, uid)
message_data["data"]["mention"] = atMember!.uin
message_data["data"]["qq"] = atMember!.uin
}
} else if (element.textElement) {
message_data["type"] = "text"
message_data["data"]["text"] = element.textElement.content
} else if (element.picElement) {
message_data["type"] = "image"
message_data["data"]["file_id"] = element.picElement.fileUuid
message_data["data"]["path"] = element.picElement.sourcePath
message_data["data"]["file"] = element.picElement.sourcePath
} else if (element.replyElement) {
message_data["type"] = "reply"
const replyMsg = getHistoryMsgBySeq(element.replyElement.replayMsgSeq)
if (replyMsg) {
message_data["data"]["id"] = replyMsg.msgId
}
else{
continue
}
} else if (element.pttElement) {
message_data["type"] = OB11MessageDataType.voice;
message_data["data"]["file"] = element.pttElement.filePath
message_data["data"]["file_id"] = element.pttElement.fileUuid
// console.log("收到语音消息", message.raw.msgId, message.peer, element.pttElement)
// window.LLAPI.Ptt2Text(message.raw.msgId, message.peer, messages).then(text => {
// console.log("语音转文字结果", text);
// }).catch(err => {
// console.log("语音转文字失败", err);
// })
} else if (element.arkElement) {
message_data["type"] = OB11MessageDataType.json;
message_data["data"]["data"] = element.arkElement.bytesData;
}
if (message_data.data.file) {
let filePath: string = message_data.data.file;
message_data.data.file = "file://" + filePath
if (enableBase64) {
// filePath = filePath.replace("\\Ori\\", "\\Thumb\\")
let {err, data} = await file2base64(filePath);
if (err) {
console.log("文件转base64失败", err)
} else {
message_data.data.file = "base64://" + data
}
}
}
if (message_data.type !== "unknown" && message_data.data) {
resMsg.message.push(message_data);
}
}
// if (msgHistory.length > 10000) {
// msgHistory.splice(0, 100)
// }
// msgHistory.push(message)
// if (!reportSelfMessage && onebot_message_data["user_id"] == self_qq) {
// console.log("开启了不上传自己发送的消息,进行拦截 ", onebot_message_data);
// } else {
// console.log("发送上传消息给ipc main", onebot_message_data);
// window.llonebot.postData(onebot_message_data);
// }
return resMsg;
}
static constructGroupMemberRole(role: number): OB11GroupMemberRole {
return {
4: OB11GroupMemberRole.owner,
3: OB11GroupMemberRole.admin,
2: OB11GroupMemberRole.member
}[role]
}
}