From df0c6fafbe62afcf1826e6254d210802e444d655 Mon Sep 17 00:00:00 2001 From: Alen Date: Sat, 17 Aug 2024 00:17:51 +0800 Subject: [PATCH 01/14] =?UTF-8?q?fix:=20Uid=E8=BD=ACUin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复设置管理、禁言等数个API失效 对查询企业陌生人信息进行容错 --- src/core/apis/user.ts | 4 ++-- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index 0a0d7d5b..7766fb7b 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -187,9 +187,9 @@ export class NTQQUserApi { //后期改成流水线处理 async getUidByUinV2(Uin: string) { - let uid = (await this.context.session.getProfileService().getUidByUin('FriendsServiceImpl', [Uin])).get(Uin); + let uid = (await this.context.session.getGroupService().getUidByUins([Uin])).uids.get(Uin); if (uid) return uid; - uid = (await this.context.session.getGroupService().getUidByUins([Uin])).uids.get(Uin); + uid = (await this.context.session.getProfileService().getUidByUin('FriendsServiceImpl', [Uin])).get(Uin); if (uid) return uid; uid = (await this.context.session.getUixConvertService().getUid([Uin])).uidInfo.get(Uin); if (uid) return uid; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 611369ed..aea502b7 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -34,7 +34,7 @@ export default class GoCQHTTPGetStrangerInfo extends BaseAction Date: Sat, 17 Aug 2024 14:11:57 +0800 Subject: [PATCH 02/14] Update LICENSE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改License,从法律层面禁止在公共社交媒体宣传 --- LICENSE | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index d159169d..6340ac9d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC Without Social media promotion LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., @@ -111,6 +111,10 @@ above, provided that you also meet all of these conditions: does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + d)You may use this software in accordance with the above terms, + but you are not allowed to promote this project or your projects + based on this project on any public social media. + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in From 5afa2dcdf1be23ca500a1a0dd03c0a4aa7817b2f 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: Sat, 17 Aug 2024 15:37:19 +0800 Subject: [PATCH 03/14] =?UTF-8?q?chore:=20=E5=A4=8D=E6=B4=BB=E8=B5=9B?= =?UTF-8?q?=E6=89=93=E8=B5=A2=E5=95=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5cd5b1e8..419a95ed 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ --- ## To Be Continued -愿我们在更好的开源世界相遇... +当前版本请使用低于27187高于27602的QQ版本运行 ## 项目介绍 NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。 From 8142d3bfebaab7e72ad18d851624d9e6f52f9cae 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: Sat, 17 Aug 2024 18:12:43 +0800 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20=E6=89=93=E9=94=99=E5=95=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 419a95ed..711bebe3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ --- ## To Be Continued -当前版本请使用低于27187高于27602的QQ版本运行 +当前版本请使用低于27187高于26702的QQ版本运行 ## 项目介绍 NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。 From 9676b1d0e9be48db2617b9b6fa87a78753e6802f 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: Sat, 17 Aug 2024 18:13:43 +0800 Subject: [PATCH 05/14] fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 711bebe3..66b20c61 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ --- ## To Be Continued -当前版本请使用低于27187高于26702的QQ版本运行 +当前版本请使用低于27187 (不包含) 高于26702 (包含) 的QQ版本运行 ## 项目介绍 NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。 From 44d6ed5e80b7d6bd58522c5567f7a4cbacc3e9dd Mon Sep 17 00:00:00 2001 From: Alen Date: Sat, 17 Aug 2024 23:15:52 +0800 Subject: [PATCH 06/14] release: v2.0.31 --- manifest.json | 2 +- package.json | 2 +- src/common/framework/napcat.ts | 2 +- src/onebot/action/msg/SendMsg/create-send-elements.ts | 4 ++-- src/onebot/helper/data.ts | 2 +- src/webui/ui/NapCat.ts | 2 +- static/assets/renderer.js | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest.json b/manifest.json index 6117c12d..346ce6dd 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "2.0.30", + "version": "2.0.31", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index f2edc77f..562f688c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "2.0.30", + "version": "2.0.31", "scripts": { "build:framework": "vite build --mode framework", "build:shell": "vite build --mode shell", diff --git a/src/common/framework/napcat.ts b/src/common/framework/napcat.ts index b7e9f807..15320f5b 100644 --- a/src/common/framework/napcat.ts +++ b/src/common/framework/napcat.ts @@ -2,7 +2,7 @@ import path, { dirname } from 'path'; import { fileURLToPath } from 'url'; import fs from 'fs'; -export const napcat_version = '2.0.30'; +export const napcat_version = '2.0.31'; export class NapCatPathWrapper { binaryPath: string; diff --git a/src/onebot/action/msg/SendMsg/create-send-elements.ts b/src/onebot/action/msg/SendMsg/create-send-elements.ts index ef7afb19..fdbde295 100644 --- a/src/onebot/action/msg/SendMsg/create-send-elements.ts +++ b/src/onebot/action/msg/SendMsg/create-send-elements.ts @@ -56,7 +56,7 @@ const _handlers: { if (atQQ === 'all') return SendMsgElementConstructor.at(coreContext, atQQ, atQQ, AtType.atAll, '全体成员'); // then the qq is a group member - // Mlikiowa V2.0.30 Refactor Todo + // Mlikiowa V2.0.31 Refactor Todo const uid = await coreContext.apis.UserApi.getUidByUinV2(`${atQQ}`); if (!uid) throw new Error('Get Uid Error'); return SendMsgElementConstructor.at(coreContext, atQQ, uid, AtType.atUser, ''); @@ -161,7 +161,7 @@ const _handlers: { } else { postData = data; } - // Mlikiowa V2.0.30 Refactor Todo + // Mlikiowa V2.0.31 Refactor Todo const signUrl = obContext.configLoader.configData.musicSignUrl; if (!signUrl) { if (data.type === 'qq') { diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 4a774b1b..c5a28a5b 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -417,7 +417,7 @@ export class OB11Constructor { return; } //log("group msg", msg); - // Mlikiowa V2.0.30 Refactor Todo + // Mlikiowa V2.0.31 Refactor Todo // if (msg.senderUin && msg.senderUin !== '0') { // const member = await getGroupMember(msg.peerUid, msg.senderUin); // if (member && member.cardName !== msg.sendMemberName) { diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts index 5aea211f..3242603b 100644 --- a/src/webui/ui/NapCat.ts +++ b/src/webui/ui/NapCat.ts @@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) { SettingItem( 'Napcat', undefined, - SettingButton('V2.0.30', 'napcat-update-button', 'secondary'), + SettingButton('V2.0.31', 'napcat-update-button', 'secondary'), ), ]), SettingList([ diff --git a/static/assets/renderer.js b/static/assets/renderer.js index c09bdd67..a42d0e9d 100644 --- a/static/assets/renderer.js +++ b/static/assets/renderer.js @@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) { SettingItem( 'Napcat', void 0, - SettingButton("V2.0.30", "napcat-update-button", "secondary") + SettingButton("V2.0.31", "napcat-update-button", "secondary") ) ]), SettingList([ From 7a98025df8411e3528b1d2005f2f5ee1b017969f Mon Sep 17 00:00:00 2001 From: Alen Date: Sun, 18 Aug 2024 01:40:14 +0800 Subject: [PATCH 07/14] =?UTF-8?q?fix:=20=E5=BC=95=E7=94=A8=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 (疑似)旧设备引用消息验证失败 --- src/onebot/helper/data.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index c5a28a5b..359c642d 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -149,6 +149,7 @@ export class OB11Constructor { message_data['type'] = OB11MessageDataType.reply; //log("收到回复消息", element.replyElement); try { + let oldMsgFlag = false; const records = msg.records.find(msgRecord => msgRecord.msgId === element?.replyElement?.sourceMsgIdInRecords); const peer = { chatType: msg.chatType, @@ -163,12 +164,13 @@ export class OB11Constructor { chatType: msg.chatType, }, element.replyElement.replayMsgSeq, 1, true, true)).msgList.find(msg => msg.msgRandom === records.msgRandom); if (!replyMsg || records.msgRandom !== replyMsg.msgRandom) { + if (!replyMsg && records.msgRandom === '0') oldMsgFlag = true; replyMsg = (await NTQQMsgApi.getSingleMsg(peer, element.replyElement.replayMsgSeq)).msgList[0]; } if (msg.peerUin == '284840486') { //合并消息内侧 消息具体定位不到 } - if ((!replyMsg || records.msgRandom !== replyMsg.msgRandom) && msg.peerUin !== '284840486') { + if ((!replyMsg || (records.msgRandom !== replyMsg.msgRandom && !oldMsgFlag || (oldMsgFlag && records.msgSeq !== replyMsg.msgSeq))) && msg.peerUin !== '284840486') { throw new Error('回复消息消息验证失败'); } message_data['data']['id'] = MessageUnique.createMsg({ From 1cc9d501ab5f719b07cb12ba0d204a867136c8ad Mon Sep 17 00:00:00 2001 From: Alen Date: Sun, 18 Aug 2024 14:33:35 +0800 Subject: [PATCH 08/14] =?UTF-8?q?perf:=20API=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化get_group_member_info在查询非群员时的效率 --- src/common/framework/event-legacy.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/framework/event-legacy.ts b/src/common/framework/event-legacy.ts index 136ead80..66092943 100644 --- a/src/common/framework/event-legacy.ts +++ b/src/common/framework/event-legacy.ts @@ -232,6 +232,11 @@ export class LegacyNTEventWrapper { this.createListenerFunction(ListenerMainName); const EventFunc = this.createEventFunction(EventName); retEvent = await EventFunc!(...(args as any[])); + // 120271006: TaskGetGroupMemberList 0x899_EMPTY_RSP_BODY 查找群内不存在的成员返回 + if (typeof retEvent === 'object' && retEvent?.result !== 0) { + clearTimeout(Timeouter); + databack(); + }; }, ); } From a6a3d71155ef51e290f3621df217b94f7ed44f38 Mon Sep 17 00:00:00 2001 From: Alen Date: Sun, 18 Aug 2024 18:49:46 +0800 Subject: [PATCH 09/14] =?UTF-8?q?Revert=20"perf:=20API=E4=BC=98=E5=8C=96"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1cc9d501ab5f719b07cb12ba0d204a867136c8ad. --- src/common/framework/event-legacy.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/common/framework/event-legacy.ts b/src/common/framework/event-legacy.ts index 66092943..136ead80 100644 --- a/src/common/framework/event-legacy.ts +++ b/src/common/framework/event-legacy.ts @@ -232,11 +232,6 @@ export class LegacyNTEventWrapper { this.createListenerFunction(ListenerMainName); const EventFunc = this.createEventFunction(EventName); retEvent = await EventFunc!(...(args as any[])); - // 120271006: TaskGetGroupMemberList 0x899_EMPTY_RSP_BODY 查找群内不存在的成员返回 - if (typeof retEvent === 'object' && retEvent?.result !== 0) { - clearTimeout(Timeouter); - databack(); - }; }, ); } From 5d649b3687e0980767c487a62ec1536518767784 Mon Sep 17 00:00:00 2001 From: Alen Date: Mon, 19 Aug 2024 00:55:32 +0800 Subject: [PATCH 10/14] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96API=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化get_group_member_info效率 --- src/core/apis/group.ts | 39 +++++++++++++++---- src/core/apis/user.ts | 12 ++++-- src/core/entities/group.ts | 3 +- src/core/entities/user.ts | 1 + src/onebot/action/group/GetGroupMemberInfo.ts | 16 -------- src/onebot/helper/data.ts | 2 +- 6 files changed, 44 insertions(+), 29 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index c700b9ee..237df7db 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -253,22 +253,45 @@ export class NTQQGroupApi { } async getGroupMemberV2(GroupCode: string, uid: string, forced = false) { - type ListenerType = NodeIKernelGroupListener['onMemberInfoChange']; + //type ListenerType = NodeIKernelGroupListener['onMemberInfoChange']; type EventType = NodeIKernelGroupService['getMemberInfo']; // NTEventDispatch.CreatListenerFunction('NodeIKernelGroupListener/onGroupMemberInfoUpdate', //return napCatCore.session.getGroupService().getMemberInfo(GroupCode, [uid], forced); - const [, , , _members] = await this.core.eventWrapper.CallNormalEvent + const Listener = this.core.eventWrapper.RegisterListen<(params: any) => void> ( - 'NodeIKernelGroupService/getMemberInfo', 'NodeIKernelGroupListener/onMemberInfoChange', 1, - 5000, - (groupCode: string, changeType: number, members: Map) => { - return groupCode == GroupCode && members.has(uid); + forced ? 5000 : 500, + (params) => { + return params === GroupCode; }, - GroupCode, [uid], forced, ); - return _members.get(uid); + const EventFunc = this.core.eventWrapper.createEventFunction('NodeIKernelGroupService/getMemberInfo'); + const retData = await EventFunc!(GroupCode, [uid], forced); + if (retData.result !== 0) { + throw new Error(`获取群成员信息失败: ${retData.errMsg}`); + } + const result = await Listener as unknown; + let member: GroupMember | undefined; + if (Array.isArray(result) && result?.[2] instanceof Map) { + let members = result[2] as Map; + member = members.get(uid); + }; + return member; + + // 原本的方法: (no_cache 下效率很高, cache 下效率一致) + // const [, , , _members] = await this.core.eventWrapper.CallNormalEvent + // ( + // 'NodeIKernelGroupService/getMemberInfo', + // 'NodeIKernelGroupListener/onMemberInfoChange', + // 1, + // 5000, + // (groupCode: string, changeType: number, members: Map) => { + // return groupCode == GroupCode && members.has(uid); + // }, + // GroupCode, [uid], forced, + // ); + // return _members.get(uid); } async getGroupMembers(groupQQ: string, num = 3000): Promise> { diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index 7766fb7b..f75fc340 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -100,7 +100,7 @@ export class NTQQUserApi { return retData; } - async fetchUserDetailInfo(uid: string) { + async fetchUserDetailInfo(uid: string, mode: UserDetailSource = UserDetailSource.KDB) { type EventService = NodeIKernelProfileService['fetchUserDetailInfo']; type EventListener = NodeIKernelProfileListener['onUserDetailInfoChanged']; const [_retData, profile] = await this.core.eventWrapper.CallNormalEvent( @@ -111,7 +111,7 @@ export class NTQQUserApi { (profile) => profile.uid === uid, 'BuddyProfileStore', [uid], - UserDetailSource.KSERVER, + mode, [ProfileBizType.KALL], ); const RetUser: User = { @@ -121,13 +121,19 @@ export class NTQQUserApi { ...profile.commonExt, ...profile.simpleInfo.baseInfo, qqLevel: profile.commonExt.qqLevel, + age: profile.simpleInfo.baseInfo.age, pendantId: '', }; return RetUser; } async getUserDetailInfo(uid: string) { - return this.fetchUserDetailInfo(uid); + const ret = await this.fetchUserDetailInfo(uid, UserDetailSource.KDB); + if (ret.uin === '0') { + console.log('[NapCat] [Mark] getUserDetailInfo Mode1 Failed.') + return await this.fetchUserDetailInfo(uid, UserDetailSource.KSERVER); + } + return ret; } async modifySelfProfile(param: ModifyProfileParams) { diff --git a/src/core/entities/group.ts b/src/core/entities/group.ts index a4aeea84..b926e1fb 100644 --- a/src/core/entities/group.ts +++ b/src/core/entities/group.ts @@ -1,4 +1,4 @@ -import { QQLevel, Sex } from './user'; +import { QQLevel, Sex, User } from './user'; export enum GroupListUpdateType { REFRESHALL, @@ -65,6 +65,7 @@ export interface GroupMember { uin: string; // QQ号 isRobot: boolean; sex?: Sex; + age?: number; qqLevel?: QQLevel; isChangeRole: boolean; joinTime: string; diff --git a/src/core/entities/user.ts b/src/core/entities/user.ts index 073f0cd8..3eb5a966 100644 --- a/src/core/entities/user.ts +++ b/src/core/entities/user.ts @@ -231,6 +231,7 @@ export interface User { longNick?: string; // 签名 remark?: string; sex?: Sex; + age?: number; qqLevel?: QQLevel; qid?: string; birthday_year?: number; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index a628586c..e3fecfb5 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -38,22 +38,6 @@ class GetGroupMemberInfo extends BaseAction { } const date = Math.round(Date.now() / 1000); const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); - const SelfInfoInGroup = await NTQQGroupApi.getGroupMemberV2(payload.group_id.toString(), this.CoreContext.selfInfo.uid, isNocache); - let isPrivilege = false; - if (SelfInfoInGroup) { - isPrivilege = SelfInfoInGroup.role === 3 || SelfInfoInGroup.role === 4; - } - if (isPrivilege) { - const webGroupMembers = await NTQQWebApi.getGroupMembers(payload.group_id.toString()); - for (let i = 0, len = webGroupMembers.length; i < len; i++) { - if (webGroupMembers[i]?.uin && webGroupMembers[i].uin === retMember.user_id) { - retMember.join_time = webGroupMembers[i]?.join_time; - retMember.last_sent_time = webGroupMembers[i]?.last_speak_time; - retMember.qage = webGroupMembers[i]?.qage; - retMember.level = webGroupMembers[i]?.lv.level.toString(); - } - } - } retMember.last_sent_time = parseInt((await this.CoreContext.apis.GroupApi.getGroupMember(payload.group_id.toString(), retMember.user_id))?.lastSpeakTime || date.toString()); retMember.join_time = parseInt((await this.CoreContext.apis.GroupApi.getGroupMember(payload.group_id.toString(), retMember.user_id))?.joinTime || date.toString()); return retMember; diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 359c642d..b9592b14 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -711,7 +711,7 @@ export class OB11Constructor { nickname: member.nick, card: member.cardName, sex: OB11Constructor.sex(member.sex!), - age: 0, + age: member.age ?? 0, area: '', level: '0', qq_level: member.qqLevel && calcQQLevel(member.qqLevel) || 0, From 698624b4dcde3f067b44dcc7edebd32aecfa4dad Mon Sep 17 00:00:00 2001 From: Alen <33656288+cnxysoft@users.noreply.github.com> Date: Mon, 19 Aug 2024 10:09:53 +0800 Subject: [PATCH 11/14] release: v2.0.32 --- manifest.json | 2 +- package.json | 2 +- src/common/framework/napcat.ts | 2 +- src/onebot/action/msg/SendMsg/create-send-elements.ts | 4 ++-- src/onebot/helper/data.ts | 2 +- src/webui/ui/NapCat.ts | 2 +- static/assets/renderer.js | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest.json b/manifest.json index 346ce6dd..47ee4df0 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "2.0.31", + "version": "2.0.32", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 562f688c..d7228331 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "2.0.31", + "version": "2.0.32", "scripts": { "build:framework": "vite build --mode framework", "build:shell": "vite build --mode shell", diff --git a/src/common/framework/napcat.ts b/src/common/framework/napcat.ts index 15320f5b..1878ee33 100644 --- a/src/common/framework/napcat.ts +++ b/src/common/framework/napcat.ts @@ -2,7 +2,7 @@ import path, { dirname } from 'path'; import { fileURLToPath } from 'url'; import fs from 'fs'; -export const napcat_version = '2.0.31'; +export const napcat_version = '2.0.32'; export class NapCatPathWrapper { binaryPath: string; diff --git a/src/onebot/action/msg/SendMsg/create-send-elements.ts b/src/onebot/action/msg/SendMsg/create-send-elements.ts index fdbde295..1397a2ec 100644 --- a/src/onebot/action/msg/SendMsg/create-send-elements.ts +++ b/src/onebot/action/msg/SendMsg/create-send-elements.ts @@ -56,7 +56,7 @@ const _handlers: { if (atQQ === 'all') return SendMsgElementConstructor.at(coreContext, atQQ, atQQ, AtType.atAll, '全体成员'); // then the qq is a group member - // Mlikiowa V2.0.31 Refactor Todo + // Mlikiowa V2.0.32 Refactor Todo const uid = await coreContext.apis.UserApi.getUidByUinV2(`${atQQ}`); if (!uid) throw new Error('Get Uid Error'); return SendMsgElementConstructor.at(coreContext, atQQ, uid, AtType.atUser, ''); @@ -161,7 +161,7 @@ const _handlers: { } else { postData = data; } - // Mlikiowa V2.0.31 Refactor Todo + // Mlikiowa V2.0.32 Refactor Todo const signUrl = obContext.configLoader.configData.musicSignUrl; if (!signUrl) { if (data.type === 'qq') { diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index b9592b14..915d89a4 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -419,7 +419,7 @@ export class OB11Constructor { return; } //log("group msg", msg); - // Mlikiowa V2.0.31 Refactor Todo + // Mlikiowa V2.0.32 Refactor Todo // if (msg.senderUin && msg.senderUin !== '0') { // const member = await getGroupMember(msg.peerUid, msg.senderUin); // if (member && member.cardName !== msg.sendMemberName) { diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts index 3242603b..ff8597fe 100644 --- a/src/webui/ui/NapCat.ts +++ b/src/webui/ui/NapCat.ts @@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) { SettingItem( 'Napcat', undefined, - SettingButton('V2.0.31', 'napcat-update-button', 'secondary'), + SettingButton('V2.0.32', 'napcat-update-button', 'secondary'), ), ]), SettingList([ diff --git a/static/assets/renderer.js b/static/assets/renderer.js index a42d0e9d..9a9a3358 100644 --- a/static/assets/renderer.js +++ b/static/assets/renderer.js @@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) { SettingItem( 'Napcat', void 0, - SettingButton("V2.0.31", "napcat-update-button", "secondary") + SettingButton("V2.0.32", "napcat-update-button", "secondary") ) ]), SettingList([ From 836eb7b7080bd3a27b56a5ec4c4d489e3f131afc Mon Sep 17 00:00:00 2001 From: Alen <33656288+cnxysoft@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:39:34 +0800 Subject: [PATCH 12/14] =?UTF-8?q?fix:=20=E5=A4=9A=E5=A4=84=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.修复部分Uin转换失败导致的相关API错误 2.继续改进get_group_member_info效率 3.增加fetchUserDetailInfo容错(暂时性/待观察) --- src/core/apis/group.ts | 4 +-- src/core/apis/user.ts | 8 +++--- src/onebot/action/group/GetGroupMemberInfo.ts | 27 ++++++++++--------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 237df7db..be5f920f 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -261,7 +261,7 @@ export class NTQQGroupApi { ( 'NodeIKernelGroupListener/onMemberInfoChange', 1, - forced ? 5000 : 500, + forced ? 5000 : 250, (params) => { return params === GroupCode; }, @@ -269,7 +269,7 @@ export class NTQQGroupApi { const EventFunc = this.core.eventWrapper.createEventFunction('NodeIKernelGroupService/getMemberInfo'); const retData = await EventFunc!(GroupCode, [uid], forced); if (retData.result !== 0) { - throw new Error(`获取群成员信息失败: ${retData.errMsg}`); + throw new Error(`${retData.errMsg}`); } const result = await Listener as unknown; let member: GroupMember | undefined; diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index f75fc340..bf09fd77 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -120,7 +120,7 @@ export class NTQQUserApi { ...profile.simpleInfo.vasInfo, ...profile.commonExt, ...profile.simpleInfo.baseInfo, - qqLevel: profile.commonExt.qqLevel, + qqLevel: profile.commonExt?.qqLevel, age: profile.simpleInfo.baseInfo.age, pendantId: '', }; @@ -130,7 +130,7 @@ export class NTQQUserApi { async getUserDetailInfo(uid: string) { const ret = await this.fetchUserDetailInfo(uid, UserDetailSource.KDB); if (ret.uin === '0') { - console.log('[NapCat] [Mark] getUserDetailInfo Mode1 Failed.') + this.context.logger.logDebug('[NapCat] [Mark] getUserDetailInfo Mode1 Failed.') return await this.fetchUserDetailInfo(uid, UserDetailSource.KSERVER); } return ret; @@ -207,9 +207,9 @@ export class NTQQUserApi { //后期改成流水线处理 async getUinByUidV2(Uid: string) { - let uin = (await this.context.session.getProfileService().getUinByUid('FriendsServiceImpl', [Uid])).get(Uid); + let uin = (await this.context.session.getGroupService().getUinByUids([Uid])).uins.get(Uid); if (uin) return uin; - uin = (await this.context.session.getGroupService().getUinByUids([Uid])).uins.get(Uid); + uin = (await this.context.session.getProfileService().getUinByUid('FriendsServiceImpl', [Uid])).get(Uid); if (uin) return uin; uin = (await this.context.session.getUixConvertService().getUin([Uid])).uinInfo.get(Uid); if (uin) return uin; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index e3fecfb5..0c24f599 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,6 +3,7 @@ import { OB11Constructor } from '../../helper/data'; import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; +import { GroupMember } from '@/core'; const SchemaData = { type: 'object', @@ -23,23 +24,25 @@ class GetGroupMemberInfo extends BaseAction { async _handle(payload: Payload) { const NTQQUserApi = this.CoreContext.apis.UserApi; const NTQQGroupApi = this.CoreContext.apis.GroupApi; - const NTQQWebApi = this.CoreContext.apis.WebApi; const isNocache = typeof payload.no_cache === 'string' ? payload.no_cache === 'true' : !!payload.no_cache; const uid = await NTQQUserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw (`Uin2Uid Error ${payload.user_id}不存在`); - const member = await NTQQGroupApi.getGroupMemberV2(payload.group_id.toString(), uid, isNocache); - if (!member) throw (`群(${payload.group_id})成员${payload.user_id}不存在`); - try { - const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); - this.CoreContext.context.logger.logDebug('群成员详细信息结果', info); - Object.assign(member, info); - } catch (e) { - this.CoreContext.context.logger.logDebug('获取群成员详细信息失败, 只能返回基础信息', e); + const [member, info] = await Promise.allSettled([ + NTQQGroupApi.getGroupMemberV2(payload.group_id.toString(), uid, isNocache), + NTQQUserApi.getUserDetailInfo(uid), + ]); + if (member.status !== 'fulfilled') throw (`群(${payload.group_id})成员${payload.user_id}不存在 ${member.reason}`); + if (info.status === 'fulfilled') { + this.CoreContext.context.logger.logDebug("群成员详细信息结果", info.value); + Object.assign(member, info.value); + } else { + this.CoreContext.context.logger.logDebug(`获取群成员详细信息失败, 只能返回基础信息 ${info.reason}`); } const date = Math.round(Date.now() / 1000); - const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); - retMember.last_sent_time = parseInt((await this.CoreContext.apis.GroupApi.getGroupMember(payload.group_id.toString(), retMember.user_id))?.lastSpeakTime || date.toString()); - retMember.join_time = parseInt((await this.CoreContext.apis.GroupApi.getGroupMember(payload.group_id.toString(), retMember.user_id))?.joinTime || date.toString()); + const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member.value as GroupMember); + const Member = await this.CoreContext.apis.GroupApi.getGroupMember(payload.group_id.toString(), retMember.user_id); + retMember.last_sent_time = parseInt(Member?.lastSpeakTime || date.toString()); + retMember.join_time = parseInt(Member?.joinTime || date.toString()); return retMember; } } From 8d94f24c71ee6634e96731c04e96ad85b9104a4a Mon Sep 17 00:00:00 2001 From: Alen <33656288+cnxysoft@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:43:41 +0800 Subject: [PATCH 13/14] release: v2.0.33 --- manifest.json | 2 +- package.json | 2 +- src/common/framework/napcat.ts | 2 +- src/onebot/action/msg/SendMsg/create-send-elements.ts | 4 ++-- src/onebot/helper/data.ts | 2 +- src/webui/ui/NapCat.ts | 2 +- static/assets/renderer.js | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest.json b/manifest.json index 47ee4df0..1508f73c 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "2.0.32", + "version": "2.0.33", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index d7228331..072bf694 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "2.0.32", + "version": "2.0.33", "scripts": { "build:framework": "vite build --mode framework", "build:shell": "vite build --mode shell", diff --git a/src/common/framework/napcat.ts b/src/common/framework/napcat.ts index 1878ee33..27799126 100644 --- a/src/common/framework/napcat.ts +++ b/src/common/framework/napcat.ts @@ -2,7 +2,7 @@ import path, { dirname } from 'path'; import { fileURLToPath } from 'url'; import fs from 'fs'; -export const napcat_version = '2.0.32'; +export const napcat_version = '2.0.33'; export class NapCatPathWrapper { binaryPath: string; diff --git a/src/onebot/action/msg/SendMsg/create-send-elements.ts b/src/onebot/action/msg/SendMsg/create-send-elements.ts index 1397a2ec..397542e1 100644 --- a/src/onebot/action/msg/SendMsg/create-send-elements.ts +++ b/src/onebot/action/msg/SendMsg/create-send-elements.ts @@ -56,7 +56,7 @@ const _handlers: { if (atQQ === 'all') return SendMsgElementConstructor.at(coreContext, atQQ, atQQ, AtType.atAll, '全体成员'); // then the qq is a group member - // Mlikiowa V2.0.32 Refactor Todo + // Mlikiowa V2.0.33 Refactor Todo const uid = await coreContext.apis.UserApi.getUidByUinV2(`${atQQ}`); if (!uid) throw new Error('Get Uid Error'); return SendMsgElementConstructor.at(coreContext, atQQ, uid, AtType.atUser, ''); @@ -161,7 +161,7 @@ const _handlers: { } else { postData = data; } - // Mlikiowa V2.0.32 Refactor Todo + // Mlikiowa V2.0.33 Refactor Todo const signUrl = obContext.configLoader.configData.musicSignUrl; if (!signUrl) { if (data.type === 'qq') { diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 915d89a4..0ffcd2e1 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -419,7 +419,7 @@ export class OB11Constructor { return; } //log("group msg", msg); - // Mlikiowa V2.0.32 Refactor Todo + // Mlikiowa V2.0.33 Refactor Todo // if (msg.senderUin && msg.senderUin !== '0') { // const member = await getGroupMember(msg.peerUid, msg.senderUin); // if (member && member.cardName !== msg.sendMemberName) { diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts index ff8597fe..db1dc626 100644 --- a/src/webui/ui/NapCat.ts +++ b/src/webui/ui/NapCat.ts @@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) { SettingItem( 'Napcat', undefined, - SettingButton('V2.0.32', 'napcat-update-button', 'secondary'), + SettingButton('V2.0.33', 'napcat-update-button', 'secondary'), ), ]), SettingList([ diff --git a/static/assets/renderer.js b/static/assets/renderer.js index 9a9a3358..6d3a8dac 100644 --- a/static/assets/renderer.js +++ b/static/assets/renderer.js @@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) { SettingItem( 'Napcat', void 0, - SettingButton("V2.0.32", "napcat-update-button", "secondary") + SettingButton("V2.0.33", "napcat-update-button", "secondary") ) ]), SettingList([ From 42b23a6c9cae1d9b22ce9d096a613510f227cf18 Mon Sep 17 00:00:00 2001 From: "Wesley F. Young" Date: Mon, 19 Aug 2024 16:17:33 +0800 Subject: [PATCH 14/14] docs: clarify version range --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66b20c61..6267acc5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ --- ## To Be Continued -当前版本请使用低于27187 (不包含) 高于26702 (包含) 的QQ版本运行 +当前版本请使用内核构建版本(版本号最后的五位数)为 26702 至 26909 的 PC NTQQ 运行。 ## 项目介绍 NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。