2024-12-23 13:41:57 -06:00
/ *
* Konpeki Discord Bot - Main Bot File
* All base level bot setup is done here
* /
// Require filesystem libraries
const fs = require ( 'node:fs' ) ;
const path = require ( 'node:path' ) ;
// Use a custom logging script
const logger = require ( './utils/logging.js' ) ;
2024-12-23 18:24:03 -06:00
// Listen for (Semi-)Permanent Interactions
2024-12-23 13:41:57 -06:00
const interactionListener = require ( './utils/interaction-trigger.js' ) ;
// Require the necessary discord.js classes
const { Client , Collection , Events , GatewayIntentBits } = require ( 'discord.js' ) ;
const { token , botOwner } = require ( './config.json' ) ;
const { activity , status } = require ( './presence.json' ) ;
// Create a new client instance
2024-12-23 18:16:06 -06:00
const client = new Client ( { intents : [ GatewayIntentBits . Guilds , GatewayIntentBits . MessageContent ] } ) ;
2024-12-23 13:41:57 -06:00
// Setup the commands collection
client . commands = new Collection ( ) ;
const commandsPath = path . join ( _ _dirname , 'commands' ) ;
const commandFiles = fs . readdirSync ( commandsPath ) . filter ( file => file . endsWith ( '.js' ) ) ;
for ( const file of commandFiles ) {
const filePath = path . join ( commandsPath , file ) ;
const command = require ( filePath ) ;
// Set a new item in the Collection with the key as the command name and the value as the exported module
if ( 'data' in command && 'execute' in command ) {
client . commands . set ( command . data . name , command ) ;
}
else {
logger . log ( logger . logLevels . WARN , ` The command at ${ filePath } is missing a required "data" or "execute" property. ` ) ;
}
}
// When the client is ready, run this code (only once)
// We use 'c' for the event parameter to keep it separate from the already defined 'client'
client . once ( Events . ClientReady , c => {
logger . log ( logger . logLevels . INFO , ` ${ logger . colorText ( 'Ready!' , logger . textColor . Green ) } Logged in as ${ logger . colorText ( c . user . tag , logger . textColor . Blue ) } ` ) ;
client . user . setPresence ( { activities : [ { name : activity } ] , status : status } ) ;
} ) ;
// Client "on" Events
// Someone used an interaction
client . on ( Events . InteractionCreate , async interaction => {
if ( interaction . isChatInputCommand ( ) ) {
const command = interaction . client . commands . get ( interaction . commandName ) ;
if ( ! command ) {
logger . log ( logger . logLevels . ERROR , ` No command matching ${ interaction . commandName } was found. ` ) ;
await interaction . reply ( { content : ` This command no longer exists! Please contact ${ botOwner } to report that this is happening! ` , ephemeral : true } ) ;
return ;
}
try {
await command . execute ( interaction ) ;
}
catch ( error ) {
logger . log ( logger . logLevels . ERROR , error ) ;
await interaction . reply ( { content : 'There was an error while executing this command!' , ephemeral : true } ) ;
}
}
else if ( interaction . isButton ( ) ) {
interactionListener . buttonInteraction ( interaction ) ;
}
else if ( interaction . isStringSelectMenu ( ) ) {
// respond to the select menu
}
} ) ;
// Log in to Discord with your client's token
client . login ( token ) ;