2022-05-14 20:40:58 +03:00
const { Client , Intents , Permissions } = require ( 'discord.js' );
2022-02-17 21:42:57 -05:00
const Discord = require ( 'discord.js' );
2022-05-12 17:38:08 +03:00
const { MongoClient , ServerApiVersion } = require ( 'mongodb' );
const fs = require ( 'fs' );
2022-05-28 16:55:56 +03:00
const turnManager = require ( './commands/turnManager.js' );
2022-05-12 17:38:08 +03:00
const { exit } = require ( 'process' );
const BASE_LVL_XP = 20 ;
2022-05-20 12:19:27 +03:00
//Token area
//Adding integration for development mode
let token ;
2022-05-25 22:33:42 +03:00
let IDM = false ;
2022-05-20 12:19:27 +03:00
if ( process . env . token != undefined ) {
//Use "setx NAME VALUE" in the local powershell terminal to set
token = process . env . token ;
} else {
token = require ( './config.json' ). token ;
2022-05-25 22:33:42 +03:00
IDM = true ;
2022-05-20 12:19:27 +03:00
}
2022-04-30 17:41:44 -04:00
// const { token } = require('./config.json');
2022-04-30 17:02:26 -04:00
//Heroku part
2022-05-12 17:48:49 +03:00
// const { token } = process.env.token;
2022-04-17 08:51:30 -04:00
2022-04-30 15:51:55 -04:00
const bot = new Client ({
2022-02-17 21:42:57 -05:00
intents : [
Intents . FLAGS . GUILDS ,
Intents . FLAGS . GUILD_MESSAGES ,
2022-04-30 15:51:55 -04:00
Intents . FLAGS . GUILD_MESSAGE_REACTIONS ,
2022-05-13 12:14:24 +03:00
Intents . FLAGS . GUILD_VOICE_STATES ,
Intents . FLAGS . GUILD_EMOJIS_AND_STICKERS
2022-02-17 21:42:57 -05:00
],
});
2022-05-18 21:34:58 +03:00
const prefix = '!' ;
bot . prefix = new String ;
bot . prefix = prefix ;
2022-05-25 22:33:42 +03:00
bot . inDebugMode = IDM ;
2022-02-17 21:42:57 -05:00
2022-05-09 12:11:18 +03:00
//MongoDB integration
2022-05-20 12:19:27 +03:00
//Development support
let mongouritemp ;
if ( process . env . MONGODB_URI ) {
mongouritemp = process . env . MONGODB_URI ;
} else {
mongouritemp = require ( './config.json' );
}
const mongouri = mongouritemp ;
2022-05-12 17:38:08 +03:00
const { connect } = require ( 'mongoose' );
bot . on ( "guildCreate" , guild => {
2022-05-14 20:40:58 +03:00
guild . members . fetch
guild . roles . create ({ name : 'Selmer Bot Mod' });
2022-05-28 16:55:56 +03:00
2022-05-14 20:40:58 +03:00
const role = guild . roles . cache . find (( role ) => role . name === 'Selmer Bot Mod' ); // member.roles.cache.has('role-id-here');
2022-05-28 16:55:56 +03:00
let owner = guild . members . cache . fetch ( guild . ownerID );
2022-05-14 20:40:58 +03:00
owner . send ( 'Thank you for adding Selmer Bot to your server!\nPlease give people you want to have access to Selmer Bot\'s restricted commands the <@&' + role + '> role.' );
2022-05-12 17:38:08 +03:00
});
//MongoDB Integration end
// let item = items.filter(function (item) { return item.name.toLowerCase() == 'grapes'; });
2022-05-09 12:11:18 +03:00
2022-04-30 15:51:55 -04:00
bot . commands = new Discord . Collection ();
2022-02-17 21:42:57 -05:00
const commandFiles = fs . readdirSync ( './commands/' ). filter ( file => file . endsWith ( '.js' ));
2022-05-09 12:14:23 +03:00
2022-05-13 22:29:54 +03:00
bot . commands = new Discord . Collection ();
fs . readdirSync ( './commands' )
. forEach ( dir => {
2022-05-27 14:58:30 +03:00
if ( dir != 'db' && ! dir . endsWith ( '.js' )) {
2022-05-24 08:55:57 +03:00
fs . readdirSync ( `./commands/ ${ dir } ` )
. filter ( file => file . endsWith ( '.js' ))
. forEach ( file => {
const command = require ( `./commands/ ${ dir } / ${ file } ` );
bot . commands . set ( command . name , command );
});
}
2022-05-13 22:29:54 +03:00
});
2022-05-13 22:03:05 +03:00
2022-05-24 08:55:57 +03:00
//Set these two manually because all the seperate games can't be included in the command list (all managed by the 'game' file)
let temp_command = require ( "./commands/db/econ.js" );
2022-05-28 16:55:56 +03:00
const { STATE } = require ( './commands/db/econ.js' );
2022-05-24 08:55:57 +03:00
bot . commands . set ( 'econ' , temp_command );
temp_command = require ( './commands/db/game.js' );
bot . commands . set ( 'game' , temp_command );
2022-05-12 17:38:08 +03:00
// const econFiles = fs.readdirSync('./commands/inventory').filter(file => file.endsWith('.js'));;
2022-04-30 17:41:44 -04:00
// const currency = new Discord.Collection();
// const { Users } = require('./commands/currency/dbObjects.js');
// i++;
2022-02-17 21:42:57 -05:00
2022-05-12 17:38:08 +03:00
//XP Table section
let xp_collection = new Map ();
let items ;
2022-02-17 21:42:57 -05:00
2022-04-30 15:51:55 -04:00
bot . on ( 'ready' , async () => {
2022-05-12 17:38:08 +03:00
//Make then copy the shop
const client = new MongoClient ( mongouri , { useNewUrlParser : true , useUnifiedTopology : true , serverApi : ServerApiVersion . v1 });
client . connect ( err => {
const shop = client . db ( "main" ). collection ( "shop" );
shop . find (). toArray ( function ( err , itemstemp ) {
if ( err ) throw err ;
items = [... itemstemp ];
client . close ();
});
2022-05-24 08:55:57 +03:00
//Srt status and Activity (idle and listening to !help)
bot . user . setActivity ( ` ${ bot . prefix } help` , { type : "LISTENING" });
// bot.user.setStatus('idle');
2022-05-12 17:38:08 +03:00
});
//Note the xp numbers are a little wonky on levels 6, 8 and 13 (why though?)
//See https://stackoverflow.com/questions/72212928/why-are-the-differences-between-my-numbers-inconsistent-sort-of-compund-interes
for ( let i = 1 ; i < 101 ; i ++ ) {
// xp_collection.set(i, BASE_LVL_XP * .1);
let amount = BASE_LVL_XP * ( Math . ceil ( Math . pow (( 1.1 ), ( 2 * i ))) + i );
xp_collection . set ( i + 1 , amount );
}
2022-04-17 08:51:30 -04:00
2022-05-13 12:14:24 +03:00
//Reaction map area
2022-05-25 22:33:42 +03:00
if ( ! bot . inDebugMode ) {
2022-05-20 12:19:27 +03:00
console . log ( 'SLEEMER BOT ONLINE!!!!! OH MY GOD OH MY GOD!!!' );
} else {
console . log ( "Testing testing 1 2 5..." );
}
2022-02-17 21:42:57 -05:00
});
2022-05-27 14:58:30 +03:00
//Button Section
2022-05-28 16:55:56 +03:00
bot . on ( 'interactionCreate' , async interaction => {
2022-05-27 14:58:30 +03:00
if ( ! interaction . isButton ()) return ;
2022-05-28 16:55:56 +03:00
const client = new MongoClient ( mongouri , { useNewUrlParser : true , useUnifiedTopology : true , serverApi : ServerApiVersion . v1 });
client . connect ( err => {
let current_user = turnManager . getTurn ( client , bot , interaction );
current_user . then ( function ( result ) {
const id = result [ 0 ];
const doc = result [ 1 ];
const threadname = doc . thread ;
const dbo = client . db ( interaction . guildId + '[ECON]' ). collection ( id );
2022-05-29 20:59:39 +03:00
2022-05-28 16:55:56 +03:00
dbo . find ({ 'state' : { $exists : true } }). toArray ( async function ( err , docs ) {
if ( interaction . user . id == id ) {
await interaction . deferReply ();
//Check State
if ( docs [ 0 ]. state == STATE . FIGHTING ) {
//Do turn stuff
2022-05-29 20:59:39 +03:00
bot . commands . get ( 'game' ). in_game_redirector ( bot , interaction , threadname , doc , client , mongouri , items , xp_collection );
2022-05-28 16:55:56 +03:00
}
turnManager . changeTurn ( client , bot , interaction );
//remove the old interation message
interaction . message . delete ();
interaction . editReply ( `<@ ${ interaction . user . id } > used _ ${ interaction . customId . toLowerCase () } _!` );
} else {
console . log ( "It's not your turn!" );
}
});
});
});
2022-05-27 14:58:30 +03:00
});
2022-04-30 15:51:55 -04:00
bot . on ( 'messageCreate' , ( message ) => {
2022-05-25 22:33:42 +03:00
2022-02-17 21:42:57 -05:00
//COMMAND AREA
//Check if the prefix exists
if ( ! message . content . startsWith ( prefix ) || message . author . bot ) return ;
2022-05-27 14:58:30 +03:00
2022-02-17 21:42:57 -05:00
const args = message . content . slice ( prefix . length ). split ( ' ' );
const command = args . shift (). toLowerCase ();
//Check if the user has sufficient permission
//Performes the command
2022-05-14 20:40:58 +03:00
//Admin section
if ( command == 'reactionrole' ) { bot . commands . get ( command ). execute ( message , args , Discord , bot ); }
2022-05-13 22:29:54 +03:00
2022-05-24 08:55:57 +03:00
else if ( bot . commands . has ( command ) && command != 'ECON' ) {
//Database access is required, change the inputs
if ( command == 'game' || command == 'accept' ) {
2022-05-28 16:55:56 +03:00
bot . commands . get ( command ). execute ( bot , message , args , command , Discord , mongouri , items , xp_collection );
2022-05-24 08:55:57 +03:00
} else {
bot . commands . get ( command ). execute ( message , args , Discord , Client , bot );
}
}
2022-05-13 22:29:54 +03:00
2022-05-24 08:55:57 +03:00
//Catch
else { bot . commands . get ( 'econ' ). execute ( bot , message , args , command , Discord , mongouri , items , xp_collection ); }
2022-02-17 21:42:57 -05:00
})
2022-05-09 10:22:33 +03:00
//Look into integrating MySQL into SelmerBot instead of SQLite
2022-02-17 21:42:57 -05:00
2022-05-12 17:38:08 +03:00
//Last Line(s)
2022-05-12 17:48:49 +03:00
// bot.login(token);
2022-05-12 17:38:08 +03:00
2022-05-20 12:19:27 +03:00
bot . login ( token );