2019-06-12 23:43:36 +02:00
package moe.kageru.kagebot.command
import moe.kageru.kagebot.Globals.config
import moe.kageru.kagebot.MessageUtil
import moe.kageru.kagebot.Util.doIf
import moe.kageru.kagebot.config.RawCommand
import org.javacord.api.entity.message.MessageAuthor
import org.javacord.api.event.message.MessageCreateEvent
private const val AUTHOR _PLACEHOLDER = " @@ "
class Command ( cmd : RawCommand ) {
val trigger : String
private val response : String ?
val matchType : MatchType
private val permissions : Permissions ?
private val actions : MessageActions ?
val regex : Regex ?
init {
2019-06-15 12:27:20 +02:00
trigger = cmd . trigger ?: throw IllegalArgumentException ( " Every command must have a trigger. " )
2019-06-12 23:43:36 +02:00
response = cmd . response
matchType = cmd . matchType ?. let { type ->
MatchType . values ( ) . find { it . name . equals ( type , ignoreCase = true ) }
?: throw IllegalArgumentException ( " Invalid [command.matchType]: “ ${cmd.matchType} ” " )
} ?: MatchType . PREFIX
permissions = cmd . permissions ?. let { Permissions ( it ) }
actions = cmd . actions ?. let { MessageActions ( it ) }
regex = if ( matchType == MatchType . REGEX ) Regex ( trigger ) else null
}
fun execute ( message : MessageCreateEvent ) {
if ( permissions ?. isAllowed ( message ) == false ) {
2019-06-15 11:47:11 +02:00
if ( config . localization . permissionDenied . isNotBlank ( ) ) {
message . channel . sendMessage ( config . localization . permissionDenied )
}
2019-06-12 23:43:36 +02:00
return
}
this . actions ?. run ( message , this )
this . response ?. let {
2019-06-15 12:48:23 +02:00
message . channel . sendMessage ( respond ( message . messageAuthor , it ) )
2019-06-12 23:43:36 +02:00
}
}
fun matches ( msg : String ) = this . matchType . matches ( msg , this )
2019-06-15 12:48:23 +02:00
private fun respond ( author : MessageAuthor , response : String ) = response . doIf ( { it . contains ( AUTHOR _PLACEHOLDER ) } ) {
2019-06-12 23:43:36 +02:00
it . replace ( AUTHOR _PLACEHOLDER , MessageUtil . mention ( author ) )
}
}
enum class MatchType {
PREFIX {
override fun matches ( message : String , command : Command ) = message . startsWith ( command . trigger )
} ,
CONTAINS {
override fun matches ( message : String , command : Command ) = message . contains ( command . trigger )
} ,
REGEX {
override fun matches ( message : String , command : Command ) = command . regex !! . matches ( message )
} ;
abstract fun matches ( message : String , command : Command ) : Boolean
}