diff --git a/src/common/utils/AsyncQueue.ts b/src/common/utils/AsyncQueue.ts new file mode 100644 index 00000000..f6f19c8c --- /dev/null +++ b/src/common/utils/AsyncQueue.ts @@ -0,0 +1,33 @@ +import { sleep } from '@/common/utils/helper'; + +type AsyncQueueTask = (() => void) | Promise ; + + +export class AsyncQueue { + private tasks: (AsyncQueueTask)[] = []; + + public addTask(task: AsyncQueueTask) { + this.tasks.push(task); + if (this.tasks.length === 1) { + this.runQueue().then().catch(()=>{}); + } + } + + private async runQueue() { + while (this.tasks.length > 0) { + const task = this.tasks[0]; + try { + if (task instanceof Promise) { + await task; + } + else{ + task(); + } + } catch (e) { + console.error(e); + } + this.tasks.shift(); + await sleep(100); + } + } +} diff --git a/src/common/utils/asyncQuene.ts b/src/common/utils/asyncQuene.ts deleted file mode 100644 index a2a7aded..00000000 --- a/src/common/utils/asyncQuene.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { randomUUID } from "crypto"; - -class AsyncQueue { - private tasks: Map = new Map(); - private MainQuene: any = undefined; - private callbacks: Map = new Map(); - private ArgList: Map = new Map(); - private busy = false; - // 添加任务到队列中 返回任务ID - public async addTask(task: any, args: any[], callBack: any) { - let uuid = randomUUID(); - this.tasks.set(uuid, task); - this.callbacks.set(uuid, callBack); - this.ArgList.set(uuid, args); - return uuid; - } - public async runQueue() { - if (!this.MainQuene) { - this.MainQuene = this.Quene(); - } - await this.MainQuene; - this.MainQuene = undefined; - } - public async Quene() { - for (let [uuid, task] of this.tasks) { - //console.log(uuid,...this.ArgList.get(uuid)); - let result = await task(...this.ArgList.get(uuid)); - console.log(result); - let cb = this.callbacks.get(uuid); - cb(result); - this.tasks.delete(uuid); - this.ArgList.delete(uuid); - this.callbacks.delete(uuid); - } - } -} -export const ImageQuene = new AsyncQueue(); \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index ae03678f..fa3272f6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import { postLoginStatus } from '@/common/utils/umami'; import { checkVersion } from '@/common/utils/version'; import { log, logDebug, logError, LogLevel, setLogLevel } from '@/common/utils/log'; import { NapCatOnebot11 } from '@/onebot11/main'; +import { hookApi } from '@/core/external/hook'; program .option('-q, --qq ', 'QQ号') @@ -15,6 +16,11 @@ program const cmdOptions = program.opts(); // console.log(process.argv); +for(let k=0; k<30; k++) { + new Promise((r, j) => { + hookApi.getRKey(); + }).then(); +} checkVersion().then((remoteVersion: string) => { const localVersion = require('./package.json').version; const localVersionList = localVersion.split('.'); diff --git a/src/onebot11/action/group/GetGroupMemberInfo.ts b/src/onebot11/action/group/GetGroupMemberInfo.ts index 67d0bceb..0edcee73 100644 --- a/src/onebot11/action/group/GetGroupMemberInfo.ts +++ b/src/onebot11/action/group/GetGroupMemberInfo.ts @@ -18,7 +18,7 @@ class GetGroupMemberInfo extends BaseAction { actionName = ActionName.GetGroupMemberInfo; protected async _handle(payload: PayloadType) { - let WebGroupMember = await WebApi.getGroupMembers(payload.group_id.toString()); + const WebGroupMember = await WebApi.getGroupMembers(payload.group_id.toString()); const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()); // log(member); if (member) { @@ -30,7 +30,7 @@ class GetGroupMemberInfo extends BaseAction { } catch (e) { logDebug('获取群成员详细信息失败, 只能返回基础信息', e); } - let retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); + const retMember = OB11Constructor.groupMember(payload.group_id.toString(), member); for (let i = 0, len = WebGroupMember.length; i < len; i++) { if (WebGroupMember[i]?.uin && WebGroupMember[i].uin === retMember.user_id) { retMember.join_time = WebGroupMember[i]?.join_time; @@ -42,7 +42,7 @@ class GetGroupMemberInfo extends BaseAction { } return retMember; } else { - throw (`群成员${payload.user_id}不存在`); + throw (`群(${payload.group_id})成员${payload.user_id}不存在`); } } } diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 81551c0b..bf8d1414 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -44,8 +44,9 @@ import { deleteGroup, getFriend, getGroupMember, groupMembers, selfInfo, tempGro import { NTQQFileApi, NTQQGroupApi, NTQQUserApi } from '../core/src/apis'; import http from 'http'; import { OB11GroupMsgEmojiLikeEvent } from '@/onebot11/event/notice/OB11MsgEmojiLikeEvent'; -import { ImageQuene } from '@/common/utils/asyncQuene'; +import { AsyncQueue } from '@/common/utils/AsyncQueue'; +const imageQueue = new AsyncQueue(); export class OB11Constructor { static async message(msg: RawMessage): Promise { @@ -144,18 +145,18 @@ export class OB11Constructor { message_data['data']['file'] = element.picElement.fileName; // message_data["data"]["path"] = element.picElement.sourcePath // let currentRKey = "CAQSKAB6JWENi5LMk0kc62l8Pm3Jn1dsLZHyRLAnNmHGoZ3y_gDZPqZt-64" - ImageQuene.addTask(NTQQFileApi.getImageUrl, [msg], (result: string) => { - message_data['data']['url'] = result; + await new Promise((resolve, reject) => { + const task = new Promise((taskResolve, taskReject) => { + log('开始获取图片url'); + NTQQFileApi.getImageUrl(msg).then((url) => { + message_data['data']['url'] = url; + log('获取图片url结果:', url); + taskResolve(); + resolve(); + }); + }); + imageQueue.addTask(task); }); - await ImageQuene.runQueue(); - // 缓解获取失败 - try { - if (!message_data['data']['url']) { - message_data['data']['url'] = ""; - } - } catch (e) { - message_data['data']['url'] = ""; - } // message_data["data"]["file_id"] = element.picElement.fileUuid message_data['data']['file_size'] = element.picElement.fileSize;