From af8cf1882c35d358612b859888fb8406246cf652 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Sun, 17 Mar 2024 15:33:56 +0800 Subject: [PATCH 1/2] refactor: member qq_level --- electron.vite.config.ts | 24 +++++++------- manifest.json | 4 +-- src/common/config.ts | 2 +- src/main/main.ts | 13 ++++++++ src/ntqqapi/api/msg.ts | 4 ++- src/ntqqapi/constructor.ts | 6 ++-- src/ntqqapi/external/ccpoke/index.ts | 28 ++++++++++++++++ .../external/ccpoke/poke-win32-x64.node | Bin 0 -> 65536 bytes src/ntqqapi/hook.ts | 14 ++++++-- src/ntqqapi/ntcall.ts | 1 + src/onebot11/action/GetGroupMemberInfo.ts | 2 ++ src/onebot11/action/SendMsg.ts | 12 +++---- src/onebot11/constructor.ts | 3 +- src/onebot11/event/notice/OB11PokeEvent.ts | 31 ++++++++++++++++++ src/onebot11/types.ts | 4 +++ src/renderer/index.ts | 4 +-- src/version.ts | 2 +- 17 files changed, 122 insertions(+), 32 deletions(-) create mode 100644 src/ntqqapi/external/ccpoke/index.ts create mode 100644 src/ntqqapi/external/ccpoke/poke-win32-x64.node create mode 100644 src/onebot11/event/notice/OB11PokeEvent.ts diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 26525e0..1139273 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -6,7 +6,7 @@ const external = ["silk-wasm", "ws", "module-error", "catering", "node-gyp-build"]; function genCpModule(module: string) { - return { src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false } + return {src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false} } let config = { @@ -16,20 +16,24 @@ let config = { emptyOutDir: true, lib: { formats: ["cjs"], - entry: { "main": "src/main/main.ts" }, + entry: {"main": "src/main/main.ts"}, }, rollupOptions: { external, input: "src/main/main.ts", } }, - resolve:{ + resolve: { alias: { './lib-cov/fluent-ffmpeg': './lib/fluent-ffmpeg' }, }, - plugins: [cp({ targets: [...external.map(genCpModule), - { src: './manifest.json', dest: 'dist' }, {src: './icon.jpg', dest: 'dist' }] + plugins: [cp({ + targets: [ + ...external.map(genCpModule), + {src: './manifest.json', dest: 'dist'}, {src: './icon.jpg', dest: 'dist'}, + {src: './src/ntqqapi/external/ccpoke/poke-win32-x64.node', dest: 'dist/main/ccpoke/'}, + ] })] }, preload: { @@ -39,15 +43,14 @@ let config = { emptyOutDir: true, lib: { formats: ["cjs"], - entry: { "preload": "src/preload.ts" }, + entry: {"preload": "src/preload.ts"}, }, rollupOptions: { // external: externalAll, input: "src/preload.ts", } }, - resolve:{ - } + resolve: {} }, renderer: { // vite config options @@ -56,15 +59,14 @@ let config = { emptyOutDir: true, lib: { formats: ["es"], - entry: { "renderer": "src/renderer/index.ts" }, + entry: {"renderer": "src/renderer/index.ts"}, }, rollupOptions: { // external: externalAll, input: "src/renderer/index.ts", } }, - resolve:{ - } + resolve: {} } } diff --git a/manifest.json b/manifest.json index 9c887d8..c94e72e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { "manifest_version": 4, "type": "extension", - "name": "LLOneBot v3.15.3", + "name": "LLOneBot v3.16.0", "slug": "LLOneBot", "description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新", - "version": "3.15.3", + "version": "3.16.0", "icon": "./icon.jpg", "authors": [ { diff --git a/src/common/config.ts b/src/common/config.ts index 5a7a964..397c77c 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -2,7 +2,7 @@ import fs from "fs"; import {Config, OB11Config} from './types'; import {mergeNewProperties} from "./utils"; -export const HOOK_LOG = true; +export const HOOK_LOG = false; export const ALLOW_SEND_TEMP_MSG = false; diff --git a/src/main/main.ts b/src/main/main.ts index 194c7df..d0f8179 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -37,6 +37,8 @@ import {dbUtil} from "../common/db"; import {setConfig} from "./setConfig"; import {NTQQUserApi} from "../ntqqapi/api/user"; import {NTQQGroupApi} from "../ntqqapi/api/group"; +import {registerPokeHandler} from "../ntqqapi/external/ccpoke"; +import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent"; let running = false; @@ -124,6 +126,16 @@ function onLoad() { } async function startReceiveHook() { + registerPokeHandler((id, isGroup) => { + log(`收到戳一戳消息了!是否群聊:${isGroup},id:${id}`) + let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent; + if (isGroup) { + pokeEvent = new OB11GroupPokeEvent(parseInt(id)); + }else{ + pokeEvent = new OB11FriendPokeEvent(parseInt(id)); + } + postOB11Event(pokeEvent); + }) registerReceiveHook<{ msgList: Array }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], async (payload) => { try { await postReceiveMsg(payload.msgList); @@ -297,6 +309,7 @@ function onLoad() { async function start() { log("llonebot pid", process.pid) + startTime = Date.now(); startReceiveHook().then(); NTQQGroupApi.getGroups(true).then() diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts index 5721d53..edbfa6b 100644 --- a/src/ntqqapi/api/msg.ts +++ b/src/ntqqapi/api/msg.ts @@ -15,7 +15,9 @@ export interface Peer { export class NTQQMsgApi { static async activateGroupChat(groupCode: string) { - return await callNTQQApi({ + // await this.fetchRecentContact(); + // await sleep(500); + return await callNTQQApi({ methodName: NTQQApiMethod.ADD_ACTIVE_CHAT, args: [{peer:{peerUid: groupCode, chatType: ChatType.group}, cnt: 20}] }) diff --git a/src/ntqqapi/constructor.ts b/src/ntqqapi/constructor.ts index 342c437..af6fea1 100644 --- a/src/ntqqapi/constructor.ts +++ b/src/ntqqapi/constructor.ts @@ -59,7 +59,7 @@ export class SendMsgElementConstructor { } } - static async pic(picPath: string): Promise { + static async pic(picPath: string, summary: string = ""): Promise { const {md5, fileName, path, fileSize} = await NTQQFileApi.uploadFile(picPath, ElementType.PIC); if (fileSize === 0) { throw "文件异常,大小为0"; @@ -78,7 +78,7 @@ export class SendMsgElementConstructor { fileUuid: "", fileSubId: "", thumbFileSize: 0, - summary: "", + summary, }; return { @@ -136,7 +136,7 @@ export class SendMsgElementConstructor { folder: thumb, size: videoInfo.width + "x" + videoInfo.height }).on("end", () => { - resolve(pathLib.join(thumb, thumbFileName)); + resolve(pathLib.join(thumb, thumbFileName)); }); }) let thumbPath = new Map() diff --git a/src/ntqqapi/external/ccpoke/index.ts b/src/ntqqapi/external/ccpoke/index.ts new file mode 100644 index 0000000..22f82d1 --- /dev/null +++ b/src/ntqqapi/external/ccpoke/index.ts @@ -0,0 +1,28 @@ +import {log} from "../../../common/utils"; + +let pokeEngine: any = null + +type PokeHandler = (id: string, isGroup: boolean)=>void + +let pokeRecords: Record = {} +export function registerPokeHandler(handler: PokeHandler){ + if(!pokeEngine){ + try { + pokeEngine = require("./ccpoke/poke-win32-x64.node") + pokeEngine.performHooks(); + }catch (e) { + log("戳一戳引擎加载失败", e) + return + } + } + pokeEngine.setHandlerForPokeHook((id: string, isGroup: boolean)=>{ + let existTime = pokeRecords[id] + if (existTime){ + if (Date.now() - existTime < 1500){ + return + } + } + pokeRecords[id] = Date.now() + handler(id, isGroup); + }) +} \ No newline at end of file diff --git a/src/ntqqapi/external/ccpoke/poke-win32-x64.node b/src/ntqqapi/external/ccpoke/poke-win32-x64.node new file mode 100644 index 0000000000000000000000000000000000000000..581f88e019bbc3707900170a9f75f8b38050f8ab GIT binary patch literal 65536 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 { + activatedGroups.push(group.groupCode); + // log(`激活群聊天窗口${group.groupName}(${group.groupCode})`, r) + // if (r.result !== 0) { + // setTimeout(() => NTQQMsgApi.activateGroupChat(group.groupCode).then(r => log(`再次激活群聊天窗口${group.groupName}(${group.groupCode})`, r)), 500); + // }else { + // } + }).catch(log) + } let existGroup = groups.find(g => g.groupCode == group.groupCode); if (existGroup) { Object.assign(existGroup, group); diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index b886459..98bc0c3 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -17,6 +17,7 @@ export enum NTQQApiClass { export enum NTQQApiMethod { RECENT_CONTACT = "nodeIKernelRecentContactService/fetchAndSubscribeABatchOfRecentContact", ADD_ACTIVE_CHAT = "nodeIKernelMsgService/getAioFirstViewLatestMsgsAndAddActiveChat", // 激活群助手内的聊天窗口,这样才能收到消息 + ADD_ACTIVE_CHAT_2 = "nodeIKernelMsgService/getMsgsIncludeSelfAndAddActiveChat", LIKE_FRIEND = "nodeIKernelProfileLikeService/setBuddyProfileLike", SELF_INFO = "fetchAuthData", FRIENDS = "nodeIKernelBuddyService/getBuddyList", diff --git a/src/onebot11/action/GetGroupMemberInfo.ts b/src/onebot11/action/GetGroupMemberInfo.ts index 9e43e4c..a4bcfda 100644 --- a/src/onebot11/action/GetGroupMemberInfo.ts +++ b/src/onebot11/action/GetGroupMemberInfo.ts @@ -19,7 +19,9 @@ class GetGroupMemberInfo extends BaseAction { const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()) if (member) { if (isNull(member.sex)){ + log("获取群成员详细信息") let info = (await NTQQUserApi.getUserDetailInfo(member.uid)) + log("群成员详细信息结果", info) Object.assign(member, info); } return OB11Constructor.groupMember(payload.group_id.toString(), member) diff --git a/src/onebot11/action/SendMsg.ts b/src/onebot11/action/SendMsg.ts index 1784640..5375d21 100644 --- a/src/onebot11/action/SendMsg.ts +++ b/src/onebot11/action/SendMsg.ts @@ -417,20 +417,16 @@ export class SendMsg extends BaseAction { if (!isLocal) { // 只删除http和base64转过来的文件 deleteAfterSentFiles.push(path) } - const constructorMap = { - [OB11MessageDataType.image]: SendMsgElementConstructor.pic, - [OB11MessageDataType.voice]: SendMsgElementConstructor.ptt, - [OB11MessageDataType.video]: SendMsgElementConstructor.video, - [OB11MessageDataType.file]: SendMsgElementConstructor.file, - } if (sendMsg.type === OB11MessageDataType.file) { log("发送文件", path, payloadFileName || fileName) sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName)); } else if (sendMsg.type === OB11MessageDataType.video) { log("发送视频", path, payloadFileName || fileName) sendElements.push(await SendMsgElementConstructor.video(path, payloadFileName || fileName)); - } else { - sendElements.push(await constructorMap[sendMsg.type](path)); + } else if (sendMsg.type === OB11MessageDataType.voice) { + sendElements.push(await SendMsgElementConstructor.ptt(path)); + }else if (sendMsg.type === OB11MessageDataType.image) { + sendElements.push(await SendMsgElementConstructor.pic(path, sendMsg.data.summary || "")); } } } diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 8aff3b0..760381f 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -344,7 +344,8 @@ export class OB11Constructor { sex: OB11Constructor.sex(member.sex), age: 0, area: "", - level: member.qqLevel && calcQQLevel(member.qqLevel) || 0, + level: 0, + qq_level: member.qqLevel && calcQQLevel(member.qqLevel) || 0, join_time: 0, // 暂时没法获取 last_sent_time: 0, // 暂时没法获取 title_expire_time: 0, diff --git a/src/onebot11/event/notice/OB11PokeEvent.ts b/src/onebot11/event/notice/OB11PokeEvent.ts new file mode 100644 index 0000000..0c81a96 --- /dev/null +++ b/src/onebot11/event/notice/OB11PokeEvent.ts @@ -0,0 +1,31 @@ +import {OB11BaseNoticeEvent} from "./OB11BaseNoticeEvent"; +import {selfInfo} from "../../../common/data"; +import {OB11BaseEvent} from "../OB11BaseEvent"; + +class OB11PokeEvent extends OB11BaseNoticeEvent{ + notice_type = "notify" + sub_type = "poke" + target_id = parseInt(selfInfo.uin) + user_id: number + +} + +export class OB11FriendPokeEvent extends OB11PokeEvent{ + sender_id: number + constructor(user_id: number) { + super(); + this.user_id = user_id; + this.sender_id = user_id; + } +} + +export class OB11GroupPokeEvent extends OB11PokeEvent{ + group_id: number + + constructor(group_id: number, user_id: number=0) { + super(); + this.group_id = group_id; + this.target_id = user_id; + this.user_id = user_id; + } +} diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts index ed47253..2d73435 100644 --- a/src/onebot11/types.ts +++ b/src/onebot11/types.ts @@ -29,6 +29,7 @@ export interface OB11GroupMember { join_time?: number last_sent_time?: number level?: number + qq_level?: number role?: OB11GroupMemberRole title?: string area?: string @@ -121,6 +122,9 @@ interface OB11MessageFileBase { export interface OB11MessageImage extends OB11MessageFileBase { type: OB11MessageDataType.image + data: OB11MessageFileBase['data'] & { + summary ? : string; // 图片摘要 + } } export interface OB11MessageRecord extends OB11MessageFileBase { diff --git a/src/renderer/index.ts b/src/renderer/index.ts index af26786..9399099 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -90,8 +90,8 @@ async function onSettingWindowCreated(view: Element) { ], 'ob11.messagePostFormat', config.ob11.messagePostFormat), ), SettingItem( - 'ffmpeg 路径,发送语音、视频需要,同时保证ffprobe和ffmpeg在一起', `配置可参考 官方文档 路径:${!isEmpty(config.ffmpeg) ? config.ffmpeg : '未指定'}`, - SettingButton('选择', 'config-ffmpeg-select'), + 'ffmpeg 路径,发送语音、视频需要,同时保证ffprobe和ffmpeg在一起', ` 下载地址 , 路径:${!isEmpty(config.ffmpeg) ? config.ffmpeg : '未指定'}`, + SettingButton('选择ffmpeg', 'config-ffmpeg-select'), ), SettingItem( '', null, diff --git a/src/version.ts b/src/version.ts index 3a60d3f..93bafb5 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = "3.15.3" \ No newline at end of file +export const version = "3.16.0" \ No newline at end of file From 9209ae766c5c03e76e81a51e3abd2654fceebafa Mon Sep 17 00:00:00 2001 From: linyuchen Date: Mon, 18 Mar 2024 09:49:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=8E=A5=E6=94=B6=E6=88=B3?= =?UTF-8?q?=E4=B8=80=E6=88=B3=E5=BC=80=E5=85=B3=20feat:=20message=5Fsent?= =?UTF-8?q?=20=E4=BA=8B=E4=BB=B6=E6=B7=BB=E5=8A=A0=20target=5Fid=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20feat:=20=E5=9B=9E=E5=A4=8D=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/config.ts | 1 + src/common/db.ts | 15 ++++++++++++- src/common/types.ts | 1 + src/main/main.ts | 40 ++++++++++++++++++++++++---------- src/ntqqapi/hook.ts | 22 +++++++++++++++++-- src/onebot11/action/SendMsg.ts | 11 ++++++++-- src/onebot11/types.ts | 1 + src/renderer/index.ts | 5 +++++ src/version.ts | 2 +- 9 files changed, 80 insertions(+), 18 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index 397c77c..16c854b 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -44,6 +44,7 @@ export class ConfigUtil { reportSelfMessage: false, autoDeleteFile: false, autoDeleteFileSecond: 60, + enablePoke: false }; if (!fs.existsSync(this.configPath)) { diff --git a/src/common/db.ts b/src/common/db.ts index de84003..3da7967 100644 --- a/src/common/db.ts +++ b/src/common/db.ts @@ -4,6 +4,7 @@ import {DATA_DIR, log} from "./utils"; import {selfInfo} from "./data"; import {FileCache} from "./types"; +type ReceiveTempUinMap = Record; class DBUtil { public readonly DB_KEY_PREFIX_MSG_ID = "msg_id_"; @@ -11,8 +12,9 @@ class DBUtil { public readonly DB_KEY_PREFIX_MSG_SEQ_ID = "msg_seq_id_"; public readonly DB_KEY_PREFIX_FILE = "file_"; public readonly DB_KEY_PREFIX_GROUP_NOTIFY = "group_notify_"; + private readonly DB_KEY_RECEIVED_TEMP_UIN_MAP = "received_temp_uin_map"; public db: Level; - public cache: Record = {} // : RawMessage + public cache: Record = {} // : RawMessage private currentShortId: number; /* @@ -67,6 +69,17 @@ class DBUtil { }, expiredMilliSecond) } + public async getReceivedTempUinMap(): Promise { + try{ + this.cache[this.DB_KEY_RECEIVED_TEMP_UIN_MAP] = JSON.parse(await this.db.get(this.DB_KEY_RECEIVED_TEMP_UIN_MAP)); + }catch (e) { + } + return (this.cache[this.DB_KEY_RECEIVED_TEMP_UIN_MAP] || {}) as ReceiveTempUinMap; + } + public setReceivedTempUinMap(data: ReceiveTempUinMap) { + this.cache[this.DB_KEY_RECEIVED_TEMP_UIN_MAP] = data; + this.db.put(this.DB_KEY_RECEIVED_TEMP_UIN_MAP, JSON.stringify(data)).then(); + } private addCache(msg: RawMessage) { const longIdKey = this.DB_KEY_PREFIX_MSG_ID + msg.msgId const shortIdKey = this.DB_KEY_PREFIX_MSG_SHORT_ID + msg.msgShortId diff --git a/src/common/types.ts b/src/common/types.ts index f7a7a71..6e07d91 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -21,6 +21,7 @@ export interface Config { autoDeleteFile?: boolean autoDeleteFileSecond?: number ffmpeg?: string // ffmpeg路径 + enablePoke?: boolean } export interface LLOneBotError { diff --git a/src/main/main.ts b/src/main/main.ts index d0f8179..e96a222 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -19,7 +19,7 @@ import { getGroupMember, llonebotError, refreshGroupMembers, - selfInfo + selfInfo, uidMaps } from "../common/data"; import {hookNTQQApiCall, hookNTQQApiReceive, ReceiveCmdS, registerReceiveHook} from "../ntqqapi/hook"; import {OB11Constructor} from "../onebot11/constructor"; @@ -108,11 +108,18 @@ function onLoad() { OB11Constructor.message(message).then((msg) => { if (debug) { msg.raw = message; + } else { + if (msg.message.length === 0) { + return + } } const isSelfMsg = msg.user_id.toString() == selfInfo.uin if (isSelfMsg && !reportSelfMessage) { return } + if (isSelfMsg) { + msg.target_id = parseInt(message.peerUin); + } postOB11Event(msg); // log("post msg", msg) }).catch(e => log("constructMessage error: ", e.stack.toString())); @@ -126,17 +133,21 @@ function onLoad() { } async function startReceiveHook() { - registerPokeHandler((id, isGroup) => { - log(`收到戳一戳消息了!是否群聊:${isGroup},id:${id}`) - let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent; - if (isGroup) { - pokeEvent = new OB11GroupPokeEvent(parseInt(id)); - }else{ - pokeEvent = new OB11FriendPokeEvent(parseInt(id)); - } - postOB11Event(pokeEvent); - }) - registerReceiveHook<{ msgList: Array }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], async (payload) => { + if (getConfigUtil().getConfig().enablePoke) { + registerPokeHandler((id, isGroup) => { + log(`收到戳一戳消息了!是否群聊:${isGroup},id:${id}`) + let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent; + if (isGroup) { + pokeEvent = new OB11GroupPokeEvent(parseInt(id)); + } else { + pokeEvent = new OB11FriendPokeEvent(parseInt(id)); + } + postOB11Event(pokeEvent); + }) + } + registerReceiveHook<{ + msgList: Array + }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], async (payload) => { try { await postReceiveMsg(payload.msgList); } catch (e) { @@ -311,6 +322,11 @@ function onLoad() { log("llonebot pid", process.pid) startTime = Date.now(); + dbUtil.getReceivedTempUinMap().then(m=>{ + for (const [key, value] of Object.entries(m)) { + uidMaps[value] = key; + } + }) startReceiveHook().then(); NTQQGroupApi.getGroups(true).then() const config = getConfigUtil().getConfig() diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index f2045f0..574adea 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -3,7 +3,7 @@ import {getConfigUtil, log, sleep} from "../common/utils"; import {NTQQApiClass} from "./ntcall"; import {NTQQMsgApi, sendMessagePool} from "./api/msg" import {ChatType, Group, RawMessage, User} from "./types"; -import {friends, groups, selfInfo, tempGroupCodeMap} from "../common/data"; +import {friends, groups, receivedTempUinMap, selfInfo, tempGroupCodeMap, uidMaps} from "../common/data"; import {OB11GroupDecreaseEvent} from "../onebot11/event/notice/OB11GroupDecreaseEvent"; import {v4 as uuidv4} from "uuid" import {postOB11Event} from "../onebot11/server/postOB11Event"; @@ -249,8 +249,26 @@ registerReceiveHook<{ } }) -// 新消息 registerReceiveHook<{ msgList: Array }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], (payload) => { + // 保存一下uid + for (const message of payload.msgList) { + const uid = message.senderUid; + const uin = message.senderUin; + if (uid && uin) { + if (message.chatType === ChatType.temp){ + dbUtil.getReceivedTempUinMap().then(receivedTempUinMap=>{ + if (!receivedTempUinMap[uin]){ + receivedTempUinMap[uin] = uid; + dbUtil.setReceivedTempUinMap(receivedTempUinMap) + } + }) + } + uidMaps[uid] = uin; + } + } + + + // 自动清理新消息文件 const {autoDeleteFile} = getConfigUtil().getConfig(); if (!autoDeleteFile) { return diff --git a/src/onebot11/action/SendMsg.ts b/src/onebot11/action/SendMsg.ts index 5375d21..52145f3 100644 --- a/src/onebot11/action/SendMsg.ts +++ b/src/onebot11/action/SendMsg.ts @@ -7,7 +7,14 @@ import { SendArkElement, SendMessageElement } from "../../ntqqapi/types"; -import {friends, getFriend, getGroup, getGroupMember, getUidByUin, selfInfo,} from "../../common/data"; +import { + friends, + getFriend, + getGroup, + getGroupMember, + getUidByUin, + selfInfo, +} from "../../common/data"; import { OB11MessageCustomMusic, OB11MessageData, @@ -87,7 +94,7 @@ export class SendMsg extends BaseAction { } if (payload.user_id && payload.message_type !== "group") { if (!(await getFriend(payload.user_id))) { - if (!ALLOW_SEND_TEMP_MSG) { + if (!ALLOW_SEND_TEMP_MSG && !(await dbUtil.getReceivedTempUinMap())[payload.user_id.toString()]) { return { valid: false, message: `不能发送临时消息` diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts index 2d73435..b8db420 100644 --- a/src/onebot11/types.ts +++ b/src/onebot11/types.ts @@ -65,6 +65,7 @@ export enum OB11MessageType { } export interface OB11Message { + target_id?: number; // 自己发送的消息才有此字段 self_id?: number, time: number, message_id: number, diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 9399099..c16f12b 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -99,6 +99,11 @@ async function onSettingWindowCreated(view: Element) { ) ]), SettingList([ + SettingItem( + '接收戳一戳消息, 暂时只支持Windows版的LLOneBot', + `重启QQ后生效,如果导致QQ崩溃请勿开启此项`, + SettingSwitch('enablePoke', config.enablePoke), + ), SettingItem( '使用 Base64 编码获取文件', '开启后,调用 /get_image、/get_record 时,获取不到 url 时添加一个 Base64 字段', diff --git a/src/version.ts b/src/version.ts index 93bafb5..42fc3ff 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = "3.16.0" \ No newline at end of file +export const version = "3.16.1" \ No newline at end of file