diff --git a/src/core/src/apis/group.ts b/src/core/src/apis/group.ts index 459e98c5..52b6ff18 100644 --- a/src/core/src/apis/group.ts +++ b/src/core/src/apis/group.ts @@ -7,6 +7,9 @@ import { logDebug } from '@/common/utils/log'; // console.log(JSON.stringify(await NTQQGroupApi.getMemberExtInfo(), null, 2)); // }, 20000); export class NTQQGroupApi { + static async setGroupAvatar(gc:string,filePath: string) { + return napCatCore.session.getGroupService().setHeader(gc,filePath); + } static async getGroups(forced = false) { let [_retData, _updateType, groupList] = await NTEventDispatch.CallNormalEvent <(force: boolean) => Promise, (updateType: number, groupList: Group[]) => void> diff --git a/src/core/src/apis/user.ts b/src/core/src/apis/user.ts index be305e05..28cf01f1 100644 --- a/src/core/src/apis/user.ts +++ b/src/core/src/apis/user.ts @@ -46,6 +46,10 @@ export class NTQQUserApi { const ret = await napCatCore.session.getProfileService().setHeader(filePath) as setQQAvatarRet; return { result: ret?.result, errMsg: ret?.errMsg }; } + static async setGroupAvatar(gc:string,filePath: string) { + const ret = await napCatCore.session.getGroupService().setHeader(gc,filePath); + return { result: ret?.result, errMsg: ret?.errMsg }; + } static async getSelfInfo() { diff --git a/src/core/src/services/NodeIKernelGroupService.ts b/src/core/src/services/NodeIKernelGroupService.ts index 1f695c4f..7efd8bd8 100644 --- a/src/core/src/services/NodeIKernelGroupService.ts +++ b/src/core/src/services/NodeIKernelGroupService.ts @@ -9,6 +9,7 @@ import { import { GeneralCallResult } from '@/core/services/common'; export interface NodeIKernelGroupService { + setHeader(uid:string,path:string): unknown; addKernelGroupListener(listener: NodeIKernelGroupListener): number; diff --git a/src/onebot11/action/extends/SetGroupHeader.ts b/src/onebot11/action/extends/SetGroupHeader.ts new file mode 100644 index 00000000..3a5dd8d2 --- /dev/null +++ b/src/onebot11/action/extends/SetGroupHeader.ts @@ -0,0 +1,57 @@ +import BaseAction from '../BaseAction'; +import { ActionName, BaseCheckResult } from '../types'; +import * as fs from 'node:fs'; +import { NTQQUserApi } from '@/core/apis/user'; +import { checkFileReceived, uri2local } from '@/common/utils/file'; +import { NTQQGroupApi } from '@/core'; +// import { log } from "../../../common/utils"; + +interface Payload { + file: string, + groupCode: string +} + +export default class SetGroupHeader extends BaseAction { + actionName = ActionName.SetGroupHeader; + // 用不着复杂检测 + protected async check(payload: Payload): Promise { + if (!payload.file || typeof payload.file != 'string' || !payload.groupCode || typeof payload.groupCode != 'string') { + return { + valid: false, + message: 'file和groupCode字段不能为空或者类型错误', + }; + } + return { + valid: true, + }; + } + protected async _handle(payload: Payload): Promise { + const { path, isLocal, errMsg } = (await uri2local(payload.file)); + if (errMsg) { + throw `头像${payload.file}设置失败,file字段可能格式不正确`; + } + if (path) { + await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断 + const ret = await NTQQGroupApi.setGroupAvatar(payload.groupCode,path); + if (!isLocal) { + fs.unlink(path, () => { }); + } + if (!ret) { + throw `头像${payload.file}设置失败,api无返回`; + } + // log(`头像设置返回:${JSON.stringify(ret)}`) + // if (ret['result'] == 1004022) { + // throw `头像${payload.file}设置失败,文件可能不是图片格式`; + // } else if (ret['result'] != 0) { + // throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}`; + // } + return ret; + } else { + if (!isLocal) { + fs.unlink(path, () => { }); + } + throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在`; + } + return null; + } +} diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 47bd83eb..c3a26c6d 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -98,5 +98,6 @@ export enum ActionName { DelEssenceMsg = 'delete_essence_msg', GetRecentContact = 'get_recent_contact', _MarkAllMsgAsRead = '_mark_all_as_read', - GetProfileLike = 'get_profile_like' + GetProfileLike = 'get_profile_like', + SetGroupHeader = "set_group_head" }