
com.freya02.botcommands.internal.commands.application.context.user.UserCommandInfo.kt Maven / Gradle / Ivy
package com.freya02.botcommands.internal.commands.application.context.user
import com.freya02.botcommands.api.commands.application.context.builder.UserCommandBuilder
import com.freya02.botcommands.api.commands.application.context.user.GlobalUserEvent
import com.freya02.botcommands.api.commands.application.context.user.GuildUserEvent
import com.freya02.botcommands.internal.BContextImpl
import com.freya02.botcommands.internal.commands.application.ApplicationCommandInfo
import com.freya02.botcommands.internal.commands.application.ApplicationGeneratedOption
import com.freya02.botcommands.internal.commands.application.context.user.mixins.ITopLevelUserCommandInfo
import com.freya02.botcommands.internal.commands.application.context.user.mixins.TopLevelUserCommandInfoMixin
import com.freya02.botcommands.internal.commands.application.mixins.ITopLevelApplicationCommandInfo
import com.freya02.botcommands.internal.commands.application.slash.SlashUtils.getCheckedDefaultValue
import com.freya02.botcommands.internal.core.CooldownService
import com.freya02.botcommands.internal.core.options.Option
import com.freya02.botcommands.internal.core.options.OptionType
import com.freya02.botcommands.internal.core.reflection.checkEventScope
import com.freya02.botcommands.internal.core.reflection.toMemberEventFunction
import com.freya02.botcommands.internal.parameters.CustomMethodOption
import com.freya02.botcommands.internal.throwInternal
import com.freya02.botcommands.internal.transform
import com.freya02.botcommands.internal.utils.InsertOptionResult
import com.freya02.botcommands.internal.utils.mapFinalParameters
import com.freya02.botcommands.internal.utils.mapOptions
import com.freya02.botcommands.internal.utils.tryInsertNullableOption
import net.dv8tion.jda.api.events.interaction.command.UserContextInteractionEvent
import kotlin.reflect.full.callSuspendBy
class UserCommandInfo internal constructor(
private val context: BContextImpl,
builder: UserCommandBuilder
) : ApplicationCommandInfo(builder),
ITopLevelUserCommandInfo by TopLevelUserCommandInfoMixin(context, builder) {
override val eventFunction = builder.toMemberEventFunction(context)
override val topLevelInstance: ITopLevelApplicationCommandInfo = this
override val parentInstance = null
override val parameters: List
init {
eventFunction.checkEventScope(builder)
parameters = builder.optionAggregateBuilders.transform {
UserContextCommandParameter(context, it)
}
}
internal suspend fun execute(jdaEvent: UserContextInteractionEvent, cooldownService: CooldownService): Boolean {
val event = when {
isGuildOnly -> GuildUserEvent(context, jdaEvent)
else -> GlobalUserEvent(context, jdaEvent)
}
val optionValues = parameters.mapOptions { option ->
if (tryInsertOption(event, this, option) == InsertOptionResult.ABORT)
return false
}
cooldownService.applyCooldown(this, event)
function.callSuspendBy(parameters.mapFinalParameters(event, optionValues))
return true
}
private suspend fun tryInsertOption(
event: GlobalUserEvent,
optionMap: MutableMap
© 2015 - 2025 Weber Informatics LLC | Privacy Policy