mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
Compare commits
6 Commits
v4.2.0
...
sincetagsa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06fbb063fc | ||
|
|
cd10c566f5 | ||
|
|
1b7f2a49a8 | ||
|
|
97fa2a2d78 | ||
|
|
a52ad270d8 | ||
|
|
1e5deae1f9 |
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## [4.2.1](https://github.com/sern-handler/handler/compare/v4.2.0...v4.2.1) (2025-01-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* context-interactions error ([#382](https://github.com/sern-handler/handler/issues/382)) ([a52ad27](https://github.com/sern-handler/handler/commit/a52ad270d843e92db5bf2049d07527eed59d428c))
|
||||
|
||||
## [4.2.0](https://github.com/sern-handler/handler/compare/v4.1.1...v4.2.0) (2025-01-18)
|
||||
|
||||
|
||||
|
||||
18
README.md
18
README.md
@@ -19,7 +19,7 @@
|
||||
- Lightweight. Does a lot while being small.
|
||||
- Latest features. Support for discord.js v14 and all of its interactions.
|
||||
- Start quickly. Plug and play or customize to your liking.
|
||||
- works with [bun](https://bun.sh/) and [node](https://nodejs.org/en) out the box!
|
||||
- Works with [bun](https://bun.sh/) and [node](https://nodejs.org/en) out the box!
|
||||
- Use it with TypeScript or JavaScript. CommonJS and ESM supported.
|
||||
- Active and growing community, always here to help. [Join us](https://sern.dev/discord)
|
||||
- Unleash its full potential with a powerful CLI and awesome plugins.
|
||||
@@ -45,14 +45,14 @@ export default commandModule({
|
||||
|
||||
|
||||
## 🤖 Bots Using sern
|
||||
- [Community Bot](https://github.com/sern-handler/sern-community), the community bot for our [discord server](https://sern.dev/discord).
|
||||
- [Vinci](https://github.com/SrIzan10/vinci), the bot for Mara Turing.
|
||||
- [Bask](https://github.com/baskbotml/bask), Listen your favorite artists on Discord.
|
||||
- [Murayama](https://github.com/murayamabot/murayama), :pepega:
|
||||
- [Protector](https://github.com/GlitchApotamus/Protector), Just a simple bot to help enhance a private minecraft server.
|
||||
- [SmokinWeed 💨](https://github.com/Peter-MJ-Parker/sern-bud), A fun bot for a small - but growing - server.
|
||||
- [Man Nomic](https://github.com/jacoobes/man-nomic), A simple information bot to provide information to the nomic-ai discord community.
|
||||
- [Linear-Discord](https://github.com/sern-handler/linear-discord) Display and manage a linear dashboard.
|
||||
- [Community Bot](https://github.com/sern-handler/sern-community) - The community bot for our [Discord server](https://sern.dev/discord).
|
||||
- [Vinci](https://github.com/SrIzan10/vinci) - The bot for Mara Turing.
|
||||
- [Bask](https://github.com/baskbotml/bask) - Listen to your favorite artists on Discord.
|
||||
- [Murayama](https://github.com/murayamabot/murayama) - :pepega:
|
||||
- [Protector](https://github.com/GlitchApotamus/Protector) - Just a simple bot to help enhance a private Minecraft server.
|
||||
- [SmokinWeed 💨](https://github.com/Peter-MJ-Parker/sern-bud) - A fun bot for a small, but growing server.
|
||||
- [Man Nomic](https://github.com/jacoobes/man-nomic) - A simple information bot to provide information to the nomic-ai Discord community.
|
||||
- [Linear-Discord](https://github.com/sern-handler/linear-discord) - Display and manage a linear dashboard.
|
||||
## 💻 CLI
|
||||
|
||||
It is **highly encouraged** to use the [command line interface](https://github.com/sern-handler/cli) for your project. Don't forget to view it.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@sern/handler",
|
||||
"packageManager": "yarn@3.5.0",
|
||||
"version": "4.2.0",
|
||||
"version": "4.2.1",
|
||||
"description": "A complete, customizable, typesafe, & reactive framework for discord bots.",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -119,6 +119,9 @@ export function isMessageComponent(i: InteractionTypable): i is AnyMessageCompon
|
||||
export function isCommand(i: InteractionTypable): i is AnyCommandInteraction {
|
||||
return i.type === InteractionType.ApplicationCommand;
|
||||
}
|
||||
export function isContextCommand(i: AnyCommandInteraction): i is MessageContextMenuCommandInteraction | UserContextMenuCommandInteraction {
|
||||
return i.isContextMenuCommand();
|
||||
}
|
||||
export function isAutocomplete(i: InteractionTypable): i is AutocompleteInteraction {
|
||||
return i.type === InteractionType.ApplicationCommandAutocomplete;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { Module } from '../types/core-modules'
|
||||
import { callPlugins, executeModule } from './event-utils';
|
||||
import { SernError } from '../core/structures/enums'
|
||||
import { createSDT, isAutocomplete, isCommand, isMessageComponent, isModal, resultPayload, treeSearch } from '../core/functions'
|
||||
import { createSDT, isAutocomplete, isCommand, isContextCommand, isMessageComponent, isModal, resultPayload, treeSearch } from '../core/functions'
|
||||
import type { UnpackedDependencies } from '../types/utility';
|
||||
import * as Id from '../core/id'
|
||||
import { Context } from '../core/structures/context';
|
||||
@@ -29,13 +29,23 @@ export function interactionHandler(deps: UnpackedDependencies, defaultPrefix?: s
|
||||
}
|
||||
const { module, params } = modules.at(0)!;
|
||||
let payload;
|
||||
// handles autocomplete
|
||||
if(isAutocomplete(event)) {
|
||||
//@ts-ignore stfu
|
||||
const { command } = treeSearch(event, module.options);
|
||||
payload= { module: command as Module, //autocomplete is not a true "module" warning cast!
|
||||
args: [event, createSDT(command, deps, params)] };
|
||||
// either CommandTypes Slash | ContextMessage | ContextUesr
|
||||
} else if(isCommand(event)) {
|
||||
payload= { module, args: [Context.wrap(event, defaultPrefix), createSDT(module, deps, params)] };
|
||||
const sdt = createSDT(module, deps, params)
|
||||
// handle CommandType.CtxUser || CommandType.CtxMsg
|
||||
if(isContextCommand(event)) {
|
||||
payload= { module, args: [event, sdt] };
|
||||
} else {
|
||||
// handle CommandType.Slash || CommandType.Both
|
||||
payload= { module, args: [Context.wrap(event, defaultPrefix), sdt] };
|
||||
}
|
||||
// handles modals or components
|
||||
} else if (isModal(event) || isMessageComponent(event)) {
|
||||
payload= { module, args: [event, createSDT(module, deps, params)] }
|
||||
} else {
|
||||
|
||||
@@ -61,7 +61,7 @@ import { Awaitable, SernEventsMapping, UnpackedDependencies, Dictionary } from '
|
||||
*
|
||||
* @see {@link CommandControlPlugin} for plugin implementation
|
||||
* @see {@link CommandType} for available command types
|
||||
* @see {@link Dependencies} for dependency injection interface
|
||||
* @see {@link Dependencies} for [dependency injection](https://sern.dev/v4/reference/dependencies/) interface
|
||||
*/
|
||||
export type SDT = {
|
||||
/**
|
||||
@@ -114,6 +114,10 @@ export type SDT = {
|
||||
|
||||
export type Processed<T> = T & { name: string; description: string };
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface Module {
|
||||
type: CommandType | EventType;
|
||||
name?: string;
|
||||
@@ -196,13 +200,18 @@ export interface Module {
|
||||
execute(...args: any[]): Awaitable<any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface SernEventCommand<T extends keyof SernEventsMapping = keyof SernEventsMapping>
|
||||
extends Module {
|
||||
name?: T;
|
||||
type: EventType.Sern;
|
||||
execute(...args: SernEventsMapping[T]): Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ExternalEventCommand extends Module {
|
||||
name?: string;
|
||||
emitter: keyof Dependencies;
|
||||
@@ -210,83 +219,121 @@ export interface ExternalEventCommand extends Module {
|
||||
execute(...args: unknown[]): Awaitable<unknown>;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ContextMenuUser extends Module {
|
||||
type: CommandType.CtxUser;
|
||||
execute: (ctx: UserContextMenuCommandInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ContextMenuMsg extends Module {
|
||||
type: CommandType.CtxMsg;
|
||||
execute: (ctx: MessageContextMenuCommandInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ButtonCommand extends Module {
|
||||
type: CommandType.Button;
|
||||
execute: (ctx: ButtonInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface StringSelectCommand extends Module {
|
||||
type: CommandType.StringSelect;
|
||||
execute: (ctx: StringSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ChannelSelectCommand extends Module {
|
||||
type: CommandType.ChannelSelect;
|
||||
execute: (ctx: ChannelSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface RoleSelectCommand extends Module {
|
||||
type: CommandType.RoleSelect;
|
||||
execute: (ctx: RoleSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface MentionableSelectCommand extends Module {
|
||||
type: CommandType.MentionableSelect;
|
||||
execute: (ctx: MentionableSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface UserSelectCommand extends Module {
|
||||
type: CommandType.UserSelect;
|
||||
execute: (ctx: UserSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ModalSubmitCommand extends Module {
|
||||
type: CommandType.Modal;
|
||||
execute: (ctx: ModalSubmitInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface AutocompleteCommand {
|
||||
onEvent?: ControlPlugin[];
|
||||
execute: (ctx: AutocompleteInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface DiscordEventCommand<T extends keyof ClientEvents = keyof ClientEvents>
|
||||
extends Module {
|
||||
name?: T;
|
||||
type: EventType.Discord;
|
||||
execute(...args: ClientEvents[T]): Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a text command
|
||||
*/
|
||||
export interface TextCommand extends Module {
|
||||
type: CommandType.Text;
|
||||
execute: (ctx: Context & { get options(): string[] }, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a slash command
|
||||
*/
|
||||
export interface SlashCommand extends Module {
|
||||
type: CommandType.Slash;
|
||||
description: string;
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context & { get options(): ChatInputCommandInteraction['options']}, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a both command
|
||||
*/
|
||||
export interface BothCommand extends Module {
|
||||
type: CommandType.Both;
|
||||
description: string;
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand;
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export type CommandModule =
|
||||
| TextCommand
|
||||
| SlashCommand
|
||||
@@ -355,6 +402,7 @@ export type InputCommand = {
|
||||
}[CommandType];
|
||||
|
||||
/**
|
||||
* @see @link {https://sern.dev/v4/reference/autocomplete/}
|
||||
* Type that replaces autocomplete with {@link SernAutocompleteData}
|
||||
*/
|
||||
export type SernOptionsData =
|
||||
@@ -374,7 +422,9 @@ export interface SernSubCommandGroupData extends BaseApplicationCommandOptionsDa
|
||||
options?: SernSubCommandData[];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @since 4.0.0
|
||||
*/
|
||||
export interface ScheduledTaskContext {
|
||||
|
||||
/**
|
||||
@@ -398,7 +448,9 @@ interface TaskAttrs {
|
||||
*/
|
||||
deps: UnpackedDependencies
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.0.0
|
||||
*/
|
||||
export interface ScheduledTask {
|
||||
name?: string;
|
||||
trigger: string | Date;
|
||||
|
||||
Reference in New Issue
Block a user