2018-10-14 14:16:14 +02:00
package nl.voidcorp.dbot.commands
2018-10-29 15:28:58 +01:00
import net.dv8tion.jda.core.EmbedBuilder
2018-10-14 14:16:14 +02:00
import net.dv8tion.jda.core.MessageBuilder
2018-11-05 17:41:18 +01:00
import net.dv8tion.jda.core.entities.ChannelType
2018-10-29 15:28:58 +01:00
import net.dv8tion.jda.core.entities.MessageEmbed
2018-11-05 22:10:19 +01:00
import net.dv8tion.jda.core.managers.GuildController
2018-10-29 15:28:58 +01:00
import nl.voidcorp.dbot.catMap
import nl.voidcorp.dbot.commands
import nl.voidcorp.dbot.emptyOr
import nl.voidcorp.dbot.random
import java.time.LocalDateTime
2018-10-15 22:25:51 +02:00
import java.time.temporal.ChronoUnit
2018-10-30 20:38:44 +01:00
import kotlin.random.Random
2018-10-14 14:16:14 +02:00
2018-10-15 22:25:51 +02:00
2018-11-05 22:10:19 +01:00
val helloCommand = UnityCommand ( " hello " , " Say hello to Andy! " ) {
2018-10-30 20:38:44 +01:00
val i = Random . nextInt ( 10 )
if ( i > 8 ) {
it . reply ( " Can you speak up or I'll throw you a microphone " )
} else {
it . reply ( MessageBuilder ( " Hello, " ) . append ( it . author ) . append ( " ! " ) . build ( ) )
}
2018-10-15 22:25:51 +02:00
}
2018-10-30 20:59:07 +01:00
val pingCommand =
2018-11-05 22:10:19 +01:00
UnityCommand ( " ping " , help = " Check the bot's ping " , aliases = mutableListOf ( " pong " ) , cooldown = 10 ) { event ->
2018-11-05 17:41:18 +01:00
event . reply ( " Ping: ... " ) { m ->
val ping = event . message . creationTime . until ( m . creationTime , ChronoUnit . MILLIS )
m . editMessage ( " Ping: " + ping + " ms | Websocket: " + event . jda . ping + " ms " ) . queue ( )
}
2018-10-15 22:25:51 +02:00
}
2018-10-30 20:38:44 +01:00
val replies =
listOf ( " Hello %% " , " Why hello there %%! " , " Hello there %% " , " General %%. You are a bold one " , " A wild %% appeared! " )
val helpCommand =
2018-11-05 17:41:18 +01:00
UnityCommand ( " help " , " Guess what? " , category = object : UnityCategory ( " hidden " ) {
override fun test ( ce : UnityCommandEvent ) : Boolean {
2018-11-05 22:10:19 +01:00
if ( ce . member . roles . firstOrNull { it . name . equals ( " admin " , true ) } != null ) return true
if ( channels . all { ce . guild . getTextChannelsByName ( it , true ) . firstOrNull ( ) == null } ) return true
2018-11-05 17:41:18 +01:00
val s = ( ce . channelType == ChannelType . TEXT ) and ( ce . textChannel !! . name . toLowerCase ( ) . run {
contains ( " bot " ) or ( ce . guild . textChannels . none {
it . name . contains (
" music-bot "
)
} and contains ( " music " ) )
} )
if ( ! s ) {
ce . reply ( " This command can only be used in music and bot channels! " )
}
return s
}
} ) { event ->
2018-10-30 20:38:44 +01:00
val greeting = replies . random ( ) . replace ( " %% " , event . member . effectiveName )
val eb = EmbedBuilder ( )
when {
event . args . isEmpty ( ) -> {
val prefix = GSM . getSettings ( event . guild ) . primaryPrefix
2018-10-29 15:28:58 +01:00
2018-10-30 20:38:44 +01:00
eb . setTitle ( greeting )
2018-11-05 22:10:19 +01:00
. appendDescription ( " My name is OttoBot, and I am definitely the best Discord bot around! \n \n Use ` ${prefix} help command` for a chance that I have more info about a command! " )
2018-10-30 20:38:44 +01:00
. setColor ( event . selfMember . color )
. setFooter ( " Requested by ${event.member.effectiveName} " , event . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
val m = commands . catMap ( ) . filter { it . key != " hidden " }
for ( e in m . entries ) {
val f = MessageEmbed . Field (
e . key ,
e . value . asSequence ( ) . filter { it . name != " help " } . joinToString (
separator = " \n " ,
postfix = " \n "
) { " ` $prefix ${it.name} ` " } ,
true
)
eb . addField ( f )
}
eb . setThumbnail ( event . selfUser . effectiveAvatarUrl )
2018-10-29 15:28:58 +01:00
}
2018-10-30 20:38:44 +01:00
event . args == " help " -> {
eb . setTitle ( " Ha Ha " )
2018-10-29 15:28:58 +01:00
. appendDescription ( " Ha ha, very funny ${event.member.effectiveName} " )
2018-10-30 20:38:44 +01:00
. setColor ( event . selfMember . color )
. setFooter ( " Requested by ${event.member.effectiveName} " , event . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
}
commands . any { it . name == event . args } -> {
val cmd = commands . first { it . name == event . args }
eb . setTitle ( " **! ${cmd.name} ** " )
2018-10-29 15:28:58 +01:00
. appendDescription ( cmd . help )
2018-10-30 20:38:44 +01:00
. setColor ( event . selfMember . color )
. setFooter ( " Requested by ${event.member.effectiveName} " , event . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
if ( cmd . aliases . isNotEmpty ( ) ) eb . addField ( " Aliases " , cmd . aliases . joinToString { " ` $it ` " } , true )
2018-11-05 22:10:19 +01:00
eb . addField (
" Usage " ,
" ` ${GSM.getSettings(event.guild).primaryPrefix} ${cmd.howTo.emptyOr(cmd.name)} ` " ,
true
)
2018-10-30 20:38:44 +01:00
val cat = cmd . category
2018-10-29 15:28:58 +01:00
if ( cat . roles . isNotEmpty ( ) )
eb . addField ( " Roles " , cat . roles . joinToString { " ` $it ` " } , true )
2018-10-30 20:38:44 +01:00
}
2018-10-29 15:28:58 +01:00
2018-10-30 20:38:44 +01:00
else -> {
eb . setTitle ( greeting )
2018-10-29 15:28:58 +01:00
. appendDescription ( " I honestly have no idea what the command ` ${event.args} ` does... " )
2018-10-30 20:38:44 +01:00
. setColor ( event . selfMember . color )
. setFooter ( " Requested by ${event.member.effectiveName} " , event . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
}
2018-10-29 15:28:58 +01:00
}
2018-10-30 20:38:44 +01:00
event . reply ( eb . build ( ) )
2018-10-29 15:28:58 +01:00
}
2018-10-14 14:16:14 +02:00
2018-11-05 22:10:19 +01:00
val joinRoleCommand = UnityCommand (
" role " ,
" Join the role specified, use without parameters for a list! " ,
aliases = mutableListOf ( " joinrole " , " jr " )
) { ce ->
val gm = GSM . getSettings ( ce . guild )
val eb = EmbedBuilder ( ) . setColor ( ce . selfMember . color )
. setFooter ( " Requested by ${ce.member.effectiveName} " , ce . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
if ( ! ce . hasArgs ) {
val field = MessageEmbed . Field (
" Roles " ,
gm . roleMap . entries . map { it . key to ce . guild . getRoleById ( it . value ) !! } . joinToString { " ` ${it.first} `: ${it.second.name} " } ,
false
)
eb . addField ( field )
eb . setTitle ( " Here's a list of all this servers roles, ${ce.member.effectiveName} ! " )
} else {
if ( ! gm . roleMap . containsKey ( ce . args ) ) {
eb . setTitle ( " There was an error " )
eb . setDescription ( " This role does not exist? \n Use ` ${gm.primaryPrefix} joinrole` to find the available roles! " )
} else {
val id = gm . roleMap [ ce . args ] !!
val r = ce . guild . getRoleById ( id ) !!
GuildController ( ce . guild ) . addSingleRoleToMember ( ce . member , r ) . queue ( )
eb . setTitle ( " Have fun with your new role! " )
eb . setDescription ( " I have given you the role ${r.name} ! " )
}
}
ce . reply ( eb . build ( ) )
}
val removeRoleCommand =
UnityCommand ( " removerole " , " Remove the role specified, if you have it! " , aliases = mutableListOf ( " rr " ) ) { ce ->
val gm = GSM . getSettings ( ce . guild )
val eb = EmbedBuilder ( ) . setColor ( ce . selfMember . color )
. setFooter ( " Requested by ${ce.member.effectiveName} " , ce . author . effectiveAvatarUrl )
. setTimestamp ( LocalDateTime . now ( ) )
if ( ! ce . hasArgs ) {
val roles = gm . roleMap . map { it . key to ce . guild . getRoleById ( it . value ) !! }
. filter { ce . member . roles . contains ( it . second ) }
val field = MessageEmbed . Field (
" Roles " ,
roles . joinToString { " ` ${it.first} `: ${it.second.name} " } ,
false
)
eb . addField ( field )
eb . setTitle ( " Here's a list of all your removable roles, ${ce.member.effectiveName} ! " )
} else {
if ( ! gm . roleMap . containsKey ( ce . args ) ) {
eb . setTitle ( " There was an error " )
eb . setDescription ( " This role does not exist? \n Use ` ${gm.primaryPrefix} removerole` to find the removable roles! " )
} else {
val id = gm . roleMap [ ce . args ] !!
val r = ce . guild . getRoleById ( id ) !!
if ( ce . member . roles . contains ( r ) ) {
GuildController ( ce . guild ) . removeSingleRoleFromMember ( ce . member , r ) . queue ( )
eb . setTitle ( " Have fun (?) without the role? " )
eb . setDescription ( " I have removed the role ${r.name} ! " )
} else {
eb . setTitle ( " Yeah this wont work don't you think? " )
eb . setDescription ( " You need to have the role you are trying to remove to be able to remove it... \n Honestly what did you expect? " )
}
}
}
ce . reply ( eb . build ( ) )
}