2019-10-19 11:32:28 +02:00
package moe.kageru.kagebot.features
2019-11-13 22:41:28 +01:00
import arrow.core.Either
import arrow.core.filterOrElse
import arrow.core.flatMap
import arrow.core.rightIfNotNull
2019-10-19 11:32:28 +02:00
import com.fasterxml.jackson.annotation.JsonProperty
import moe.kageru.kagebot.Log
2019-11-12 22:22:32 +01:00
import moe.kageru.kagebot.Util.asOption
2019-10-19 11:32:28 +02:00
import moe.kageru.kagebot.config.Config
2019-11-12 22:02:32 +01:00
import moe.kageru.kagebot.extensions.categoriesByName
2019-10-19 11:32:28 +02:00
import moe.kageru.kagebot.persistence.Dao
import org.javacord.api.DiscordApi
import org.javacord.api.entity.channel.ChannelCategory
import org.javacord.api.entity.channel.ServerVoiceChannel
import org.javacord.api.event.message.MessageCreateEvent
class TempVCFeature ( @JsonProperty ( " category " ) category : String ? = null ) : EventFeature , MessageFeature {
2019-11-12 22:02:32 +01:00
private val category : ChannelCategory ? = category ?. let { Config . server . categoriesByName ( it ) . first ( ) }
2019-10-19 11:32:28 +02:00
2019-11-13 22:41:28 +01:00
override fun handle ( message : MessageCreateEvent ) : Unit = with ( message ) {
Either . cond ( ' ' in readableMessageContent ,
{ readableMessageContent . split ( ' ' , limit = 2 ) . last ( ) } ,
{ " Invalid syntax, expected `<command> <userlimit>` " } )
. flatMap { limit ->
limit . toIntOrNull ( ) . rightIfNotNull { " Invalid syntax, expected a number as limit, got $limit " }
} . filterOrElse ( { it < 99 } , { " Error: can’t create a channel with that many users. " } )
. fold ( { err -> channel . sendMessage ( err ) } ,
{ limit ->
createChannel ( message , limit )
channel . sendMessage ( " Done " )
} )
2019-10-19 11:32:28 +02:00
}
override fun register ( api : DiscordApi ) {
api . addServerVoiceChannelMemberLeaveListener { event ->
if ( event . channel . connectedUsers . isEmpty ( ) && Dao . isTemporaryVC ( event . channel . idAsString ) ) {
deleteChannel ( event . channel )
}
}
}
2019-11-12 22:22:32 +01:00
private fun deleteChannel ( channel : ServerVoiceChannel ) =
channel . delete ( " Empty temporary channel " ) . asOption ( ) . fold (
{ Log . warn ( " Attempted to delete temporary VC without the necessary permissions " ) } ,
{ Dao . removeTemporaryVC ( channel . idAsString ) }
)
2019-10-19 11:32:28 +02:00
2019-11-13 22:41:28 +01:00
private fun createChannel ( message : MessageCreateEvent , limit : Int ) : Unit =
Config . server . createVoiceChannelBuilder ( ) . apply {
setUserlimit ( limit )
2019-10-19 11:32:28 +02:00
setName ( generateChannelName ( message ) )
setAuditLogReason ( " Created temporary VC for user ${message.messageAuthor.discriminatedName} " )
2019-11-13 22:41:28 +01:00
setCategory ( category )
} . create ( ) . asOption ( ) . fold (
{ Log . warn ( " Attempted to create temporary VC without the necessary permissions " ) } ,
{ channel -> Dao . addTemporaryVC ( channel . idAsString ) } )
2019-10-19 11:32:28 +02:00
2019-11-13 22:41:28 +01:00
private fun generateChannelName ( message : MessageCreateEvent ) : String =
" ${message.messageAuthor.name} ’s volatile corner "
}