user17632296
user17632296

Reputation:

When I run my bot, the `ready` event doesn't fire but the bot is online

When I run my bot, the ready event doesn't fire but the bot is online. My event handler is in the start method in the Client.ts class, and I execute the start method in the index.ts file.

My client class: ./classes/Client.ts

import { Client as DiscordClient, ClientOptions, Collection } from 'discord.js';
import fs from 'fs';
import path from 'path';

export class Client extends DiscordClient {
    commandarray: any[] = [];
    commands: Collection<string, any> = new Collection();
    constructor (options: ClientOptions, token: string) {
        super(options);

        this.login(token);
            
        }

    async start() {
        //Event Handler
        const eventDirectories = await fs.readdirSync('./events');
        for (const dir of eventDirectories) {
            const eventFiles = await fs.readdirSync(`./events/${dir}`).filter(file => file.endsWith(".ts"));

            if (eventFiles.length <= 0) 
                return console.log("[EVENT HANDLER] - Cannot find any events!");
    
    

            for (const file of eventFiles) {
                const event = require(`../events/${dir}/${file}`);

                if (event.once) {
                    this.once(event.name, (...args) => event.execute(...args, this));
                } else {
                    this.on(event.name, (...args) => event.execute(...args));
                }

            }
        }

        // Slash Command Handler
        const cmdDirectories = await fs.readdirSync('./commands');
        for (const dir of cmdDirectories) {
            const cmdFiles = await fs.readdirSync(`./commands/${dir}`).filter(file => file.endsWith(".ts"));

            if (cmdFiles.length <= 0)
                return console.log("[COMMAND HANDLER] - Cannot find any commands!");

            for (const file of cmdFiles) {
                const command = require(`../commands/${dir}/${file}`)
                await this.commandarray.push(command);
                await this.commands.set(command.name, command);
            }
        }
    }
};

My index.ts file: ./index.ts

import { Client } from "./classes/Client";
import { config } from "dotenv";

config();

export const client: Client = new Client({ intents: 515 }, process.env.token!);

client.start();

My ready event: ./events/Client/ready.ts

import { Client } from '../../classes/Client';

export default {
    name: 'ready',
    once: true,
    async execute(client: Client) {
        await console.log(`Logged in as ${client.user?.tag}`);
        await client.application?.commands.set(client.commandarray);
    }
}

Edit, I fixed the first issue thanks to Rahuletto, but found a new one and have updated the question accordingly.

Upvotes: 1

Views: 605

Answers (2)

user17632296
user17632296

Reputation:

I used export default to export the event So, instead of using event.<property/function> in the handler, I should use event.default.<property/function>

Upvotes: 0

Rahuletto
Rahuletto

Reputation: 11

It's a wrong path. You should show ur path structure (file format).

I think it's ../events/Client/ready.ts.

Upvotes: 1

Related Questions