style: 强类型大法

This commit is contained in:
手瓜一十雪
2025-02-02 23:22:21 +08:00
parent 76501bae34
commit 70945cf2d8
191 changed files with 923 additions and 806 deletions

View File

@@ -5,7 +5,7 @@ import { NapCatOneBot11Adapter, OB11Return } from '@/onebot';
import { NetworkAdapterConfig } from '../config/config';
export class OB11Response {
private static createResponse<T>(data: T, status: string, retcode: number, message: string = '', echo: any = null): OB11Return<T> {
private static createResponse<T>(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return<T> {
return {
status,
retcode,
@@ -20,11 +20,11 @@ export class OB11Response {
return this.createResponse(data, status, retcode, message);
}
static ok<T>(data: T, echo: any = null): OB11Return<T> {
static ok<T>(data: T, echo: unknown = null): OB11Return<T> {
return this.createResponse(data, 'ok', 0, '', echo);
}
static error(err: string, retcode: number, echo: any = null): OB11Return<null> {
static error(err: string, retcode: number, echo: unknown = null): OB11Return<null> {
return this.createResponse(null, 'failed', retcode, err, echo);
}
}
@@ -32,8 +32,8 @@ export class OB11Response {
export abstract class OneBotAction<PayloadType, ReturnDataType> {
actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown;
core: NapCatCore;
private validate: ValidateFunction<any> | undefined = undefined;
payloadSchema: any = undefined;
private validate?: ValidateFunction<unknown> = undefined;
payloadSchema?: unknown = undefined;
obContext: NapCatOneBot11Adapter;
constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) {
@@ -64,13 +64,13 @@ export abstract class OneBotAction<PayloadType, ReturnDataType> {
try {
const resData = await this._handle(payload, adaptername, config);
return OB11Response.ok(resData);
} catch (e: any) {
} catch (e: unknown) {
this.core.context.logger.logError('发生错误', e);
return OB11Response.error((e as Error).message.toString() || e?.stack?.toString() || '未知错误,可能操作超时', 200);
return OB11Response.error((e as Error).message.toString() || (e as Error)?.stack?.toString() || '未知错误,可能操作超时', 200);
}
}
public async websocketHandle(payload: PayloadType, echo: any, adaptername: string, config: NetworkAdapterConfig): Promise<OB11Return<ReturnDataType | null>> {
public async websocketHandle(payload: PayloadType, echo: unknown, adaptername: string, config: NetworkAdapterConfig): Promise<OB11Return<ReturnDataType | null>> {
const result = await this.check(payload);
if (!result.valid) {
return OB11Response.error(result.message, 1400, echo);
@@ -78,9 +78,9 @@ export abstract class OneBotAction<PayloadType, ReturnDataType> {
try {
const resData = await this._handle(payload, adaptername, config);
return OB11Response.ok(resData, echo);
} catch (e: any) {
} catch (e: unknown) {
this.core.context.logger.logError('发生错误', e);
return OB11Response.error((e as Error).message.toString() || e.stack?.toString(), 1200, echo);
return OB11Response.error(((e as Error).message.toString() || (e as Error).stack?.toString()) ?? 'Error', 1200, echo);
}
}

View File

@@ -9,9 +9,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class CreateCollection extends OneBotAction<Payload, any> {
actionName = ActionName.CreateCollection;
payloadSchema = SchemaData;
export class CreateCollection extends OneBotAction<Payload, unknown> {
override actionName = ActionName.CreateCollection;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.CollectionApi.createCollection(

View File

@@ -9,8 +9,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class FetchCustomFace extends OneBotAction<Payload, string[]> {
actionName = ActionName.FetchCustomFace;
payloadSchema = SchemaData;
override actionName = ActionName.FetchCustomFace;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.MsgApi.fetchFavEmojiList(+payload.count);

View File

@@ -2,6 +2,7 @@ import { Type, Static } from '@sinclair/typebox';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique';
import { type NTQQMsgApi } from '@/core/apis';
const SchemaData = Type.Object({
message_id: Type.Union([Type.Number(), Type.String()]),
@@ -12,14 +13,15 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class FetchEmojiLike extends OneBotAction<Payload, any> {
actionName = ActionName.FetchEmojiLike;
payloadSchema = SchemaData;
export class FetchEmojiLike extends OneBotAction<Payload, Awaited<ReturnType<NTQQMsgApi['getMsgEmojiLikesList']>>> {
override actionName = ActionName.FetchEmojiLike;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const msgIdPeer = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id);
if (!msgIdPeer) throw new Error('消息不存在');
const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(msgIdPeer.Peer, [msgIdPeer.MsgId])).msgList[0];
if (!msg) throw new Error('消息不存在');
return await this.core.apis.MsgApi.getMsgEmojiLikesList(
msgIdPeer.Peer, msg.msgSeq, payload.emojiId.toString(), payload.emojiType.toString(), +payload.count
);

View File

@@ -20,8 +20,8 @@ interface GetAiCharactersResponse {
}
export class GetAiCharacters extends GetPacketStatusDepends<Payload, GetAiCharactersResponse[]> {
actionName = ActionName.GetAiCharacters;
payloadSchema = SchemaData;
override actionName = ActionName.GetAiCharacters;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const rawList = await this.core.apis.PacketApi.pkt.operation.FetchAiVoiceList(+payload.group_id, +payload.chat_type as AIVoiceChatType);

View File

@@ -6,7 +6,7 @@ interface GetClientkeyResponse {
}
export class GetClientkey extends OneBotAction<void, GetClientkeyResponse> {
actionName = ActionName.GetClientkey;
override actionName = ActionName.GetClientkey;
async _handle() {
return { clientkey: (await this.core.apis.UserApi.forceFetchClientKey()).clientKey };

View File

@@ -1,3 +1,4 @@
import { type NTQQCollectionApi } from '@/core/apis/collection';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Type, Static } from '@sinclair/typebox';
@@ -9,9 +10,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetCollectionList extends OneBotAction<Payload, any> {
actionName = ActionName.GetCollectionList;
payloadSchema = SchemaData;
export class GetCollectionList extends OneBotAction<Payload, Awaited<ReturnType<NTQQCollectionApi['getAllCollection']>>> {
override actionName = ActionName.GetCollectionList;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.CollectionApi.getAllCollection(+payload.category, +payload.count);

View File

@@ -2,10 +2,10 @@ import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export class GetFriendWithCategory extends OneBotAction<void, any> {
actionName = ActionName.GetFriendsWithCategory;
export class GetFriendWithCategory extends OneBotAction<void, unknown> {
override actionName = ActionName.GetFriendsWithCategory;
async _handle(payload: void) {
async _handle() {
return (await this.core.apis.FriendApi.getBuddyV2ExWithCate()).map(category => ({
...category,
buddyList: OB11Construct.friends(category.buddyList),

View File

@@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router';
import { Notify } from '@/onebot/types';
export default class GetGroupAddRequest extends OneBotAction<null, Notify[] | null> {
actionName = ActionName.GetGroupIgnoreAddRequest;
override actionName = ActionName.GetGroupIgnoreAddRequest;
async _handle(payload: null): Promise<Notify[] | null> {
async _handle(): Promise<Notify[] | null> {
const NTQQUserApi = this.core.apis.UserApi;
const NTQQGroupApi = this.core.apis.GroupApi;
const ignoredNotifies = await NTQQGroupApi.getSingleScreenNotifies(true, 10);

View File

@@ -7,9 +7,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupInfoEx extends OneBotAction<Payload, any> {
actionName = ActionName.GetGroupInfoEx;
payloadSchema = SchemaData;
export class GetGroupInfoEx extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GetGroupInfoEx;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id.toString()])).result.groupExtInfos.get(payload.group_id.toString());

View File

@@ -38,8 +38,8 @@ type Payload = Static<typeof SchemaData>;
export class GetMiniAppArk extends GetPacketStatusDepends<Payload, {
data: MiniAppData | MiniAppRawData
}> {
actionName = ActionName.GetMiniAppArk;
payloadSchema = SchemaData;
override actionName = ActionName.GetMiniAppArk;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
let reqParam: MiniAppReqParams;

View File

@@ -1,3 +1,4 @@
import { NTVoteInfo } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Type, Static } from '@sinclair/typebox';
@@ -10,9 +11,25 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetProfileLike extends OneBotAction<Payload, any> {
actionName = ActionName.GetProfileLike;
payloadSchema = SchemaData;
export class GetProfileLike extends OneBotAction<Payload, {
uid: string;
time: string;
favoriteInfo: {
userInfos: Array<NTVoteInfo>;
total_count: number;
last_time: number;
today_count: number;
};
voteInfo: {
total_count: number;
new_count: number;
new_nearby_count: number;
last_visit_time: number;
userInfos: Array<NTVoteInfo>;
};
}> {
override actionName = ActionName.GetProfileLike;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const isSelf = this.core.selfInfo.uin === payload.user_id || !payload.user_id;
const userUid = isSelf || !payload.user_id ? this.core.selfInfo.uid : await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());

View File

@@ -1,8 +1,8 @@
import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
export class GetRkey extends GetPacketStatusDepends<void, Array<any>> {
actionName = ActionName.GetRkey;
export class GetRkey extends GetPacketStatusDepends<void, Array<unknown>> {
override actionName = ActionName.GetRkey;
async _handle() {
return await this.core.apis.PacketApi.pkt.operation.FetchRkey();

View File

@@ -1,8 +1,8 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export class GetRobotUinRange extends OneBotAction<void, Array<any>> {
actionName = ActionName.GetRobotUinRange;
export class GetRobotUinRange extends OneBotAction<void, Array<unknown>> {
override actionName = ActionName.GetRobotUinRange;
async _handle() {
return await this.core.apis.UserApi.getRobotUinRange();

View File

@@ -9,8 +9,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetUserStatus extends GetPacketStatusDepends<Payload, { status: number; ext_status: number; } | undefined> {
actionName = ActionName.GetUserStatus;
payloadSchema = SchemaData;
override actionName = ActionName.GetUserStatus;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(+payload.user_id);

View File

@@ -3,6 +3,7 @@ import { ActionName } from '@/onebot/action/router';
import { checkFileExist, uriToLocalFile } from '@/common/file';
import fs from 'fs';
import { Static, Type } from '@sinclair/typebox';
import { GeneralCallResultStatus } from '@/core';
const SchemaData = Type.Object({
image: Type.String(),
@@ -10,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class OCRImageBase extends OneBotAction<Payload, any> {
payloadSchema = SchemaData;
class OCRImageBase extends OneBotAction<Payload, GeneralCallResultStatus> {
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const { path, success } = await uriToLocalFile(this.core.NapCatTempPath, payload.image);
@@ -35,9 +36,9 @@ class OCRImageBase extends OneBotAction<Payload, any> {
}
export class OCRImage extends OCRImageBase {
actionName = ActionName.OCRImage;
override actionName = ActionName.OCRImage;
}
export class IOCRImage extends OCRImageBase {
actionName = ActionName.IOCRImage;
override actionName = ActionName.IOCRImage;
}

View File

@@ -1,3 +1,4 @@
import { PacketHexStr } from '@/core/packet/transformer/base';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { ActionName } from '@/onebot/action/router';
import { Static, Type } from '@sinclair/typebox';
@@ -10,12 +11,12 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SendPacket extends GetPacketStatusDepends<Payload, any> {
payloadSchema = SchemaData;
actionName = ActionName.SendPacket;
export class SendPacket extends GetPacketStatusDepends<Payload, string | undefined> {
override payloadSchema = SchemaData;
override actionName = ActionName.SendPacket;
async _handle(payload: Payload) {
const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true';
const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: payload.data as any }, rsp);
const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: payload.data as PacketHexStr }, rsp);
return typeof data === 'object' ? data.toString('hex') : undefined;
}
}

View File

@@ -8,8 +8,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class SetGroupSignBase extends GetPacketStatusDepends<Payload, any> {
payloadSchema = SchemaData;
class SetGroupSignBase extends GetPacketStatusDepends<Payload, void> {
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.PacketApi.pkt.operation.GroupSign(+payload.group_id);
@@ -17,9 +17,9 @@ class SetGroupSignBase extends GetPacketStatusDepends<Payload, any> {
}
export class SetGroupSign extends SetGroupSignBase {
actionName = ActionName.SetGroupSign;
override actionName = ActionName.SetGroupSign;
}
export class SendGroupSign extends SetGroupSignBase {
actionName = ActionName.SendGroupSign;
override actionName = ActionName.SendGroupSign;
}

View File

@@ -10,9 +10,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SetInputStatus extends OneBotAction<Payload, any> {
actionName = ActionName.SetInputStatus;
export class SetInputStatus extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetInputStatus;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());
if (!uid) throw new Error('uid is empty');

View File

@@ -8,9 +8,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SetLongNick extends OneBotAction<Payload, any> {
actionName = ActionName.SetLongNick;
payloadSchema = SchemaData;
export class SetLongNick extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetLongNick;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.UserApi.setLongNick(payload.longNick);

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SetOnlineStatus extends OneBotAction<Payload, null> {
actionName = ActionName.SetOnlineStatus;
payloadSchema = SchemaData;
override actionName = ActionName.SetOnlineStatus;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.UserApi.setSelfOnlineStatus(

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetAvatar extends OneBotAction<Payload, null> {
actionName = ActionName.SetQQAvatar;
payloadSchema = SchemaData;
override actionName = ActionName.SetQQAvatar;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file));
if (!success) {

View File

@@ -10,9 +10,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SetSpecialTittle extends GetPacketStatusDepends<Payload, any> {
actionName = ActionName.SetSpecialTittle;
payloadSchema = SchemaData;
export class SetSpecialTittle extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.SetSpecialTittle;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());

View File

@@ -1,3 +1,4 @@
import { GeneralCallResult } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Static, Type } from '@sinclair/typebox';
@@ -10,9 +11,12 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SharePeer extends OneBotAction<Payload, any> {
actionName = ActionName.SharePeer;
payloadSchema = SchemaData;
export class SharePeer extends OneBotAction<Payload, GeneralCallResult & {
arkMsg?: string;
arkJson?: string;
}> {
override actionName = ActionName.SharePeer;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
if (payload.group_id) {
@@ -20,6 +24,7 @@ export class SharePeer extends OneBotAction<Payload, any> {
} else if (payload.user_id) {
return await this.core.apis.UserApi.getBuddyRecommendContactArkJson(payload.user_id.toString(), payload.phoneNumber);
}
throw new Error('group_id or user_id is required');
}
}
@@ -29,9 +34,9 @@ const SchemaDataGroupEx = Type.Object({
type PayloadGroupEx = Static<typeof SchemaDataGroupEx>;
export class ShareGroupEx extends OneBotAction<PayloadGroupEx, any> {
actionName = ActionName.ShareGroupEx;
payloadSchema = SchemaDataGroupEx;
export class ShareGroupEx extends OneBotAction<PayloadGroupEx, string> {
override actionName = ActionName.ShareGroupEx;
override payloadSchema = SchemaDataGroupEx;
async _handle(payload: PayloadGroupEx) {
return await this.core.apis.GroupApi.getArkJsonGroupShare(payload.group_id.toString());

View File

@@ -8,9 +8,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class TranslateEnWordToZn extends OneBotAction<Payload, Array<any> | null> {
actionName = ActionName.TranslateEnWordToZn;
payloadSchema = SchemaData;
export class TranslateEnWordToZn extends OneBotAction<Payload, Array<unknown> | null> {
override actionName = ActionName.TranslateEnWordToZn;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.SystemApi.translateEnWordToZn(payload.words);

View File

@@ -22,7 +22,7 @@ const GetFileBase_PayloadSchema = Type.Object({
export type GetFilePayload = Static<typeof GetFileBase_PayloadSchema>;
export class GetFileBase extends OneBotAction<GetFilePayload, GetFileResponse> {
payloadSchema = GetFileBase_PayloadSchema;
override payloadSchema = GetFileBase_PayloadSchema;
async _handle(payload: GetFilePayload): Promise<GetFileResponse> {
payload.file ||= payload.file_id || '';
@@ -113,5 +113,5 @@ export class GetFileBase extends OneBotAction<GetFilePayload, GetFileResponse> {
}
export default class GetFile extends GetFileBase {
actionName = ActionName.GetFile;
override actionName = ActionName.GetFile;
}

View File

@@ -15,8 +15,8 @@ interface GetGroupFileUrlResponse {
}
export class GetGroupFileUrl extends GetPacketStatusDepends<Payload, GetGroupFileUrlResponse> {
actionName = ActionName.GOCQHTTP_GetGroupFileUrl;
payloadSchema = SchemaData;
override actionName = ActionName.GOCQHTTP_GetGroupFileUrl;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id);

View File

@@ -3,5 +3,5 @@ import { ActionName } from '@/onebot/action/router';
export default class GetImage extends GetFileBase {
actionName = ActionName.GetImage;
override actionName = ActionName.GetImage;
}

View File

@@ -4,16 +4,16 @@ import { promises as fs } from 'fs';
import { decode } from 'silk-wasm';
import { FFmpegService } from '@/common/ffmpeg';
const out_format = ['mp3' , 'amr' , 'wma' , 'm4a' , 'spx' , 'ogg' , 'wav' , 'flac'];
const out_format = ['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac'];
type Payload = {
out_format : string
out_format: string
} & GetFilePayload
export default class GetRecord extends GetFileBase {
actionName = ActionName.GetRecord;
override actionName = ActionName.GetRecord;
async _handle(payload: Payload): Promise<GetFileResponse> {
override async _handle(payload: Payload): Promise<GetFileResponse> {
const res = await super._handle(payload);
if (payload.out_format && typeof payload.out_format === 'string') {
const inputFile = res.file;
@@ -27,7 +27,7 @@ export default class GetRecord extends GetFileBase {
await fs.access(inputFile);
try {
await fs.access(outputFile);
} catch (error) {
} catch {
await this.decodeFile(inputFile, pcmFile);
await FFmpegService.convertFile(pcmFile, outputFile, payload.out_format);
}

View File

@@ -8,10 +8,13 @@ const SchemaData = Type.Object({
});
type Payload = Static<typeof SchemaData>;
export class CreateGroupFileFolder extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_CreateGroupFileFolder;
payloadSchema = SchemaData;
interface ResponseType{
result:unknown;
groupItem:unknown;
}
export class CreateGroupFileFolder extends OneBotAction<Payload, ResponseType> {
override actionName = ActionName.GoCQHTTP_CreateGroupFileFolder;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return (await this.core.apis.GroupApi.creatGroupFileFolder(payload.group_id.toString(), payload.folder_name)).resultWithGroupItem;
}

View File

@@ -3,6 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { Static, Type } from '@sinclair/typebox';
import { NTQQGroupApi } from '@/core/apis';
const SchemaData = Type.Object({
group_id: Type.Union([Type.Number(), Type.String()]),
@@ -11,9 +12,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class DeleteGroupFile extends OneBotAction<Payload, any> {
actionName = ActionName.GOCQHTTP_DeleteGroupFile;
payloadSchema = SchemaData;
export class DeleteGroupFile extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFile']>>> {
override actionName = ActionName.GOCQHTTP_DeleteGroupFile;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const data = FileNapCatOneBotUUID.decodeModelId(payload.file_id);
if (!data || !data.fileId) throw new Error('Invalid file_id');

View File

@@ -1,6 +1,7 @@
import { ActionName } from '@/onebot/action/router';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { Static, Type } from '@sinclair/typebox';
import { NTQQGroupApi } from '@/core/apis';
const SchemaData = Type.Object({
group_id: Type.Union([Type.Number(), Type.String()]),
@@ -10,9 +11,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class DeleteGroupFileFolder extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder;
payloadSchema = SchemaData;
export class DeleteGroupFileFolder extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFileFolder']>>['groupFileCommonResult']> {
override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return (await this.core.apis.GroupApi.delGroupFileFolder(
payload.group_id.toString(), payload.folder ?? payload.folder_id ?? '')).groupFileCommonResult;

View File

@@ -20,8 +20,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPDownloadFile extends OneBotAction<Payload, FileResponse> {
actionName = ActionName.GoCQHTTP_DownloadFile;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_DownloadFile;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<FileResponse> {
const isRandomName = !payload.name;

View File

@@ -11,9 +11,11 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_GetForwardMsg;
payloadSchema = SchemaData;
export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, {
messages: OB11Message[] | undefined;
}> {
override actionName = ActionName.GoCQHTTP_GetForwardMsg;
override payloadSchema = SchemaData;
private createTemplateNode(message: OB11Message): OB11MessageNode {
return {
@@ -49,7 +51,7 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, any> {
return retMsg;
}
async _handle(payload: Payload): Promise<any> {
async _handle(payload: Payload) {
const msgId = payload.message_id || payload.id;
if (!msgId) {
throw new Error('message_id is required');
@@ -67,6 +69,9 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, any> {
}
const singleMsg = data.msgList[0];
if (!singleMsg) {
throw new Error('找不到相关的聊天记录');
}
const resMsg = (await this.obContext.apis.MsgApi.parseMessageV2(singleMsg))?.arrayMsg;//强制array 以便处理
if (!(resMsg?.message?.[0] as OB11MessageForward)?.data?.content) {
throw new Error('找不到相关的聊天记录');

View File

@@ -21,10 +21,10 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class GetFriendMsgHistory extends OneBotAction<Payload, Response> {
actionName = ActionName.GetFriendMsgHistory;
payloadSchema = SchemaData;
override actionName = ActionName.GetFriendMsgHistory;
override payloadSchema = SchemaData;
async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig): Promise<Response> {
async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise<Response> {
//处理参数
const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());

View File

@@ -7,10 +7,14 @@ const SchemaData = Type.Object({
});
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_GetGroupAtAllRemain;
payloadSchema = SchemaData;
interface ResponseType {
can_at_all: boolean;
remain_at_all_count_for_group: number;
remain_at_all_count_for_uin: number;
}
export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction<Payload, ResponseType> {
override actionName = ActionName.GoCQHTTP_GetGroupAtAllRemain;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.GroupApi.getGroupRemainAtTimes(payload.group_id.toString());

View File

@@ -14,15 +14,16 @@ export class GetGroupFileSystemInfo extends OneBotAction<Payload, {
used_space: number, // TODO:unimplemented, but can be implemented later
total_space: number, // unimplemented, 10 GB by default
}> {
actionName = ActionName.GoCQHTTP_GetGroupFileSystemInfo;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_GetGroupFileSystemInfo;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const groupFileCount = (await this.core.apis.GroupApi.getGroupFileCount([payload.group_id.toString()])).groupFileCounts[0];
if (!groupFileCount) {
throw new Error('Group not found');
}
return {
file_count:
(await this.core.apis.GroupApi
.getGroupFileCount([payload.group_id.toString()]))
.groupFileCounts[0],
file_count: groupFileCount,
limit_count: 10000,
used_space: 0,
total_space: 10 * 1024 * 1024 * 1024,

View File

@@ -13,9 +13,12 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupFilesByFolder extends OneBotAction<any, any> {
actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder;
payloadSchema = SchemaData;
export class GetGroupFilesByFolder extends OneBotAction<Payload, {
files: ReturnType<typeof OB11Construct.file>[],
folders: never[],
}> {
override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), {

View File

@@ -10,9 +10,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupHonorInfo extends OneBotAction<Payload, Array<any>> {
actionName = ActionName.GetGroupHonorInfo;
payloadSchema = SchemaData;
export class GetGroupHonorInfo extends OneBotAction<Payload, Array<unknown>> {
override actionName = ActionName.GetGroupHonorInfo;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
if (!payload.type) {

View File

@@ -22,10 +22,10 @@ type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction<Payload, Response> {
actionName = ActionName.GoCQHTTP_GetGroupMsgHistory;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_GetGroupMsgHistory;
override payloadSchema = SchemaData;
async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig): Promise<Response> {
async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise<Response> {
//处理参数
const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder;
const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() };

View File

@@ -16,8 +16,8 @@ export class GetGroupRootFiles extends OneBotAction<Payload, {
files: OB11GroupFile[],
folders: OB11GroupFileFolder[],
}> {
actionName = ActionName.GoCQHTTP_GetGroupRootFiles;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_GetGroupRootFiles;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), {
sortType: 1,

View File

@@ -2,10 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { sleep } from '@/common/helper';
export class GetOnlineClient extends OneBotAction<void, Array<any>> {
actionName = ActionName.GetOnlineClient;
async _handle(payload: void) {
export class GetOnlineClient extends OneBotAction<void, Array<void>> {
override actionName = ActionName.GetOnlineClient;
async _handle() {
//注册监听
this.core.apis.SystemApi.getOnlineDev();
await sleep(500);

View File

@@ -11,10 +11,10 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPGetStrangerInfo extends OneBotAction<Payload, OB11User> {
actionName = ActionName.GoCQHTTP_GetStrangerInfo;
payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<OB11User> {
export default class GoCQHTTPGetStrangerInfo extends OneBotAction<Payload, OB11User & { uid: string }> {
override actionName = ActionName.GoCQHTTP_GetStrangerInfo;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const user_id = payload.user_id.toString();
const extendData = await this.core.apis.UserApi.getUserDetailInfoByUin(user_id);
let uid = (await this.core.apis.UserApi.getUidByUinV2(user_id));
@@ -28,7 +28,7 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction<Payload, OB11U
...extendData.detail.simpleInfo.status ?? {},
user_id: parseInt(extendData.detail.uin) ?? 0,
uid: info.uid ?? uid,
nickname: extendData.detail.simpleInfo.coreInfo.nick,
nickname: extendData.detail.simpleInfo.coreInfo.nick ?? '',
age: extendData.detail.simpleInfo.baseInfo.age ?? info.age,
qid: extendData.detail.simpleInfo.baseInfo.qid,
qqLevel: calcQQLevel(extendData.detail.commonExt?.qqLevel ?? info.qqLevel),

View File

@@ -8,11 +8,11 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPCheckUrlSafely extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_CheckUrlSafely;
payloadSchema = SchemaData;
export class GoCQHTTPCheckUrlSafely extends OneBotAction<Payload, { level: number }> {
override actionName = ActionName.GoCQHTTP_CheckUrlSafely;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
async _handle() {
return { level: 1 };
}
}

View File

@@ -11,9 +11,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPDeleteFriend extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_DeleteFriend;
payloadSchema = SchemaData;
export class GoCQHTTPDeleteFriend extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GoCQHTTP_DeleteFriend;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const uin = payload.friend_id ?? payload.user_id ?? '';

View File

@@ -3,14 +3,19 @@ import { ActionName } from '@/onebot/action/router';
import { Static, Type } from '@sinclair/typebox';
const SchemaData = Type.Object({
model: Type.String(),
model: Type.String(),
});
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPGetModelShow extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_GetModelShow;
payloadSchema = SchemaData;
export class GoCQHTTPGetModelShow extends OneBotAction<Payload, Array<{
variants: {
model_show: string;
need_pay: boolean;
}
}>> {
override actionName = ActionName.GoCQHTTP_GetModelShow;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
if (!payload.model) {

View File

@@ -1,10 +1,10 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
//兼容性代码
export class GoCQHTTPSetModelShow extends OneBotAction<void, any> {
actionName = ActionName.GoCQHTTP_SetModelShow;
export class GoCQHTTPSetModelShow extends OneBotAction<void, void> {
override actionName = ActionName.GoCQHTTP_SetModelShow;
async _handle(payload: void) {
return null;
async _handle() {
return;
}
}

View File

@@ -8,7 +8,7 @@ interface Payload {
}
export class GoCQHTTPHandleQuickAction extends OneBotAction<Payload, null> {
actionName = ActionName.GoCQHTTP_HandleQuickAction;
override actionName = ActionName.GoCQHTTP_HandleQuickAction;
async _handle(payload: Payload): Promise<null> {
this.obContext.apis.QuickActionApi

View File

@@ -1,21 +1,26 @@
import SendMsg, { normalize } from '@/onebot/action/msg/SendMsg';
import { normalize, SendMsgBase } from '@/onebot/action/msg/SendMsg';
import { OB11PostSendMsg } from '@/onebot/types';
import { ActionName } from '@/onebot/action/router';
// 未验证
export class GoCQHTTPSendForwardMsg extends SendMsg {
actionName = ActionName.GoCQHTTP_SendForwardMsg;
protected async check(payload: OB11PostSendMsg) {
export class GoCQHTTPSendForwardMsgBase extends SendMsgBase {
protected override async check(payload: OB11PostSendMsg) {
if (payload.messages) payload.message = normalize(payload.messages);
return super.check(payload);
}
}
export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase {
override actionName = ActionName.GoCQHTTP_SendForwardMsg;
export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsg {
actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg;
protected override async check(payload: OB11PostSendMsg) {
if (payload.messages) payload.message = normalize(payload.messages);
return super.check(payload);
}
}
export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase {
override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg;
}
export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsg {
actionName = ActionName.GoCQHTTP_SendGroupForwardMsg;
export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsgBase {
override actionName = ActionName.GoCQHTTP_SendGroupForwardMsg;
}

View File

@@ -18,8 +18,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SendGroupNotice extends OneBotAction<Payload, null> {
actionName = ActionName.GoCQHTTP_SendGroupNotice;
override actionName = ActionName.GoCQHTTP_SendGroupNotice;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
let UploadImage: { id: string, width: number, height: number } | undefined = undefined;

View File

@@ -3,6 +3,7 @@ import { ActionName } from '@/onebot/action/router';
import { checkFileExistV2, uriToLocalFile } from '@/common/file';
import { Static, Type } from '@sinclair/typebox';
import fs from 'node:fs/promises';
import { GeneralCallResult } from '@/core';
const SchemaData = Type.Object({
file: Type.String(),
group_id: Type.Union([Type.Number(), Type.String()])
@@ -10,11 +11,11 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupPortrait extends OneBotAction<Payload, any> {
actionName = ActionName.SetGroupPortrait;
payloadSchema = SchemaData;
export default class SetGroupPortrait extends OneBotAction<Payload, GeneralCallResult> {
override actionName = ActionName.SetGroupPortrait;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<any> {
async _handle(payload: Payload): Promise<GeneralCallResult> {
const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file));
if (!success) {
throw new Error(`头像${payload.file}设置失败,file字段可能格式不正确`);

View File

@@ -1,3 +1,4 @@
import { NTQQUserApi } from '@/core/apis';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Static, Type } from '@sinclair/typebox';
@@ -9,10 +10,9 @@ const SchemaData = Type.Object({
});
type Payload = Static<typeof SchemaData>;
export class SetQQProfile extends OneBotAction<Payload, any> {
actionName = ActionName.SetQQProfile;
payloadSchema = SchemaData;
export class SetQQProfile extends OneBotAction<Payload, Awaited<ReturnType<NTQQUserApi['modifySelfProfile']>> | null> {
override actionName = ActionName.SetQQProfile;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const self = this.core.selfInfo;

View File

@@ -17,8 +17,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPUploadGroupFile extends OneBotAction<Payload, null> {
actionName = ActionName.GoCQHTTP_UploadGroupFile;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_UploadGroupFile;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
let file = payload.file;
@@ -38,7 +38,7 @@ export default class GoCQHTTPUploadGroupFile extends OneBotAction<Payload, null>
deleteAfterSentFiles: []
};
const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name, payload.folder ?? payload.folder_id);
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(peer, [sendFileEle], msgContext.deleteAfterSentFiles, true);
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(peer, [sendFileEle], msgContext.deleteAfterSentFiles);
return null;
}
}

View File

@@ -16,8 +16,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPUploadPrivateFile extends OneBotAction<Payload, null> {
actionName = ActionName.GOCQHTTP_UploadPrivateFile;
payloadSchema = SchemaData;
override actionName = ActionName.GOCQHTTP_UploadPrivateFile;
override payloadSchema = SchemaData;
async getPeer(payload: Payload): Promise<Peer> {
if (payload.user_id) {
@@ -43,13 +43,12 @@ export default class GoCQHTTPUploadPrivateFile extends OneBotAction<Payload, nul
const msgContext: SendMessageContext = {
peer: await createContext(this.core, {
user_id: payload.user_id.toString(),
group_id: undefined,
user_id: payload.user_id.toString()
}, ContextMode.Private),
deleteAfterSentFiles: []
};
const sendFileEle: SendFileElement = await this.core.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name);
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], msgContext.deleteAfterSentFiles, true);
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], msgContext.deleteAfterSentFiles);
return null;
}
}

View File

@@ -8,12 +8,11 @@ const SchemaData = Type.Object({
});
type Payload = Static<typeof SchemaData>;
export default class DelEssenceMsg extends OneBotAction<Payload, unknown> {
override actionName = ActionName.DelEssenceMsg;
override payloadSchema = SchemaData;
export default class DelEssenceMsg extends OneBotAction<Payload, any> {
actionName = ActionName.DelEssenceMsg;
payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<any> {
async _handle(payload: Payload): Promise<unknown> {
const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id);
if (!msg) {
const data = this.core.apis.GroupApi.essenceLRU.getValue(+payload.message_id);

View File

@@ -9,9 +9,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class DelGroupNotice extends OneBotAction<Payload, any> {
actionName = ActionName.DelGroupNotice;
payloadSchema = SchemaData;
export class DelGroupNotice extends OneBotAction<Payload, void> {
override actionName = ActionName.DelGroupNotice;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const group = payload.group_id.toString();

View File

@@ -12,11 +12,14 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetAiRecord extends GetPacketStatusDepends<Payload, string> {
actionName = ActionName.GetAiRecord;
payloadSchema = SchemaData;
override actionName = ActionName.GetAiRecord;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const rawRsp = await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound);
if (!rawRsp.msgInfoBody[0]) {
throw new Error('No voice data');
}
return await this.core.apis.PacketApi.pkt.operation.GetGroupPttUrl(+payload.group_id, rawRsp.msgInfoBody[0].index);
}
}

View File

@@ -12,9 +12,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupEssence extends OneBotAction<Payload, any> {
actionName = ActionName.GoCQHTTP_GetEssenceMsg;
payloadSchema = SchemaData;
export class GetGroupEssence extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GoCQHTTP_GetEssenceMsg;
override payloadSchema = SchemaData;
private async msgSeqToMsgId(peer: Peer, msgSeq: string, msgRandom: string) {
const replyMsgList = (await this.core.apis.MsgApi.getMsgsBySeqAndCount(peer, msgSeq, 1, true, true)).msgList.find((msg) => msg.msgSeq === msgSeq && msg.msgRandom === msgRandom);
@@ -27,7 +27,7 @@ export class GetGroupEssence extends OneBotAction<Payload, any> {
};
}
async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig) {
async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig) {
const msglist = (await this.core.apis.WebApi.getGroupEssenceMsgAll(payload.group_id.toString())).flatMap((e) => e.data.msg_list);
if (!msglist) {
throw new Error('获取失败');
@@ -58,7 +58,9 @@ export class GetGroupEssence extends OneBotAction<Payload, any> {
});
const hash = crypto.createHash('md5').update(msgTempData).digest();
//设置第一个bit为0 保证shortId为正数
hash[0] &= 0x7f;
if(hash[0]){
hash[0] &= 0x7f;
}
const shortId = hash.readInt32BE(0);
this.core.apis.GroupApi.essenceLRU.set(shortId, msgTempData);
return {

View File

@@ -9,7 +9,7 @@ interface RetData {
}
export class GetGroupIgnoredNotifies extends OneBotAction<void, RetData> {
actionName = ActionName.GetGroupIgnoredNotifies;
override actionName = ActionName.GetGroupIgnoredNotifies;
async _handle(): Promise<RetData> {
const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50);

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class GetGroupInfo extends OneBotAction<Payload, OB11Group> {
actionName = ActionName.GetGroupInfo;
payloadSchema = SchemaData;
override actionName = ActionName.GetGroupInfo;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const group = (await this.core.apis.GroupApi.getGroups()).find(e => e.groupCode == payload.group_id.toString());

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class GetGroupList extends OneBotAction<Payload, OB11Group[]> {
actionName = ActionName.GetGroupList;
payloadSchema = SchemaData;
override actionName = ActionName.GetGroupList;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return OB11Construct.groups(

View File

@@ -13,8 +13,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class GetGroupMemberInfo extends OneBotAction<Payload, OB11GroupMember> {
actionName = ActionName.GetGroupMemberInfo;
payloadSchema = SchemaData;
override actionName = ActionName.GetGroupMemberInfo;
override payloadSchema = SchemaData;
private parseBoolean(value: boolean | string): boolean {
return typeof value === 'string' ? value === 'true' : value;

View File

@@ -13,8 +13,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupMemberList extends OneBotAction<Payload, OB11GroupMember[]> {
actionName = ActionName.GetGroupMemberList;
payloadSchema = SchemaData;
override actionName = ActionName.GetGroupMemberList;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const groupIdStr = payload.group_id.toString();

View File

@@ -25,8 +25,8 @@ type Payload = Static<typeof SchemaData>;
type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed;
export class GetGroupNotice extends OneBotAction<Payload, GroupNotice[]> {
actionName = ActionName.GoCQHTTP_GetGroupNotice;
payloadSchema = SchemaData;
override actionName = ActionName.GoCQHTTP_GetGroupNotice;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const group = payload.group_id.toString();
@@ -36,6 +36,9 @@ export class GetGroupNotice extends OneBotAction<Payload, GroupNotice[]> {
}
const retNotices: GroupNotice[] = new Array<ApiGroupNotice>();
for (const key in ret.feeds) {
if (!ret.feeds[key]) {
continue;
}
const retApiNotice: WebApiGroupNoticeFeed = ret.feeds[key];
const retNotice: GroupNotice = {
notice_id: retApiNotice.fid,

View File

@@ -1,3 +1,4 @@
import { ShutUpGroupMember } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Static, Type } from '@sinclair/typebox';
@@ -8,9 +9,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetGroupShutList extends OneBotAction<Payload, any> {
actionName = ActionName.GetGroupShutList;
payloadSchema = SchemaData;
export class GetGroupShutList extends OneBotAction<Payload, ShutUpGroupMember[]> {
override actionName = ActionName.GetGroupShutList;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.GroupApi.getGroupShutUpMemberList(payload.group_id.toString());

View File

@@ -9,9 +9,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GroupPoke extends GetPacketStatusDepends<Payload, any> {
actionName = ActionName.GroupPoke;
payloadSchema = SchemaData;
export class GroupPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.GroupPoke;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
await this.core.apis.PacketApi.pkt.operation.GroupPoke(+payload.group_id, +payload.user_id);

View File

@@ -1,7 +1,5 @@
import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { uriToLocalFile } from '@/common/file';
import { ChatType, Peer } from '@/core';
import { AIVoiceChatType } from '@/core/packet/entities/aiChat';
import { Static, Type } from '@sinclair/typebox';
@@ -17,8 +15,8 @@ type Payload = Static<typeof SchemaData>;
export class SendGroupAiRecord extends GetPacketStatusDepends<Payload, {
message_id: number
}> {
actionName = ActionName.SendGroupAiRecord;
payloadSchema = SchemaData;
override actionName = ActionName.SendGroupAiRecord;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound);

View File

@@ -4,10 +4,10 @@ import { OB11PostSendMsg } from '@/onebot/types';
// 未检测参数
class SendGroupMsg extends SendMsgBase {
actionName = ActionName.SendGroupMsg;
contextMode: ContextMode = ContextMode.Group;
override actionName = ActionName.SendGroupMsg;
override contextMode: ContextMode = ContextMode.Group;
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
protected override async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
delete payload.user_id;
payload.message_type = 'group';
return super.check(payload);

View File

@@ -9,11 +9,11 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetEssenceMsg extends OneBotAction<Payload, any> {
actionName = ActionName.SetEssenceMsg;
payloadSchema = SchemaData;
export default class SetEssenceMsg extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetEssenceMsg;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<any> {
async _handle(payload: Payload) {
const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id);
if (!msg) {
throw new Error('msg not found');

View File

@@ -12,8 +12,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupAddRequest extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupAddRequest;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupAddRequest;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const flag = payload.flag.toString();

View File

@@ -12,8 +12,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupAdmin extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupAdmin;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupAdmin;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const enable = typeof payload.enable === 'string' ? payload.enable === 'true' : !!payload.enable;

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupBan extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupBan;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupBan;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupCard extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupCard;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupCard;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const member = await this.core.apis.GroupApi.getGroupMember(payload.group_id.toString(), payload.user_id.toString());

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupKick extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupKick;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupKick;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const rejectReq = payload.reject_add_request?.toString() == 'true';

View File

@@ -9,11 +9,11 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupLeave extends OneBotAction<Payload, any> {
actionName = ActionName.SetGroupLeave;
payloadSchema = SchemaData;
export default class SetGroupLeave extends OneBotAction<Payload, void> {
override actionName = ActionName.SetGroupLeave;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<any> {
async _handle(payload: Payload): Promise<void> {
await this.core.apis.GroupApi.quitGroup(payload.group_id.toString());
}
}

View File

@@ -11,8 +11,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupName extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupName;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupName;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const ret = await this.core.apis.GroupApi.setGroupName(payload.group_id.toString(), payload.group_name);

View File

@@ -10,8 +10,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export default class SetGroupWholeBan extends OneBotAction<Payload, null> {
actionName = ActionName.SetGroupWholeBan;
payloadSchema = SchemaData;
override actionName = ActionName.SetGroupWholeBan;
override payloadSchema = SchemaData;
async _handle(payload: Payload): Promise<null> {
const enable = payload.enable?.toString() !== 'false';

View File

@@ -1,10 +1,10 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export class GetGuildList extends OneBotAction<null, null> {
actionName = ActionName.GetGuildList;
export class GetGuildList extends OneBotAction<void, void> {
override actionName = ActionName.GetGuildList;
async _handle(payload: null): Promise<null> {
return null;
async _handle(): Promise<void> {
return;
}
}

View File

@@ -1,10 +1,10 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export class GetGuildProfile extends OneBotAction<null, null> {
actionName = ActionName.GetGuildProfile;
export class GetGuildProfile extends OneBotAction<void, void> {
override actionName = ActionName.GetGuildProfile;
async _handle(payload: null): Promise<null> {
return null;
async _handle(): Promise<void> {
return;
}
}

View File

@@ -8,7 +8,6 @@ import SendGroupMsg from './group/SendGroupMsg';
import SendPrivateMsg from './msg/SendPrivateMsg';
import SendMsg from './msg/SendMsg';
import DeleteMsg from './msg/DeleteMsg';
import { OneBotAction } from '@/onebot/action/OneBotAction';
import GetVersionInfo from './system/GetVersionInfo';
import CanSendRecord from './system/CanSendRecord';
import CanSendImage from './system/CanSendImage';
@@ -239,10 +238,11 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo
_map.set(`${h.actionName}_rate_limited` as keyof MapType, h);
});
function get<K extends keyof MapType>(key: K): MapType[K];
function get<K extends keyof MapType>(key: K): null;
function get<K extends keyof MapType>(key: K): HandlerUnion | null | MapType[K] {
return _map.get(key as keyof MapType) ?? null;
// function get<K extends keyof MapType>(key: K): MapType[K];
// function get<K extends keyof MapType>(key: K): null;
// function get<K extends keyof MapType>(key: K): HandlerUnion | null | MapType[K]
function get<K extends keyof MapType>(key: K): MapType[K] | undefined {
return _map.get(key as keyof MapType) as MapType[K] | undefined;
}
return { get };

View File

@@ -10,8 +10,8 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class DeleteMsg extends OneBotAction<Payload, void> {
actionName = ActionName.DeleteMsg;
payloadSchema = SchemaData;
override actionName = ActionName.DeleteMsg;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const msg = MessageUnique.getMsgIdAndPeerByShortId(Number(payload.message_id));

View File

@@ -42,11 +42,11 @@ class ForwardSingleMsg extends OneBotAction<Payload, null> {
}
export class ForwardFriendSingleMsg extends ForwardSingleMsg {
payloadSchema = SchemaData;
actionName = ActionName.ForwardFriendSingleMsg;
override payloadSchema = SchemaData;
override actionName = ActionName.ForwardFriendSingleMsg;
}
export class ForwardGroupSingleMsg extends ForwardSingleMsg {
payloadSchema = SchemaData;
actionName = ActionName.ForwardGroupSingleMsg;
override payloadSchema = SchemaData;
override actionName = ActionName.ForwardGroupSingleMsg;
}

View File

@@ -15,11 +15,10 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
class GetMsg extends OneBotAction<Payload, OB11Message> {
actionName = ActionName.GetMsg;
payloadSchema = SchemaData;
override actionName = ActionName.GetMsg;
override payloadSchema = SchemaData;
async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig) {
// log("history msg ids", Object.keys(msgHistory));
async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig) {
if (!payload.message_id) {
throw Error('参数message_id不能为空');
}
@@ -30,19 +29,20 @@ class GetMsg extends OneBotAction<Payload, OB11Message> {
}
const peer = { guildId: '', peerUid: msgIdWithPeer?.Peer.peerUid, chatType: msgIdWithPeer.Peer.chatType };
const orimsg = this.obContext.recallMsgCache.get(msgIdWithPeer.MsgId);
let msg: RawMessage;
let msg: RawMessage|undefined;
if (orimsg) {
msg = orimsg;
} else {
msg = (await this.core.apis.MsgApi.getMsgsByMsgId(peer, [msgIdWithPeer?.MsgId || payload.message_id.toString()])).msgList[0];
}
if (!msg) throw Error('消息不存在');
const retMsg = await this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat);
if (!retMsg) throw Error('消息为空');
try {
retMsg.message_id = MessageUnique.createUniqueMsgId(peer, msg.msgId)!;
retMsg.message_seq = retMsg.message_id;
retMsg.real_id = retMsg.message_id;
} catch (e) {
} catch {
// ignored
}
return retMsg;

View File

@@ -49,21 +49,21 @@ class MarkMsgAsRead extends OneBotAction<PlayloadType, null> {
// 以下为非标准实现
export class MarkPrivateMsgAsRead extends MarkMsgAsRead {
payloadSchema = SchemaData;
actionName = ActionName.MarkPrivateMsgAsRead;
override payloadSchema = SchemaData;
override actionName = ActionName.MarkPrivateMsgAsRead;
}
export class MarkGroupMsgAsRead extends MarkMsgAsRead {
payloadSchema = SchemaData;
actionName = ActionName.MarkGroupMsgAsRead;
override payloadSchema = SchemaData;
override actionName = ActionName.MarkGroupMsgAsRead;
}
export class GoCQHTTPMarkMsgAsRead extends MarkMsgAsRead {
actionName = ActionName.GoCQHTTP_MarkMsgAsRead;
override actionName = ActionName.GoCQHTTP_MarkMsgAsRead;
}
export class MarkAllMsgAsRead extends OneBotAction<any, null> {
actionName = ActionName._MarkAllMsgAsRead;
export class MarkAllMsgAsRead extends OneBotAction<void, null> {
override actionName = ActionName._MarkAllMsgAsRead;
async _handle(): Promise<null> {
await this.core.apis.MsgApi.markAllMsgAsRead();

View File

@@ -36,10 +36,10 @@ export function normalize(message: OB11MessageMixType, autoEscape = false): OB11
) : Array.isArray(message) ? message : [message];
}
export async function createContext(core: NapCatCore, payload: OB11PostContext, contextMode: ContextMode): Promise<Peer> {
// This function determines the type of message by the existence of user_id / group_id,
// not message_type.
// This redundant design of Ob11 here should be blamed.
export async function createContext(core: NapCatCore, payload: OB11PostContext | undefined, contextMode: ContextMode = ContextMode.Normal): Promise<Peer> {
if (!payload) {
throw new Error('请指定 group_id 或 user_id');
}
if ((contextMode === ContextMode.Group || contextMode === ContextMode.Normal) && payload.group_id) {
return {
chatType: ChatType.KCHATTYPEGROUP,
@@ -91,7 +91,7 @@ function getSpecialMsgNum(payload: OB11PostSendMsg, msgType: OB11MessageDataType
export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
contextMode = ContextMode.Normal;
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
protected override async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
const messages = normalize(payload.message);
const nodeElementLength = getSpecialMsgNum(payload, OB11MessageDataType.node);
if (nodeElementLength > 0 && nodeElementLength != messages.length) {
@@ -121,8 +121,8 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
returnMsgAndResId = packetMode
? await this.handleForwardedNodesPacket(peer, messages as OB11MessageNode[], payload.source, payload.news, payload.summary, payload.prompt)
: await this.handleForwardedNodes(peer, messages as OB11MessageNode[]);
} catch (e: any) {
throw Error(packetMode ? `发送伪造合并转发消息失败: ${e?.stack}` : `发送合并转发消息失败: ${e?.stack}`);
} catch (e: unknown) {
throw Error(packetMode ? `发送伪造合并转发消息失败: ${(e as Error)?.stack}` : `发送合并转发消息失败: ${(e as Error)?.stack}`);
}
if (!returnMsgAndResId) {
throw Error('发送合并转发消息失败returnMsgAndResId 为空!');
@@ -133,7 +133,7 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
peerUid: peer.peerUid,
chatType: peer.chatType,
}, (returnMsgAndResId.message).msgId);
return { message_id: msgShortId!, res_id: returnMsgAndResId.res_id };
return { message_id: msgShortId!, res_id: returnMsgAndResId.res_id! };
} else if (returnMsgAndResId.res_id && !returnMsgAndResId.message) {
throw Error(`发送转发消息res_id${returnMsgAndResId.res_id} 失败`);
}
@@ -185,7 +185,7 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
const packetMsgElements: rawMsgWithSendMsg = {
senderUin: Number((node.data.user_id ?? node.data.uin) ?? parentMeta?.user_id) || +this.core.selfInfo.uin,
senderName: (node.data.nickname || node.data.name) ?? parentMeta?.nickname ?? 'QQ用户',
groupId: msgPeer.chatType === ChatType.KCHATTYPEGROUP ? +msgPeer.peerUid : undefined,
groupId: msgPeer.chatType === ChatType.KCHATTYPEGROUP ? +msgPeer.peerUid : 0,
time: Number(node.data.time) || Date.now(),
msg: sendElements,
};
@@ -202,10 +202,12 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
}
const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(nodeMsg.Peer, [nodeMsg.MsgId])).msgList[0];
this.core.context.logger.logDebug(`handleForwardedNodesPacket[PureRaw] 开始转换 ${stringifyWithBigInt(msg)}`);
await this.core.apis.FileApi.downloadRawMsgMedia([msg]);
const transformedMsg = this.core.apis.PacketApi.pkt.msgConverter.rawMsgToPacketMsg(msg, msgPeer);
this.core.context.logger.logDebug(`handleForwardedNodesPacket[PureRaw] 转换为 ${stringifyWithBigInt(transformedMsg)}`);
packetMsg.push(transformedMsg);
if (msg) {
await this.core.apis.FileApi.downloadRawMsgMedia([msg]);
const transformedMsg = this.core.apis.PacketApi.pkt.msgConverter.rawMsgToPacketMsg(msg, msgPeer);
this.core.context.logger.logDebug(`handleForwardedNodesPacket[PureRaw] 转换为 ${stringifyWithBigInt(transformedMsg)}`);
packetMsg.push(transformedMsg);
}
} else {
this.core.context.logger.logDebug(`handleForwardedNodesPacket 跳过元素 ${stringifyWithBigInt(node)}`);
}
@@ -238,8 +240,8 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
const res_id = uploadReturnData?.res_id;
const finallySendElements = uploadReturnData?.finallySendElements;
if (!finallySendElements) throw Error('转发消息失败,生成节点为空');
const returnMsg = await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(msgPeer, [finallySendElements], [], true).catch(_ => undefined);
return { message: returnMsg ?? null, res_id };
const returnMsg = await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(msgPeer, [finallySendElements], []).catch(() => undefined);
return { message: returnMsg ?? null, res_id: res_id! };
}
private async handleForwardedNodes(destPeer: Peer, messageNodes: OB11MessageNode[]): Promise<{
@@ -297,7 +299,7 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
const AllElement: SendMessageElement[][] = [MixElement, ...SingleElement].filter(e => e !== undefined && e.length !== 0);
const MsgNodeList: Promise<RawMessage | undefined>[] = [];
for (const sendElementsSplitElement of AllElement) {
MsgNodeList.push(this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(selfPeer, sendElementsSplitElement, [], true).catch(_ => undefined));
MsgNodeList.push(this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(selfPeer, sendElementsSplitElement, []).catch(() => undefined));
}
(await Promise.allSettled(MsgNodeList)).map((result) => {
if (result.status === 'fulfilled' && result.value) {
@@ -305,8 +307,8 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
MessageUnique.createUniqueMsgId(selfPeer, result.value.msgId);
}
});
} catch (e: any) {
this.core.context.logger.logDebug('生成转发消息节点失败', e?.stack);
} catch (e: unknown) {
this.core.context.logger.logDebug('生成转发消息节点失败', (e as Error).stack);
}
}
}
@@ -321,11 +323,13 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
continue;
}
const nodeMsg = (await this.core.apis.MsgApi.getMsgsByMsgId(nodeMsgPeer.Peer, [msgId])).msgList[0];
srcPeer = srcPeer ?? { chatType: nodeMsg.chatType, peerUid: nodeMsg.peerUid };
if (srcPeer.peerUid !== nodeMsg.peerUid) {
needSendSelf = true;
if (nodeMsg) {
srcPeer = srcPeer ?? { chatType: nodeMsg.chatType, peerUid: nodeMsg.peerUid };
if (srcPeer.peerUid !== nodeMsg.peerUid) {
needSendSelf = true;
}
nodeMsgArray.push(nodeMsg);
}
nodeMsgArray.push(nodeMsg);
}
nodeMsgIds = nodeMsgArray.map(msg => msg.msgId);
let retMsgIds: string[] = [];
@@ -347,8 +351,8 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
return {
message: await this.core.apis.MsgApi.multiForwardMsg(srcPeer!, destPeer, retMsgIds)
};
} catch (e: any) {
this.core.context.logger.logError('forward failed', e?.stack);
} catch (e: unknown) {
this.core.context.logger.logError('forward failed', (e as Error)?.stack);
return {
message: null
};
@@ -371,13 +375,13 @@ export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
this.core.context.logger.logDebug('需要clone的消息无法解析将会忽略掉', msg);
}
try {
return await this.core.apis.MsgApi.sendMsg(selfPeer, sendElements, true);
} catch (e: any) {
this.core.context.logger.logError(e?.stack, '克隆转发消息失败,将忽略本条消息', msg);
return await this.core.apis.MsgApi.sendMsg(selfPeer, sendElements);
} catch (e: unknown) {
this.core.context.logger.logError((e as Error)?.stack, '克隆转发消息失败,将忽略本条消息', msg);
}
return;
}
}
export default class SendMsg extends SendMsgBase {
actionName = ActionName.SendMsg;
override actionName = ActionName.SendMsg;
}

View File

@@ -4,10 +4,10 @@ import { OB11PostSendMsg } from '@/onebot/types';
// 未检测参数
class SendPrivateMsg extends SendMsgBase {
actionName = ActionName.SendPrivateMsg;
contextMode: ContextMode = ContextMode.Private;
override actionName = ActionName.SendPrivateMsg;
override contextMode: ContextMode = ContextMode.Private;
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
protected override async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
payload.message_type = 'private';
return super.check(payload);
}

View File

@@ -11,9 +11,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SetMsgEmojiLike extends OneBotAction<Payload, any> {
actionName = ActionName.SetMsgEmojiLike;
payloadSchema = SchemaData;
export class SetMsgEmojiLike extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetMsgEmojiLike;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id);
@@ -26,7 +26,7 @@ export class SetMsgEmojiLike extends OneBotAction<Payload, any> {
payload.set = payload.set ?? true;
const msgData = (await this.core.apis.MsgApi.getMsgsByMsgId(msg.Peer, [msg.MsgId])).msgList;
if (!msgData || msgData.length === 0 || !msgData[0].msgSeq) {
if (!msgData || msgData.length === 0 || !msgData[0]?.msgSeq) {
throw new Error('find msg by msgid error');
}

View File

@@ -3,7 +3,7 @@ import { ActionName, BaseCheckResult } from '@/onebot/action/router';
export abstract class GetPacketStatusDepends<PT, RT> extends OneBotAction<PT, RT> {
protected async check(payload: PT): Promise<BaseCheckResult>{
protected override async check(payload: PT): Promise<BaseCheckResult>{
if (!this.core.apis.PacketApi.available) {
return {
valid: false,
@@ -15,10 +15,10 @@ export abstract class GetPacketStatusDepends<PT, RT> extends OneBotAction<PT, RT
}
}
export class GetPacketStatus extends GetPacketStatusDepends<any, null> {
actionName = ActionName.GetPacketStatus;
export class GetPacketStatus extends GetPacketStatusDepends<void, void> {
override actionName = ActionName.GetPacketStatus;
async _handle(payload: any) {
return null;
async _handle() {
return;
}
}

View File

@@ -9,9 +9,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class SendPoke extends GetPacketStatusDepends<Payload, any> {
actionName = ActionName.SendPoke;
payloadSchema = SchemaData;
export class SendPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.SendPoke;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
if (payload.group_id) {

View File

@@ -2,15 +2,11 @@ export type BaseCheckResult = ValidCheckResult | InvalidCheckResult;
export interface ValidCheckResult {
valid: true;
[k: string | number]: any;
}
export interface InvalidCheckResult {
valid: false;
message: string;
[k: string | number]: any;
}
export const ActionName = {

View File

@@ -1,10 +1,6 @@
import { ActionName } from '@/onebot/action/router';
import CanSendRecord, { CanSend } from './CanSendRecord';
interface ReturnType {
yes: boolean;
}
import { CanSend } from './CanSendRecord';
export default class CanSendImage extends CanSend {
actionName = ActionName.CanSendImage;
override actionName = ActionName.CanSendImage;
}

View File

@@ -5,8 +5,8 @@ interface ReturnType {
yes: boolean;
}
export class CanSend extends OneBotAction<any, ReturnType> {
async _handle(_payload: void): Promise<ReturnType> {
export class CanSend extends OneBotAction<void, ReturnType> {
async _handle(): Promise<ReturnType> {
return {
yes: true,
};
@@ -15,5 +15,5 @@ export class CanSend extends OneBotAction<any, ReturnType> {
export default class CanSendRecord extends CanSend{
actionName = ActionName.CanSendRecord;
override actionName = ActionName.CanSendRecord;
}

View File

@@ -1,10 +1,10 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export class GetCSRF extends OneBotAction<any, any> {
actionName = ActionName.GetCSRF;
export class GetCSRF extends OneBotAction<void, { token: number }> {
override actionName = ActionName.GetCSRF;
async _handle(payload: any) {
async _handle() {
const sKey = await this.core.apis.UserApi.getSKey();
if (!sKey) {
throw new Error('SKey is undefined');

View File

@@ -15,14 +15,14 @@ type Payload = Static<typeof SchemaData>;
export class GetCredentials extends OneBotAction<Payload, Response> {
actionName = ActionName.GetCredentials;
payloadSchema = SchemaData;
override actionName = ActionName.GetCredentials;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const cookiesObject = await this.core.apis.UserApi.getCookies(payload.domain);
//把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起
const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; ');
const bkn = cookiesObject?.skey ? this.core.apis.WebApi.getBknFromCookie(cookiesObject) : '';
const bkn = cookiesObject?.['skey'] ? this.core.apis.WebApi.getBknFromCookie(cookiesObject) : '';
return { cookies: cookies, token: +bkn };
}
}

View File

@@ -4,9 +4,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
class GetLoginInfo extends OneBotAction<null, OB11User> {
actionName = ActionName.GetLoginInfo;
override actionName = ActionName.GetLoginInfo;
async _handle(payload: null) {
async _handle() {
return OB11Construct.selfInfo(this.core.selfInfo);
}
}

View File

@@ -1,10 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
export default class GetStatus extends OneBotAction<any, any> {
actionName = ActionName.GetStatus;
interface ResponseType{
online: boolean;
good: boolean;
stat: unknown;
}
export default class GetStatus extends OneBotAction<void, ResponseType> {
override actionName = ActionName.GetStatus;
async _handle(payload: any): Promise<any> {
async _handle(): Promise<ResponseType> {
return {
online: !!this.core.selfInfo.online,
good: true,

View File

@@ -9,7 +9,7 @@ interface RetData {
}
export class GetGroupSystemMsg extends OneBotAction<void, RetData> {
actionName = ActionName.GetGroupSystemMsg;
override actionName = ActionName.GetGroupSystemMsg;
async _handle(): Promise<RetData> {
const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50);

View File

@@ -1,12 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { napCatVersion } from '@/common/version';
interface ResponseType {
app_name: string;
protocol_version: string;
app_version: string;
}
export default class GetVersionInfo extends OneBotAction<void, ResponseType> {
override actionName = ActionName.GetVersionInfo;
export default class GetVersionInfo extends OneBotAction<any, any> {
actionName = ActionName.GetVersionInfo;
async _handle(payload: any): Promise<any> {
async _handle(): Promise<ResponseType> {
return {
app_name: 'NapCat.Onebot',
protocol_version: 'v11',

View File

@@ -8,9 +8,9 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class FriendPoke extends GetPacketStatusDepends<Payload, any> {
actionName = ActionName.FriendPoke;
payloadSchema = SchemaData;
export class FriendPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.FriendPoke;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
await this.core.apis.PacketApi.pkt.operation.FriendPoke(+payload.user_id);

View File

@@ -13,14 +13,14 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>;
export class GetCookies extends OneBotAction<Payload, Response> {
actionName = ActionName.GetCookies;
payloadSchema = SchemaData;
override actionName = ActionName.GetCookies;
override payloadSchema = SchemaData;
async _handle(payload: Payload) {
const cookiesObject = await this.core.apis.UserApi.getCookies(payload.domain);
//把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起
const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; ');
const bkn = cookiesObject?.skey ? this.core.apis.WebApi.getBknFromCookie(cookiesObject) : '';
const bkn = cookiesObject?.['skey'] ? this.core.apis.WebApi.getBknFromCookie(cookiesObject) : '';
return { cookies, bkn };
}
}

Some files were not shown because too many files have changed in this diff Show More