discord-kagebot/src/main/kotlin/moe/kageru/kagebot/features/WelcomeFeature.kt

54 lines
1.8 KiB
Kotlin
Raw Normal View History

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
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
import org.javacord.api.event.message.MessageCreateEvent
2019-07-17 23:42:12 +02:00
import org.javacord.api.event.server.member.ServerMemberJoinEvent
class WelcomeFeature(
2019-11-14 15:10:30 +01:00
content: List<String>?,
fallbackChannel: String?,
2023-08-14 10:14:19 +02:00
private val fallbackMessage: String?,
) : MessageFeature, EventFeature {
2019-11-14 15:10:30 +01:00
val embed: EmbedBuilder? by lazy { content?.let(MessageUtil::listToEmbed) }
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(
2023-08-14 10:14:19 +02:00
fallbackMessage!!.replace("@@", event.user.mentionTag),
2019-11-14 15:10:30 +01:00
)
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
}