5.5.2 • Published 9 months ago
@eds-fw/framework v5.5.2
Features
- Intuitive and does not complicate the development process
- Contains type declarations (.d.ts)
- Fully configurable
- Built-in
/help
command - Lazy constructors (
createSlashCommand()
,createButton()
and more) - Smart Fetches: get from cache or fetch (
sfMember(context, userId)
and more) - Simply 'Map'-based storage:
get()
,set()
,save()
and more - Quick message panels for advanced for data input (
InteractivePanel
) - Utils:
getAvatar()
,quickEmbed()
,optionsWithDefaultValue()
andexpandDirs()
Requirements
- NodeJS
v18
or newer
Setup
- Install EDS via npm:
npm i @eds-fw/framework
- Create
tsconfig.json
file:
{
"extends": "./node_modules/@eds-fw/framework/tsconfig.base.json",
"exclude": [
"node_modules/",
"logs/",
"vault.json",
"dist/",
"assets/"
],
"compilerOptions": {
"rootDit": "src",
"outDir": "dist"
}
}
- Create your first bot using EDS:
// src/index.ts
//'runtime' is a 'global' object equivalent
import { eds } from "@eds-fw/framework";
import { ApplicationCommandType } from "discord.js";
import { token } from "../vault.json" with { "type": "json" };
const config: eds.ConfigExemplar = {
token,
intents: "all",
commandsPath: "./commands/",
slashOnly: true, //default value
includeBuiltinCommands: {
help: true, //default value
},
colors: {
default: 0xffffff, //'0x' + HEX color without '#'
info: 0x00FFEA,
},
};
const bot = eds.createBot(config);
eds.createSlashCommand({
name: "cake",
description: "Give me a cake!",
nsfw: false,
type: ApplicationCommandType.ChatInput,
defaultMemberPermissions: null,
dmPermission: false,
});
eds.startBot();
export default bot;
- Create your first
/cake
command:
// src/commands/cake.ts
import { eds } from "@eds-fw/framework";
import { ComponentType, ButtonStyle } from "discord.js";
//eds components are resistant to bot restarts
eds.createButton({
custom_id: "get cake"
}, async context => { //"get cake" button code
await context.quickReply(
true, //epemeral?
undefined, //title
"# :cake:" //description
);
})
export default {
async run(context)
{
await context.reply(
true, //ephemeral?
"aloha hawaii", //embed title (optional if has desc)
`<@${context.user.id}>, do you want a cake?`, //embed desc (optional if has title)
"info", //?embed color name (set in config)
[{ //?djs components
type: ComponentType.ActionRow,
components: [{
type: ComponentType.Button,
style: ButtonStyle.Secondary, //gray
custom_id: "get cake",
label: "Get cake"
}]
}]
);
},
//command options
info: {
name: "cake",
type: "slash",
//for auto-help:
desc: "Give me a cake!",
category: "General",
usage: '',
hidden: true,
}
} satisfies eds.CommandFile<"slash">;
- A) Create
start.bat
file (WINDOWS ONLY) for easily compile & launch your bot:
rem start.bat
@npx tsc
@node dist/index.js
@pause
rem "@pause" keeps window open after bot crash
- B) Create
start.sh
file for easily compile & launch your bot:
# start.sh
npx tsc
node dist/index.js
read -p "" #keeps window open after bot crash
- Execute (open)
start.bat
orstart.sh
file. Voila! It's alive!
API
- module
@eds-fw/utils
- module
@eds-fw/storage
- module
@eds-fw/fetch
createBot (config: ConfigExemplar): KnownRuntimeProperties
(lazyConstructor)createButton (options: ButtonOptions, code: ButtonCode): void
(lazyConstructor)- runtime:
componentManager
- runtime:
createMenu (options: MenuOptions, code: MenuUserCode | MenuStringCode): void
(lazyConstructor)- runtime:
componentManager
- runtime:
createModal (options: ModalOptions, code: ModalCode): void
(lazyConstructor)- runtime:
componentManager
- runtime:
createSlashCommand (options: SpplicationCommandData): void
(lazyConstructor)- runtime:
slashCommandsManager
- runtime:
- async
sfUser (mng_or_ctx: AnyContext | UserManager | undefined, id: Snowflake | undefined): Promise<User | undefined>
- async
sfMember (mng_or_ctx: AnyContext | GuildMemberManager | undefined, id: Snowflake | undefined): Promise<GuildMember | undefined>
- async
sfChannel (mng_or_ctx: AnyContext | GuildChannelManager | undefined, id: Snowflake | undefined): Promise<GuildBasedChannel | undefined>
- async
sfGuild (mng_or_ctx: AnyContext | GuildManager | undefined, id: Snowflake | undefined): Promise<Guild | undefined>
- async
sfRole (mng_or_ctx: AnyContext | RoleManager | undefined, id: Snowflake | undefined): Promise<Role | undefined>
- async
sfMessage (mng_or_ctx: AnyContext | MessageManager | undefined, id: Snowflake | undefined): Promise<Message | undefined>
getAvatar (user: <any user> | <any member> | undefined | null): string
quickEmbed (title?: string, description?: string, type: string = "default", components?: BaseMessageOptions["components"], customEmbed?: JSONEncodable<APIEmbed> | APIEmbed): BaseMessageOptions
optionsWithDefaultValue (options: SelectMenuComponentOptionData[], defaultVal: string | null): SelectMenuComponentOptionData[]
- async
startBot (): Promise<void>
- runtime:
slashCommandsManager, client, config
- runtime:
- anonimous class
runtimeStorage
(runtime)[key: string]: any
getAll <T>(...keys: (keyof T)): T
get <V>(key: string): V
setAll <T>(values: T): T
set <K, V>(key: K, value: V): { [X in K]: V }
- class
Client
extends djs.Client- constructor
(options: Options)
- async
init (): Promise<void>
- constructor
- class
Handler
- runtime:
config, loader, client, contextFactory
- constructor
new ()
- runtime:
- class
InteractivePanel <T>
- static
register <T extends object>(messageConstructor: InteractivePanel.ConstructMessageFn<T>, msgId: string): void
- static
getMenu<T extends object>(msgId: string): InteractivePanel<T> | undefined
- static
renderValues(keysAndValues: [string, string | undefined, string?][]): string
data: Partial<T>
render (): MessageCreateOptions & InteractionUpdateOptions & InteractionReplyOptions
deleteInstance (): void
- private constructor
()
- static
- class
Loader
- field
commandHelp: AutoCommandHelp
- constructor
new (path: string, noLog?: boolean, ignorePrefixes?: string[], builtinCommands?: ConfigExemplar.includeBuiltinCommands)
clearMaps (): void
- async
load (): Promise<void>
- iternal async
loadBuiltin (): Promise<void>
- iternal get
getCallMap: Map<string[], string>
- iternal get
getSlashCallMap: Map<string, string>
- iternal get
getAlwaysCallMap: string[]
- iternal get
getHelpInfoMap: Map<string[], CommandHelpInfo>
- field
- class
SlashCommandsManager
- runtime:
client
create (options: djs.ApplicationCommandData): void
save (): void
- runtime:
- type
SupportedInteractions
- type
CommandContext <CmdType>
- type
AnyContext
- type
InteractionContext <SupportedInteractions>
- type
SlashCommandContext
- type
TextCommandContext
- type
CommandFile
- type
CommandHelpInfo
- type
CommandInfo
- type
ConfigExemplar
- type
KnownRuntimeProperties
- iternal async
expandDirs (path: string): Promise<string[]>
- iternal class
AutoCommandHelp
- runtime:
config
- field
pages: Map<string, string>
- field
commandTypes: Map<string, "slash" | "text" | "nonPrefixed">
- field
descriptions: Map<string, string>
- field
templates: {...}
- field
_fullCommandList: string
- constructor
new ()
getCommandList (roles: string[]): string
getCommandNames (roles: string[]): string[]
getBakedCommandNames (roles: string[]): string[]
clear (): void
- iternal
reg (file: CommandFile<boolean> as const): void
- iternal field
_publicCommands: string
- iternal field
_fullCommandList: string
- runtime:
- iternal class
ContextFactory
- runtime:
config
- constructor
new ()
createTextContext (message: djs.Message): CommandContext<false>
createSlashContext (interaction: djs.ChatInputCommandInteraction): CommandContext<true>
- runtime:
- iternal class
ComponentsManager
- constructor
()
empty clearMaps (): void
createButton (options: ButtonOptions, code: ButtonCode): void
createMenu (options: MenuOptions, code: MenuUserCode | MenuStringCode): void
createModal (options: ModalOptions, code: ModalCode): void
- iternal get
getButtonsMap: Map<string, MapVal<...>>
- iternal get
getMenusMap: Map<string, MapVal<...>>
- iternal get
getModalsMap: Map<string, MapVal<...>>
- constructor
Source (git)
Issues (git)
5.5.2
9 months ago
5.5.1
9 months ago
5.5.0
9 months ago
5.4.1
9 months ago
5.4.0
9 months ago
5.3.1
10 months ago
5.3.0
10 months ago
5.2.2
10 months ago
5.2.1
10 months ago
5.2.0
10 months ago
5.1.0
10 months ago
5.0.1
10 months ago
5.0.0
10 months ago
4.1.2
10 months ago
4.1.1
11 months ago
4.1.0
11 months ago
4.0.0
11 months ago
3.3.0
11 months ago
3.2.0
1 year ago
3.1.3
1 year ago
3.1.2
1 year ago
3.1.1
1 year ago