diff --git a/src/main/kotlin/moe/kageru/kagebot/Util.kt b/src/main/kotlin/moe/kageru/kagebot/Util.kt index 3e0783c..a30b82a 100644 --- a/src/main/kotlin/moe/kageru/kagebot/Util.kt +++ b/src/main/kotlin/moe/kageru/kagebot/Util.kt @@ -57,13 +57,13 @@ object Util { return orElse(null) } - fun findUser(idOrName: String): User? { + fun findUser(idOrName: String): Option { return when { - idOrName.isEntityId() -> server.getMemberById(idOrName).toNullable() + idOrName.isEntityId() -> server.getMemberById(idOrName).asOption() else -> { when { - idOrName.contains('#') -> server.getMemberByDiscriminatedNameIgnoreCase(idOrName).toNullable() - else -> server.getMembersByName(idOrName).firstOrNull() + idOrName.contains('#') -> server.getMemberByDiscriminatedNameIgnoreCase(idOrName).asOption() + else -> server.getMembersByName(idOrName).firstOrNull().toOption() } } } diff --git a/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt b/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt new file mode 100644 index 0000000..6aeeec6 --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt @@ -0,0 +1,8 @@ +package moe.kageru.kagebot.extensions + +import arrow.core.Either + +fun Either.on(op: (R) -> Unit): Either { + this.map { op(it) } + return this +} diff --git a/src/main/kotlin/moe/kageru/kagebot/extensions/Extensions.kt b/src/main/kotlin/moe/kageru/kagebot/extensions/Extensions.kt index f9a9215..593862d 100644 --- a/src/main/kotlin/moe/kageru/kagebot/extensions/Extensions.kt +++ b/src/main/kotlin/moe/kageru/kagebot/extensions/Extensions.kt @@ -15,6 +15,7 @@ fun Server.channelById(id: String): Option = getTextChannelBy fun Server.channelByName(name: String): ListK = getTextChannelsByName(name).k() fun Server.rolesByName(name: String): ListK = getRolesByNameIgnoreCase(name).k() fun Server.membersByName(name: String): ListK = getMembersByName(name).toList().k() +fun Server.memberById(name: Long): Option = getMemberById(name).asOption() fun Server.categoriesByName(name: String): ListK = getChannelCategoriesByNameIgnoreCase(name).k() fun User.roles(): ListK = getRoles(Config.server).k() diff --git a/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt index 013123e..8bc3139 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt @@ -1,19 +1,23 @@ package moe.kageru.kagebot.features -import arrow.core.ListK +import arrow.core.* import arrow.core.extensions.list.monad.map -import arrow.core.k +import arrow.core.extensions.listk.functorFilter.filter +import arrow.syntax.collections.destructured import com.fasterxml.jackson.annotation.JsonProperty import moe.kageru.kagebot.Log import moe.kageru.kagebot.MessageUtil.sendEmbed -import moe.kageru.kagebot.Util.asOption import moe.kageru.kagebot.Util.findRole import moe.kageru.kagebot.Util.findUser import moe.kageru.kagebot.Util.unwrap import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.LocalizationSpec +import moe.kageru.kagebot.extensions.memberById +import moe.kageru.kagebot.extensions.on +import moe.kageru.kagebot.extensions.roles import moe.kageru.kagebot.persistence.Dao import org.javacord.api.entity.permission.Role +import org.javacord.api.entity.user.User import org.javacord.api.event.message.MessageCreateEvent import java.time.Duration import java.time.Instant @@ -22,71 +26,55 @@ class TimeoutFeature(@JsonProperty("role") role: String) : MessageFeature { private val timeoutRole: Role = findRole(role).unwrap() override fun handle(message: MessageCreateEvent) { - val timeout = message.readableMessageContent.split(' ', limit = 4).let { args -> - if (args.size < 3) { - message.channel.sendMessage("Error: expected “