2022-07-09 20:30:31 +03:00
//@ts-check
const { log , SEVCODES } = require ( '../log.js' ) ;
const { checkRole } = require ( './verify.js' ) ;
2022-07-12 20:10:35 +03:00
function modHelp ( ) {
const l = [ 'lock' , 'unlock' , 'kick' , 'ban' , 'unban' , 'mute' , 'unmute' ] ;
return l . join ( ", " ) ;
}
2022-07-09 20:30:31 +03:00
function kick ( guild , user ) {
guild . members . kick ( user ) ;
}
async function toggle _ban ( guild , message , args , ban , reason ) {
if ( ban ) {
2022-07-24 15:25:51 +03:00
guild . members . ban ( args ) ;
2022-07-09 20:30:31 +03:00
} else {
2022-07-24 15:25:51 +03:00
var user = args [ 0 ] ;
let i = 0 ;
while ( user . indexOf ( '#' ) == - 1 ) {
user += args [ i ] ;
i ++
}
2022-07-09 20:30:31 +03:00
return new Promise ( ( resolve , reject ) => {
message . guild . bans . fetch ( ) . then ( ( users ) => {
const userObj = users . filter ( ( u ) => {
return ( ` ${ u . user . username } # ${ u . user . discriminator } ` == user ) ;
} ) . first ( ) ;
if ( userObj && userObj . user ) {
guild . members . unban ( userObj . user . id , reason ) . then ( ( ) => {
resolve ( userObj . user ) ;
} ) ;
} else {
reject ( "This user is not in the server!" ) ;
}
} )
} ) ;
// //Check if the user is banned or not
// message.guild.invites.fetch().then((invites) => {
// const u = guild.members.cache.get(id);
// u.send(`You have been unbanned from ${guild.name}, you can rejoin using the following link!\nhttps://discord.gg/${invites.first().code}`);
// });
}
}
function toggle _mute ( bot , guild , command , message , user , reason , mute ) {
const mutedRole = guild . roles . cache . find ( ( role ) => role . name . toLowerCase ( ) === 'muted' ) ;
const guser = guild . members . cache . get ( user . id ) ;
// if there is no `Muted` role, send an error
if ( ! mutedRole ) { return message . channel . send ( 'There is no "muted" role on this server. Please create one then try again' ) ; }
if ( mute ) {
if ( guser . roles . cache . get ( mutedRole . id ) == undefined ) {
guser . roles . add ( mutedRole ) ;
log ( bot , message , command , user , reason , SEVCODES . low ) ;
} else { message . reply ( "This user is already muted!" ) ; }
} else {
if ( guser . roles . cache . get ( mutedRole . id ) != undefined ) {
guser . roles . remove ( mutedRole ) ;
log ( bot , message , command , user , reason , SEVCODES . none ) ;
} else { message . reply ( "This user is not muted!" ) ; }
}
/*
NOTE: use the following function for a "time out" type thing?
setTimeout(() => {
target.roles.remove(mutedRole); // remove the role
}, <time>)
*/
}
function timeOut ( bot , user , message , args , command , reason ) {
let num = Number ( args [ 1 ] ) ;
if ( ! args [ 1 ] && ! Number . isSafeInteger ( num ) ) { return message . reply ( ` Please use the following format ${ bot . repfix } timeout <user> <amount of time> [*hours* **or** *minutes (default)*] ` ) }
let ms = num * 60 * 1000 ;
let timeAsSt = '' ;
if ( args [ 2 ] == 'hours' ) { ms *= 60 ; timeAsSt = ` ${ args [ 1 ] } hours ` ; }
else { timeAsSt = ` ${ args [ 2 ] } minutes ` ; }
user . timeout ( ms , reason ) ;
log ( bot , message , command , user , reason , timeAsSt ) ;
}
function moderation _handler ( bot , message , args , command ) {
const guild = message . guild ;
//Verify
if ( ! checkRole ( bot , guild , message . author . id ) ) { return message . reply ( 'Insufficient Permission!' ) ; }
let mentioned = message . mentions . users . first ( ) ;
if ( mentioned && mentioned . id == message . author . id ) { return message . reply ( ` You can't ${ command } yourself! ` ) ; }
const reason = args . slice ( 1 ) . join ( ' ' ) ;
if ( message . mentions . members . first ( ) && ( message . mentions . members . first ( ) . roles . highest . position > message . guild . members . resolve ( bot . user ) . roles . highest . position ) ) {
return message . reply ( "I'm not high enough in the role hierarchy to do that!\n_To raise my place, go to **Server Settings -> Roles** then drag me up!_" ) ;
}
if ( command != 'unban' && ! mentioned || ! reason ) { return message . channel . send ( ` Please use the following format: _!<command> <user> <reason> ` ) ; }
if ( command == 'unban' && ! args [ 0 ] && ! reason ) { return message . channel . send ( "Please use the following format: _!unban <user_tag>#<user_discriminator> <reason>\nExample: _!unban John#1122_" ) ; }
// if (command == 'ban' && guild.members.cache.get(mentioned.id).bannable) { message.reply("This user is not bannable!"); } //Broken
// if (command == 'ban' && !message.guild.members.cache.get(mentioned.id)) { message.reply("This user is not in the server"); }
switch ( command ) {
case 'kick' : kick ( guild , mentioned ) ;
log ( bot , message , command , mentioned , reason , SEVCODES . medium ) ;
break ;
case 'ban' : toggle _ban ( guild , message , mentioned , true , reason ) ;
log ( bot , message , command , mentioned , reason , SEVCODES . high ) ;
break ;
//Leave the then() catch() thing, it needs to be async
case 'unban' : toggle _ban ( guild , message , args , false , reason ) . then ( ( user ) => { log ( bot , message , command , user , reason , SEVCODES . none ) } ) . catch ( ( note ) => { message . reply ( note ) ; } ) ;
break ;
case 'mute' : toggle _mute ( bot , guild , command , message , mentioned , reason , true ) ;
break ;
case 'unmute' : toggle _mute ( bot , guild , command , message , mentioned , reason , true ) ;
break ;
// case 'timeout': timeOut(bot, mentioned, message, args, command, reason);
// shouldIlog = false;
// break;
default : console . log ( ` ERROR! Moderation Command " ${ command } " has somehow been used! ` ) ;
}
}
2022-07-12 20:10:35 +03:00
module . exports = {
name : 'moderation' ,
moderation _handler , modHelp
}