mirror of
https://github.com/sern-handler/handler
synced 2026-06-20 23:02:15 +00:00
feat!:(2.0 global services) (#156)
* style: prettier line feed changes
* style: prettier line feed changes
* feat: prototyping module manager
* feat: removing unused types
* feat: update location of module typings
* revert: port back to original interaction type checkers
* revert: port back to original interaction type checkers
* revert: remove unneeded type predicates
* feat: moving modules to its own contained class
* feat: getting global plugins some typings and adding contracts
* chore: fixing up and cleaning code
* feat: adding ModuleConfiguration helper fn and default module manager
* feat: solidifying contract
* revert: delete files
* chore: saving for later
* feat: prototyping module manager
* feat: removing unused types
* feat: update location of module typings
* revert: port back to original interaction type checkers
* revert: port back to original interaction type checkers
* revert: remove unneeded type predicates
* feat: moving modules to its own contained class
* feat: getting global plugins some typings and adding contracts
* chore: fixing up and cleaning code
* feat: adding ModuleConfiguration helper fn and default module manager
* feat: solidifying contract
* revert: delete files
* chore: saving for later
* feat: more merge conflicts
* feat: starting from scratch, add new typings
* feat: refactor ScopedPlugin typing
* feat: strengthening contracts
* chore: edit eslint
* feat: add addDependencies
* feat: add iti di
* feat: constfn util
* revert: delete old files
* remove: ModuleConfiguration
* feat: add sanity checker
* feat: add new error and update dependency
* feat: add sanity check for iti
* feat: add function helpers for di
* feat: add POC for sern di IOC
* feat: refactor DependenciesMap
* revert: remove old code
* feat: refactor makeDependencies fn
* chore(deps): update dependency @typescript-eslint/parser to v5.36.1 (#127)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.1 (#126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* docs: Fix the code example (#128)
* chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.2 (#130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
* chore(deps): update dependency @typescript-eslint/parser to v5.36.2 (#131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
* feat: allow constructable modules (#133)
* Update readFile.ts
* Update userDefinedEventsHandling.ts
* Update readyHandler.ts
* fix: ts error
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
* revert: feat of allow constructable modules (#138)
Revert "feat: allow constructable modules (#133)"
This reverts commit 03936eb2ea.
* feat: update CODEOWNERS
* feat: classmodules@arcs (#143)
* feat: add class based commands
* docs: add deprecation warnings
* feat: add deprecation warnings
* feat: add more deprecation warnings
* feat: add prototype ClassModule abstract class
* feat: add EventModuleClass prototype, change names
* feat: more flexible contract
* feat: EventExecutable
* fix: typo
* feat: made abstract classes because of defaults
* fix: typings
* feat: update Context typings, update to djs v15
* chore: update typescript dependency
* chore: bump version
* chore: update ignore
* chore: prettier
* docs: change readme to be docusaurus compliant
* chore(main): release 1.2.0 (#145)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(autocomplete): now support multiple autocomplete options (#147)
* chore(main): release 1.2.1 (#148)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat: update location of module typings
* feat: getting global plugins some typings and adding contracts
* feat: adding ModuleConfiguration helper fn and default module manager
* feat: solidifying contract
* feat: removing unused types
* feat: update location of module typings
* feat: moving modules to its own contained class
* feat: getting global plugins some typings and adding contracts
* feat: solidifying contract
* revert: delete files
* chore: saving for later
* feat: more merge conflicts
* feat: starting from scratch, add new typings
* feat: strengthening contracts
* feat: add sanity check for iti
* feat: refactor DependenciesMap
* feat: adding POC back
* docs: add some deprecation warnings
* feat: remove client and sernEmitter
* feat: rebase global_services
* chore: oops rebase pkgjson fix
* fix: typings
* feat: iti update and getting di working
* feat: adding contracts and default provider
* feat: update typings and change logger
* fix: MapDeps typings and useContainer typings
* feat: moving handlers to 2.0
* feat: injecting crash handler
* feat: alpha logging injection?
* feat: injecting modulemanager in interactionhandler
* fix: typos and fixups
* fix: typos and fixups
* feat: moduleManager injection
* fix: crash on no module
* feat: i think optional dependencies work
* feat: add more optional support
* feat: make exclusion optional
* perf: simplify typings and reduce compile time
* fix: some typings adjustment, deprecating a field
* perf: simplifying plugin typings
* feat: remove addExternal
* feat: more simplifying typings
* perf: allow any and interfacify some types
* revert: remove horrendous Override type
* revert: delete interaction type predicates
* fix: unchecked cast to EventEmitter
* perf: remove unneeded creation of instance members
* feat: init test dir
* refactor: rename fn and short circuit name fn
* refactor: insert function
* feat: starting event module onEvent plugins and log payload
* feat: basic eventmodule event plugins?
* refactor: DRY
* feat: unify warning typing
* fix: typings
* feat: more progress on new eventModules
* feat: event modules with plugins!!?!?
* feat: making sernEmitter create default!!, readjust typings
* feat: inject sernEmitter emits and catch possible errors
* feat: add optionality to Logger dep type
* feat: context upgrade, fix circular emissions, crap ton of shit
* feat!: Module -> AnyModule, Added new SelectMenuInteractions, Changed some CommandType names
* feat: rudimentary onClick handler
* feat!: rename select menu command types, no distinguishing between text and alias
* docs: adding docs
* fix: forgot to change
* fix: logging undefined
* revert: remove spreadparams
* feat: export useContainerRaw function and fix smol bug
* feat: add iti DI disposeAll on crash
* fix: deferred execute
* feat!: rename BasePlugin -> Plugin
* feat: commandplugins for event modules, ill test later
* refactor: rename
* refactor: remove import
* feat: add deprecation warnings
* feat: update documentation comments
* perf: static'ify command plugin and event plugin typings
* refactor: remove redundant assignment
* feat: switch to pnpm
* chore: update pnpm lock
* fix: errors crashing and completing subscription
* feat: update example
* fix: overriding dependencies no matter what
* fix: bad rxjs docs
* refactor: destructuring
* feat: update typings for addDisposer
* feat: update packageManager field in package.json
* feat: grammar
Co-authored-by: jacoobes <jacobnguyend@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
Co-authored-by: Arcs <73959934+HighArcs@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Evo <85353424+EvolutionX-10@users.noreply.github.com>
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
import type { CommandInteractionOptionResolver } from 'discord.js';
|
||||
import type { CommandModule, EventModule, Module } from '../handler/structures/module';
|
||||
import type { PayloadType } from '../handler/structures/enums';
|
||||
import type { InteractionReplyOptions, MessageReplyOptions } from 'discord.js';
|
||||
export type Nullish<T> = T | undefined | null;
|
||||
|
||||
import type { EventEmitter } from 'events';
|
||||
import type { CommandModule, EventModule, AnyModule } from './module';
|
||||
import type { UnpackFunction } from 'iti';
|
||||
import type { ErrorHandling, Logging, ModuleManager } from '../handler/contracts';
|
||||
import type { ModuleStore } from '../handler/structures/moduleStore';
|
||||
import type SernEmitter from '../handler/sernEmitter';
|
||||
// Thanks to @kelsny
|
||||
export type ParseType<T> = {
|
||||
[K in keyof T]: T[K] extends unknown ? [k: K, args: T[K]] : never;
|
||||
@@ -13,46 +16,42 @@ export type Args = ParseType<{ text: string[]; slash: SlashOptions }>;
|
||||
|
||||
export type SlashOptions = Omit<CommandInteractionOptionResolver, 'getMessage' | 'getFocused'>;
|
||||
|
||||
// Source: https://dev.to/vborodulin/ts-how-to-override-properties-with-type-intersection-554l
|
||||
export type Override<T1, T2> = Omit<T1, keyof T2> & T2;
|
||||
|
||||
export type DefinitelyDefined<T, K extends keyof T = keyof T> = {
|
||||
[L in K]-?: T[L] extends Record<string, unknown>
|
||||
? DefinitelyDefined<T[L], keyof T[L]>
|
||||
: Required<T>[L];
|
||||
} & T;
|
||||
|
||||
export type EventInput =
|
||||
| string
|
||||
| { mod: EventModule; absPath: string }[]
|
||||
| (() => { mod: EventModule; absPath: string }[]);
|
||||
|
||||
/**
|
||||
* Turns a function with a union of array of args into a single union
|
||||
* [ T , V , B ] | [ A ] => T | V | B | A
|
||||
*/
|
||||
export type SpreadParams<T extends (...args: never) => unknown> = (
|
||||
args: Parameters<T>[number],
|
||||
) => unknown;
|
||||
|
||||
/**
|
||||
* After modules are transformed, name and description are given default values if none
|
||||
* are provided to Module. This type represents that transformation
|
||||
*/
|
||||
export type DefinedModule = DefinitelyDefined<Module, 'name' | 'description'>;
|
||||
export type DefinedCommandModule = DefinitelyDefined<CommandModule, 'name' | 'description'>;
|
||||
export type DefinedEventModule = DefinitelyDefined<EventModule, 'name' | 'description'>;
|
||||
export type DefinedCommandModule = CommandModule & { name: string; description: string };
|
||||
export type DefinedEventModule = EventModule & { name: string };
|
||||
export type AnyDefinedModule = DefinedCommandModule | DefinedEventModule
|
||||
export type Payload =
|
||||
| { type: PayloadType.Success; module: Module }
|
||||
| { type: PayloadType.Failure; module?: Module; reason: string | Error };
|
||||
| { type: PayloadType.Success; module: AnyModule }
|
||||
| { type: PayloadType.Failure; module?: AnyModule; reason: string | Error }
|
||||
| { type: PayloadType.Warning; reason: string};
|
||||
export type SernEventsMapping = {
|
||||
['module.register']: [Payload];
|
||||
['module.activate']: [Payload];
|
||||
['error']: [Payload];
|
||||
['warning']: [string];
|
||||
'module.register': [Payload];
|
||||
'module.activate': [Payload];
|
||||
'error': [Payload];
|
||||
'warning': [Payload];
|
||||
};
|
||||
export type LogPayload<T = unknown> = { message: T }
|
||||
export type Singleton<T> = () => T
|
||||
export type Transient<T> = () => () => T;
|
||||
|
||||
export type ReplyOptions =
|
||||
| string
|
||||
| Omit<InteractionReplyOptions, 'fetchReply'>
|
||||
| MessageReplyOptions;
|
||||
export interface Dependencies {
|
||||
'@sern/client': Singleton<EventEmitter>;
|
||||
'@sern/logger'?: Singleton<Logging>;
|
||||
'@sern/emitter': Singleton<SernEmitter>;
|
||||
'@sern/store' : Singleton<ModuleStore>;
|
||||
'@sern/modules' : Singleton<ModuleManager>;
|
||||
'@sern/errors': Singleton<ErrorHandling>;
|
||||
}
|
||||
|
||||
export type ReplyOptions = string | Omit<InteractionReplyOptions, 'fetchReply'> | MessageReplyOptions;
|
||||
|
||||
export type MapDeps<
|
||||
Deps extends Dependencies,
|
||||
T extends readonly unknown[]
|
||||
> = T extends [infer First extends keyof Deps, ...infer Rest extends readonly unknown[]]
|
||||
? [ UnpackFunction<Deps[First]>, ...(MapDeps<Deps, Rest> extends [never] ? [] : MapDeps<Deps,Rest>)] : [never]
|
||||
//Basically, '@sern/client' | '@sern/store' | '@sern/modules' | '@sern/error' | '@sern/emitter' will be provided defaults, and you can exclude the rest
|
||||
export type OptionalDependencies = '@sern/logger';
|
||||
215
src/types/module.ts
Normal file
215
src/types/module.ts
Normal file
@@ -0,0 +1,215 @@
|
||||
import type {
|
||||
ApplicationCommandAttachmentOption,
|
||||
ApplicationCommandChannelOptionData,
|
||||
ApplicationCommandChoicesData,
|
||||
ApplicationCommandNonOptionsData,
|
||||
ApplicationCommandNumericOptionData,
|
||||
ApplicationCommandOptionData,
|
||||
ApplicationCommandOptionType,
|
||||
ApplicationCommandSubCommandData,
|
||||
ApplicationCommandSubGroupData,
|
||||
AutocompleteInteraction,
|
||||
Awaitable,
|
||||
BaseApplicationCommandOptionsData,
|
||||
ButtonInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
ModalSubmitInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
ChannelSelectMenuInteraction,
|
||||
MentionableSelectMenuInteraction,
|
||||
RoleSelectMenuInteraction,
|
||||
StringSelectMenuInteraction
|
||||
} from 'discord.js';
|
||||
import type {
|
||||
DiscordEventCommand,
|
||||
ExternalEventCommand,
|
||||
SernEventCommand,
|
||||
} from '../handler/structures/events';
|
||||
import { CommandType } from '../handler/structures/enums';
|
||||
import type { Args, SlashOptions } from './handler';
|
||||
import type Context from '../handler/structures/context';
|
||||
import type { AutocompletePlugin, CommandPlugin, EventPlugin } from '../handler/plugins/plugin';
|
||||
import { EventType } from '../handler/structures/enums';
|
||||
import type { UserSelectMenuInteraction } from 'discord.js';
|
||||
|
||||
export interface Module {
|
||||
type?: CommandType | EventType;
|
||||
name?: string;
|
||||
description?: string;
|
||||
execute: (...args: any[]) => any
|
||||
}
|
||||
|
||||
export interface TextCommand extends Module {
|
||||
type: CommandType.Text;
|
||||
onEvent: EventPlugin<CommandType.Text>[];
|
||||
plugins: CommandPlugin[];
|
||||
alias?: string[];
|
||||
execute: (ctx: Context, args: ['text', string[]]) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface SlashCommand extends Module {
|
||||
type: CommandType.Slash;
|
||||
onEvent: EventPlugin<CommandType.Slash>[];
|
||||
plugins: CommandPlugin[];
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context, args: ['slash', SlashOptions]) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface BothCommand extends Module {
|
||||
type: CommandType.Both;
|
||||
onEvent: EventPlugin<CommandType.Both>[];
|
||||
plugins: CommandPlugin[];
|
||||
alias?: string[];
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context, args: Args) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface ContextMenuUser extends Module {
|
||||
type: CommandType.CtxUser;
|
||||
onEvent: EventPlugin<CommandType.CtxUser>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: UserContextMenuCommandInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface ContextMenuMsg extends Module {
|
||||
type: CommandType.CtxMsg;
|
||||
onEvent: EventPlugin<CommandType.CtxMsg>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: MessageContextMenuCommandInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface ButtonCommand extends Module {
|
||||
type: CommandType.Button;
|
||||
onEvent: EventPlugin<CommandType.Button>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: ButtonInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface StringSelectCommand extends Module {
|
||||
type: CommandType.StringSelect;
|
||||
onEvent: EventPlugin<CommandType.StringSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: StringSelectMenuInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface ChannelSelectCommand extends Module {
|
||||
type: CommandType.ChannelSelect;
|
||||
onEvent: EventPlugin<CommandType.ChannelSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: ChannelSelectMenuInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface RoleSelectCommand extends Module {
|
||||
type: CommandType.RoleSelect;
|
||||
onEvent: EventPlugin<CommandType.RoleSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: RoleSelectMenuInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface MentionableSelectCommand extends Module {
|
||||
type: CommandType.MentionableSelect;
|
||||
onEvent: EventPlugin<CommandType.MentionableSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: MentionableSelectMenuInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface UserSelectCommand extends Module {
|
||||
type: CommandType.UserSelect;
|
||||
onEvent: EventPlugin<CommandType.UserSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: UserSelectMenuInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface ModalSubmitCommand extends Module {
|
||||
type: CommandType.Modal;
|
||||
onEvent: EventPlugin<CommandType.Modal>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: ModalSubmitInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export interface AutocompleteCommand extends Module {
|
||||
name?: never;
|
||||
description?: never;
|
||||
type?: never;
|
||||
onEvent: AutocompletePlugin[];
|
||||
execute: (ctx: AutocompleteInteraction) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand;
|
||||
export type CommandModule =
|
||||
| TextCommand
|
||||
| SlashCommand
|
||||
| BothCommand
|
||||
| ContextMenuUser
|
||||
| ContextMenuMsg
|
||||
| ButtonCommand
|
||||
| StringSelectCommand
|
||||
| MentionableSelectCommand
|
||||
| UserSelectCommand
|
||||
| ChannelSelectCommand
|
||||
| RoleSelectCommand
|
||||
| ModalSubmitCommand;
|
||||
|
||||
export type AnyModule = CommandModule | EventModule;
|
||||
|
||||
//https://stackoverflow.com/questions/64092736/alternative-to-switch-statement-for-typescript-discriminated-union
|
||||
// Explicit Module Definitions for mapping
|
||||
export type CommandModuleDefs = {
|
||||
[CommandType.Text]: TextCommand;
|
||||
[CommandType.Slash]: SlashCommand;
|
||||
[CommandType.Both]: BothCommand;
|
||||
[CommandType.CtxMsg]: ContextMenuMsg;
|
||||
[CommandType.CtxUser]: ContextMenuUser;
|
||||
[CommandType.Button]: ButtonCommand;
|
||||
[CommandType.StringSelect]: StringSelectCommand;
|
||||
[CommandType.RoleSelect] : RoleSelectCommand;
|
||||
[CommandType.ChannelSelect] : ChannelSelectCommand;
|
||||
[CommandType.MentionableSelect] : MentionableSelectCommand;
|
||||
[CommandType.UserSelect] : UserSelectCommand;
|
||||
[CommandType.Modal]: ModalSubmitCommand;
|
||||
};
|
||||
|
||||
export type EventModuleDefs = {
|
||||
[EventType.Sern]: SernEventCommand;
|
||||
[EventType.Discord]: DiscordEventCommand;
|
||||
[EventType.External]: ExternalEventCommand;
|
||||
};
|
||||
|
||||
export interface SernAutocompleteData extends Omit<BaseApplicationCommandOptionsData, 'autocomplete'> {
|
||||
autocomplete: true;
|
||||
type:
|
||||
| ApplicationCommandOptionType.String
|
||||
| ApplicationCommandOptionType.Number
|
||||
| ApplicationCommandOptionType.Integer;
|
||||
command: AutocompleteCommand;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type that replaces autocomplete with {@link SernAutocompleteData}
|
||||
*/
|
||||
export type BaseOptions =
|
||||
| ApplicationCommandChoicesData
|
||||
| ApplicationCommandNonOptionsData
|
||||
| ApplicationCommandChannelOptionData
|
||||
| ApplicationCommandNumericOptionData
|
||||
| ApplicationCommandAttachmentOption
|
||||
| SernAutocompleteData;
|
||||
|
||||
export interface SernSubCommandData extends BaseApplicationCommandOptionsData {
|
||||
type: ApplicationCommandOptionType.Subcommand;
|
||||
required?: never;
|
||||
options?: BaseOptions[];
|
||||
}
|
||||
|
||||
export interface SernSubCommandGroupData extends BaseApplicationCommandOptionsData {
|
||||
type: ApplicationCommandOptionType.SubcommandGroup;
|
||||
required?: never;
|
||||
options?: SernSubCommandData[];
|
||||
}
|
||||
|
||||
export type SernOptionsData<U extends ApplicationCommandOptionData = ApplicationCommandOptionData> =
|
||||
U extends ApplicationCommandSubCommandData
|
||||
? SernSubCommandData
|
||||
: U extends ApplicationCommandSubGroupData
|
||||
? SernSubCommandGroupData
|
||||
: BaseOptions;
|
||||
Reference in New Issue
Block a user