From b9a9438bf05a576fca326c42d78fca085cf04726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 23 Mar 2025 16:53:06 +0800 Subject: [PATCH] x --- src/core/apis/msg.ts | 21 +++- .../listeners/NodeIKernelSearchListener.ts | 2 +- src/core/services/NodeIKernelSearchService.ts | 2 +- src/plugin/index.ts | 113 +++++++++++++++++- 4 files changed, 129 insertions(+), 9 deletions(-) diff --git a/src/core/apis/msg.ts b/src/core/apis/msg.ts index 51b67951..f0076ce0 100644 --- a/src/core/apis/msg.ts +++ b/src/core/apis/msg.ts @@ -12,11 +12,29 @@ export class NTQQMsgApi { this.context = context; this.core = core; } - + async clickInlineKeyboardButton(...params: Parameters) { return this.context.session.getMsgService().clickInlineKeyboardButton(...params); } + async searchMsgWithKeywords(keyWords: string[], param: Peer & { searchFields: number, pageLimit: number }) { + let outputSearchId = 0; + return this.core.eventWrapper.callNormalEventV2( + 'NodeIKernelSearchService/searchMsgWithKeywords', + 'NodeIKernelSearchListener/onSearchMsgKeywordsResult', + [keyWords, param], + (searchId) => { + outputSearchId = searchId; + return true; + }, + (event) => { + return event.searchId == outputSearchId; + }, + 1, + 5000 + ); + } + getMsgByClientSeqAndTime(peer: Peer, replyMsgClientSeq: string, replyMsgTime: string) { // https://bot.q.qq.com/wiki/develop/api-v2/openapi/emoji/model.html#EmojiType 可以用过特殊方式拉取 return this.context.session.getMsgService().getMsgByClientSeqAndTime(peer, replyMsgClientSeq, replyMsgTime); @@ -137,7 +155,6 @@ export class NTQQMsgApi { } async queryFirstMsgBySender(peer: Peer, SendersUid: string[]) { - console.log(peer, SendersUid); return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { chatInfo: peer, filterMsgType: [], diff --git a/src/core/listeners/NodeIKernelSearchListener.ts b/src/core/listeners/NodeIKernelSearchListener.ts index e0a34e9d..b1f0fb86 100644 --- a/src/core/listeners/NodeIKernelSearchListener.ts +++ b/src/core/listeners/NodeIKernelSearchListener.ts @@ -96,7 +96,7 @@ export interface NodeIKernelSearchListener { }): any; onSearchMsgKeywordsResult(params: { - searchId: string, + searchId: number, hasMore: boolean, resultItems: Array<{ msgId: string, diff --git a/src/core/services/NodeIKernelSearchService.ts b/src/core/services/NodeIKernelSearchService.ts index 7eda4f8a..6895b399 100644 --- a/src/core/services/NodeIKernelSearchService.ts +++ b/src/core/services/NodeIKernelSearchService.ts @@ -54,7 +54,7 @@ export interface NodeIKernelSearchService { cancelSearchChatMsgs(...args: unknown[]): unknown;// needs 3 arguments - searchMsgWithKeywords(keyWords: string[], param: Peer & { searchFields: number, pageLimit: number }): Promise; + searchMsgWithKeywords(keyWords: string[], param: Peer & { searchFields: number, pageLimit: number }): number; searchMoreMsgWithKeywords(...args: unknown[]): unknown;// needs 1 arguments diff --git a/src/plugin/index.ts b/src/plugin/index.ts index 3ac2a50c..02ffb4ab 100644 --- a/src/plugin/index.ts +++ b/src/plugin/index.ts @@ -1,15 +1,19 @@ import { NapCatOneBot11Adapter, OB11Message, OB11MessageDataType } from '@/onebot'; -import { NapCatCore } from '@/core'; +import { ChatType, NapCatCore } from '@/core'; import { ActionMap } from '@/onebot/action'; import { OB11PluginAdapter } from '@/onebot/network/plugin'; import { MsgData } from '@/core/packet/client/nativeClient'; import { ProtoBufDecode } from 'napcat.protobuf'; import { drawJsonContent } from '@/shell/napcat'; import appidList from "@/core/external/appid.json"; - +import { MessageUnique } from '@/common/message-unique'; +function timestampToDateText(timestamp: string): string { + const date = new Date(+(timestamp + '000')); + return date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }); +} export const plugin_onmessage = async (adapter: string, _core: NapCatCore, _obCtx: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap, instance: OB11PluginAdapter) => { if (typeof message.message === 'string' || !message.raw) return; - if (!message.message.find(e => e.type == 'text' && e.data.text == '#取')) { + if (message.message.find(e => e.type == 'text' && e.data.text == '#取')) { let reply = message.raw.elements.find(e => e.replyElement)?.replyElement?.replayMsgSeq; if (!reply) return; @@ -73,7 +77,106 @@ export const plugin_onmessage = async (adapter: string, _core: NapCatCore, _obCt message: msgList as any }, adapter, instance.config); } - if(!message.message.find(e => e.type == 'text' && e.data.text.startsWith('#谁说过'))){ - + if (message.message.find(e => e.type == 'text' && e.data.text.startsWith('#谁说过'))) { + let text = message.message.find(e => e.type == 'text')?.data.text; + if (!text) return; + let keyWords = text.slice(4); + let search_result = await _core.apis.MsgApi.searchMsgWithKeywords([keyWords], { + chatType: ChatType.KCHATTYPEGROUP, + peerUid: message.group_id?.toString() ?? "", + searchFields: 1, + pageLimit: 20 + }); + type typeinner = typeof search_result[1]['resultItems']; + let msgItems: typeinner = []; + for (let i = 0; i < search_result[1].resultItems.length; i++) { + let data = search_result[1].resultItems[i]; + if (data && data.fieldText.indexOf('#谁说过') === -1) { + msgItems.push(data); + } + } + let item = msgItems.length; + if (item > 0) { + let randomIndex = Math.floor(Math.random() * item); + let msg = msgItems[randomIndex]; + let onebotmsgid = MessageUnique.createUniqueMsgId({ chatType: ChatType.KCHATTYPEGROUP, peerUid: message.group_id?.toString() ?? "" }, msg?.msgId ?? ''); + let msgJson = '关键词是:' + keyWords + '\n'; + for (const msgitem of msgItems) { + msgJson += msgitem.senderNick + ' 在 ' + timestampToDateText(msgitem.msgTime) + ' 也说过哦' + '\n'; + } + msgJson = msgJson.slice(0, -1); + await action.get('send_group_msg')?.handle({ + group_id: String(message.group_id), + message: [{ + type: OB11MessageDataType.reply, + data: { + id: onebotmsgid.toString(), + } + }, + { + type: OB11MessageDataType.text, + data: { + text: '抓到你啦', + } + }, { + type: OB11MessageDataType.image, + data: { + file: await drawJsonContent(msgJson) + } + }] + }, adapter, instance.config); + } + } + if (message.message.find(e => e.type == 'text' && e.data.text.startsWith('#谁经常说'))) { + let text = message.message.find(e => e.type == 'text')?.data.text; + if (!text) return; + let keyWords = text.slice(5); + let search_result = await _core.apis.MsgApi.searchMsgWithKeywords([keyWords], { + chatType: ChatType.KCHATTYPEGROUP, + peerUid: message.group_id?.toString() ?? "", + searchFields: 1, + pageLimit: 500 + }); + type typeinner = typeof search_result[1]['resultItems']; + let msgItems: typeinner = []; + let senderUinMap = new Map(); + for (let i = 0; i < search_result[1].resultItems.length; i++) { + let data = search_result[1].resultItems[i]; + if (data && data.fieldText.indexOf('#谁经常说') === -1) { + senderUinMap.set(data.senderUin, (senderUinMap.get(data.senderUin) ?? 0) + 1); + msgItems.push(data); + } + } + let rank = Array.from(senderUinMap.entries()).sort((a, b) => b[1] - a[1]); + let rankOne = rank[0]; + msgItems = msgItems.filter(e => e.senderUin == rankOne?.[0]); + let item = msgItems.length; + if (item > 0) { + let msgJson = '关键词是:' + keyWords + '\n' + '' + rankOne?.[0] + ' 说过 ' + rankOne?.[1] + ' 次\n'; + for (const msgitem of msgItems) { + msgJson += msgitem.senderNick + ' 说 ' + msgitem.fieldText + '\n'; + } + msgJson = msgJson.slice(0, -1); + await action.get('send_group_msg')?.handle({ + group_id: String(message.group_id), + message: [{ + type: OB11MessageDataType.at, + data: { + qq: rankOne?.[0] ?? message.user_id.toString(), + } + }, + { + type: OB11MessageDataType.text, + data: { + text: ' 抓到你啦', + } + }, { + type: OB11MessageDataType.image, + data: { + file: await drawJsonContent(msgJson) + } + }] + }, adapter, instance.config); + } } }; \ No newline at end of file