2022-05-12 17:38:08 +03:00
const { MongoClient , ServerApiVersion } = require ( 'mongodb' );
// const { update } = require('apt');
const { Collection , Client , Formatters , Intents } = require ( 'discord.js' );
2022-05-19 21:31:40 +03:00
const { CLIENT_ODBC } = require ( 'mysql/lib/protocol/constants/client' );
2022-05-24 08:55:57 +03:00
//Declair an "enum" to help with BASE calculations
const BASE = {
PAY : 5 ,
HP : 5 ,
2022-05-25 22:33:42 +03:00
MP : 10 ,
XP : 5
2022-05-24 08:55:57 +03:00
}
const STATE = {
IDLE : 0 ,
FIGHTING : 1 ,
2022-05-29 20:59:39 +03:00
DEFENDING : 2 ,
PRONE : 3 ,
WAITING : 4 //For items ONLY
2022-05-24 08:55:57 +03:00
}
2022-05-12 17:38:08 +03:00
//Note that leveling up to the next level takes 10% more xp than the previous one
//#region functions
function isNum ( arg ) {
return ( ! isNaN ( arg ) && Number . isSafeInteger ( Number ( arg )));
};
2022-05-24 08:55:57 +03:00
function CreateNewCollection ( message , client , server , id , opponent = null , game = null ) {
client . connect ( err => {
const db = client . db ( String ( server ) + "[ECON]" );
const dbo = db . collection ( id );
if ( err ) { return console . log ( err ); }
db . listCollections ({ name : id })
. next ( function ( err , collinfo ) {
if ( err ) { return console . log ( err ); }
if ( ! collinfo ) {
message . reply ( "You didn't have a place in my databases, so I created one for you!\nPlease try your command again!" )
2022-05-29 20:59:39 +03:00
let hp_mp = { maxhp : BASE . HP , hp : BASE . HP , maxmp : BASE . MP , mp : BASE . MP }
dbo . insertOne ({ balance : 10 , rank : 1 , lastdayworked : 0 , xp : 0 , hpmp : hp_mp , game : game , opponent : opponent , state : STATE . IDLE , equipped : { weapons : { main : null , secondary : null }, items : {}}});
2022-05-24 08:55:57 +03:00
}
});
});
client . close ();
}
2022-05-12 17:38:08 +03:00
function addxp ( message , dbo , amt , xp_list ) {
if ( ! isNum ( amt )) { return console . log ( "This isn't a number...." ); }
dbo . find ({ "balance" : { $exists : true }}). toArray ( function ( err , doc ) {
if ( ! String ( doc )) { return console . log ( "ERROR!\nThis account does not exist!" ); }
temp = doc [ 0 ];
2022-05-24 08:55:57 +03:00
let rank = temp . rank + 1 ; //The table starts at rank 0, the user starts at rank 1
const txp = amt ; /*temp.xp + amt; // This part was used before the xp check was made in the 'work' function */
2022-05-12 17:38:08 +03:00
//If the rank is less than 100, you can still advance
if ( rank < 101 ) {
let needed = xp_list . get ( rank );
if ( txp >= needed ) {
//Get to the max level possible with the current xp (may skip)
while ( txp >= needed ) {
rank ++ ;
needed = xp_list . get ( rank );
}
rank -- ; //Maybe?
2022-05-29 20:59:39 +03:00
let newhp ;
if ( newhp < 200 ) {
newhp = BASE . HP * rank ;
} else {
newhp = temp . hpmp . hp + 50 ;
}
let newmp = temp . mp + 5 ;
dbo . updateOne ({ balance : temp . balance , rank : temp . rank , lastdayworked : temp . lastdayworked }, { $set : { rank : rank , hpmp : { maxhp : newhp , maxmp : newmp } }});
2022-05-12 17:38:08 +03:00
message . channel . send ( 'Congradulations <@' + message . author . id + '> for reaching rank ' + String ( rank ) + '!' );
}
2022-05-29 20:59:39 +03:00
} else {
message . reply ( "You've already reached max level!" );
2022-05-12 17:38:08 +03:00
}
dbo . updateOne ({ balance : temp . balance }, { $set : { xp : txp }});
});
}
2022-05-19 21:31:40 +03:00
function getBalance ( dbo , message ) {
dbo . find ({ "balance" : { $exists : true }}). toArray ( function ( err , doc ) {
return message . reply ( 'Your current balance is $' + String ( doc [ 0 ]. balance ));
});
}
2022-05-12 17:38:08 +03:00
function rank ( dbo , message , xp_list ) {
dbo . find ({ "balance" : { $exists : true }}). toArray ( function ( err , doc ) {
if ( ! String ( doc )) { return console . log ( "ERROR!\nThis account does not exist!" ); }
let next = doc [ 0 ]. rank + 1 ;
let needed = xp_list . get ( next );
message . channel . send ( '<@' + message . author . id + '> you are currently at rank ' + String ( next - 1 ) + ' and have ' + String ( doc [ 0 ]. xp ) + 'xp. You need ' + String ( needed - doc [ 0 ]. xp ) + ' more xp to get to rank ' + String ( next ));
});
}
//Changes one type of currency for another
function convertCurrency ( id , amt , dbo ) {
}
function checkAndUpdateBal ( dbo , item , message , args ) {
let b = false ;
dbo . find ({ "balance" : { $exists : true }}). toArray ( b = function ( err , doc ) {
2022-06-10 16:19:47 +03:00
if ( ! String ( doc )) {
message . reply ( "Your account doesn't exist, please contact the mods for support" );
return false ;
}
2022-05-12 17:38:08 +03:00
const icost = args [ 0 ] * item . cost ;
if ( doc [ 0 ]. balance < icost ) {
message . reply ( "Insufficient funds!" );
return false ;
} else {
let temp = doc [ 0 ];
dbo . updateOne ({ balance : temp . balance , rank : temp . rank , lastdayworked : temp . lastdayworked }, { $set : { balance : doc [ 0 ]. balance -= icost }});
2022-05-12 18:05:47 +03:00
message . reply ( "You have bought " + item . name + " for $" + icost + "!" );
2022-05-12 17:38:08 +03:00
return true ;
}
});
return b ;
}
function buy ( id , message , args , dbo , shop , xp_list ) {
if ( args . length < 2 ) { return ; }
if ( ! isNum ( args [ 0 ])) { return message . reply ( "Please enter a number for query 2" ); }
let query = args [ 1 ];
let item = shop . filter ( function ( item ) { return item . name . toLowerCase () == query . toLowerCase (); });
if ( ! String ( item )) { return message . reply ( "This item does not exist!" ); }
let success = Boolean ( checkAndUpdateBal ( dbo , item [ 0 ], message , args ));
if ( ! success ) { return ; }
var newObj = { name : item [ 0 ]. name , cost : item [ 0 ]. cost , icon : item [ 0 ]. icon , sect : item [ 0 ]. sect };
addxp ( message , dbo , Math . ceil ( item [ 0 ]. cost * 1.2 ), xp_list );
2022-05-19 21:31:40 +03:00
2022-05-12 17:38:08 +03:00
dbo . find ( newObj , { $exists : true }). toArray ( function ( err , doc ) {
if ( String ( doc )) {
let newnum = doc [ 0 ]. num + Number ( args [ 0 ]);
dbo . updateOne ({ name : item [ 0 ]. name }, { $set : { num : newnum }});
} else {
dbo . insertOne ({ name : item [ 0 ]. name , cost : item [ 0 ]. cost , icon : item [ 0 ]. icon , sect : item [ 0 ]. sect , num : Number ( args [ 0 ])});
}
});
};
2022-05-19 21:31:40 +03:00
function sell ( id , message , args , dbo , shop , xp_list ) {
2022-05-12 17:38:08 +03:00
if ( args . length < 2 ) { return ; }
2022-05-19 21:31:40 +03:00
if ( ! isNum ( args [ 0 ])) { return message . reply ( "Please enter a number for query 1" ); }
2022-05-12 17:38:08 +03:00
let query = args [ 1 ];
2022-05-19 21:31:40 +03:00
var newObj = { name : query };
let item = shop . filter ( function ( titem ) { return titem . name . toLowerCase () == query . toLowerCase (); });
2022-05-12 17:38:08 +03:00
if ( ! String ( item )) { return message . reply ( "This item does not exist!" ); }
2022-05-19 21:31:40 +03:00
item [ 0 ] = { name : item [ 0 ]. name , cost : item [ 0 ]. cost , icon : item [ 0 ]. icon , sect : item [ 0 ]. sect };
let functional_item = item [ 0 ];
dbo . find ( functional_item , { $exists : true }). toArray ( function ( err , doc ) {
2022-05-12 17:38:08 +03:00
if ( String ( doc )) {
2022-05-19 21:31:40 +03:00
//Make sure you don't sell more than you have
let num = Number ( args [ 0 ]);
if ( num < doc [ 0 ]. num ) {
let newNum = doc [ 0 ]. num - num ;
dbo . updateOne ({ name : item [ 0 ]. name }, { $set : { num : newNum }});
} else {
num = doc [ 0 ]. num ;
dbo . deleteOne ({ name : item [ 0 ]. name });
}
//Update the balance
let amountSoldFor = functional_item . cost * num ;
dbo . find ({ "balance" : { $exists : true }}). toArray ( function ( err , doc ) {
let currentBal = doc [ 0 ]. balance ;
dbo . updateOne ({ "balance" : { $exists : true }}, { $set : { balance : currentBal + amountSoldFor }});
});
addxp ( message , dbo , Math . ceil ( functional_item . cost * 1.2 ), xp_list );
message . reply ( `You've sold ${ num } ${ String ( functional_item . name ) } for $ ${ amountSoldFor } ` );
2022-05-12 17:38:08 +03:00
} else {
message . reply ( "You don't own this item!" );
}
});
}
function work ( dbo , message , xp_list ) {
let fulldate = new Date ();
let date = fulldate . getDate ();
dbo . find ({ "lastdayworked" : { $exists : true }}). toArray ( function ( err , doc ) {
if ( ! String ( doc )) { return message . reply ( "Your account doesn't exist, please contact the mods for support" ); }
2022-05-24 08:55:57 +03:00
if ( doc [ 0 ]. lastdayworked == 111111 ) { //date
2022-05-12 17:38:08 +03:00
message . reply ( "You've already worked today, try again tomorrow!" );
} else {
//Amount to be paid
let amt = 0 ;
2022-05-24 08:55:57 +03:00
amt = ( BASE . PAY * doc [ 0 ]. rank );
let xp_earned = doc [ 0 ]. xp + Math . ceil ( amt * 1.5 );
//Update the amount to the new TOTAL balance
dbo . updateOne ({ "balance" : { $exists : true }}, { $set : { balance : doc [ 0 ]. balance + amt , lastdayworked : date }});
addxp ( message , dbo , xp_earned , xp_list );
message . channel . send ( '<@' + message . author . id + '> worked and earned $' + amt + ' and ' + String ( xp_earned ) + ' xp!' );
2022-05-12 17:38:08 +03:00
}
});
}
function printInventory ( dbo , message ) {
let tempstring = "" ;
dbo . find (). toArray ( function ( err , docs ){
docs . forEach ( val => {
if ( ! val . balance ) {
tempstring += String ( val . num ) + " " + val . name + " (" + val . icon + ")\n" ;
}
});
2022-05-19 21:31:40 +03:00
if ( tempstring == "" ) { tempstring += "You have nothing in your inventory!" ; }
2022-05-12 17:38:08 +03:00
message . reply ( tempstring );
});
}
2022-05-24 08:55:57 +03:00
function getShop ( message , args , items , bot ) {
2022-05-12 17:38:08 +03:00
if ( args . length == 0 ) {
let temp = Formatters . codeBlock ( items . map ( i => ` ${ i . sect } ` ). join ( ' ' ));
temp = [... new Set ( temp . split ( ' ' ))];
2022-05-24 08:55:57 +03:00
return message . reply ( `Please use the format ${ bot . prefix } shop [type] [page number]\nTypes are: ${ temp } ` );
2022-05-12 17:38:08 +03:00
}
let ind = 1 ;
let noinp = false ;
if ( args . length > 1 ) {
if ( args [ 1 ] < ( items . length / 9 )) {
ind = Number ( args [ 1 ]);
} else {
return message . reply ( "That number is too large" );
}
} else {
noinp = true ;
}
2022-05-29 21:30:37 +03:00
const items2 = items . filter ( function ( f ) { return ( f . sect . toLowerCase () == args [ 0 ]. toLowerCase ()) }). slice (( ind - 1 ) * 10 , ( ind - 1 ) * 10 + 10 );
newText = Formatters . codeBlock ( items2 . map ( i => ` ${ i . icon } ( ${ i . name } ): \$ ${ i . cost } ` ). join ( '\n' ));
2022-05-12 17:38:08 +03:00
if ( noinp ) {
2022-05-24 08:55:57 +03:00
newText += `(Use ${ bot . prefix } shop [type] [page number] to access other pages)` ;
2022-05-12 17:38:08 +03:00
}
return message . reply ( newText );
}
2022-05-24 08:55:57 +03:00
function econHelp () {
let l = [ "buy" , 'shop' , 'work' , 'rank' , 'inventory' , 'balance' , 'sell' ]
return l . join ( ", " );
}
2022-05-12 17:38:08 +03:00
//#endregion
//Main Code
module . exports = {
2022-05-24 08:55:57 +03:00
name : 'econ' ,
2022-05-12 17:38:08 +03:00
description : 'ECON' ,
async execute ( bot , message , args , command , Discord , mongouri , items , xp_list ) {
//Set Discord vars
const id = message . author . id ;
const server = message . guild . id ;
const client = new MongoClient ( mongouri , { useNewUrlParser : true , useUnifiedTopology : true , serverApi : ServerApiVersion . v1 });
2022-05-24 08:55:57 +03:00
if ( client . writeConcern || client . writeConcern ) {
client . close ();
return message . reply ( "Something went wrong with the database, please try again later and contact support if this problem persists!" );
}
//Initialize if necessary
CreateNewCollection ( message , client , server , id );
2022-05-12 17:38:08 +03:00
client . connect ( err => {
2022-05-14 20:40:58 +03:00
const db = client . db ( String ( server ) + "[ECON]" );
2022-05-12 17:38:08 +03:00
const dbo = db . collection ( id );
if ( err ) { return console . log ( err ); }
2022-05-24 08:55:57 +03:00
//test area
if ( command == 'xp' || command == 'adbal' ) {
//Selmer Dev only command
if ( message . member . roles . cache . has ( '944048889038774302' )) {
if ( command == 'xp' ) {
return addxp ( message , dbo , Number ( args [ 0 ]), xp_list );
2022-05-12 17:38:08 +03:00
}
}
2022-05-24 08:55:57 +03:00
}
2022-05-12 17:38:08 +03:00
2022-05-24 08:55:57 +03:00
//Command Area
if ( command == 'init' ) {
//Add security check here
// init.execute(bot, message, args, command, dbo, Discord, connect);
return ;
} else if ( command == 'buy' ) {
buy ( id , message , args , dbo , items , xp_list );
} else if ( command == 'shop' ) {
getShop ( message , args , items , bot );
} else if ( command == 'work' ) {
work ( dbo , message , xp_list );
} else if ( command == 'rank' ) {
rank ( dbo , message , xp_list );
} else if ( command == 'inventory' ) {
printInventory ( dbo , message );
} else if ( command == 'balance' ) {
getBalance ( dbo , message );
} else if ( command == 'sell' ) {
sell ( id , message , args , dbo , items , xp_list );
} else {
message . channel . send ( "'" + message . content + "' is not a command!" );
}
2022-05-12 17:38:08 +03:00
});
//Close the database
client . close ();
2022-05-24 08:55:57 +03:00
},
//Battle Updating stuff
2022-05-25 22:33:42 +03:00
addxp , checkAndUpdateBal , CreateNewCollection , econHelp , addxp , BASE , STATE
2022-05-24 08:55:57 +03:00
}
/*
?????????????? What did I need this for?
else if (command == 'checkinv') {
const req = dbo.findOne({ id: message.guild.id });
if (!req) { return message.reply("Doc doesn't exist!"); }
}
*/