From 3da49fbfba67cb06ae30d269f2ad7107c587d0bb Mon Sep 17 00:00:00 2001 From: idranme Date: Fri, 27 Sep 2024 18:37:47 +0800 Subject: [PATCH 1/4] optimize --- src/onebot11/action/go-cqhttp/SendForwardMsg.ts | 14 ++++++++++---- src/onebot11/action/types.ts | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts index 14bd9af..d4f184f 100644 --- a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts +++ b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts @@ -10,7 +10,8 @@ import { convertMessage2List, createSendElements, sendMsg, createPeer, CreatePee interface Payload { user_id?: string | number group_id?: string | number - messages: OB11MessageNode[] + messages?: OB11MessageNode[] + message?: OB11MessageNode[] message_type?: 'group' | 'private' } @@ -20,15 +21,20 @@ interface Response { } export class SendForwardMsg extends BaseAction { - actionName = ActionName.GoCQHTTP_SendForwardMsg + actionName = ActionName.SendForwardMsg payloadSchema = Schema.object({ user_id: Schema.union([Number, String]), group_id: Schema.union([Number, String]), - messages: Schema.array(Schema.any()).required(), + messages: Schema.array(Schema.any()), + message: Schema.array(Schema.any()), message_type: Schema.union(['group', 'private']) }) protected async _handle(payload: Payload) { + const messages = payload.messages ?? payload.message + if (!messages) { + throw new Error('未指定消息内容') + } let contextMode = CreatePeerMode.Normal if (payload.message_type === 'group') { contextMode = CreatePeerMode.Group @@ -36,7 +42,7 @@ export class SendForwardMsg extends BaseAction { contextMode = CreatePeerMode.Private } const peer = await createPeer(this.ctx, payload, contextMode) - const msg = await this.handleForwardNode(peer, payload.messages) + const msg = await this.handleForwardNode(peer, messages) const msgShortId = this.ctx.store.createMsgShortId({ chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId) return { message_id: msgShortId } } diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index d48b780..8dda7bf 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -24,6 +24,7 @@ export enum ActionName { FetchEmojiLike = 'fetch_emoji_like', FetchCustomFace = 'fetch_custom_face', GetFriendMsgHistory = 'get_friend_msg_history', + SendForwardMsg = 'send_forward_msg', // onebot 11 SendLike = 'send_like', GetLoginInfo = 'get_login_info', @@ -58,7 +59,6 @@ export enum ActionName { ForwardFriendSingleMsg = 'forward_friend_single_msg', ForwardGroupSingleMsg = 'forward_group_single_msg', // 以下为go-cqhttp api - GoCQHTTP_SendForwardMsg = 'send_forward_msg', GoCQHTTP_SendGroupForwardMsg = 'send_group_forward_msg', GoCQHTTP_SendPrivateForwardMsg = 'send_private_forward_msg', GoCQHTTP_GetStrangerInfo = 'get_stranger_info', From 544682fe41371ed5253c815be835ed95aa5cd9a1 Mon Sep 17 00:00:00 2001 From: idranme Date: Sat, 28 Sep 2024 12:54:02 +0800 Subject: [PATCH 2/4] fix --- package.json | 4 ++-- src/onebot11/action/group/SetGroupBan.ts | 6 +++--- src/onebot11/adapter.ts | 1 - src/onebot11/connect/http.ts | 11 ++++++----- tsconfig.json | 1 - 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index f2de371..7aee440 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", + "@types/express": "^5.0.0", "@types/fluent-ffmpeg": "^2.1.26", "@types/node": "^20.14.15", "@types/ws": "^8.5.12", @@ -40,7 +40,7 @@ "electron-vite": "^2.3.0", "protobufjs-cli": "^1.1.3", "typescript": "^5.6.2", - "vite": "^5.4.7", + "vite": "^5.4.8", "vite-plugin-cp": "^4.0.8" }, "packageManager": "yarn@4.5.0" diff --git a/src/onebot11/action/group/SetGroupBan.ts b/src/onebot11/action/group/SetGroupBan.ts index c286eaf..2c2e3a7 100644 --- a/src/onebot11/action/group/SetGroupBan.ts +++ b/src/onebot11/action/group/SetGroupBan.ts @@ -4,7 +4,7 @@ import { ActionName } from '../types' interface Payload { group_id: number | string user_id: number | string - duration: number + duration: number | string } export default class SetGroupBan extends BaseAction { @@ -12,7 +12,7 @@ export default class SetGroupBan extends BaseAction { payloadSchema = Schema.object({ group_id: Schema.union([Number, String]).required(), user_id: Schema.union([Number, String]).required(), - duration: Schema.number().default(30 * 60) + duration: Schema.union([Number, String]).default(30 * 60) }) protected async _handle(payload: Payload): Promise { @@ -21,7 +21,7 @@ export default class SetGroupBan extends BaseAction { const uid = await this.ctx.ntUserApi.getUidByUin(uin, groupCode) if (!uid) throw new Error('无法获取用户信息') await this.ctx.ntGroupApi.banMember(groupCode, [ - { uid, timeStamp: payload.duration }, + { uid, timeStamp: +payload.duration }, ]) return null } diff --git a/src/onebot11/adapter.ts b/src/onebot11/adapter.ts index 450621f..5e2b38c 100644 --- a/src/onebot11/adapter.ts +++ b/src/onebot11/adapter.ts @@ -5,7 +5,6 @@ import { GroupNotifyType, RawMessage, BuddyReqType, - Peer, FriendRequest, GroupMember, GroupMemberRole, diff --git a/src/onebot11/connect/http.ts b/src/onebot11/connect/http.ts index fd999be..0a76871 100644 --- a/src/onebot11/connect/http.ts +++ b/src/onebot11/connect/http.ts @@ -1,7 +1,7 @@ import http from 'node:http' import cors from 'cors' import crypto from 'node:crypto' -import express, { Express, Request, Response } from 'express' +import express, { Express, Request, Response, NextFunction } from 'express' import { BaseAction } from '../action/BaseAction' import { Context } from 'cordis' import { llonebotError, selfInfo } from '@/common/globalVars' @@ -76,7 +76,7 @@ class OB11Http { Object.assign(this.config, config) } - private authorize(req: Request, res: Response, next: () => void) { + private authorize(req: Request, res: Response, next: NextFunction) { const serverToken = this.config.token if (!serverToken) return next() @@ -95,12 +95,13 @@ class OB11Http { } if (clientToken !== serverToken) { - return res.status(403).json({ message: 'token verify failed!' }) + res.status(403).json({ message: 'token verify failed!' }) + } else { + next() } - next() } - private async handleRequest(req: Request, res: Response, next: () => void) { + private async handleRequest(req: Request, res: Response, next: NextFunction) { if (req.path === '/') return next() let payload = req.body if (req.method === 'GET') { diff --git a/tsconfig.json b/tsconfig.json index 21e5d46..ee046bc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,6 @@ "module": "CommonJS", "outDir": "./dist", "strict": true, - "isolatedModules": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, From 35bf4f001bcc5e7e28cf6832649f3047a7106774 Mon Sep 17 00:00:00 2001 From: idranme Date: Sat, 28 Sep 2024 14:35:06 +0800 Subject: [PATCH 3/4] feat: `_get_group_notice` API --- src/ntqqapi/api/group.ts | 32 +++++++++- src/ntqqapi/types/group.ts | 62 +++++++++++++++++-- .../action/go-cqhttp/GetGroupNotice.ts | 48 ++++++++++++++ src/onebot11/action/index.ts | 4 +- src/onebot11/action/types.ts | 3 +- 5 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 src/onebot11/action/go-cqhttp/GetGroupNotice.ts diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts index d6507d9..9c4fd31 100644 --- a/src/ntqqapi/api/group.ts +++ b/src/ntqqapi/api/group.ts @@ -8,7 +8,8 @@ import { GetFileListParam, PublishGroupBulletinReq, GroupAllInfo, - GroupFileInfo + GroupFileInfo, + GroupBulletinListResult } from '../types' import { invoke, NTClass, NTMethod } from '../ntcall' import { GeneralCallResult } from '../services' @@ -347,4 +348,33 @@ export class NTQQGroupApi extends Service { } ) } + + async getGroupBulletinList(groupCode: string) { + invoke('nodeIKernelGroupListener/onGetGroupBulletinListResult', [], { registerEvent: true }) + const ntUserApi = this.ctx.get('ntUserApi')! + const psKey = (await ntUserApi.getPSkey(['qun.qq.com'])).domainPskeyMap.get('qun.qq.com')! + return await invoke<{ + groupCode: string + context: string + result: GroupBulletinListResult + }>( + 'nodeIKernelGroupService/getGroupBulletinList', + [{ + groupCode, + psKey, + context: '', + req: { + startIndex: -1, + num: 20, + needInstructionsForJoinGroup: 1, + needPublisherInfo: 1 + } + }], + { + cbCmd: 'nodeIKernelGroupListener/onGetGroupBulletinListResult', + cmdCB: payload => payload.groupCode === groupCode, + afterFirstCmd: false + } + ) + } } diff --git a/src/ntqqapi/types/group.ts b/src/ntqqapi/types/group.ts index 72a3885..2dcee1f 100644 --- a/src/ntqqapi/types/group.ts +++ b/src/ntqqapi/types/group.ts @@ -22,9 +22,9 @@ export interface Group { hasModifyConfGroupName: boolean remarkName: string hasMemo: boolean - groupShutupExpireTime: string //"0", - personShutupExpireTime: string //"0", - discussToGroupUin: string //"0", + groupShutupExpireTime: string + personShutupExpireTime: string + discussToGroupUin: string discussToGroupMaxMsgSeq: number discussToGroupTime: number groupFlagExt: number //1073938496, @@ -32,8 +32,8 @@ export interface Group { groupCreditLevel: number //0, groupFlagExt3: number //0, groupOwnerId: { - memberUin: string //"0", - memberUid: string //"u_fbf8N7aeuZEnUiJAbQ9R8Q" + memberUin: string + memberUid: string } members: GroupMember[] // 原始数据是没有这个的,为了方便自己加了这个字段 createTime: string @@ -120,3 +120,55 @@ export interface GroupAllInfo { joinGroupAuth: string isAllowModifyConfGroupName: number } + +export interface GroupBulletinListResult { + groupCode: string + srvCode: number + readOnly: number + role: number + inst: unknown[] + feeds: { + uin: string + feedId: string + publishTime: string + msg: { + text: string + textFace: string + pics: { + id: string + width: number + height: number + }[] + title: string + } + type: number + fn: number + cn: number + vn: number + settings: { + isShowEditCard: number + remindTs: number + tipWindowType: number + confirmRequired: number + } + pinned: number + readNum: number + is_read: number + is_all_confirm: number + }[] + groupInfo: { + groupCode: string + classId: number + } + gln: number + tst: number + publisherInfos: { + uin: string + nick: string + avatar: string + }[] + server_time: string + svrt: string + nextIndex: number + jointime: string +} diff --git a/src/onebot11/action/go-cqhttp/GetGroupNotice.ts b/src/onebot11/action/go-cqhttp/GetGroupNotice.ts new file mode 100644 index 0000000..6bfbd51 --- /dev/null +++ b/src/onebot11/action/go-cqhttp/GetGroupNotice.ts @@ -0,0 +1,48 @@ +import { BaseAction, Schema } from '../BaseAction' +import { ActionName } from '../types' + +interface Payload { + group_id: number | string +} + +interface Notice { + sender_id: number + publish_time: number + message: { + text: string + images: { + height: string + width: string + id: string + }[] + } +} + +export class GetGroupNotice extends BaseAction { + actionName = ActionName.GoCQHTTP_GetGroupNotice + payloadSchema = Schema.object({ + group_id: Schema.union([Number, String]).required() + }) + + protected async _handle(payload: Payload) { + const data = await this.ctx.ntGroupApi.getGroupBulletinList(payload.group_id.toString()) + const result: Notice[] = [] + for (const feed of data.result.feeds) { + result.push({ + sender_id: +feed.uin, + publish_time: +feed.publishTime, + message: { + text: feed.msg.text, + images: feed.msg.pics.map(image => { + return { + height: String(image.height), + width: String(image.width), + id: image.id + } + }) + } + }) + } + return result + } +} diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index d037dfe..1558639 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -70,6 +70,7 @@ import { GetFriendWithCategory } from './llonebot/GetFriendWithCategory' import { UploadGroupFile } from './go-cqhttp/UploadGroupFile' import { UploadPrivateFile } from './go-cqhttp/UploadPrivateFile' import { GetGroupFileUrl } from './go-cqhttp/GetGroupFileUrl' +import { GetGroupNotice } from './go-cqhttp/GetGroupNotice' export function initActionMap(adapter: Adapter) { const actionHandlers = [ @@ -144,7 +145,8 @@ export function initActionMap(adapter: Adapter) { new GetGroupRootFiles(adapter), new SendGroupNotice(adapter), new GetGroupFilesByFolder(adapter), - new GetGroupFileUrl(adapter) + new GetGroupFileUrl(adapter), + new GetGroupNotice(adapter), ] const actionMap = new Map>() for (const action of actionHandlers) { diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 8dda7bf..2cb911f 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -82,5 +82,6 @@ export enum ActionName { GoCQHTTP_GetGroupRootFiles = 'get_group_root_files', GoCQHTTP_SendGroupNotice = '_send_group_notice', GoCQHTTP_GetGroupFilesByFolder = 'get_group_files_by_folder', - GoCQHTTP_GetGroupFileUrl = 'get_group_file_url' + GoCQHTTP_GetGroupFileUrl = 'get_group_file_url', + GoCQHTTP_GetGroupNotice = '_get_group_notice', } From 0ceef4d4c01622534df32c08774f8999109e8afd Mon Sep 17 00:00:00 2001 From: idranme Date: Sat, 28 Sep 2024 14:37:44 +0800 Subject: [PATCH 4/4] chore: v3.33.10 --- manifest.json | 2 +- src/version.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 83911fc..65a7b54 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "LLOneBot", "slug": "LLOneBot", "description": "实现 OneBot 11 协议,用于 QQ 机器人开发", - "version": "3.33.9", + "version": "3.33.10", "icon": "./icon.webp", "authors": [ { diff --git a/src/version.ts b/src/version.ts index 248e835..3dd42de 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '3.33.9' +export const version = '3.33.10'