2020-05-21 12:47:58 +02:00
const { Setting } = require ( '../../../../interfaces/' ) ;
2020-08-17 22:26:57 +02:00
const { Emojis } = require ( '../../../../../util/' ) ;
const { PermissionNames , EmbedLimits } = require ( '../../../../../util/Constants.js' ) ;
const Constants = {
Types : {
role : [
'muteRole' ,
'mutedRole'
] ,
create : [
'createMute' ,
'createMuted' ,
'createMuteRole' ,
'createMutedRole'
] ,
type : [
'muteType' ,
'mutedType'
] ,
permanent : [
'permaMute' ,
'permanentMute'
] ,
duration : [
'defaultMuteDuration' ,
'muteDuration'
]
} ,
MuteTypes : [ 0 , 1 , 2 ] ,
MaxCharacters : 98 ,
MaxIssues : 6
} ;
2020-05-21 12:47:58 +02:00
2020-06-02 12:09:28 +02:00
const { stripIndents } = require ( 'common-tags' ) ;
2020-05-21 12:47:58 +02:00
class MuteSetting extends Setting {
constructor ( client ) {
super ( client , {
name : 'mute' ,
module : 'moderation' ,
aliases : [
'muted' ,
'muteType' ,
'mutedType' ,
'muteRole' ,
'mutedRole' ,
2020-05-24 23:45:47 +02:00
'createMute' ,
'createMuteRole' ,
'createMuted' ,
2020-06-16 00:15:13 +02:00
'createMutedRole' ,
'permaMute' ,
'permanentMute' ,
2020-08-19 10:26:29 +02:00
'muteDuration' ,
2020-07-29 21:01:39 +02:00
'defaultMuteDuration'
2020-06-16 00:15:13 +02:00
] ,
2020-08-17 22:26:57 +02:00
// arguments: [
// {
// name: 'text',
// type: 'BOOLEAN',
// types: ['FLAG'],
// default: true
// },
// {
// name: 'voice',
// type: 'BOOLEAN',
// types: ['FLAG'],
// default: true
// }
// ],
usage : "<'create'|'type'|'permanent'|'default'|role> <value..>" ,
2020-05-21 12:47:58 +02:00
examples : [
2020-08-17 22:26:57 +02:00
"mute muted-role" ,
"mute create Muted" ,
"mute type 1" ,
"mute permanent true" ,
"mute default 1 day"
2020-05-21 12:47:58 +02:00
] ,
resolve : 'GUILD' ,
default : {
mute : {
role : null ,
2020-06-16 00:15:13 +02:00
type : 0 ,
defaultDuration : 3600 ,
permanent : false
2020-05-21 12:47:58 +02:00
}
}
} ) ;
}
2020-08-17 22:26:57 +02:00
async handle ( message , args ) {
const { params , parsedArguments } = await this . _parseArguments ( args , message . guild ) ;
if ( params . length === 0 ) {
return {
msg : message . format ( 'S_MUTE_MISSINGARGUMENTS' ) ,
error : true
} ;
}
let type = 'role' ;
let parameters = params . join ( ' ' ) ;
if ( ! [ 'mute' , 'muted' ] . includes ( message . _settingCaller ) ) {
for ( const [ key , values ] of Object . entries ( Constants . Types ) ) {
if ( values . map ( ( v ) => v . toLowerCase ( ) ) . includes ( message . _settingCaller . toLowerCase ( ) ) ) {
type = key ;
break ;
}
}
} else {
const key = params [ 0 ] . toLowerCase ( ) ;
if ( [ 'create' , 'createrole' ] . includes ( key ) ) type = 'create' , parameters = params . splice ( 1 ) . join ( ' ' ) ; //eslint-disable-line no-unused-expressions, no-sequences
if ( [ 'type' ] . includes ( key ) ) type = 'type' , parameters = params . splice ( 1 ) . join ( ' ' ) ; //eslint-disable-line no-unused-expressions, no-sequences
if ( [ 'duration' , 'defaultduration' ] . includes ( key ) ) type = 'duration' , parameters = params . splice ( 1 ) . join ( ' ' ) ; //eslint-disable-line no-unused-expressions, no-sequences
if ( [ 'perma' , 'permamute' , 'permanent' ] . includes ( key ) ) type = 'permanent' , parameters = params . splice ( 1 ) . join ( ' ' ) ; //eslint-disable-line no-unused-expressions, no-sequences
}
if ( type === 'role' ) {
const role = await this . client . resolver . resolveRole ( parameters , true , message . guild ) ;
if ( ! role ) return {
msg : message . format ( 'S_MUTE_ROLEMISSING' ) ,
error : true
} ;
await message . guild . _updateSettings ( {
[ this . index ] : {
... message . guild . _settings [ this . index ] ,
role : role . id
}
} ) ;
2020-08-19 10:26:29 +02:00
return {
msg : message . format ( 'S_MUTE_ROLESUCCESS' , { role : role . name } ) ,
error : false
} ;
2020-08-17 22:26:57 +02:00
} else if ( type === 'create' ) {
const response = await this . _createRole ( message , parameters , parsedArguments ) ;
if ( response . error ) return response ;
const { role , issues , created , updatedPermissions } = response ;
await message . guild . _updateSettings ( {
[ this . index ] : {
... message . guild . _settings [ this . index ] ,
role : role . id
}
} ) ;
const embed = {
author : {
name : ` ${ Emojis . warning } Warning `
} ,
color : 0xffe15c ,
description : message . format ( 'S_MUTE_CREATESUCCESSWARNING' ) ,
fields : [ ]
} ;
const addField = ( array , type ) => {
const field = {
name : type === 'text' ? 'Text Channels' : 'Voice Channels' ,
value : ''
} ;
const sorted = array . sort ( ( a , b ) => a . position - b . position ) || [ ] ;
for ( const i of sorted ) {
const text = ` ${ Emojis . role } ** ${ i . role } ** has ${ i . permissions . map ( ( p ) => ` \` ${ PermissionNames [ p ] } \` ` ) . join ( ', ' ) } in ${ Emojis [ i . type === 'text' ? 'text-channel' : 'voice-channel' ] } ** ${ i . channel } ** \n ` ;
if ( field . value . length + text . length <= EmbedLimits . fieldValue ) field . value += text ;
}
return field ;
} ;
const textIssues = issues . filter ( ( i ) => i . type === 'text' ) ;
if ( textIssues . length > 0 ) embed . fields . push ( addField ( textIssues , 'text' ) ) ;
const voiceIssues = issues . filter ( ( i ) => i . type === 'voice' ) ;
if ( voiceIssues . length > 0 ) embed . fields . push ( addField ( voiceIssues , 'voice' ) ) ;
2020-08-19 10:26:29 +02:00
message . respond ( message . format ( ` S_MUTE_CREATESUCCESS ${ created ? 'ALT' : '' } ` , {
2020-08-17 22:26:57 +02:00
permissions : message . format ( updatedPermissions ? 'S_MUTE_GENERATEDPERMISSIONS' : 'S_MUTE_UNGENERATEDPERMISSIONS' ) ,
role : role . name
} ) , {
emoji : 'success' ,
embed : issues . length > 0 ? embed : null
} ) ;
} else if ( type === 'type' ) {
2020-08-19 10:26:29 +02:00
const number = parseInt ( parameters ) ;
2020-08-17 22:26:57 +02:00
if ( Number . isNaN ( number ) ) return {
msg : message . format ( 'S_MUTE_TYPENAN' ) ,
error : true
} ;
if ( ! Constants . MuteTypes . includes ( number ) ) return {
msg : message . format ( 'S_MUTE_TYPEINVALID' ) ,
error : true
} ;
await message . guild . _updateSettings ( {
[ this . index ] : {
... message . guild . _settings [ this . index ] ,
type : number
}
} ) ;
return {
msg : ` ${ message . format ( 'S_MUTE_TYPESUCCESS' , { type : number } )} ${ message . format ( 'S_MUTE_TYPESWITCH' , { type : number } , true)} ` ,
error : false
} ;
} else if ( type === 'duration' ) {
2020-08-19 10:26:29 +02:00
const time = this . client . resolver . resolveTime ( parameters ) ;
if ( ! time ) {
return {
msg : message . format ( 'S_MUTE_DEFAULTINVALID' ) ,
error : true
} ;
}
await message . guild . _updateSettings ( {
[ this . index ] : {
... message . guild . _settings [ this . index ] ,
defaultDuration : time
}
} ) ;
2020-08-17 22:26:57 +02:00
2020-08-19 10:26:29 +02:00
return {
msg : message . format ( 'S_MUTE_DEFAULTSUCCESS' , { time } ) ,
error : false
} ;
2020-08-17 22:26:57 +02:00
} else if ( type === 'permanent' ) {
2020-08-19 10:26:29 +02:00
const boolean = this . client . resolver . resolveBoolean ( parameters ) ;
if ( boolean === null ) {
return {
msg : message . format ( 'S_MUTE_PERMANENTINVALID' ) ,
error : true
} ;
}
2020-08-17 22:26:57 +02:00
2020-08-19 10:26:29 +02:00
await message . guild . _updateSettings ( {
[ this . index ] : {
... message . guild . _settings [ this . index ] ,
permanent : boolean
}
} ) ;
return {
msg : message . format ( 'S_MUTE_PERMANENTSUCCESS' , { boolean } ) ,
error : false
} ;
2020-08-17 22:26:57 +02:00
}
return {
error : false ,
ignore : true
} ;
}
async _createRole ( message , name = 'Muted' , args ) {
const createRole = async ( name ) => {
let role = null ;
if ( name . length > Constants . MaxCharacters ) name = name . slice ( 0 , Constants . MaxCharacters ) ;
try {
role = await message . guild . roles . create ( {
data : {
name
} ,
reason : super . reason ( message . author )
} ) ;
} catch ( error ) {
return {
msg : message . format ( 'S_MUTE_ROLECREATEERROR' ) ,
error : true
} ;
}
return role ;
} ;
const hasPermission = message . guild . me . hasPermission ( 'MANAGE_ROLES' ) ;
if ( ! hasPermission ) return {
msg : message . format ( 'S_MUTE_ROLEMISSINGPERMISSION' ) ,
error : true
} ;
let role = null ;
const existing = await this . client . resolver . resolveRole ( name , true , message . guild ) ;
if ( existing ) {
const prompt = await message . prompt ( message . format ( 'S_MUTE_ROLEPROMPT' , {
name : existing . name ,
id : existing . id
} ) , { emoji : 'loading' } ) ;
const boolean = this . client . resolver . resolveBoolean ( prompt . content . toLowerCase ( ) ) ;
if ( boolean === null ) return {
msg : message . format ( 'S_MUTE_ROLEPROMPTERROR' ) ,
error : true
} ;
if ( boolean ) {
role = existing ;
}
}
let created = false ;
if ( ! role ) {
role = await createRole ( name ) ;
if ( role . error ) return role ;
created = true ;
}
const issues = [ ] ;
let updatedPermissions = false ;
for ( const channel of message . guild . channels . cache . values ( ) ) {
const configuration = channel . type === 'text'
? { permissions : { SEND _MESSAGES : false , ADD _REACTIONS : false } , bitwise : 0x800 }
: { permissions : { CONNECT : false } , bitwise : 0x100000 } ;
try {
if ( channel . type === 'text' || channel . type === 'voice' ) {
await channel . createOverwrite ( role , configuration . permissions , super . reason ( message . author ) ) ;
for ( const permission of channel . permissionOverwrites . values ( ) ) {
if ( permission . type !== 'role' ) continue ;
const permissionRole = await this . client . resolver . resolveRole ( permission . id , true , message . guild ) ;
if ( ( permission . allow & configuration . bitwise ) === configuration . bitwise ) { //eslint-disable-line no-bitwise
const issue = {
role : permissionRole . name ,
permissions : Object . keys ( configuration . permissions ) ,
channel : channel . name ,
type : channel . type ,
position : permissionRole . rawPosition
} ;
issues . push ( issue ) ;
}
}
}
updatedPermissions = true ;
} catch ( error ) { } //eslint-disable-line no-empty
}
return {
error : false ,
updatedPermissions ,
created ,
issues ,
role
} ;
}
2020-05-21 12:47:58 +02:00
fields ( guild ) {
2020-06-16 00:15:13 +02:00
const setting = guild . _settings [ this . index ] ;
2020-05-21 12:47:58 +02:00
return [
{
2020-08-19 10:26:29 +02:00
name : '》 Mute Role' ,
2020-06-16 00:15:13 +02:00
value : setting ? . role ? ` <@& ${ guild . _settings [ this . index ] . role } > ` : '`N/A`' ,
2020-05-21 12:47:58 +02:00
inline : true
} ,
{
2020-08-16 09:27:49 +02:00
name : '》 Mute Type' ,
2020-06-16 00:15:13 +02:00
value : ` \` ${ setting ? . type || 0 } \` ` ,
2020-05-21 12:47:58 +02:00
inline : true
2020-06-16 00:15:13 +02:00
} ,
{ name : '\u200b' , value : '\u200b' , inline : true } , //zero width spaces, not necessary, but could make things look nicer.
{
2020-08-16 09:27:49 +02:00
name : '》 Permanent Mutes' ,
value : guild . format ( 'SETTING_STATUS' , { bool : Boolean ( setting ? . permanent ) } , true ) ,
2020-06-16 00:15:13 +02:00
inline : true
} ,
{
2020-08-16 09:27:49 +02:00
name : '》 Default Duration' ,
2020-06-16 00:15:13 +02:00
value : ` \` ${ setting . defaultDuration ? ` ${ setting . defaultDuration } seconds ` : 'N/A' } \` ` ,
inline : true
} ,
{ name : '\u200b' , value : '\u200b' , inline : true } //zero width spaces, not necessary, but could make things look nicer.
2020-05-21 12:47:58 +02:00
] ;
}
}
module . exports = MuteSetting ;