2019-10-19 11:32:28 +02:00
package moe.kageru.kagebot.features
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
import java.util.concurrent.CompletionException
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
override fun handle ( message : MessageCreateEvent ) {
if ( " " !in message . readableMessageContent ) {
message . channel . sendMessage ( " Invalid syntax, expected 2 arguments " )
return
}
val ( _ , limit ) = message . readableMessageContent . split ( " " , limit = 2 )
limit . toLongOrNull ( ) ?. let { parsedLimit ->
if ( parsedLimit > 99 ) {
message . channel . sendMessage ( " You can’t create a channel with that many users. " )
}
createChannel ( message , parsedLimit )
message . channel . sendMessage ( " Done " )
} ?: message . channel . sendMessage ( " Invalid syntax, expected a number, got $limit " )
}
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
private fun createChannel ( message : MessageCreateEvent , limit : Long ) {
val creation = Config . server . createVoiceChannelBuilder ( ) . apply {
setUserlimit ( limit . toInt ( ) )
setName ( generateChannelName ( message ) )
setAuditLogReason ( " Created temporary VC for user ${message.messageAuthor.discriminatedName} " )
category ?. let { setCategory ( it ) }
} . create ( )
try {
val channel = creation . join ( )
Dao . addTemporaryVC ( channel . idAsString )
} catch ( e : CompletionException ) {
Log . warn ( " Attempted to create temporary VC without the necessary permissions " )
}
}
private fun generateChannelName ( message : MessageCreateEvent ) : String {
return " ${message.messageAuthor.name} ’s volatile corner "
}
}