diff --git a/src/common/config.ts b/src/common/config.ts index de9e0cb..4e8922f 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -29,13 +29,13 @@ export class ConfigUtil { enableHttp: true, enableHttpPost: true, enableWs: true, - enableWsReverse: false + enableWsReverse: false, + messagePostFormat: "array", } let defaultConfig: Config = { ob11: ob11Default, heartInterval: 60000, token: "", - messagePostFormat: "array", enableLocalFile2Url: false, debug: false, log: false, diff --git a/src/common/types.ts b/src/common/types.ts index 11aa8b1..ed98c32 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -7,13 +7,13 @@ export interface OB11Config { enableHttpPost?: boolean enableWs?: boolean enableWsReverse?: boolean + messagePostFormat?: 'array' | 'string' } export interface Config { ob11: OB11Config token?: string heartInterval?: number // ms - messagePostFormat?: 'array' | 'string' enableLocalFile2Url?: boolean // 开启后,本地文件路径图片会转成http链接, 语音会转成base64 debug?: boolean reportSelfMessage?: boolean diff --git a/src/global.d.ts b/src/global.d.ts index 02e92a8..d88bd91 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -4,14 +4,7 @@ import {LLOneBot} from "./preload"; declare global { interface Window { - llonebot: typeof llonebot; + llonebot: LLOneBot; LiteLoader: any; } - - interface Event { - detail?: { - name: string; - value: string; - } - } } \ No newline at end of file diff --git a/src/onebot11/action/SendMsg.ts b/src/onebot11/action/SendMsg.ts index 2150423..eb73fd2 100644 --- a/src/onebot11/action/SendMsg.ts +++ b/src/onebot11/action/SendMsg.ts @@ -9,7 +9,7 @@ import {ActionName, BaseCheckResult} from "./types"; import * as fs from "fs"; import {log} from "../../common/utils"; import {v4 as uuidv4} from "uuid" -import {parseCQCode} from "../cqcode"; +import {decodeCQCode} from "../cqcode"; function checkSendMessage(sendMsgList: OB11MessageData[]) { function checkUri(uri: string): boolean { @@ -124,7 +124,7 @@ export class SendMsg extends BaseAction { // text: message // } // }] as OB11MessageData[] - message = parseCQCode(message.toString()) + message = decodeCQCode(message.toString()) } else if (!Array.isArray(message)) { message = [message] } diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 02a6a34..d6eb36c 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -7,27 +7,18 @@ import { OB11MessageDataType, OB11User } from "./types"; -import { - AtType, - ChatType, - Friend, - Group, - GroupMember, - IMAGE_HTTP_HOST, - RawMessage, - SelfInfo, - User -} from '../ntqqapi/types'; +import {AtType, ChatType, Group, GroupMember, IMAGE_HTTP_HOST, RawMessage, SelfInfo, User} from '../ntqqapi/types'; import {getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo} from '../common/data'; import {file2base64, getConfigUtil, log} from "../common/utils"; import {NTQQApi} from "../ntqqapi/ntcall"; import {EventType} from "./event/OB11BaseEvent"; +import {encodeCQCode} from "./cqcode"; export class OB11Constructor { static async message(msg: RawMessage): Promise { - const {enableLocalFile2Url, messagePostFormat} = getConfigUtil().getConfig() + const {enableLocalFile2Url, ob11: {messagePostFormat}} = getConfigUtil().getConfig() const message_type = msg.chatType == ChatType.group ? "group" : "private"; const resMsg: OB11Message = { self_id: parseInt(selfInfo.uin), @@ -92,14 +83,11 @@ export class OB11Constructor { } } else if (element.textElement) { message_data["type"] = "text" - let text= element.textElement.content - if (!text.trim()){ + let text = element.textElement.content + if (!text.trim()) { continue; } message_data["data"]["text"] = text - if (text){ - resMsg.raw_message += text - } } else if (element.picElement) { message_data["type"] = "image" message_data["data"]["file_id"] = element.picElement.fileUuid @@ -156,8 +144,11 @@ export class OB11Constructor { } if (message_data.type !== "unknown" && message_data.data) { - if (messagePostFormat === 'string') (resMsg.message as string) += CQCodeBuilder(message_data); - else (resMsg.message as OB11MessageData[]).push(message_data); + if (messagePostFormat === 'string') { + const cqCode = encodeCQCode(message_data); + (resMsg.message as string) += cqCode; + resMsg.raw_message += cqCode; + } else (resMsg.message as OB11MessageData[]).push(message_data); } } resMsg.raw_message = resMsg.raw_message.trim(); @@ -220,24 +211,3 @@ export class OB11Constructor { return groups.map(OB11Constructor.group) } } - -function CQCodeBuilder(data: OB11MessageData) { - const CQCodeEscape = (text: string) => { - return text.replace(/\[/g, '[') - .replace(/\]/g, ']') - .replace(/\&/g, '&') - .replace(/,/g, ','); - }; - - if (data.type === 'text') { - return CQCodeEscape(data.data.text); - } - - let result = '[CQ:' + data.type; - for (const name in data.data) { - const value = data.data[name]; - result += `,${name}=${CQCodeEscape(value)}`; - } - result += ']'; - return result; -} diff --git a/src/onebot11/cqcode.ts b/src/onebot11/cqcode.ts index ca3d566..bfec38e 100644 --- a/src/onebot11/cqcode.ts +++ b/src/onebot11/cqcode.ts @@ -29,7 +29,7 @@ function h(type: string, data: any) { } } -export function parseCQCode(source: string): OB11MessageData[] { +export function decodeCQCode(source: string): OB11MessageData[] { const elements: any[] = [] let result: ReturnType while ((result = from(source))) { @@ -44,6 +44,28 @@ export function parseCQCode(source: string): OB11MessageData[] { return elements } + +export function encodeCQCode(data: OB11MessageData) { + const CQCodeEscape = (text: string) => { + return text.replace(/\[/g, '[') + .replace(/\]/g, ']') + .replace(/\&/g, '&') + .replace(/,/g, ','); + }; + + if (data.type === 'text') { + return CQCodeEscape(data.data.text); + } + + let result = '[CQ:' + data.type; + for (const name in data.data) { + const value = data.data[name]; + result += `,${name}=${CQCodeEscape(value)}`; + } + result += ']'; + return result; +} + // const result = parseCQCode("[CQ:at,qq=114514]早上好啊[CQ:image,file=http://baidu.com/1.jpg,type=show,id=40004]") // const result = parseCQCode("好好好") // console.log(JSON.stringify(result)) \ No newline at end of file diff --git a/src/renderer.ts b/src/renderer.ts index 38e1e01..6695669 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -113,8 +113,8 @@ async function onSettingWindowCreated(view: Element) { 如客户端无特殊需求推荐保持默认设置,两者的详细差异可参考 OneBot v11 文档 - Array - String + 消息段 + CQ码 @@ -185,10 +185,9 @@ async function onSettingWindowCreated(view: Element) { doc.getElementById("addHttpHost").addEventListener("click", () => addHostEle("http")) doc.getElementById("addWsHost").addEventListener("click", () => addHostEle("ws")) - doc.getElementById("messagePostFormat").addEventListener("selected", (e) => { - const _config = config || {}; - _config.messagePostFormat = e.detail && !isEmpty(e.detail.value) ? e.detail.value : 'array'; - window.llonebot.setConfig(_config); + doc.getElementById("messagePostFormat").addEventListener("selected", (e: CustomEvent) => { + config.ob11.messagePostFormat = e.detail && !isEmpty(e.detail.value) ? e.detail.value : 'array'; + window.llonebot.setConfig(config); }) function switchClick(eleId: string, configKey: string, _config=null) {