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' ) ;
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-27 14:58:30 +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');
let owner = guild . members . fetch ( guild . ownerID ) ;
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" ) ;
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
bot . on ( 'interactionCreate' , interaction => {
if ( ! interaction . isButton ( ) ) return ;
console . log ( interaction ) ;
} ) ;
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' ) {
bot . commands . get ( command ) . execute ( bot , message , args , command , Discord , mongouri , items , xp _collection )
} 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 ) ;