2019-06-15 12:59:02 +02:00
package moe.kageru.kagebot.features
2019-07-23 11:26:48 +02:00
import moe.kageru.kagebot.Log
2019-06-15 12:59:02 +02:00
import moe.kageru.kagebot.MessageUtil
import moe.kageru.kagebot.Util
2019-11-12 22:22:32 +01:00
import moe.kageru.kagebot.Util.asOption
2019-11-13 23:18:28 +01:00
import moe.kageru.kagebot.Util.checked
2019-11-12 22:10:26 +01:00
import moe.kageru.kagebot.extensions.unwrap
2019-07-17 23:42:12 +02:00
import org.javacord.api.DiscordApi
2019-06-15 12:59:02 +02:00
import org.javacord.api.entity.channel.TextChannel
import org.javacord.api.entity.message.embed.EmbedBuilder
2019-07-07 11:08:49 +02:00
import org.javacord.api.event.message.MessageCreateEvent
2019-07-17 23:42:12 +02:00
import org.javacord.api.event.server.member.ServerMemberJoinEvent
2019-07-07 11:08:49 +02:00
2019-10-18 21:56:31 +02:00
class WelcomeFeature (
2019-11-14 15:10:30 +01:00
content : List < String > ? ,
fallbackChannel : String ? ,
private val fallbackMessage : String ?
2019-10-18 21:56:31 +02:00
) : MessageFeature , EventFeature {
2019-11-14 15:10:30 +01:00
val embed : EmbedBuilder ? by lazy { content ?. let ( MessageUtil :: listToEmbed ) }
2019-10-18 21:56:31 +02:00
2019-11-14 15:10:30 +01:00
override fun register ( api : DiscordApi ) {
api . addServerMemberJoinListener { event ->
checked { welcomeUser ( event ) }
2019-07-17 23:42:12 +02:00
}
2019-11-14 15:10:30 +01:00
}
2019-07-17 23:42:12 +02:00
2019-11-14 15:10:30 +01:00
fun welcomeUser ( event : ServerMemberJoinEvent ) {
Log . info ( " User ${event.user.discriminatedName} joined " )
val message = event . user . sendMessage ( embed )
// If the user disabled direct messages, try the fallback (if defined)
if ( message . asOption ( ) . isEmpty ( ) && hasFallback ( ) ) {
fallbackChannel !! . sendMessage (
fallbackMessage !! . replace ( " @@ " , event . user . mentionTag )
)
2019-07-17 23:42:12 +02:00
}
2019-11-14 15:10:30 +01:00
}
2019-07-17 23:42:12 +02:00
2019-11-14 15:10:30 +01:00
override fun handle ( message : MessageCreateEvent ) {
embed ?. let {
MessageUtil . sendEmbed ( message . channel , it )
} ?: Log . info ( " Welcome command was triggered, but no welcome embed defined. " )
}
2019-06-15 12:59:02 +02:00
2019-11-14 15:10:30 +01:00
private fun hasFallback ( ) : Boolean = fallbackChannel != null && fallbackMessage != null
2019-07-17 23:17:16 +02:00
2019-11-14 15:10:30 +01:00
private val fallbackChannel : TextChannel ? = fallbackChannel ?. let { channel ->
requireNotNull ( fallbackMessage ) {
" [feature.welcome.fallbackMessage] must not be null if fallbackChannel is defined "
2019-06-15 12:59:02 +02:00
}
2019-11-14 15:10:30 +01:00
Util . findChannel ( channel ) . unwrap ( )
}
2019-07-13 14:52:05 +02:00
}