Astronaut
Astronaut
DIAdiscord.js - Imagine an app
Created by Astronaut on 9/30/2023 in #djs-questions
How to register slash commands in Typescript
I do apologize for asking a simple and basic question here, but I've already searched for it here and google but couldn't find an appropriate solution to apply to my code... This is my code to register events to my bot and I didn't write this code by myself but it was from a tutorial video on Youtube. I don't demand to teach me the full process to register slash commands, but please just give me some tiny hints! + I want to make it global commands! client.ts
import { Client, GatewayIntentBits } from 'discord.js';
import { registerEvents } from './utils/index.js';
import Events from './events/index.js'
import Keys from './keys.js';

const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
]
});

registerEvents(client, Events);

client.login(Keys.clientToken).catch((err) => {
console.error('[Login Error]', err);
process.exit(1);
});
import { Client, GatewayIntentBits } from 'discord.js';
import { registerEvents } from './utils/index.js';
import Events from './events/index.js'
import Keys from './keys.js';

const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
]
});

registerEvents(client, Events);

client.login(Keys.clientToken).catch((err) => {
console.error('[Login Error]', err);
process.exit(1);
});
index.ts
import { Event } from '../utils/index.js';
import ready from './ready.js';
import message from './message.js';
import login from './login.js'

export default [
ready,
message,
login,
] as Event[];
import { Event } from '../utils/index.js';
import ready from './ready.js';
import message from './message.js';
import login from './login.js'

export default [
ready,
message,
login,
] as Event[];
message.ts
import { event, Events } from '../utils/index.js';

export default event(Events.InteractionCreate, async ({ client, log }, interaction) => {
if (!interaction.isCommand()) return;

if (interaction.commandName === 'hey') {
await interaction.reply('hi');
}
})
import { event, Events } from '../utils/index.js';

export default event(Events.InteractionCreate, async ({ client, log }, interaction) => {
if (!interaction.isCommand()) return;

if (interaction.commandName === 'hey') {
await interaction.reply('hi');
}
})
events.ts
import type { ClientEvents, Awaitable, Client } from 'discord.js';

// Export events enum through here to reduce the amounf of imports.
export { Events } from 'discord.js';

export type LogMethod = (...args: unknown[] ) => void;
export type EventKeys = keyof ClientEvents;

// Props that will be passed through the event callback.
export interface EventProps {
client: Client;
log: LogMethod;
}

export type EventCallback<T extends EventKeys> = (
props: EventProps,
...args: ClientEvents[T]
) => Awaitable<unknown>;

// Internal struct that represents an event.
export interface Event<T extends EventKeys = EventKeys> {
key: T;
callback: EventCallback<T>;
}

// Create an event struct.
export function event<T extends EventKeys>(key: T, callback: EventCallback<T>): Event<T> {
return {key, callback};
}

// Registers events to the client.
export function registerEvents(client: Client, events: Event[]): void {
for(const {key, callback} of events) {
client.on(key, (...args) => {
// Create a new log method for this event.
const log = console.log.bind(console, `[Event: ${key}]`)

// Try to catch uncaught errors.
try {
callback({ client, log }, ...args);
} catch(err) {
log('[Uncaught Error]', err);
}

})
}
}
import type { ClientEvents, Awaitable, Client } from 'discord.js';

// Export events enum through here to reduce the amounf of imports.
export { Events } from 'discord.js';

export type LogMethod = (...args: unknown[] ) => void;
export type EventKeys = keyof ClientEvents;

// Props that will be passed through the event callback.
export interface EventProps {
client: Client;
log: LogMethod;
}

export type EventCallback<T extends EventKeys> = (
props: EventProps,
...args: ClientEvents[T]
) => Awaitable<unknown>;

// Internal struct that represents an event.
export interface Event<T extends EventKeys = EventKeys> {
key: T;
callback: EventCallback<T>;
}

// Create an event struct.
export function event<T extends EventKeys>(key: T, callback: EventCallback<T>): Event<T> {
return {key, callback};
}

// Registers events to the client.
export function registerEvents(client: Client, events: Event[]): void {
for(const {key, callback} of events) {
client.on(key, (...args) => {
// Create a new log method for this event.
const log = console.log.bind(console, `[Event: ${key}]`)

// Try to catch uncaught errors.
try {
callback({ client, log }, ...args);
} catch(err) {
log('[Uncaught Error]', err);
}

})
}
}
5 replies