feat: attempt to enhance type inference

This commit is contained in:
pk5ls20
2024-12-14 05:56:49 +08:00
parent 7b693132f9
commit a6adde7966
12 changed files with 180 additions and 169 deletions

View File

@@ -29,7 +29,7 @@ export class OB11Response {
} }
export abstract class OneBotAction<PayloadType, ReturnDataType> { export abstract class OneBotAction<PayloadType, ReturnDataType> {
actionName: ActionName = ActionName.Unknown; actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown;
core: NapCatCore; core: NapCatCore;
private validate: ValidateFunction<any> | undefined = undefined; private validate: ValidateFunction<any> | undefined = undefined;
payloadSchema: any = undefined; payloadSchema: any = undefined;
@@ -84,4 +84,4 @@ export abstract class OneBotAction<PayloadType, ReturnDataType> {
} }
abstract _handle(payload: PayloadType, adaptername: string): PromiseLike<ReturnDataType>; abstract _handle(payload: PayloadType, adaptername: string): PromiseLike<ReturnDataType>;
} }

View File

@@ -10,8 +10,7 @@ const SchemaData = Type.Object({
type Payload = Static<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class OCRImage extends OneBotAction<Payload, any> { class OCRImageBase extends OneBotAction<Payload, any> {
actionName = ActionName.OCRImage;
payloadSchema = SchemaData; payloadSchema = SchemaData;
async _handle(payload: Payload) { async _handle(payload: Payload) {
@@ -34,6 +33,10 @@ export class OCRImage extends OneBotAction<Payload, any> {
} }
} }
export class IOCRImage extends OCRImage { export class OCRImage extends OCRImageBase {
actionName = ActionName.OCRImage;
}
export class IOCRImage extends OCRImageBase {
actionName = ActionName.IOCRImage; actionName = ActionName.IOCRImage;
} }

View File

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

View File

@@ -1,9 +1,9 @@
import SendMsg, { ContextMode } from '@/onebot/action/msg/SendMsg'; import {ContextMode, SendMsgBase} from '@/onebot/action/msg/SendMsg';
import { ActionName, BaseCheckResult } from '@/onebot/action/router'; import { ActionName, BaseCheckResult } from '@/onebot/action/router';
import { OB11PostSendMsg } from '@/onebot/types'; import { OB11PostSendMsg } from '@/onebot/types';
// 未检测参数 // 未检测参数
class SendGroupMsg extends SendMsg { class SendGroupMsg extends SendMsgBase {
actionName = ActionName.SendGroupMsg; actionName = ActionName.SendGroupMsg;
contextMode: ContextMode = ContextMode.Group; contextMode: ContextMode = ContextMode.Group;

View File

@@ -218,32 +218,29 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo
new GetAiCharacters(obContext, core), new GetAiCharacters(obContext, core),
]; ];
type ValueType<K> = K extends `${typeof actionHandlers[number]['actionName']}` | `${typeof actionHandlers[number]['actionName']}_async` | `${typeof actionHandlers[number]['actionName']}_rate_limited` ? typeof actionHandlers[number] : never; type HandlerUnion = typeof actionHandlers[number];
type MapType = {
[H in HandlerUnion as H['actionName']]: H;
} & {
[H in HandlerUnion as `${H['actionName']}_async`]: H;
} & {
[H in HandlerUnion as `${H['actionName']}_rate_limited`]: H;
};
class TypedMap<K extends string> { const _map = new Map<keyof MapType, HandlerUnion>();
private map = new Map<K, ValueType<K>>();
set(key: K, value: ValueType<K>): void { actionHandlers.forEach(h => {
this.map.set(key, value); _map.set(h.actionName as keyof MapType, h);
} _map.set(`${h.actionName}_async` as keyof MapType, h);
_map.set(`${h.actionName}_rate_limited` as keyof MapType, h);
});
get(key: K): ValueType<K> | undefined { function get<K extends keyof MapType>(key: K): MapType[K];
return this.map.get(key); 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;
} }
const actionMap = new TypedMap< return { get };
`${typeof actionHandlers[number]['actionName']}` |
`${typeof actionHandlers[number]['actionName']}_async` |
`${typeof actionHandlers[number]['actionName']}_rate_limited`
>();
for (const action of actionHandlers) {
actionMap.set(action.actionName, action);
actionMap.set(`${action.actionName}_async`, action);
actionMap.set(`${action.actionName}_rate_limited`, action);
}
return actionMap;
} }
export type ActionMap = ReturnType<typeof createActionMap> export type ActionMap = ReturnType<typeof createActionMap>

View File

@@ -88,8 +88,7 @@ function getSpecialMsgNum(payload: OB11PostSendMsg, msgType: OB11MessageDataType
return 0; return 0;
} }
export class SendMsg extends OneBotAction<OB11PostSendMsg, ReturnDataType> { export class SendMsgBase extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
actionName = ActionName.SendMsg;
contextMode = ContextMode.Normal; contextMode = ContextMode.Normal;
protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> { protected async check(payload: OB11PostSendMsg): Promise<BaseCheckResult> {
@@ -379,4 +378,6 @@ export class SendMsg extends OneBotAction<OB11PostSendMsg, ReturnDataType> {
} }
} }
export default SendMsg; export default class SendMsg extends SendMsgBase {
actionName = ActionName.SendMsg;
}

View File

@@ -1,9 +1,9 @@
import SendMsg, { ContextMode } from './SendMsg'; import {ContextMode, SendMsgBase} from './SendMsg';
import { ActionName, BaseCheckResult } from '@/onebot/action/router'; import { ActionName, BaseCheckResult } from '@/onebot/action/router';
import { OB11PostSendMsg } from '@/onebot/types'; import { OB11PostSendMsg } from '@/onebot/types';
// 未检测参数 // 未检测参数
class SendPrivateMsg extends SendMsg { class SendPrivateMsg extends SendMsgBase {
actionName = ActionName.SendPrivateMsg; actionName = ActionName.SendPrivateMsg;
contextMode: ContextMode = ContextMode.Private; contextMode: ContextMode = ContextMode.Private;

View File

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

View File

@@ -13,134 +13,134 @@ export interface InvalidCheckResult {
[k: string | number]: any; [k: string | number]: any;
} }
export enum ActionName { export const ActionName = {
// onebot 11 // onebot 11
SendPrivateMsg = 'send_private_msg', SendPrivateMsg : 'send_private_msg',
SendGroupMsg = 'send_group_msg', SendGroupMsg : 'send_group_msg',
SendMsg = 'send_msg', SendMsg : 'send_msg',
DeleteMsg = 'delete_msg', DeleteMsg : 'delete_msg',
GetMsg = 'get_msg', GetMsg : 'get_msg',
GoCQHTTP_GetForwardMsg = 'get_forward_msg', GoCQHTTP_GetForwardMsg : 'get_forward_msg',
SendLike = 'send_like', SendLike : 'send_like',
SetGroupKick = 'set_group_kick', SetGroupKick : 'set_group_kick',
SetGroupBan = 'set_group_ban', SetGroupBan : 'set_group_ban',
// SetGroupAnoymousBan = 'set_group_anonymous_ban', // SetGroupAnoymousBan : 'set_group_anonymous_ban',
SetGroupWholeBan = 'set_group_whole_ban', SetGroupWholeBan : 'set_group_whole_ban',
SetGroupAdmin = 'set_group_admin', SetGroupAdmin : 'set_group_admin',
// SetGroupAnoymous = 'set_group_anonymous', // SetGroupAnoymous : 'set_group_anonymous',
SetGroupCard = 'set_group_card', SetGroupCard : 'set_group_card',
SetGroupName = 'set_group_name', SetGroupName : 'set_group_name',
SetGroupLeave = 'set_group_leave', SetGroupLeave : 'set_group_leave',
SetSpecialTittle = 'set_group_special_title', SetSpecialTittle : 'set_group_special_title',
SetFriendAddRequest = 'set_friend_add_request', SetFriendAddRequest : 'set_friend_add_request',
SetGroupAddRequest = 'set_group_add_request', SetGroupAddRequest : 'set_group_add_request',
GetLoginInfo = 'get_login_info', GetLoginInfo : 'get_login_info',
GoCQHTTP_GetStrangerInfo = 'get_stranger_info', GoCQHTTP_GetStrangerInfo : 'get_stranger_info',
GetFriendList = 'get_friend_list', GetFriendList : 'get_friend_list',
GetGroupInfo = 'get_group_info', GetGroupInfo : 'get_group_info',
GetGroupList = 'get_group_list', GetGroupList : 'get_group_list',
GetGroupMemberInfo = 'get_group_member_info', GetGroupMemberInfo : 'get_group_member_info',
GetGroupMemberList = 'get_group_member_list', GetGroupMemberList : 'get_group_member_list',
GetGroupHonorInfo = 'get_group_honor_info', GetGroupHonorInfo : 'get_group_honor_info',
GetCookies = 'get_cookies', GetCookies : 'get_cookies',
GetCSRF = 'get_csrf_token', GetCSRF : 'get_csrf_token',
GetCredentials = 'get_credentials', GetCredentials : 'get_credentials',
GetRecord = 'get_record', GetRecord : 'get_record',
GetImage = 'get_image', GetImage : 'get_image',
CanSendImage = 'can_send_image', CanSendImage : 'can_send_image',
CanSendRecord = 'can_send_record', CanSendRecord : 'can_send_record',
GetStatus = 'get_status', GetStatus : 'get_status',
GetVersionInfo = 'get_version_info', GetVersionInfo : 'get_version_info',
// Reboot = 'set_restart', // Reboot : 'set_restart',
// CleanCache = 'clean_cache', // CleanCache : 'clean_cache',
// go-cqhttp // go-cqhttp
SetQQProfile = 'set_qq_profile', SetQQProfile : 'set_qq_profile',
// QidianGetAccountInfo = 'qidian_get_account_info', // QidianGetAccountInfo : 'qidian_get_account_info',
GoCQHTTP_GetModelShow = '_get_model_show', GoCQHTTP_GetModelShow : '_get_model_show',
GoCQHTTP_SetModelShow = '_set_model_show', GoCQHTTP_SetModelShow : '_set_model_show',
GetOnlineClient = 'get_online_clients', GetOnlineClient : 'get_online_clients',
// GetUnidirectionalFriendList = 'get_unidirectional_friend_list', // GetUnidirectionalFriendList : 'get_unidirectional_friend_list',
GoCQHTTP_DeleteFriend = 'delete_friend', GoCQHTTP_DeleteFriend : 'delete_friend',
// DeleteUnidirectionalFriendList = 'delete_unidirectional_friend', // DeleteUnidirectionalFriendList : 'delete_unidirectional_friend',
GoCQHTTP_MarkMsgAsRead = 'mark_msg_as_read', GoCQHTTP_MarkMsgAsRead : 'mark_msg_as_read',
GoCQHTTP_SendGroupForwardMsg = 'send_group_forward_msg', GoCQHTTP_SendGroupForwardMsg : 'send_group_forward_msg',
GoCQHTTP_SendPrivateForwardMsg = 'send_private_forward_msg', GoCQHTTP_SendPrivateForwardMsg : 'send_private_forward_msg',
GoCQHTTP_GetGroupMsgHistory = 'get_group_msg_history', GoCQHTTP_GetGroupMsgHistory : 'get_group_msg_history',
OCRImage = 'ocr_image', OCRImage : 'ocr_image',
IOCRImage = '.ocr_image', IOCRImage : '.ocr_image',
GetGroupSystemMsg = 'get_group_system_msg', GetGroupSystemMsg : 'get_group_system_msg',
GoCQHTTP_GetEssenceMsg = 'get_essence_msg_list', GoCQHTTP_GetEssenceMsg : 'get_essence_msg_list',
GoCQHTTP_GetGroupAtAllRemain = 'get_group_at_all_remain', GoCQHTTP_GetGroupAtAllRemain : 'get_group_at_all_remain',
SetGroupPortrait = 'set_group_portrait', SetGroupPortrait : 'set_group_portrait',
SetEssenceMsg = 'set_essence_msg', SetEssenceMsg : 'set_essence_msg',
DelEssenceMsg = 'delete_essence_msg', DelEssenceMsg : 'delete_essence_msg',
GoCQHTTP_SendGroupNotice = '_send_group_notice', GoCQHTTP_SendGroupNotice : '_send_group_notice',
GoCQHTTP_GetGroupNotice = '_get_group_notice', GoCQHTTP_GetGroupNotice : '_get_group_notice',
GoCQHTTP_UploadGroupFile = 'upload_group_file', GoCQHTTP_UploadGroupFile : 'upload_group_file',
GOCQHTTP_DeleteGroupFile = 'delete_group_file', GOCQHTTP_DeleteGroupFile : 'delete_group_file',
GoCQHTTP_CreateGroupFileFolder = 'create_group_file_folder', GoCQHTTP_CreateGroupFileFolder : 'create_group_file_folder',
GoCQHTTP_DeleteGroupFileFolder = 'delete_group_folder', GoCQHTTP_DeleteGroupFileFolder : 'delete_group_folder',
GoCQHTTP_GetGroupFileSystemInfo = 'get_group_file_system_info', GoCQHTTP_GetGroupFileSystemInfo : 'get_group_file_system_info',
GoCQHTTP_GetGroupRootFiles = 'get_group_root_files', GoCQHTTP_GetGroupRootFiles : 'get_group_root_files',
GoCQHTTP_GetGroupFilesByFolder = 'get_group_files_by_folder', GoCQHTTP_GetGroupFilesByFolder : 'get_group_files_by_folder',
GOCQHTTP_GetGroupFileUrl = 'get_group_file_url', GOCQHTTP_GetGroupFileUrl : 'get_group_file_url',
GOCQHTTP_UploadPrivateFile = 'upload_private_file', GOCQHTTP_UploadPrivateFile : 'upload_private_file',
// GOCQHTTP_ReloadEventFilter = 'reload_event_filter', // GOCQHTTP_ReloadEventFilter : 'reload_event_filter',
GoCQHTTP_DownloadFile = 'download_file', GoCQHTTP_DownloadFile : 'download_file',
GoCQHTTP_CheckUrlSafely = 'check_url_safely', GoCQHTTP_CheckUrlSafely : 'check_url_safely',
GoCQHTTP_GetWordSlices = '.get_word_slices', GoCQHTTP_GetWordSlices : '.get_word_slices',
GoCQHTTP_HandleQuickAction = '.handle_quick_operation', GoCQHTTP_HandleQuickAction : '.handle_quick_operation',
// 以下为扩展napcat扩展 // 以下为扩展napcat扩展
Unknown = 'unknown', Unknown : 'unknown',
SharePeer = 'ArkSharePeer', SharePeer : 'ArkSharePeer',
ShareGroupEx = 'ArkShareGroup', ShareGroupEx : 'ArkShareGroup',
// RebootNormal = 'reboot_normal', //无快速登录重新启动 // RebootNormal : 'reboot_normal', //无快速登录重新启动
GetRobotUinRange = 'get_robot_uin_range', GetRobotUinRange : 'get_robot_uin_range',
SetOnlineStatus = 'set_online_status', SetOnlineStatus : 'set_online_status',
GetFriendsWithCategory = 'get_friends_with_category', GetFriendsWithCategory : 'get_friends_with_category',
SetQQAvatar = 'set_qq_avatar', SetQQAvatar : 'set_qq_avatar',
GetFile = 'get_file', GetFile : 'get_file',
ForwardFriendSingleMsg = 'forward_friend_single_msg', ForwardFriendSingleMsg : 'forward_friend_single_msg',
ForwardGroupSingleMsg = 'forward_group_single_msg', ForwardGroupSingleMsg : 'forward_group_single_msg',
TranslateEnWordToZn = 'translate_en2zh', TranslateEnWordToZn : 'translate_en2zh',
SetMsgEmojiLike = 'set_msg_emoji_like', SetMsgEmojiLike : 'set_msg_emoji_like',
GoCQHTTP_SendForwardMsg = 'send_forward_msg', GoCQHTTP_SendForwardMsg : 'send_forward_msg',
MarkPrivateMsgAsRead = 'mark_private_msg_as_read', MarkPrivateMsgAsRead : 'mark_private_msg_as_read',
MarkGroupMsgAsRead = 'mark_group_msg_as_read', MarkGroupMsgAsRead : 'mark_group_msg_as_read',
GetFriendMsgHistory = 'get_friend_msg_history', GetFriendMsgHistory : 'get_friend_msg_history',
CreateCollection = 'create_collection', CreateCollection : 'create_collection',
GetCollectionList = 'get_collection_list', GetCollectionList : 'get_collection_list',
SetLongNick = 'set_self_longnick', SetLongNick : 'set_self_longnick',
GetRecentContact = 'get_recent_contact', GetRecentContact : 'get_recent_contact',
_MarkAllMsgAsRead = '_mark_all_as_read', _MarkAllMsgAsRead : '_mark_all_as_read',
GetProfileLike = 'get_profile_like', GetProfileLike : 'get_profile_like',
FetchCustomFace = 'fetch_custom_face', FetchCustomFace : 'fetch_custom_face',
FetchEmojiLike = 'fetch_emoji_like', FetchEmojiLike : 'fetch_emoji_like',
SetInputStatus = 'set_input_status', SetInputStatus : 'set_input_status',
GetGroupInfoEx = 'get_group_info_ex', GetGroupInfoEx : 'get_group_info_ex',
GetGroupIgnoreAddRequest = 'get_group_ignore_add_request', GetGroupIgnoreAddRequest : 'get_group_ignore_add_request',
DelGroupNotice = '_del_group_notice', DelGroupNotice : '_del_group_notice',
FetchUserProfileLike = 'fetch_user_profile_like', FetchUserProfileLike : 'fetch_user_profile_like',
FriendPoke = 'friend_poke', FriendPoke : 'friend_poke',
GroupPoke = 'group_poke', GroupPoke : 'group_poke',
GetPacketStatus = 'nc_get_packet_status', GetPacketStatus : 'nc_get_packet_status',
GetUserStatus = 'nc_get_user_status', GetUserStatus : 'nc_get_user_status',
GetRkey = 'nc_get_rkey', GetRkey : 'nc_get_rkey',
GetGroupShutList = 'get_group_shut_list', GetGroupShutList : 'get_group_shut_list',
GetGuildList = 'get_guild_list', GetGuildList : 'get_guild_list',
GetGuildProfile = 'get_guild_service_profile', GetGuildProfile : 'get_guild_service_profile',
GetGroupIgnoredNotifies = 'get_group_ignored_notifies', GetGroupIgnoredNotifies : 'get_group_ignored_notifies',
SetGroupSign = "set_group_sign", SetGroupSign : "set_group_sign",
SendGroupSign = "send_group_sign", SendGroupSign : "send_group_sign",
GetMiniAppArk = "get_mini_app_ark", GetMiniAppArk : "get_mini_app_ark",
// UploadForwardMsg = "upload_forward_msg", // UploadForwardMsg : "upload_forward_msg",
GetAiRecord = "get_ai_record", GetAiRecord : "get_ai_record",
GetAiCharacters = "get_ai_characters", GetAiCharacters : "get_ai_characters",
SendGroupAiRecord = "send_group_ai_record", SendGroupAiRecord : "send_group_ai_record",
} } as const;

View File

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

View File

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

View File

@@ -4,7 +4,10 @@ import { ActionMap } from "@/onebot/action";
export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCore: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap) => { export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCore: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap) => {
if (message.raw_message === 'ping') { if (message.raw_message === 'ping') {
// TODO:
// const a = action.get('fetch_user_profilqe_like');
const ssa = action.get('fetch_user_profile_like');
const ret = await action.get('send_group_msg')?.handle({ group_id: String(message.group_id), message: 'pong' }, adapter); const ret = await action.get('send_group_msg')?.handle({ group_id: String(message.group_id), message: 'pong' }, adapter);
console.log(ret); console.log(ret);
} }
} }