From 07cee90c7a205a0426544d35a970891fcdac4572 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: Tue, 28 May 2024 20:08:40 +0800 Subject: [PATCH] refactor: MemberInfo-1 --- .../utils}/LastSendAndJoinRemberLRU.ts | 9 +- src/common/utils/helper.ts | 1 + .../action/group/GetGroupMemberList.ts | 73 +++++++++-------- src/onebot11/config.ts | 4 +- src/onebot11/main.ts | 2 +- src/webui/ui/components/WebUiApiOB11Config.ts | 1 + static/assets/renderer.js | 21 ++--- tsconfig.json | 82 +++++++++---------- 8 files changed, 96 insertions(+), 97 deletions(-) rename src/{onebot11/action/group => common/utils}/LastSendAndJoinRemberLRU.ts (92%) diff --git a/src/onebot11/action/group/LastSendAndJoinRemberLRU.ts b/src/common/utils/LastSendAndJoinRemberLRU.ts similarity index 92% rename from src/onebot11/action/group/LastSendAndJoinRemberLRU.ts rename to src/common/utils/LastSendAndJoinRemberLRU.ts index 2abf0124..6d6be9fe 100644 --- a/src/onebot11/action/group/LastSendAndJoinRemberLRU.ts +++ b/src/common/utils/LastSendAndJoinRemberLRU.ts @@ -2,7 +2,7 @@ import sqlite3 from "sqlite3"; import { logError, logDebug } from "@/common/utils/log"; import { selfInfo } from "@/core/data"; import { ob11Config } from "@/onebot11/config"; -import LRU from "./LRUCache"; +import LRU from "../../onebot11/action/group/LRUCache"; import path from "path"; const dbPath = path.join( @@ -32,8 +32,7 @@ const createTableSQL = (groupId: number) => );`; async function createTableIfNotExist(groupId: number) { - // 未开启本地记录 - if (!ob11Config.localDB) return; + logDebug("检测数据表存在", groupId); if (groupIds.includes(groupId)) { @@ -63,9 +62,6 @@ export async function insertJoinTime( userId: number, time: number ) { - // 未开启本地记录 - if (!ob11Config.localDB) return; - logDebug("插入入群时间", userId, groupId); await createTableIfNotExist(groupId); remberDb.all( @@ -183,6 +179,5 @@ export function insertLastSentTime( userId: number, time: number ) { - if (!ob11Config.localDB) return; LURCache.set(groupId, userId,time) } diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index c09428b6..8c44094b 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -145,6 +145,7 @@ export function migrateConfig(oldConfig: any) { musicSignUrl: oldConfig.musicSignUrl, reportSelfMessage: oldConfig.reportSelfMessage, token: oldConfig.token, + GroupLocalTimeRecord: [] }; return newConfig; } diff --git a/src/onebot11/action/group/GetGroupMemberList.ts b/src/onebot11/action/group/GetGroupMemberList.ts index a6c0034f..171b16cd 100644 --- a/src/onebot11/action/group/GetGroupMemberList.ts +++ b/src/onebot11/action/group/GetGroupMemberList.ts @@ -1,4 +1,4 @@ -import { getGroup, groupMembers } from '@/core/data'; +import { getGroup, getGroupMember, groupMembers, selfInfo } from '@/core/data'; import { OB11GroupMember } from '../../types'; import { OB11Constructor } from '../../constructor'; import BaseAction from '../BaseAction'; @@ -7,7 +7,8 @@ import { napCatCore, NTQQGroupApi, NTQQUserApi, SignMiniApp } from '@/core'; import { WebApi } from '@/core/apis/webapi'; import { logDebug } from '@/common/utils/log'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; -import { getLastSentTimeAndJoinTime }from "./LastSendAndJoinRemberLRU" +import { getLastSentTimeAndJoinTime } from "../../../common/utils/LastSendAndJoinRemberLRU" +import { ob11Config } from '@/onebot11/config'; const SchemaData = { type: 'object', @@ -24,56 +25,56 @@ class GetGroupMemberList extends BaseAction { actionName = ActionName.GetGroupMemberList; PayloadSchema = SchemaData; protected async _handle(payload: Payload) { - const MemberMap: Map = new Map(); - const webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString()); + const role = (await getGroupMember(payload.group_id, selfInfo.uin))?.role; + const group = await getGroup(payload.group_id.toString()); if (!group) { throw (`群${payload.group_id}不存在`); } + + // 从Data里面获取 + let _groupMembers: OB11GroupMember[] = OB11Constructor.groupMembers(group); if (payload.no_cache == true || payload.no_cache === 'true') { // webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString());' const _groupMembers = await NTQQGroupApi.getGroupMembers(payload.group_id.toString()); groupMembers.set(group.groupCode, _groupMembers); } - const _groupMembers = OB11Constructor.groupMembers(group); - // 方便索引处理 + const MemberMap: Map = new Map(); + // 转为Map 方便索引 for (let i = 0, len = _groupMembers.length; i < len; i++) { - MemberMap.set(_groupMembers[i].user_id, _groupMembers[i]); } - // 合并数据 - for (let i = 0, len = webGroupMembers.length; i < len; i++) { - if (!webGroupMembers[i]?.uin) { - continue; - } - const MemberData = MemberMap.get(webGroupMembers[i]?.uin); - if (MemberData) { - MemberData.join_time = webGroupMembers[i]?.join_time; - MemberData.last_sent_time = webGroupMembers[i]?.last_speak_time; - MemberData.qage = webGroupMembers[i]?.qage; - MemberData.level = webGroupMembers[i]?.lv.level; - MemberMap.set(webGroupMembers[i]?.uin, MemberData); - } - } - // 还原Map到Array - const RetGroupMember: OB11GroupMember[] = Array.from(MemberMap.values()); - // 无管理员权限通过本地记录获取发言时间 - const haveAdmin = RetGroupMember[0].last_sent_time !== 0; - if (!haveAdmin) { - //logDebug('没有管理员权限,使用本地记录'); - const _sendAndJoinRember = await getLastSentTimeAndJoinTime(parseInt(group.groupCode)); - _sendAndJoinRember.forEach((rember) => { - const member = RetGroupMember.find(member=>member.user_id == rember.user_id); - if(member){ - member.last_sent_time = rember.last_sent_time; - member.join_time = rember.join_time; + const isPrivilege = role === 3 || role === 4; + if (isPrivilege) { + const webGroupMembers = await WebApi.getGroupMembers(payload.group_id.toString()); + for (let i = 0, len = webGroupMembers.length; i < len; i++) { + if (!webGroupMembers[i]?.uin) { + continue; } - }) + const MemberData = MemberMap.get(webGroupMembers[i]?.uin); + if (MemberData) { + MemberData.join_time = webGroupMembers[i]?.join_time; + MemberData.last_sent_time = webGroupMembers[i]?.last_speak_time; + MemberData.qage = webGroupMembers[i]?.qage; + MemberData.level = webGroupMembers[i]?.lv.level; + MemberMap.set(webGroupMembers[i]?.uin, MemberData); + } + } + } else if ((ob11Config.GroupLocalTimeRecord as Array).includes(payload.group_id)) { + const _sendAndJoinRember = await getLastSentTimeAndJoinTime(payload.group_id); + _sendAndJoinRember.forEach((element) => { + let MemberData = MemberMap.get(element.user_id); + if (MemberData) { + MemberData.join_time = element.join_time; + MemberData.last_sent_time = element.last_sent_time; + } + }); } - - return RetGroupMember; + // 还原索引到Array 一同返回 + _groupMembers = Array.from(MemberMap.values()); + return _groupMembers; } } diff --git a/src/onebot11/config.ts b/src/onebot11/config.ts index 3992e443..a859b46e 100644 --- a/src/onebot11/config.ts +++ b/src/onebot11/config.ts @@ -33,7 +33,7 @@ export interface OB11Config { reportSelfMessage: boolean; token: string; - localDB: boolean; + GroupLocalTimeRecord: Array; read(): OB11Config; @@ -67,7 +67,7 @@ class Config extends ConfigBase implements OB11Config { reportSelfMessage = false; token = ''; - localDB = true; + GroupLocalTimeRecord = []; getConfigPath() { return path.join(this.getConfigDir(), `onebot11_${selfInfo.uin}.json`); diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index 572d11c7..5a9a9802 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -35,7 +35,7 @@ import { Data as SysData } from '@/proto/SysMessage'; import { Data as DeviceData } from '@/proto/SysMessage.DeviceChange'; import { OB11FriendPokeEvent, OB11GroupPokeEvent } from './event/notice/OB11PokeEvent'; import { isEqual } from '@/common/utils/helper'; -import { insertLastSentTime } from "./action/group/LastSendAndJoinRemberLRU" +import { insertLastSentTime } from "../common/utils/LastSendAndJoinRemberLRU" //下面几个其实应该移进Core-Data 缓存实现 但是现在在这里方便 // diff --git a/src/webui/ui/components/WebUiApiOB11Config.ts b/src/webui/ui/components/WebUiApiOB11Config.ts index 5c6710fd..31aa45a4 100644 --- a/src/webui/ui/components/WebUiApiOB11Config.ts +++ b/src/webui/ui/components/WebUiApiOB11Config.ts @@ -26,6 +26,7 @@ export interface OB11Config { musicSignUrl: ''; reportSelfMessage: boolean; token: ''; + GroupLocalTimeRecord: []; } class WebUiApiOB11ConfigWrapper { diff --git a/static/assets/renderer.js b/static/assets/renderer.js index be56d4b1..d7915ce8 100644 --- a/static/assets/renderer.js +++ b/static/assets/renderer.js @@ -108,7 +108,7 @@ class WebUiApiOB11ConfigWrapper { this.retCredential = Credential; } async GetOB11Config() { - let ConfigResponse = await fetch("/api/OB11Config/GetConfig", { + const ConfigResponse = await fetch("/api/OB11Config/GetConfig", { method: "POST", headers: { Authorization: "Bearer " + this.retCredential, @@ -116,7 +116,7 @@ class WebUiApiOB11ConfigWrapper { } }); if (ConfigResponse.status == 200) { - let ConfigResponseJson = await ConfigResponse.json(); + const ConfigResponseJson = await ConfigResponse.json(); if (ConfigResponseJson.code == 0) { return ConfigResponseJson?.data; } @@ -124,7 +124,7 @@ class WebUiApiOB11ConfigWrapper { return {}; } async SetOB11Config(config) { - let ConfigResponse = await fetch("/api/OB11Config/SetConfig", { + const ConfigResponse = await fetch("/api/OB11Config/SetConfig", { method: "POST", headers: { Authorization: "Bearer " + this.retCredential, @@ -133,7 +133,7 @@ class WebUiApiOB11ConfigWrapper { body: JSON.stringify({ config: JSON.stringify(config) }) }); if (ConfigResponse.status == 200) { - let ConfigResponseJson = await ConfigResponse.json(); + const ConfigResponseJson = await ConfigResponse.json(); if (ConfigResponseJson.code == 0) { return true; } @@ -142,10 +142,11 @@ class WebUiApiOB11ConfigWrapper { } } const OB11ConfigWrapper = new WebUiApiOB11ConfigWrapper(); + async function onSettingWindowCreated(view) { const isEmpty = (value) => value === void 0 || value === void 0 || value === ""; await OB11ConfigWrapper.Init(localStorage.getItem("auth")); - let ob11Config = await OB11ConfigWrapper.GetOB11Config(); + const ob11Config = await OB11ConfigWrapper.GetOB11Config(); const setOB11Config = (key, value) => { const configKey = key.split("."); if (configKey.length === 2) { @@ -289,18 +290,18 @@ async function onSettingWindowCreated(view) { SettingList([ SettingItem( "GitHub 仓库", - `https://github.com/NapNeko/NapCatQQ`, + "https://github.com/NapNeko/NapCatQQ", SettingButton("点个星星", "open-github") ), - SettingItem("NapCat 文档", ``, SettingButton("看看文档", "open-docs")), + SettingItem("NapCat 文档", "", SettingButton("看看文档", "open-docs")), SettingItem( "Telegram 群", - `https://t.me/+nLZEnpne-pQ1OWFl`, + "https://t.me/+nLZEnpne-pQ1OWFl", SettingButton("进去逛逛", "open-telegram") ), SettingItem( "QQ 群", - `545402644`, + "545402644", SettingButton("我要进去", "open-qq-group") ) ]), @@ -413,7 +414,7 @@ async function onSettingWindowCreated(view) { dom.removeAttribute("is-active"); if (!isEmpty(dom.dataset.controlDisplayId)) { const displayDom = document.querySelector( - //@ts-ignore 等待修复 + //@ts-expect-error 等待修复 `#${dom.dataset.controlDisplayId}` ); if (active) diff --git a/tsconfig.json b/tsconfig.json index 0901331e..ef36626b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,41 +1,41 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "skipLibCheck": true, - "moduleResolution": "Node", - "allowImportingTsExtensions": false, - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "preserve", - "strict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "paths": { - "@*": [ - "./src*" - ], - "@/core": [ - "./src/core/src/index", - "./src/core.lib/src/index" - ], - "@/core/*": [ - "./src/core/src/*", - "./src/core.lib/src/*" - ] - } - }, - "include": [ - "src/**/*.ts" - ] -} +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + "moduleResolution": "Node", + "allowImportingTsExtensions": false, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "paths": { + "@*": [ + "./src*" + ], + "@/core": [ + "./src/core/src/index", + "./src/core.lib/src/index" + ], + "@/core/*": [ + "./src/core/src/*", + "./src/core.lib/src/*" + ] + } + }, + "include": [ + "src/**/*.ts" + ] +}