ottobotv2/src/main/kotlin/nl/voidcorp/discord/events/CommandListener.kt

87 lines
3.7 KiB
Kotlin

package nl.voidcorp.discord.events
import net.dv8tion.jda.api.MessageBuilder
import net.dv8tion.jda.api.entities.ChannelType
import net.dv8tion.jda.api.events.message.MessageReceivedEvent
import net.dv8tion.jda.api.hooks.ListenerAdapter
import nl.voidcorp.discord.command.Command
import nl.voidcorp.discord.command.CommandMessage
import nl.voidcorp.discord.command.CommandResult
import nl.voidcorp.discord.command.CommandSettings
import nl.voidcorp.discord.creator
import nl.voidcorp.discord.logger
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
class CommandListener(
@Autowired val commands: Set<Command>,
@Autowired val commandSettings: CommandSettings
) : ListenerAdapter() {
init {
logger.info("Found ${commands.size} commands!")
}
override fun onMessageReceived(event: MessageReceivedEvent) {
if (event.author.isBot) return
val prefix: String = when {
event.message.contentRaw.startsWith("<@${event.jda.selfUser.id}>") -> "<@${event.jda.selfUser.id}>"
event.message.contentRaw.startsWith("<@!${event.jda.selfUser.id}>") -> "<@!${event.jda.selfUser.id}>"
event.channelType == ChannelType.TEXT -> commandSettings.getPrefix(event.guild)
event.channelType == ChannelType.PRIVATE -> commandSettings.prefix
else -> return
}
if (!event.message.contentRaw.startsWith(prefix) or (event.message.contentRaw.length == prefix.length)) return
val isGuild = event.isFromGuild
val res = commands.map { it to it.onCommand(event, prefix) }.filter { it.second != CommandResult.NOPE }
when {
res.size > 1 -> {
val mb =
MessageBuilder("Well this is awkward... It seems that multiple actions are bound to this command... ")
.append("Report this error to the staff of the server or ")
val member = event.guild.getMemberById(creator)
if (member != null)
mb.append(member)
else {
mb.append("J00LZ#9386")
}
event.channel.sendMessage(mb.append(" since this shouldn't happen...").build()).queue()
}
res.isNotEmpty() -> {
val (command, result) = res[0]
when (result) {
CommandResult.CHANNEL -> CommandMessage(event, emptyList()).reply(
"It seems this is not a channel where bots are allowed for you..."
)
CommandResult.PERMISSIONS -> CommandMessage(event, emptyList()).reply(
"Sorry, but you don't seem to have the needed permissions to execute this command..."
)
CommandResult.SUCCESS -> Unit
CommandResult.ERROR -> CommandMessage(
event,
emptyList()
).reply(MessageBuilder("There was an error executing this command").build())
CommandResult.NOPE -> logger.warn("The command ${command.name} somehow responded with a nope?")
CommandResult.PARAMETERS -> CommandMessage(event, emptyList()).reply(
"Sorry, but you are missing some parameters: `${command.usage}`"
)
}
}
isGuild -> Unit
else -> event.channel.sendMessage("I don't seem to know this command...").queue()
}
// override fun onMessageUpdate(event: MessageUpdateEvent) =
// onMessageReceived(MessageReceivedEvent(event.jda, event.messageIdLong, event.message))
}
}