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-07-17 23:42:12 +02:00
import moe.kageru.kagebot.Util.checked
import moe.kageru.kagebot.Util.failed
2019-11-12 14:02:31 +01:00
import moe.kageru.kagebot.Util.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 (
content : List < String > ? ,
fallbackChannel : String ? ,
private val fallbackMessage : String ?
) : MessageFeature , EventFeature {
val embed : EmbedBuilder ? by lazy { content ?. let ( MessageUtil :: listToEmbed ) }
2019-07-17 23:42:12 +02:00
override fun register ( api : DiscordApi ) {
api . addServerMemberJoinListener { event ->
checked { welcomeUser ( event ) }
}
}
fun welcomeUser ( event : ServerMemberJoinEvent ) {
2019-07-23 11:26:48 +02:00
Log . info ( " User ${event.user.discriminatedName} joined " )
2019-07-17 23:42:12 +02:00
val message = event . user . sendMessage ( embed )
// If the user disabled direct messages, try the fallback (if defined)
if ( message . failed ( ) && hasFallback ( ) ) {
fallbackChannel !! . sendMessage (
fallbackMessage !! . replace ( " @@ " , MessageUtil . mention ( event . user ) )
)
}
}
override fun handle ( message : MessageCreateEvent ) {
2019-07-14 16:35:20 +02:00
embed ?. let {
2019-08-05 21:38:41 +02:00
val sent = MessageUtil . sendEmbed ( message . channel , it )
// invoke this for logging
sent . failed ( )
} ?: Log . info ( " Welcome command was triggered, but no welcome embed defined. " )
2019-07-07 11:08:49 +02:00
}
2019-06-15 12:59:02 +02:00
2019-07-23 21:50:55 +02:00
private fun hasFallback ( ) : Boolean = fallbackChannel != null && fallbackMessage != null
2019-07-17 23:17:16 +02:00
2019-11-12 14:02:31 +01:00
private val fallbackChannel : TextChannel ? = fallbackChannel ?. let { channel ->
2019-10-18 21:56:31 +02:00
requireNotNull ( fallbackMessage ) {
2019-10-18 20:48:43 +02:00
" [feature.welcome.fallbackMessage] must not be null if fallbackChannel is defined "
2019-06-15 12:59:02 +02:00
}
2019-11-12 14:02:31 +01:00
Util . findChannel ( channel ) . unwrap ( )
2019-06-15 12:59:02 +02:00
}
2019-07-13 14:52:05 +02:00
}