Commit a445a60e authored by nanahira's avatar nanahira

catchups from 3rdeye

parent c84e085c
...@@ -13,6 +13,7 @@ import { ...@@ -13,6 +13,7 @@ import {
KoishiServiceWireProperty, KoishiServiceWireProperty,
} from '../utility/koishi.constants'; } from '../utility/koishi.constants';
import { import {
CommandDefinitionFun,
CommandPutConfig, CommandPutConfig,
DoRegisterConfig, DoRegisterConfig,
KoishiCommandInterceptorRegistration, KoishiCommandInterceptorRegistration,
...@@ -81,13 +82,16 @@ export class KoishiMetascanService { ...@@ -81,13 +82,16 @@ export class KoishiMetascanService {
return; return;
} }
switch (config.type) { switch (config.type) {
case 'args':
return args;
case 'arg': case 'arg':
const { data: index } = config as CommandPutConfig<'arg'>; const { data: argIndex } = config as CommandPutConfig<'arg'>;
return args[index]; return args[argIndex];
case 'argv': case 'argv':
return argv; return argv;
case 'session': case 'argvField':
return argv.session; const { data: argvField } = config as CommandPutConfig<'argvField'>;
return argv[argvField];
case 'option': case 'option':
const { data: optionData } = config as CommandPutConfig<'option'>; const { data: optionData } = config as CommandPutConfig<'option'>;
return argv.options[optionData.name]; return argv.options[optionData.name];
...@@ -105,8 +109,9 @@ export class KoishiMetascanService { ...@@ -105,8 +109,9 @@ export class KoishiMetascanService {
} }
return argv.session.author?.nickname || argv.session.author?.username; return argv.session.author?.nickname || argv.session.author?.username;
case 'sessionField': case 'sessionField':
const { data: field } = config as CommandPutConfig<'sessionField'>; const { data: sessionField } =
return argv.session[field]; config as CommandPutConfig<'sessionField'>;
return argv.session[sessionField];
default: default:
return; return;
} }
...@@ -155,9 +160,8 @@ export class KoishiMetascanService { ...@@ -155,9 +160,8 @@ export class KoishiMetascanService {
); );
break; break;
case 'beforeEvent': case 'beforeEvent':
const { const { data: beforeEventData } =
data: beforeEventData, regData as DoRegisterConfig<'beforeEvent'>;
} = regData as DoRegisterConfig<'beforeEvent'>;
const beforeEventName = beforeEventData.name; const beforeEventName = beforeEventData.name;
baseContext.before( baseContext.before(
beforeEventName, beforeEventName,
...@@ -181,17 +185,19 @@ export class KoishiMetascanService { ...@@ -181,17 +185,19 @@ export class KoishiMetascanService {
commandData.desc, commandData.desc,
commandData.config, commandData.config,
); );
const commandDefs = this.metaFetcher.getMetadataArray( const commandDefs: CommandDefinitionFun[] =
KoishiCommandDefinition, this.metaFetcher.getPropertyMetadataArray(
methodFun, KoishiCommandDefinition,
); instance,
methodKey,
);
for (const commandDef of commandDefs) { for (const commandDef of commandDefs) {
command = commandDef(command) || command; command = commandDef(command) || command;
} }
if (commandData.config?.empty) { if (commandData.config?.empty) {
break; break;
} }
const interceptorDefs = _.uniq( const interceptorDefs: KoishiCommandInterceptorRegistration[] = _.uniq(
this.metaFetcher.getPropertyMetadataArray( this.metaFetcher.getPropertyMetadataArray(
KoishiCommandInterceptorDef, KoishiCommandInterceptorDef,
instance, instance,
......
...@@ -62,7 +62,7 @@ export const InjectContextUser = (...values: string[]) => ...@@ -62,7 +62,7 @@ export const InjectContextUser = (...values: string[]) =>
export function TransformMetadata< export function TransformMetadata<
K extends MetadataKey, K extends MetadataKey,
VM extends Partial<MetadataGenericMap> = MetadataGenericMap VM extends Partial<MetadataGenericMap> = MetadataGenericMap,
>( >(
metadataKey: K, metadataKey: K,
metadataValueFun: (oldValue: VM[K]) => VM[K], metadataValueFun: (oldValue: VM[K]) => VM[K],
...@@ -196,7 +196,9 @@ export const OnSelection = (selection: Selection) => ...@@ -196,7 +196,9 @@ export const OnSelection = (selection: Selection) =>
// Command definition // Command definition
export const CommandDef = (def: CommandDefinitionFun): MethodDecorator => export const CommandDef = (
def: CommandDefinitionFun,
): MethodDecorator & ClassDecorator =>
AppendMetadata(KoishiCommandDefinition, def); AppendMetadata(KoishiCommandDefinition, def);
export const CommandDescription = (desc: string) => export const CommandDescription = (desc: string) =>
...@@ -231,6 +233,12 @@ export const CommandUserFields = (fields: FieldCollector<'user'>) => ...@@ -231,6 +233,12 @@ export const CommandUserFields = (fields: FieldCollector<'user'>) =>
export const CommandChannelFields = (fields: FieldCollector<'channel'>) => export const CommandChannelFields = (fields: FieldCollector<'channel'>) =>
CommandDef((cmd) => cmd.channelFields(fields)); CommandDef((cmd) => cmd.channelFields(fields));
export const CommandBefore = (callback: Command.Action, append = false) =>
CommandDef((cmd) => cmd.before(callback, append));
export const CommandAction = (callback: Command.Action, prepend = false) =>
CommandDef((cmd) => cmd.action(callback, prepend));
// Command put config // Command put config
function PutCommandParam<T extends keyof CommandPutConfigMap>( function PutCommandParam<T extends keyof CommandPutConfigMap>(
...@@ -248,8 +256,11 @@ function PutCommandParam<T extends keyof CommandPutConfigMap>( ...@@ -248,8 +256,11 @@ function PutCommandParam<T extends keyof CommandPutConfigMap>(
export const PutArgv = () => PutCommandParam('argv'); export const PutArgv = () => PutCommandParam('argv');
export const PutSession = (field?: keyof Session) => export const PutSession = (field?: keyof Session) =>
field ? PutCommandParam('sessionField', field) : PutCommandParam('session'); field
? PutCommandParam('sessionField', field)
: PutCommandParam('argvField', 'session');
export const PutArg = (i: number) => PutCommandParam('arg', i); export const PutArg = (i: number) => PutCommandParam('arg', i);
export const PutArgs = () => PutCommandParam('args');
export const PutOption = ( export const PutOption = (
name: string, name: string,
desc: string, desc: string,
...@@ -272,6 +283,7 @@ export const PutChannelId = () => PutSession('channelId'); ...@@ -272,6 +283,7 @@ export const PutChannelId = () => PutSession('channelId');
export const PutChannelName = () => PutSession('channelName'); export const PutChannelName = () => PutSession('channelName');
export const PutSelfId = () => PutSession('selfId'); export const PutSelfId = () => PutSession('selfId');
export const PutBot = () => PutSession('bot'); export const PutBot = () => PutSession('bot');
export const PutNext = () => PutCommandParam('argvField', 'next');
// Service // Service
......
...@@ -96,10 +96,11 @@ export type EventNameAndPrepend = CommonEventNameAndPrepend<EventName>; ...@@ -96,10 +96,11 @@ export type EventNameAndPrepend = CommonEventNameAndPrepend<EventName>;
type OmitSubstring< type OmitSubstring<
S extends string, S extends string,
T extends string T extends string,
> = S extends `${infer L}${T}${infer R}` ? `${L}${R}` : never; > = S extends `${infer L}${T}${infer R}` ? `${L}${R}` : never;
export type BeforeEventName = OmitSubstring<EventName & string, 'before-'>; export type BeforeEventName = OmitSubstring<EventName & string, 'before-'>;
export type BeforeEventNameAndPrepend = CommonEventNameAndPrepend<BeforeEventName>; export type BeforeEventNameAndPrepend =
CommonEventNameAndPrepend<BeforeEventName>;
export type ContextFunction<T> = (ctx: Context) => T; export type ContextFunction<T> = (ctx: Context) => T;
export type OnContextFunction = ContextFunction<Context>; export type OnContextFunction = ContextFunction<Context>;
...@@ -113,7 +114,7 @@ export interface DoRegisterConfigDataMap { ...@@ -113,7 +114,7 @@ export interface DoRegisterConfigDataMap {
export interface MappingStruct< export interface MappingStruct<
T extends Record<string | number | symbol, any>, T extends Record<string | number | symbol, any>,
K extends keyof T K extends keyof T,
> { > {
type: K; type: K;
data?: T[K]; data?: T[K];
...@@ -121,7 +122,7 @@ export interface MappingStruct< ...@@ -121,7 +122,7 @@ export interface MappingStruct<
export function GenerateMappingStruct< export function GenerateMappingStruct<
T extends Record<string | number | symbol, any>, T extends Record<string | number | symbol, any>,
K extends keyof T K extends keyof T,
>(type: K, data?: T[K]): MappingStruct<T, K> { >(type: K, data?: T[K]): MappingStruct<T, K> {
return { return {
type, type,
...@@ -130,7 +131,7 @@ export function GenerateMappingStruct< ...@@ -130,7 +131,7 @@ export function GenerateMappingStruct<
} }
export type DoRegisterConfig< export type DoRegisterConfig<
K extends keyof DoRegisterConfigDataMap = keyof DoRegisterConfigDataMap K extends keyof DoRegisterConfigDataMap = keyof DoRegisterConfigDataMap,
> = MappingStruct<DoRegisterConfigDataMap, K>; > = MappingStruct<DoRegisterConfigDataMap, K>;
// Command stuff // Command stuff
...@@ -153,9 +154,10 @@ export interface CommandOptionConfig { ...@@ -153,9 +154,10 @@ export interface CommandOptionConfig {
} }
export interface CommandPutConfigMap { export interface CommandPutConfigMap {
args: never;
arg: number; arg: number;
argv: never; argv: never;
session: never; argvField: keyof Argv;
option: CommandOptionConfig; option: CommandOptionConfig;
user: FieldCollector<'user'>; user: FieldCollector<'user'>;
channel: FieldCollector<'channel'>; channel: FieldCollector<'channel'>;
...@@ -164,7 +166,7 @@ export interface CommandPutConfigMap { ...@@ -164,7 +166,7 @@ export interface CommandPutConfigMap {
} }
export type CommandPutConfig< export type CommandPutConfig<
K extends keyof CommandPutConfigMap = keyof CommandPutConfigMap K extends keyof CommandPutConfigMap = keyof CommandPutConfigMap,
> = MappingStruct<CommandPutConfigMap, K>; > = MappingStruct<CommandPutConfigMap, K>;
export type CommandDefinitionFun = (cmd: Command) => Command; export type CommandDefinitionFun = (cmd: Command) => Command;
...@@ -176,19 +178,17 @@ export type MetadataArrayValueMap = { ...@@ -176,19 +178,17 @@ export type MetadataArrayValueMap = {
export type MetadataGenericMap = MetadataArrayValueMap & MetadataMap; export type MetadataGenericMap = MetadataArrayValueMap & MetadataMap;
export type MetadataArrayValue< export type MetadataArrayValue<K extends keyof MetadataArrayValueMap> =
K extends keyof MetadataArrayValueMap MetadataArrayValueMap[K];
> = MetadataArrayValueMap[K];
export type MetadataKey = keyof MetadataArrayMap | keyof MetadataMap; export type MetadataKey = keyof MetadataArrayMap | keyof MetadataMap;
export type MetadataMapValue< export type MetadataMapValue<K extends MetadataKey> =
K extends MetadataKey K extends keyof MetadataArrayValueMap
> = K extends keyof MetadataArrayValueMap ? MetadataArrayValue<K>
? MetadataArrayValue<K> : K extends keyof MetadataMap
: K extends keyof MetadataMap ? MetadataMap[K]
? MetadataMap[K] : never;
: never;
// command interceptor // command interceptor
...@@ -196,7 +196,8 @@ export interface KoishiCommandInterceptor< ...@@ -196,7 +196,8 @@ export interface KoishiCommandInterceptor<
U extends User.Field = never, U extends User.Field = never,
G extends Channel.Field = never, G extends Channel.Field = never,
A extends any[] = any[], A extends any[] = any[],
O extends {} = {} // eslint-disable-next-line @typescript-eslint/ban-types
O extends {} = {},
> { > {
intercept: Command.Action<U, G, A, O>; intercept: Command.Action<U, G, A, O>;
} }
...@@ -205,7 +206,8 @@ export type KoishiCommandInterceptorRegistration< ...@@ -205,7 +206,8 @@ export type KoishiCommandInterceptorRegistration<
U extends User.Field = never, U extends User.Field = never,
G extends Channel.Field = never, G extends Channel.Field = never,
A extends any[] = any[], A extends any[] = any[],
O extends {} = {} // eslint-disable-next-line @typescript-eslint/ban-types
O extends {} = {},
> = > =
| KoishiCommandInterceptor<U, G, A, O> | KoishiCommandInterceptor<U, G, A, O>
| Type<KoishiCommandInterceptor<U, G, A, O>> | Type<KoishiCommandInterceptor<U, G, A, O>>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment