Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package io.github.freya022.botcommands.api.components
import io.github.freya022.botcommands.api.components.Components.Companion.defaultTimeout
import io.github.freya022.botcommands.api.components.builder.ITimeoutableComponent
import io.github.freya022.botcommands.api.components.builder.button.EphemeralButtonBuilder
import io.github.freya022.botcommands.api.components.builder.button.PersistentButtonBuilder
import io.github.freya022.botcommands.api.components.builder.group.EphemeralComponentGroupBuilder
import io.github.freya022.botcommands.api.components.builder.group.PersistentComponentGroupBuilder
import io.github.freya022.botcommands.api.components.builder.select.ephemeral.EphemeralEntitySelectBuilder
import io.github.freya022.botcommands.api.components.builder.select.ephemeral.EphemeralStringSelectBuilder
import io.github.freya022.botcommands.api.components.builder.select.persistent.PersistentEntitySelectBuilder
import io.github.freya022.botcommands.api.components.builder.select.persistent.PersistentStringSelectBuilder
import io.github.freya022.botcommands.api.core.BContext
import io.github.freya022.botcommands.api.core.config.BComponentsConfig
import io.github.freya022.botcommands.api.core.service.ConditionalServiceChecker
import io.github.freya022.botcommands.api.core.service.annotations.BService
import io.github.freya022.botcommands.api.core.service.annotations.ConditionalService
import io.github.freya022.botcommands.api.core.utils.enumSetOf
import io.github.freya022.botcommands.api.utils.ButtonContent
import io.github.freya022.botcommands.internal.components.builder.InstanceRetriever
import io.github.freya022.botcommands.internal.components.controller.ComponentController
import io.github.freya022.botcommands.internal.utils.reference
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.runBlocking
import net.dv8tion.jda.api.entities.emoji.Emoji
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle
import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget
import javax.annotation.CheckReturnValue
import kotlin.time.Duration
import kotlin.time.Duration.Companion.minutes
import kotlin.time.toJavaDuration
import kotlin.time.toKotlinDuration
import java.time.Duration as JavaDuration
/**
* This class lets you create smart components such as buttons, select menus, and groups.
*
* Every component can either be persistent or ephemeral, all components can be configured to:
* - Be used once
* - Have timeouts, [a default timeout][defaultTimeout] is set,
* which can be overridden, or set by the `timeout` methods.
* - Have handlers
* - Have constraints (checks before the button can be used)
*
* Except component groups which can only have their timeout configured,
* their default timeouts are the same as components.
*
* ### Persistent components
* - Kept after restart
* - Handlers are methods; they can have arguments passed to them
* - Timeouts are also methods, additionally, they will be rescheduled when the bot restarts
*
* ### Ephemeral components
* - Are deleted once the bot restarts
* - Handlers are closures, they can capture objects, but you [shouldn't capture JDA entities](https://jda.wiki/using-jda/troubleshooting/#cannot-get-reference-as-it-has-already-been-garbage-collected)
* - Timeouts are also closures, but are not rescheduled when restarting
*
* ### Component groups
* - If deleted, all contained components are deleted
* - If one of the contained components is deleted, then all of its subsequent groups are also deleted
*
* **Note:** Component groups cannot contain components with timeouts,
* you will need to [disable the timeout on the components][ITimeoutableComponent.noTimeout].
*
* ### Java example
* ```java
* @Command
* public class SlashSayAgain extends ApplicationCommand {
* private static final String SAY_SENTENCE_HANDLER_NAME = "SlashSayAgain: saySentenceButton";
*
* @JDASlashCommand(name = "say_again", description = "Sends a button to send a message again")
* public void onSlashSayAgain(
* GuildSlashEvent event,
* @SlashOption @Length(max = Button.LABEL_MAX_LENGTH - 6) String sentence,
* Components componentsService
* ) {
* // A button that always works, even after a restart
* final var persistentSaySentenceButton = componentsService.persistentButton(ButtonStyle.SECONDARY, "Say '" + sentence + "'")
* // Make sure only the caller can use the button
* .addUsers(event.getUser())
* // The method annotated with a JDAButtonListener of the same name will get called,
* // with the sentence as the argument
* .bindTo(SAY_SENTENCE_HANDLER_NAME, sentence)
* .build();
*
* // A button that gets deleted after restart, here it gets deleted after a timeout of 10 seconds
* AtomicReference