All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.builder.automoderation.AutoModerationRuleModifyBuilder.kt Maven / Gradle / Ivy

package dev.kord.rest.builder.automoderation

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.*
import dev.kord.common.entity.optional.*
import dev.kord.common.entity.optional.delegate.delegate
import dev.kord.rest.builder.AuditRequestBuilder
import dev.kord.rest.json.request.AutoModerationRuleModifyRequest
import kotlin.contracts.InvocationKind.AT_MOST_ONCE
import kotlin.contracts.contract

/** An [AutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@KordDsl
public sealed class AutoModerationRuleModifyBuilder :
    AutoModerationRuleBuilder,
    AuditRequestBuilder {
    final override var reason: String? = null

    private var _name: Optional = Optional.Missing()
    final override var name: String? by ::_name.delegate()

    /** @suppress Use `this.name = name` instead. */
    final override fun assignName(name: String) {
        this.name = name
    }

    private var _eventType: Optional = Optional.Missing()
    final override var eventType: AutoModerationRuleEventType? by ::_eventType.delegate()

    /** @suppress Use `this.eventType = eventType` instead. */
    final override fun assignEventType(eventType: AutoModerationRuleEventType) {
        this.eventType = eventType
    }

    protected open fun buildTriggerMetadata(): Optional = Optional.Missing()

    private var _actions: Optional> = Optional.Missing()
    final override var actions: MutableList? by ::_actions.delegate()

    /** @suppress Use `this.actions = actions` instead. */
    final override fun assignActions(actions: MutableList) {
        this.actions = actions
    }

    private var _enabled: OptionalBoolean = OptionalBoolean.Missing
    final override var enabled: Boolean? by ::_enabled.delegate()

    private var _exemptRoles: Optional> = Optional.Missing()
    final override var exemptRoles: MutableList? by ::_exemptRoles.delegate()

    private var _exemptChannels: Optional> = Optional.Missing()
    final override var exemptChannels: MutableList? by ::_exemptChannels.delegate()

    final override fun toRequest(): AutoModerationRuleModifyRequest = AutoModerationRuleModifyRequest(
        name = _name,
        eventType = _eventType,
        triggerMetadata = buildTriggerMetadata(),
        actions = _actions.mapList { it.toRequest() },
        enabled = _enabled,
        exemptRoles = _exemptRoles.mapCopy(),
        exemptChannels = _exemptChannels.mapCopy(),
    )
}

/** An [AutoModerationRuleModifyBuilder] with an always `null` [triggerType]. */
@KordDsl
public class UntypedAutoModerationRuleModifyBuilder : AutoModerationRuleModifyBuilder() {

    /**
     * This is always `null`, the function that created this builder doesn't know the
     * [trigger type][AutoModerationRuleTriggerType] based on the type system.
     */
    override val triggerType: Nothing? get() = null
}

/** A [KeywordAutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@KordDsl
public class KeywordAutoModerationRuleModifyBuilder :
    AutoModerationRuleModifyBuilder(),
    KeywordAutoModerationRuleBuilder {

    private var _keywords: Optional> = Optional.Missing()
    override var keywords: MutableList? by ::_keywords.delegate()

    private var _regexPatterns: Optional> = Optional.Missing()
    override var regexPatterns: MutableList? by ::_regexPatterns.delegate()

    private var _allowedKeywords: Optional> = Optional.Missing()
    override var allowedKeywords: MutableList? by ::_allowedKeywords.delegate()

    override fun buildTriggerMetadata(): Optional {
        val keywords = _keywords
        val regexPatterns = _regexPatterns
        val allowedKeywords = _allowedKeywords
        return ifAnyPresent(keywords, regexPatterns, allowedKeywords) {
            DiscordAutoModerationRuleTriggerMetadata(
                keywordFilter = keywords.mapCopy(),
                regexPatterns = regexPatterns.mapCopy(),
                allowList = allowedKeywords.mapCopy(),
            )
        }
    }
}

/** A [SpamAutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@Suppress("CanSealedSubClassBeObject") // superclass is mutable
@KordDsl
public class SpamAutoModerationRuleModifyBuilder :
    AutoModerationRuleModifyBuilder(),
    SpamAutoModerationRuleBuilder

/** A [KeywordPresetAutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@KordDsl
public class KeywordPresetAutoModerationRuleModifyBuilder :
    AutoModerationRuleModifyBuilder(),
    KeywordPresetAutoModerationRuleBuilder {

    private var _presets: Optional> = Optional.Missing()
    override var presets: MutableList? by ::_presets.delegate()

    /** @suppress Use `this.presets = presets` instead. */
    @Deprecated(
        "Use 'this.presets = presets' instead. The deprecation level will be raised to ERROR in 0.16.0, to HIDDEN in " +
            "0.17.0, and this declaration will be removed in 0.18.0.",
        ReplaceWith("this.run { [email protected] = presets }", imports = ["kotlin.run"]),
        DeprecationLevel.WARNING,
    )
    override fun assignPresets(presets: MutableList) {
        this.presets = presets
    }

    private var _allowedKeywords: Optional> = Optional.Missing()
    override var allowedKeywords: MutableList? by ::_allowedKeywords.delegate()

    override fun buildTriggerMetadata(): Optional {
        val presets = _presets
        val allowedKeywords = _allowedKeywords
        return ifAnyPresent(presets, allowedKeywords) {
            DiscordAutoModerationRuleTriggerMetadata(
                presets = presets.mapCopy(),
                allowList = allowedKeywords.mapCopy(),
            )
        }
    }
}

/** A [MentionSpamAutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@KordDsl
public class MentionSpamAutoModerationRuleModifyBuilder :
    AutoModerationRuleModifyBuilder(),
    MentionSpamAutoModerationRuleBuilder {

    private var _mentionLimit: OptionalInt = OptionalInt.Missing
    override var mentionLimit: Int? by ::_mentionLimit.delegate()

    private var _mentionRaidProtectionEnabled: OptionalBoolean = OptionalBoolean.Missing
    override var mentionRaidProtectionEnabled: Boolean? by ::_mentionRaidProtectionEnabled.delegate()

    override fun buildTriggerMetadata(): Optional {
        val mentionLimit = _mentionLimit
        val mentionRaidProtectionEnabled = _mentionRaidProtectionEnabled
        return if (mentionLimit is OptionalInt.Value || mentionRaidProtectionEnabled is OptionalBoolean.Value) {
            DiscordAutoModerationRuleTriggerMetadata(
                mentionTotalLimit = mentionLimit,
                mentionRaidProtectionEnabled = mentionRaidProtectionEnabled,
            ).optional()
        } else {
            Optional.Missing()
        }
    }
}

/** A [MemberProfileAutoModerationRuleBuilder] for building [AutoModerationRuleModifyRequest]s. */
@KordDsl
public class MemberProfileAutoModerationRuleModifyBuilder :
    AutoModerationRuleModifyBuilder(),
    MemberProfileAutoModerationRuleBuilder {

    private var _keywords: Optional> = Optional.Missing()
    override var keywords: MutableList? by ::_keywords.delegate()

    private var _regexPatterns: Optional> = Optional.Missing()
    override var regexPatterns: MutableList? by ::_regexPatterns.delegate()

    private var _allowedKeywords: Optional> = Optional.Missing()
    override var allowedKeywords: MutableList? by ::_allowedKeywords.delegate()

    override fun buildTriggerMetadata(): Optional {
        val keywords = _keywords
        val regexPatterns = _regexPatterns
        val allowedKeywords = _allowedKeywords
        return ifAnyPresent(keywords, regexPatterns, allowedKeywords) {
            DiscordAutoModerationRuleTriggerMetadata(
                keywordFilter = keywords.mapCopy(),
                regexPatterns = regexPatterns.mapCopy(),
                allowList = allowedKeywords.mapCopy(),
            )
        }
    }
}

private inline fun  ifAnyPresent(vararg optionals: Optional<*>, block: () -> T): Optional {
    contract { callsInPlace(block, AT_MOST_ONCE) }

    return if (optionals.any { it is Optional.Value }) {
        Optional.Value(block())
    } else {
        Optional.Missing()
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy