feat: 上报支持CQCode

This commit is contained in:
linyuchen 2024-02-24 18:27:49 +08:00
parent 4941f0071a
commit cfb066971f
7 changed files with 44 additions and 60 deletions

View File

@ -29,13 +29,13 @@ export class ConfigUtil {
enableHttp: true, enableHttp: true,
enableHttpPost: true, enableHttpPost: true,
enableWs: true, enableWs: true,
enableWsReverse: false enableWsReverse: false,
messagePostFormat: "array",
} }
let defaultConfig: Config = { let defaultConfig: Config = {
ob11: ob11Default, ob11: ob11Default,
heartInterval: 60000, heartInterval: 60000,
token: "", token: "",
messagePostFormat: "array",
enableLocalFile2Url: false, enableLocalFile2Url: false,
debug: false, debug: false,
log: false, log: false,

View File

@ -7,13 +7,13 @@ export interface OB11Config {
enableHttpPost?: boolean enableHttpPost?: boolean
enableWs?: boolean enableWs?: boolean
enableWsReverse?: boolean enableWsReverse?: boolean
messagePostFormat?: 'array' | 'string'
} }
export interface Config { export interface Config {
ob11: OB11Config ob11: OB11Config
token?: string token?: string
heartInterval?: number // ms heartInterval?: number // ms
messagePostFormat?: 'array' | 'string'
enableLocalFile2Url?: boolean // 开启后本地文件路径图片会转成http链接, 语音会转成base64 enableLocalFile2Url?: boolean // 开启后本地文件路径图片会转成http链接, 语音会转成base64
debug?: boolean debug?: boolean
reportSelfMessage?: boolean reportSelfMessage?: boolean

9
src/global.d.ts vendored
View File

@ -4,14 +4,7 @@ import {LLOneBot} from "./preload";
declare global { declare global {
interface Window { interface Window {
llonebot: typeof llonebot; llonebot: LLOneBot;
LiteLoader: any; LiteLoader: any;
} }
interface Event {
detail?: {
name: string;
value: string;
}
}
} }

View File

@ -9,7 +9,7 @@ import {ActionName, BaseCheckResult} from "./types";
import * as fs from "fs"; import * as fs from "fs";
import {log} from "../../common/utils"; import {log} from "../../common/utils";
import {v4 as uuidv4} from "uuid" import {v4 as uuidv4} from "uuid"
import {parseCQCode} from "../cqcode"; import {decodeCQCode} from "../cqcode";
function checkSendMessage(sendMsgList: OB11MessageData[]) { function checkSendMessage(sendMsgList: OB11MessageData[]) {
function checkUri(uri: string): boolean { function checkUri(uri: string): boolean {
@ -124,7 +124,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
// text: message // text: message
// } // }
// }] as OB11MessageData[] // }] as OB11MessageData[]
message = parseCQCode(message.toString()) message = decodeCQCode(message.toString())
} else if (!Array.isArray(message)) { } else if (!Array.isArray(message)) {
message = [message] message = [message]
} }

View File

@ -7,27 +7,18 @@ import {
OB11MessageDataType, OB11MessageDataType,
OB11User OB11User
} from "./types"; } from "./types";
import { import {AtType, ChatType, Group, GroupMember, IMAGE_HTTP_HOST, RawMessage, SelfInfo, User} from '../ntqqapi/types';
AtType,
ChatType,
Friend,
Group,
GroupMember,
IMAGE_HTTP_HOST,
RawMessage,
SelfInfo,
User
} from '../ntqqapi/types';
import {getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo} from '../common/data'; import {getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo} from '../common/data';
import {file2base64, getConfigUtil, log} from "../common/utils"; import {file2base64, getConfigUtil, log} from "../common/utils";
import {NTQQApi} from "../ntqqapi/ntcall"; import {NTQQApi} from "../ntqqapi/ntcall";
import {EventType} from "./event/OB11BaseEvent"; import {EventType} from "./event/OB11BaseEvent";
import {encodeCQCode} from "./cqcode";
export class OB11Constructor { export class OB11Constructor {
static async message(msg: RawMessage): Promise<OB11Message> { static async message(msg: RawMessage): Promise<OB11Message> {
const {enableLocalFile2Url, messagePostFormat} = getConfigUtil().getConfig() const {enableLocalFile2Url, ob11: {messagePostFormat}} = getConfigUtil().getConfig()
const message_type = msg.chatType == ChatType.group ? "group" : "private"; const message_type = msg.chatType == ChatType.group ? "group" : "private";
const resMsg: OB11Message = { const resMsg: OB11Message = {
self_id: parseInt(selfInfo.uin), self_id: parseInt(selfInfo.uin),
@ -92,14 +83,11 @@ export class OB11Constructor {
} }
} else if (element.textElement) { } else if (element.textElement) {
message_data["type"] = "text" message_data["type"] = "text"
let text= element.textElement.content let text = element.textElement.content
if (!text.trim()){ if (!text.trim()) {
continue; continue;
} }
message_data["data"]["text"] = text message_data["data"]["text"] = text
if (text){
resMsg.raw_message += text
}
} else if (element.picElement) { } else if (element.picElement) {
message_data["type"] = "image" message_data["type"] = "image"
message_data["data"]["file_id"] = element.picElement.fileUuid message_data["data"]["file_id"] = element.picElement.fileUuid
@ -156,8 +144,11 @@ export class OB11Constructor {
} }
if (message_data.type !== "unknown" && message_data.data) { if (message_data.type !== "unknown" && message_data.data) {
if (messagePostFormat === 'string') (resMsg.message as string) += CQCodeBuilder(message_data); if (messagePostFormat === 'string') {
else (resMsg.message as OB11MessageData[]).push(message_data); 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(); resMsg.raw_message = resMsg.raw_message.trim();
@ -220,24 +211,3 @@ export class OB11Constructor {
return groups.map(OB11Constructor.group) return groups.map(OB11Constructor.group)
} }
} }
function CQCodeBuilder(data: OB11MessageData) {
const CQCodeEscape = (text: string) => {
return text.replace(/\[/g, '&#91;')
.replace(/\]/g, '&#93;')
.replace(/\&/g, '&amp;')
.replace(/,/g, '&#44;');
};
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;
}

View File

@ -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[] = [] const elements: any[] = []
let result: ReturnType<typeof from> let result: ReturnType<typeof from>
while ((result = from(source))) { while ((result = from(source))) {
@ -44,6 +44,28 @@ export function parseCQCode(source: string): OB11MessageData[] {
return elements return elements
} }
export function encodeCQCode(data: OB11MessageData) {
const CQCodeEscape = (text: string) => {
return text.replace(/\[/g, '&#91;')
.replace(/\]/g, '&#93;')
.replace(/\&/g, '&amp;')
.replace(/,/g, '&#44;');
};
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("[CQ:at,qq=114514]早上好啊[CQ:image,file=http://baidu.com/1.jpg,type=show,id=40004]")
// const result = parseCQCode("好好好") // const result = parseCQCode("好好好")
// console.log(JSON.stringify(result)) // console.log(JSON.stringify(result))

View File

@ -113,8 +113,8 @@ async function onSettingWindowCreated(view: Element) {
<setting-text data-type="secondary"> <a href="javascript:LiteLoader.api.openExternal('https://github.com/botuniverse/onebot-11/tree/master/message#readme');">OneBot v11 </a></setting-text> <setting-text data-type="secondary"> <a href="javascript:LiteLoader.api.openExternal('https://github.com/botuniverse/onebot-11/tree/master/message#readme');">OneBot v11 </a></setting-text>
</div> </div>
<setting-select id="messagePostFormat"> <setting-select id="messagePostFormat">
<setting-option data-value="array" ${config.messagePostFormat !== "string" ? "is-selected" : ""}>Array</setting-option> <setting-option data-value="array" ${config.ob11.messagePostFormat !== "string" ? "is-selected" : ""}></setting-option>
<setting-option data-value="string" ${config.messagePostFormat === "string" ? "is-selected" : ""}>String</setting-option> <setting-option data-value="string" ${config.ob11.messagePostFormat === "string" ? "is-selected" : ""}>CQ码</setting-option>
</setting-select> </setting-select>
</setting-item> </setting-item>
<setting-item data-direction="row" class="hostItem vertical-list-item"> <setting-item data-direction="row" class="hostItem vertical-list-item">
@ -185,10 +185,9 @@ async function onSettingWindowCreated(view: Element) {
doc.getElementById("addHttpHost").addEventListener("click", () => addHostEle("http")) doc.getElementById("addHttpHost").addEventListener("click", () => addHostEle("http"))
doc.getElementById("addWsHost").addEventListener("click", () => addHostEle("ws")) doc.getElementById("addWsHost").addEventListener("click", () => addHostEle("ws"))
doc.getElementById("messagePostFormat").addEventListener("selected", (e) => { doc.getElementById("messagePostFormat").addEventListener("selected", (e: CustomEvent) => {
const _config = config || {}; config.ob11.messagePostFormat = e.detail && !isEmpty(e.detail.value) ? e.detail.value : 'array';
_config.messagePostFormat = e.detail && !isEmpty(e.detail.value) ? e.detail.value : 'array'; window.llonebot.setConfig(config);
window.llonebot.setConfig(_config);
}) })
function switchClick(eleId: string, configKey: string, _config=null) { function switchClick(eleId: string, configKey: string, _config=null) {