diff --git a/src/common/event.ts b/src/common/event.ts index bb4e5945..98686a5b 100644 --- a/src/common/event.ts +++ b/src/common/event.ts @@ -9,6 +9,15 @@ interface InternalMapKey { checker: ((...args: any[]) => boolean) | undefined; } +type EnsureFunc = T extends (...args: any) => any ? T : never; + +type FuncKeys = Extract< + { + [K in keyof T]: EnsureFunc extends never ? never : K; + }[keyof T], + string +>; + export type ListenerClassBase = Record; export class NTEventWrapper { @@ -43,10 +52,8 @@ export class NTEventWrapper { createEventFunction< Service extends keyof ServiceNamingMapping, - ServiceMethod extends Exclude, - // eslint-disable-next-line - // @ts-ignore - T extends (...args: any) => any = ServiceNamingMapping[Service][ServiceMethod], + ServiceMethod extends FuncKeys, + T extends (...args: any) => any = EnsureFunc, >(eventName: `${Service}/${ServiceMethod}`): T | undefined { const eventNameArr = eventName.split('/'); type eventType = { @@ -98,10 +105,8 @@ export class NTEventWrapper { async callNoListenerEvent< Service extends keyof ServiceNamingMapping, - ServiceMethod extends Exclude, - // eslint-disable-next-line - // @ts-ignore - EventType extends (...args: any) => any = ServiceNamingMapping[Service][ServiceMethod], + ServiceMethod extends FuncKeys, + EventType extends (...args: any) => any = EnsureFunc, >( serviceAndMethod: `${Service}/${ServiceMethod}`, ...args: Parameters @@ -111,10 +116,8 @@ export class NTEventWrapper { async registerListen< Listener extends keyof ListenerNamingMapping, - ListenerMethod extends Exclude, - // eslint-disable-next-line - // @ts-ignore - ListenerType extends (...args: any) => any = ListenerNamingMapping[Listener][ListenerMethod], + ListenerMethod extends FuncKeys, + ListenerType extends (...args: any) => any = EnsureFunc, >( listenerAndMethod: `${Listener}/${ListenerMethod}`, waitTimes = 1, @@ -164,15 +167,11 @@ export class NTEventWrapper { async callNormalEventV2< Service extends keyof ServiceNamingMapping, - ServiceMethod extends Exclude, + ServiceMethod extends FuncKeys, Listener extends keyof ListenerNamingMapping, - ListenerMethod extends Exclude, - // eslint-disable-next-line - // @ts-ignore - EventType extends (...args: any) => any = ServiceNamingMapping[Service][ServiceMethod], - // eslint-disable-next-line - // @ts-ignore - ListenerType extends (...args: any) => any = ListenerNamingMapping[Listener][ListenerMethod] + ListenerMethod extends FuncKeys, + EventType extends (...args: any) => any = EnsureFunc, + ListenerType extends (...args: any) => any = EnsureFunc >( serviceAndMethod: `${Service}/${ServiceMethod}`, listenerAndMethod: `${Listener}/${ListenerMethod}`, diff --git a/src/common/helper.ts b/src/common/helper.ts index bc05e9e8..2d9968bb 100644 --- a/src/common/helper.ts +++ b/src/common/helper.ts @@ -52,7 +52,7 @@ export class FileNapCatOneBotUUID { const [, , chatType, peerUid, modelId, fileId, fileUUID = undefined] = data; return { peer: { - chatType: chatType as any, + chatType: +chatType, peerUid: peerUid, }, modelId, @@ -89,7 +89,7 @@ export class FileNapCatOneBotUUID { const [, , chatType, peerUid, msgId, elementId, fileUUID = undefined] = data; return { peer: { - chatType: chatType as any, + chatType: +chatType, peerUid: peerUid, }, msgId, diff --git a/src/common/message-unique.ts b/src/common/message-unique.ts index 87e2ca58..db980a94 100644 --- a/src/common/message-unique.ts +++ b/src/common/message-unique.ts @@ -23,10 +23,10 @@ export class LimitedHashTable { } while (this.keyToValue.size > this.maxSize || this.valueToKey.size > this.maxSize) { const oldestKey = this.keyToValue.keys().next().value; - // @ts-ignore - this.valueToKey.delete(this.keyToValue.get(oldestKey)!); - // @ts-ignore - this.keyToValue.delete(oldestKey); + if (oldestKey !== undefined) { + this.valueToKey.delete(this.keyToValue.get(oldestKey) as V); + this.keyToValue.delete(oldestKey); + } } } diff --git a/src/core/entities/msg.ts b/src/core/entities/msg.ts index 1a4a38ce..0a254c53 100644 --- a/src/core/entities/msg.ts +++ b/src/core/entities/msg.ts @@ -64,7 +64,7 @@ type ElementFullBase = Omit | Array> }> = {} + S extends Partial<{ [P in K]: keyof NonNullable | Array> }> = object > = { [P in K]: S[P] extends Array diff --git a/src/core/index.ts b/src/core/index.ts index 338753f3..68d478e2 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -100,7 +100,7 @@ export class NapCatCore { if (!fs.existsSync(this.NapCatTempPath)) { fs.mkdirSync(this.NapCatTempPath, { recursive: true }); } - + this.initNapCatCoreListeners().then().catch(this.context.logger.logError.bind(this.context.logger)); this.context.logger.setFileLogEnabled( @@ -140,7 +140,7 @@ export class NapCatCore { }; //await sleep(2500); this.context.session.getMsgService().addKernelMsgListener( - proxiedListenerOf(msgListener, this.context.logger) as any, + proxiedListenerOf(msgListener, this.context.logger), ); const profileListener = new NodeIKernelProfileListener(); @@ -236,7 +236,7 @@ export class NapCatCore { } }; this.context.session.getGroupService().addKernelGroupListener( - proxiedListenerOf(groupListener, this.context.logger) as any, + proxiedListenerOf(groupListener, this.context.logger), ); } @@ -276,7 +276,7 @@ export async function genSessionConfig( d2: '', d2Key: '', machineId: '', - platform: systemPlatform, // 3是Windows? + platform: systemPlatform, // 3是Windows? platVer: systemVersion, // 系统版本号, 应该可以固定 appid: QQVersionAppid, rdeliveryConfig: { diff --git a/src/core/packet/proto/NapProto.ts b/src/core/packet/proto/NapProto.ts index ca9d7132..7a42b22f 100644 --- a/src/core/packet/proto/NapProto.ts +++ b/src/core/packet/proto/NapProto.ts @@ -61,35 +61,35 @@ export function ProtoField(no: number, type: ScalarType | (() => ProtoMessageTyp } } -type ProtoFieldReturnType = NonNullable extends ScalarProtoFieldType +type ProtoFieldReturnType = NonNullable extends ScalarProtoFieldType ? ScalarTypeToTsType : T extends NonNullable> ? NonNullable, E>> : never; -type RequiredFieldsBaseType = { +type RequiredFieldsBaseType = { [K in keyof T as T[K] extends { optional: true } ? never : LowerCamelCase]: T[K] extends { repeat: true } ? ProtoFieldReturnType[] : ProtoFieldReturnType } -type OptionalFieldsBaseType = { +type OptionalFieldsBaseType = { [K in keyof T as T[K] extends { optional: true } ? LowerCamelCase : never]?: T[K] extends { repeat: true } ? ProtoFieldReturnType[] : ProtoFieldReturnType } -type RequiredFieldsType = E extends true ? Partial> : RequiredFieldsBaseType; +type RequiredFieldsType = E extends true ? Partial> : RequiredFieldsBaseType; -type OptionalFieldsType = E extends true ? Partial> : OptionalFieldsBaseType; +type OptionalFieldsType = E extends true ? Partial> : OptionalFieldsBaseType; -type NapProtoStructType = RequiredFieldsType & OptionalFieldsType; +type NapProtoStructType = RequiredFieldsType & OptionalFieldsType; -export type NapProtoEncodeStructType = NapProtoStructType; +export type NapProtoEncodeStructType = NapProtoStructType; -export type NapProtoDecodeStructType = NapProtoStructType; +export type NapProtoDecodeStructType = NapProtoStructType; const NapProtoMsgCache = new Map>>(); diff --git a/src/core/services/NodeIKernelGroupService.ts b/src/core/services/NodeIKernelGroupService.ts index 0c4e02a4..dcc3ebab 100644 --- a/src/core/services/NodeIKernelGroupService.ts +++ b/src/core/services/NodeIKernelGroupService.ts @@ -12,13 +12,13 @@ import { import { GeneralCallResult } from '@/core/services/common'; export interface NodeIKernelGroupService { - // ---> + // ---> // 待启用 For Next Version 3.2.0 // isTroopMember ? 0 : 111 getGroupMemberMaxNum(groupCode: string, serviceType: number): Promise; getAllGroupPrivilegeFlag(troopUinList: string[], serviceType: number): Promise; - // <--- + // <--- getGroupExt0xEF0Info(enableGroupCodes: string[], bannedGroupCodes: string[], filter: GroupExt0xEF0InfoFilter, forceFetch: boolean): Promise } }>; @@ -111,7 +111,7 @@ export interface NodeIKernelGroupService { } }>; - setHeader(uid: string, path: string): unknown; + setHeader(uid: string, path: string): Promise; addKernelGroupListener(listener: NodeIKernelGroupListener): number; diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index cc1c3f23..60607d0f 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -41,7 +41,7 @@ export async function NCoreInitFramework( online: true, }); }; - loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger) as any); + loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); }); // 过早进入会导致addKernelMsgListener等Listener添加失败 // await sleep(2500); diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 07fb9bae..940e852e 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -38,11 +38,10 @@ export default class SetAvatar extends BaseAction { throw `头像${payload.file}设置失败,api无返回`; } // log(`头像设置返回:${JSON.stringify(ret)}`) - // @ts-ignore - if (ret['result'] == 1004022) { + if (ret.result as number == 1004022) { throw `头像${payload.file}设置失败,文件可能不是图片格式`; - } else if (ret['result'] != 0) { - throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}`; + } else if (ret.result != 0) { + throw `头像${payload.file}设置失败,未知的错误,${ret.result}:${ret.errMsg}`; } } else { fs.unlink(path, () => { }); diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index c7b363d1..9a68b7e0 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -31,15 +31,15 @@ export default class SetGroupPortrait extends BaseAction { } if (path) { await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断 - const ret = await this.core.apis.GroupApi.setGroupAvatar(payload.group_id.toString(), path) as any; + const ret = await this.core.apis.GroupApi.setGroupAvatar(payload.group_id.toString(), path); fs.unlink(path, () => { }); if (!ret) { throw `头像${payload.file}设置失败,api无返回`; } - if (ret['result'] == 1004022) { + if (ret.result as number == 1004022) { throw `头像${payload.file}设置失败,文件可能不是图片格式或权限不足`; - } else if (ret['result'] != 0) { - throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}`; + } else if (ret.result != 0) { + throw `头像${payload.file}设置失败,未知的错误,${ret.result}:${ret.errMsg}`; } return ret; } else { diff --git a/src/onebot/action/msg/SendMsg.ts b/src/onebot/action/msg/SendMsg.ts index fcfd5919..b46ac58d 100644 --- a/src/onebot/action/msg/SendMsg.ts +++ b/src/onebot/action/msg/SendMsg.ts @@ -236,12 +236,11 @@ export class SendMsg extends BaseAction { message: RawMessage | null, res_id?: string }> { - let returnMsg: RawMessage | undefined, res_id: string | undefined; const uploadReturnData = await this.uploadForwardedNodesPacket(msgPeer, messageNodes, source, news, summary, prompt); - res_id = uploadReturnData?.res_id; + const res_id = uploadReturnData?.res_id; const finallySendElements = uploadReturnData?.finallySendElements; if (!finallySendElements) throw Error('转发消息失败,生成节点为空'); - returnMsg = await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(msgPeer, [finallySendElements], [], true).catch(_ => undefined); + const returnMsg = await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(msgPeer, [finallySendElements], [], true).catch(_ => undefined); return { message: returnMsg ?? null, res_id }; } @@ -276,7 +275,6 @@ export class SendMsg extends BaseAction { logger.logError.bind(this.core.context.logger)('子消息中包含非node消息 跳过不合法部分'); continue; } - // @ts-ignore const nodeMsg = await this.handleForwardedNodes(selfPeer, OB11Data.filter(e => e.type === OB11MessageDataType.node)); if (nodeMsg) { nodeMsgIds.push(nodeMsg.message!.msgId); diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index cc7990a2..119573c8 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -24,7 +24,6 @@ import { OB11MessageData, OB11MessageDataType, OB11MessageFileBase, - OB11MessageForward, } from '@/onebot'; import { OB11Entities } from '@/onebot/entities'; import { EventType } from '@/onebot/event/OB11BaseEvent'; @@ -327,11 +326,11 @@ export class OneBotMsgApi { }, multiForwardMsgElement: async (_, msg) => { - const message_data: OB11MessageForward = { - data: {} as any, - type: OB11MessageDataType.forward, - }; - message_data.data.id = msg.msgId; + // const message_data: OB11MessageForward = { + // data: {} as any, + // type: OB11MessageDataType.forward, + // }; + // message_data.data.id = msg.msgId; const parentMsgPeer = msg.parentMsgPeer ?? { chatType: msg.chatType, guildId: '', @@ -743,9 +742,12 @@ export class OneBotMsgApi { async (element) => { for (const key in element) { if (keyCanBeParsed(key, this.rawToOb11Converters) && element[key]) { - const parsedElement = await this.rawToOb11Converters[key]?.( - // eslint-disable-next-line - // @ts-ignore + const converters = this.rawToOb11Converters[key] as ( + element: Exclude, + msg: RawMessage, + elementWrapper: MessageElement, + ) => PromiseLike; + const parsedElement = await converters?.( element[key], msg, element, @@ -794,9 +796,11 @@ export class OneBotMsgApi { if (ignoreTypes.includes(sendMsg.type)) { continue; } - const callResult = this.ob11ToRawConverters[sendMsg.type]( - // eslint-disable-next-line - // @ts-ignore + const converter = this.ob11ToRawConverters[sendMsg.type] as ( + sendMsg: Extract, + context: MessageContext, + ) => Promise; + const callResult = converter( sendMsg, { peer, deleteAfterSentFiles }, )?.catch(undefined); diff --git a/src/onebot/cqcode.ts b/src/onebot/cqcode.ts index e2f0152b..5aa5651f 100644 --- a/src/onebot/cqcode.ts +++ b/src/onebot/cqcode.ts @@ -68,13 +68,13 @@ export function encodeCQCode(data: OB11MessageData) { let result = '[CQ:' + data.type; for (const name in data.data) { - const value = (data.data as any)[name]; + const value = (data.data as Record)[name]; if (value === undefined) { continue; } try { - const text = value.toString(); - result += `,${name}=${CQCodeEscape(text)}`; + const text = value?.toString(); + if (text) result += `,${name}=${CQCodeEscape(text)}`; } catch (error) { // If it can't be converted, skip this name-value pair } diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 0ab7c9d0..9d3b2176 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -341,7 +341,7 @@ export class NapCatOneBot11Adapter { }; this.context.session.getMsgService().addKernelMsgListener( - proxiedListenerOf(msgListener, this.context.logger) as any, + proxiedListenerOf(msgListener, this.context.logger), ); } @@ -370,7 +370,7 @@ export class NapCatOneBot11Adapter { }; this.context.session.getBuddyService().addKernelBuddyListener( - proxiedListenerOf(buddyListener, this.context.logger) as any, + proxiedListenerOf(buddyListener, this.context.logger), ); } diff --git a/src/onebot/network/passive-http.ts b/src/onebot/network/passive-http.ts index 44af0843..2ebaf624 100644 --- a/src/onebot/network/passive-http.ts +++ b/src/onebot/network/passive-http.ts @@ -64,9 +64,9 @@ export class OB11PassiveHttpAdapter implements IOB11NetworkAdapter { }); this.app.use((req, res, next) => this.authorize(this.token, req, res, next)); - // @ts-ignore - this.app.use((req, res) => this.handleRequest(req, res)); - + this.app.use(async (req, res, _) => { + await this.handleRequest(req, res); + }); this.server.listen(this.port, () => { this.core.context.logger.log(`[OneBot] [HTTP Server Adapter] Start On Port ${this.port}`); }); diff --git a/src/shell/napcat.ts b/src/shell/napcat.ts index 9b004789..cc8890de 100644 --- a/src/shell/napcat.ts +++ b/src/shell/napcat.ts @@ -165,7 +165,7 @@ export async function NCoreInitShell() { logger.logError.bind(logger)('[Core] [Login] Login Error , ErrInfo: ', args); }; - loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger) as any); + loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); const isConnect = loginService.connect(); if (!isConnect) { logger.logError.bind(logger)('核心登录服务连接失败!');