From c1f5c5cd58e519a623b207f88d266f36587ead73 Mon Sep 17 00:00:00 2001 From: idranme Date: Sun, 25 Aug 2024 20:00:13 +0800 Subject: [PATCH 1/2] fix --- package.json | 4 +- src/common/config.ts | 2 - src/common/data.ts | 25 +---- src/common/types.ts | 2 + src/ntqqapi/api/friend.ts | 10 +- src/ntqqapi/api/user.ts | 18 +-- src/ntqqapi/hook.ts | 130 +--------------------- src/onebot11/action/user/GetFriendList.ts | 16 +-- 8 files changed, 21 insertions(+), 186 deletions(-) diff --git a/package.json b/package.json index 7e73a1d..9c88a95 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "fast-xml-parser": "^4.4.1", "file-type": "^19.4.1", "fluent-ffmpeg": "^2.1.3", - "minato": "^3.5.0", + "minato": "^3.5.1", "silk-wasm": "^3.6.1", "ws": "^8.18.0" }, @@ -41,5 +41,5 @@ "vite": "^5.4.2", "vite-plugin-cp": "^4.0.8" }, - "packageManager": "yarn@4.4.0" + "packageManager": "yarn@4.4.1" } diff --git a/src/common/config.ts b/src/common/config.ts index df571ff..58833b6 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -5,8 +5,6 @@ import path from 'node:path' import { getSelfUin } from './data' import { DATA_DIR } from './utils' -//export const HOOK_LOG = false - export class ConfigUtil { private readonly configPath: string private config: Config | null = null diff --git a/src/common/data.ts b/src/common/data.ts index 06aa569..2138cbf 100644 --- a/src/common/data.ts +++ b/src/common/data.ts @@ -1,45 +1,24 @@ import { - type Friend, type GroupMember, type SelfInfo, } from '../ntqqapi/types' import { type LLOneBotError } from './types' import { NTQQGroupApi } from '../ntqqapi/api/group' -import { log } from './utils/log' import { isNumeric } from './utils/helper' -import { NTQQFriendApi, NTQQUserApi } from '../ntqqapi/api' +import { NTQQUserApi } from '../ntqqapi/api' import { RawMessage } from '../ntqqapi/types' import { getConfigUtil } from './config' -import { getBuildVersion } from './utils/QQBasicInfo' -export let friends: Friend[] = [] export const llonebotError: LLOneBotError = { ffmpegError: '', httpServerError: '', wsServerError: '', otherError: 'LLOneBot 未能正常启动,请检查日志查看错误', } + // 群号 -> 群成员map(uid=>GroupMember) export const groupMembers: Map> = new Map>() -export async function getFriend(uinOrUid: string): Promise { - const filterKey: 'uin' | 'uid' = isNumeric(uinOrUid.toString()) ? 'uin' : 'uid' - const filterValue = uinOrUid - let friend = friends.find((friend) => friend[filterKey] === filterValue.toString()) - if (!friend && getBuildVersion() < 26702) { - try { - const _friends = await NTQQFriendApi.getFriends(true) - friend = _friends.find((friend) => friend[filterKey] === filterValue.toString()) - if (friend) { - friends.push(friend) - } - } catch (e: any) { - log('刷新好友列表失败', e.stack.toString()) - } - } - return friend -} - export async function getGroupMember(groupCode: string | number, memberUinOrUid: string | number) { const groupCodeStr = groupCode.toString() const memberUinOrUidStr = memberUinOrUid.toString() diff --git a/src/common/types.ts b/src/common/types.ts index 94987de..eef438a 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -12,10 +12,12 @@ export interface OB11Config { enableHttpHeart?: boolean enableQOAutoQuote: boolean // 快速操作回复自动引用原消息 } + export interface CheckVersion { result: boolean version: string } + export interface Config { enableLLOB: boolean ob11: OB11Config diff --git a/src/ntqqapi/api/friend.ts b/src/ntqqapi/api/friend.ts index 2af8916..74972fd 100644 --- a/src/ntqqapi/api/friend.ts +++ b/src/ntqqapi/api/friend.ts @@ -18,14 +18,14 @@ export class NTQQFriendApi { buddyList: Friend[] }[] }>({ - methodName: NTMethod.FRIENDS, - args: [{ force_update: forced }, undefined], + className: NTClass.NODE_STORE_API, + methodName: 'getBuddyList', cbCmd: ReceiveCmdS.FRIENDS, afterFirstCmd: false, }) - let _friends: Friend[] = [] - for (const fData of data.data) { - _friends.push(...fData.buddyList) + const _friends: Friend[] = [] + for (const item of data.data) { + _friends.push(...item.buddyList) } return _friends } diff --git a/src/ntqqapi/api/user.ts b/src/ntqqapi/api/user.ts index abda975..f977cd5 100644 --- a/src/ntqqapi/api/user.ts +++ b/src/ntqqapi/api/user.ts @@ -1,7 +1,7 @@ import { invoke, NTMethod } from '../ntcall' import { GeneralCallResult } from '../services' import { User, UserDetailInfoByUin, UserDetailInfoByUinV2, UserDetailInfoListenerArg } from '../types' -import { friends, groupMembers, getSelfUin } from '@/common/data' +import { groupMembers, getSelfUin } from '@/common/data' import { CacheClassFuncAsync, getBuildVersion } from '@/common/utils' import { getSession } from '@/ntqqapi/wrapper' import { RequestUtil } from '@/common/utils/request' @@ -177,14 +177,6 @@ export class NTQQUserApi { const session = getSession() // 通用转换开始尝试 let uid = (await session?.getUixConvertService().getUid([Uin]))?.uidInfo.get(Uin) - // Uid 好友转 - if (!uid) { - friends.forEach((t) => { - if (t.uin == Uin) { - uid = t.uid - } - }) - } //Uid 群友列表转 if (!uid) { for (let groupMembersList of groupMembers.values()) { @@ -289,14 +281,6 @@ export class NTQQUserApi { [Uid] ) let uin = ret.uinInfo.get(Uid) - if (!uin) { - //从Buddy缓存获取Uin - friends.forEach((t) => { - if (t.uid == Uid) { - uin = t.uin - } - }) - } if (!uin) { uin = (await NTQQUserApi.getUserDetailInfo(Uid)).uin //从QQ Native 转换 } diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index 46a6b80..2a50649 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -1,17 +1,16 @@ import type { BrowserWindow } from 'electron' import { NTClass, NTMethod } from './ntcall' -import { NTQQMsgApi } from './api/msg' +import { NTQQMsgApi, NTQQFriendApi } from './api' import { CategoryFriend, ChatType, GroupMember, GroupMemberRole, RawMessage, - SimpleInfo, User, + SimpleInfo, + User } from './types' import { - friends, - getFriend, getGroupMember, setSelfInfo } from '@/common/data' @@ -224,116 +223,7 @@ export function removeReceiveHook(id: string) { receiveHooks.splice(index, 1) } -//let activatedGroups: string[] = [] - -/*async function updateGroups(_groups: Group[], needUpdate: boolean = true) { - for (let group of _groups) { - log('update group', group.groupCode) - if (group.privilegeFlag === 0) { - deleteGroup(group.groupCode) - continue - } - //log('update group', group) - NTQQMsgApi.activateChat({ peerUid: group.groupCode, chatType: ChatType.group }).then().catch(log) - let existGroup = groups.find((g) => g.groupCode == group.groupCode) - if (existGroup) { - Object.assign(existGroup, group) - } else { - groups.push(group) - existGroup = group - } - - if (needUpdate) { - const members = await NTQQGroupApi.getGroupMembers(group.groupCode) - - if (members) { - existGroup.members = Array.from(members.values()) - } - } - } -}*/ - -/*async function processGroupEvent(payload: { groupList: Group[] }) { - try { - const newGroupList = payload.groupList - for (const group of newGroupList) { - let existGroup = groups.find((g) => g.groupCode == group.groupCode) - if (existGroup) { - if (existGroup.memberCount > group.memberCount) { - log(`群(${group.groupCode})成员数量减少${existGroup.memberCount} -> ${group.memberCount}`) - const oldMembers = existGroup.members - - await sleep(200) // 如果请求QQ API的速度过快,通常无法正确拉取到最新的群信息,因此这里人为引入一个延时 - const newMembers = await NTQQGroupApi.getGroupMembers(group.groupCode) - - group.members = Array.from(newMembers.values()) - const newMembersSet = new Set() // 建立索引降低时间复杂度 - - for (const member of newMembers) { - newMembersSet.add(member[1].uin) - } - - // 判断bot是否是管理员,如果是管理员不需要从这里得知有人退群,这里的退群无法得知是主动退群还是被踢 - const selfUin = getSelfUin() - const bot = await getGroupMember(group.groupCode, selfUin) - if (bot?.role == GroupMemberRole.admin || bot?.role == GroupMemberRole.owner) { - continue - } - for (const member of oldMembers) { - if (!newMembersSet.has(member.uin) && member.uin != selfUin) { - postOb11Event( - new OB11GroupDecreaseEvent( - parseInt(group.groupCode), - parseInt(member.uin), - parseInt(member.uin), - 'leave', - ), - ) - break - } - } - } - if (group.privilegeFlag === 0) { - deleteGroup(group.groupCode) - } - } - } - - updateGroups(newGroupList, false).then() - } catch (e: any) { - updateGroups(payload.groupList).then() - log('更新群信息错误', e.stack.toString()) - } -}*/ - export async function startHook() { - - // 群列表变动 - /*registerReceiveHook<{ groupList: Group[]; updateType: number }>(ReceiveCmdS.GROUPS, (payload) => { - // updateType 3是群列表变动,2是群成员变动 - // log("群列表变动", payload.updateType, payload.groupList) - if (payload.updateType != 2) { - updateGroups(payload.groupList).then() - } - else { - if (process.platform == 'win32') { - processGroupEvent(payload).then() - } - } - }) - registerReceiveHook<{ groupList: Group[]; updateType: number }>(ReceiveCmdS.GROUPS_STORE, (payload) => { - // updateType 3是群列表变动,2是群成员变动 - // log("群列表变动, store", payload.updateType, payload.groupList) - if (payload.updateType != 2) { - updateGroups(payload.groupList).then() - } - else { - if (process.platform != 'win32') { - processGroupEvent(payload).then() - } - } - })*/ - registerReceiveHook<{ groupCode: string dataSource: number @@ -402,13 +292,6 @@ export async function startHook() { log('好友列表变动', friendList.length) for (let friend of friendList) { NTQQMsgApi.activateChat({ peerUid: friend.uid, chatType: ChatType.friend }).then() - let existFriend = friends.find((f) => f.uin == friend.uin) - if (!existFriend) { - friends.push(friend) - } - else { - Object.assign(existFriend, friend) - } } }) @@ -506,11 +389,8 @@ export async function startHook() { if (isNumeric(peerUid)) { chatType = ChatType.group } - else { - // 检查是否好友 - if (!(await getFriend(peerUid))) { - chatType = ChatType.temp - } + else if (!(await NTQQFriendApi.isBuddy(peerUid))) { + chatType = ChatType.temp } const peer = { peerUid, chatType } await sleep(1000) diff --git a/src/onebot11/action/user/GetFriendList.ts b/src/onebot11/action/user/GetFriendList.ts index 8025153..963fe39 100644 --- a/src/onebot11/action/user/GetFriendList.ts +++ b/src/onebot11/action/user/GetFriendList.ts @@ -1,7 +1,6 @@ import BaseAction from '../BaseAction' import { OB11User } from '../../types' import { OB11Constructor } from '../../constructor' -import { friends } from '@/common/data' import { ActionName } from '../types' import { NTQQFriendApi } from '@/ntqqapi/api' import { getBuildVersion } from '@/common/utils/QQBasicInfo' @@ -14,24 +13,17 @@ export class GetFriendList extends BaseAction { actionName = ActionName.GetFriendList protected async _handle(payload: Payload) { + const refresh = payload?.no_cache === true || payload?.no_cache === 'true' if (getBuildVersion() >= 26702) { - return OB11Constructor.friendsV2(await NTQQFriendApi.getBuddyV2(payload?.no_cache === true || payload?.no_cache === 'true')) + return OB11Constructor.friendsV2(await NTQQFriendApi.getBuddyV2(refresh)) } - if (friends.length === 0 || payload?.no_cache === true || payload?.no_cache === 'true') { - const _friends = await NTQQFriendApi.getFriends(true) - // log('强制刷新好友列表,结果: ', _friends) - if (_friends.length > 0) { - friends.length = 0 - friends.push(..._friends) - } - } - return OB11Constructor.friends(friends) + return OB11Constructor.friends(await NTQQFriendApi.getFriends(refresh)) } } // extend export class GetFriendWithCategory extends BaseAction { - actionName = ActionName.GetFriendsWithCategory; + actionName = ActionName.GetFriendsWithCategory protected async _handle(payload: void) { if (getBuildVersion() >= 26702) { From afe8392a1e1ee9ee0cad76e0df4bf517cffe7abd Mon Sep 17 00:00:00 2001 From: idranme Date: Sun, 25 Aug 2024 23:07:33 +0800 Subject: [PATCH 2/2] chore: v3.30.5 --- README.md | 2 +- manifest.json | 2 +- src/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 353dbc7..ff0dd0b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ LiteLoaderQQNT 插件,实现 OneBot 11 协议,用于 QQ 机器人开发 > [!CAUTION]\ > **请不要在 QQ 官方群聊和任何影响力较大的简中互联网平台(包括但不限于: 哔哩哔哩,微博,知乎,抖音等)发布和讨论*任何*与本插件存在相关性的信息** -TG群: +TG 群: ## 安装方法 diff --git a/manifest.json b/manifest.json index 4995710..3b4ad50 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "LLOneBot", "slug": "LLOneBot", "description": "实现 OneBot 11 协议,用于 QQ 机器人开发", - "version": "3.30.4", + "version": "3.30.5", "icon": "./icon.webp", "authors": [ { diff --git a/src/version.ts b/src/version.ts index 7599ff0..89f3993 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '3.30.4' +export const version = '3.30.5'