Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
lukellmann committed Apr 23, 2023
1 parent e9ec786 commit b998829
Show file tree
Hide file tree
Showing 12 changed files with 380 additions and 26 deletions.
36 changes: 32 additions & 4 deletions common/api/common.api
Original file line number Diff line number Diff line change
Expand Up @@ -3804,18 +3804,20 @@ public final class dev/kord/common/entity/DiscordGuildMember$Companion {

public final class dev/kord/common/entity/DiscordGuildOnboarding {
public static final field Companion Ldev/kord/common/entity/DiscordGuildOnboarding$Companion;
public synthetic fun <init> (ILdev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZLkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;Z)V
public synthetic fun <init> (ILdev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZLdev/kord/common/entity/OnboardingMode;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZLdev/kord/common/entity/OnboardingMode;)V
public final fun component1 ()Ldev/kord/common/entity/Snowflake;
public final fun component2 ()Ljava/util/List;
public final fun component3 ()Ljava/util/List;
public final fun component4 ()Z
public final fun copy (Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;Z)Ldev/kord/common/entity/DiscordGuildOnboarding;
public static synthetic fun copy$default (Ldev/kord/common/entity/DiscordGuildOnboarding;Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZILjava/lang/Object;)Ldev/kord/common/entity/DiscordGuildOnboarding;
public final fun component5 ()Ldev/kord/common/entity/OnboardingMode;
public final fun copy (Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZLdev/kord/common/entity/OnboardingMode;)Ldev/kord/common/entity/DiscordGuildOnboarding;
public static synthetic fun copy$default (Ldev/kord/common/entity/DiscordGuildOnboarding;Ldev/kord/common/entity/Snowflake;Ljava/util/List;Ljava/util/List;ZLdev/kord/common/entity/OnboardingMode;ILjava/lang/Object;)Ldev/kord/common/entity/DiscordGuildOnboarding;
public fun equals (Ljava/lang/Object;)Z
public final fun getDefaultChannelIds ()Ljava/util/List;
public final fun getEnabled ()Z
public final fun getGuildId ()Ldev/kord/common/entity/Snowflake;
public final fun getMode ()Ldev/kord/common/entity/OnboardingMode;
public final fun getPrompts ()Ljava/util/List;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
Expand Down Expand Up @@ -7444,6 +7446,32 @@ public final class dev/kord/common/entity/NsfwLevel$Unknown : dev/kord/common/en
public fun <init> (I)V
}

public abstract class dev/kord/common/entity/OnboardingMode {
public static final field Companion Ldev/kord/common/entity/OnboardingMode$Companion;
public synthetic fun <init> (ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun equals (Ljava/lang/Object;)Z
public final fun getValue ()I
public final fun hashCode ()I
public final fun toString ()Ljava/lang/String;
}

public final class dev/kord/common/entity/OnboardingMode$Advanced : dev/kord/common/entity/OnboardingMode {
public static final field INSTANCE Ldev/kord/common/entity/OnboardingMode$Advanced;
}

public final class dev/kord/common/entity/OnboardingMode$Companion {
public final fun getEntries ()Ljava/util/List;
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}

public final class dev/kord/common/entity/OnboardingMode$Default : dev/kord/common/entity/OnboardingMode {
public static final field INSTANCE Ldev/kord/common/entity/OnboardingMode$Default;
}

public final class dev/kord/common/entity/OnboardingMode$Unknown : dev/kord/common/entity/OnboardingMode {
public fun <init> (I)V
}

public abstract class dev/kord/common/entity/OnboardingPromptType {
public static final field Companion Ldev/kord/common/entity/OnboardingPromptType$Companion;
public synthetic fun <init> (ILkotlin/jvm/internal/DefaultConstructorMarker;)V
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// THIS FILE IS AUTO-GENERATED BY KordEnumProcessor.kt, DO NOT EDIT!
@file:Suppress(names = arrayOf("RedundantVisibilityModifier", "IncorrectFormatting",
"ReplaceArrayOfWithLiteral", "SpellCheckingInspection", "GrazieInspection"))

package dev.kord.common.entity

import kotlin.Any
import kotlin.Boolean
import kotlin.Int
import kotlin.LazyThreadSafetyMode.PUBLICATION
import kotlin.String
import kotlin.Suppress
import kotlin.collections.List
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

/**
* Defines the criteria used to satisfy Onboarding constraints that are required for enabling.
*
* See [OnboardingMode]s in the
* [Discord Developer Documentation](https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-mode).
*/
@Serializable(with = OnboardingMode.Serializer::class)
public sealed class OnboardingMode(
/**
* The raw value used by Discord.
*/
public val `value`: Int,
) {
public final override fun equals(other: Any?): Boolean = this === other ||
(other is OnboardingMode && this.value == other.value)

public final override fun hashCode(): Int = value.hashCode()

public final override fun toString(): String =
"OnboardingMode.${this::class.simpleName}(value=$value)"

/**
* An unknown [OnboardingMode].
*
* This is used as a fallback for [OnboardingMode]s that haven't been added to Kord yet.
*/
public class Unknown(
`value`: Int,
) : OnboardingMode(value)

/**
* Counts only Default Channels towards constraints.
*/
public object Default : OnboardingMode(0)

/**
* Counts Default Channels and Questions towards constraints.
*/
public object Advanced : OnboardingMode(1)

internal object Serializer : KSerializer<OnboardingMode> {
public override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("dev.kord.common.entity.OnboardingMode",
PrimitiveKind.INT)

public override fun serialize(encoder: Encoder, `value`: OnboardingMode) =
encoder.encodeInt(value.value)

public override fun deserialize(decoder: Decoder) = when (val value = decoder.decodeInt()) {
0 -> Default
1 -> Advanced
else -> Unknown(value)
}
}

public companion object {
/**
* A [List] of all known [OnboardingMode]s.
*/
public val entries: List<OnboardingMode> by lazy(mode = PUBLICATION) {
listOf(
Default,
Advanced,
)
}

}
}
11 changes: 11 additions & 0 deletions common/src/commonMain/kotlin/entity/DiscordGuildOnboarding.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
@file:GenerateKordEnum(
name = "OnboardingMode", valueType = INT,
kDoc = "Defines the criteria used to satisfy Onboarding constraints that are required for enabling.",
docUrl = "https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-mode",
entries = [
Entry("Default", intValue = 0, kDoc = "Counts only Default Channels towards constraints."),
Entry("Advanced", intValue = 1, kDoc = "Counts Default Channels and Questions towards constraints."),
],
)

@file:GenerateKordEnum(
name = "OnboardingPromptType", valueType = INT,
docUrl = "https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-types",
Expand All @@ -21,6 +31,7 @@ public data class DiscordGuildOnboarding(
val prompts: List<DiscordOnboardingPrompt>,
@SerialName("default_channel_ids") val defaultChannelIds: List<Snowflake>,
val enabled: Boolean,
val mode: OnboardingMode,
)

@Serializable
Expand Down
38 changes: 33 additions & 5 deletions core/api/core.api
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ public final class dev/kord/core/Unsafe {
public final fun guildChannel (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/channel/GuildChannelBehavior;
public final fun guildEmoji (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;Ldev/kord/core/Kord;)Ldev/kord/core/behavior/GuildEmojiBehavior;
public final fun guildMessageChannel (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/channel/GuildMessageChannelBehavior;
public final fun guildOnboarding (Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/GuildOnboardingBehavior;
public final fun guildScheduledEvent (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/GuildScheduledEventBehavior;
public final fun keywordAutoModerationRule (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/automoderation/KeywordAutoModerationRuleBehavior;
public final fun keywordPresetAutoModerationRule (Ldev/kord/common/entity/Snowflake;Ldev/kord/common/entity/Snowflake;)Ldev/kord/core/behavior/automoderation/KeywordPresetAutoModerationRuleBehavior;
Expand Down Expand Up @@ -459,6 +460,29 @@ public final class dev/kord/core/behavior/GuildMessageCommandBehavior$DefaultImp
public static fun edit (Ldev/kord/core/behavior/GuildMessageCommandBehavior;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public abstract interface class dev/kord/core/behavior/GuildOnboardingBehavior : dev/kord/core/KordObject, dev/kord/core/entity/Strategizable {
public abstract fun asGuildOnboarding (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun asGuildOnboardingOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun getGuild ()Ldev/kord/core/behavior/GuildBehavior;
public abstract fun getGuild (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun getGuildId ()Ldev/kord/common/entity/Snowflake;
public abstract fun getGuildOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun toString ()Ljava/lang/String;
public abstract fun withStrategy (Ldev/kord/core/supplier/EntitySupplyStrategy;)Ldev/kord/core/behavior/GuildOnboardingBehavior;
}

public final class dev/kord/core/behavior/GuildOnboardingBehavior$DefaultImpls {
public static fun asGuildOnboarding (Ldev/kord/core/behavior/GuildOnboardingBehavior;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun asGuildOnboardingOrNull (Ldev/kord/core/behavior/GuildOnboardingBehavior;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun getGuild (Ldev/kord/core/behavior/GuildOnboardingBehavior;)Ldev/kord/core/behavior/GuildBehavior;
public static fun getGuild (Ldev/kord/core/behavior/GuildOnboardingBehavior;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun getGuildOrNull (Ldev/kord/core/behavior/GuildOnboardingBehavior;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public final class dev/kord/core/behavior/GuildOnboardingBehaviorKt {
public static final fun edit (Ldev/kord/core/behavior/GuildOnboardingBehavior;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public abstract interface class dev/kord/core/behavior/GuildScheduledEventBehavior : dev/kord/core/entity/KordEntity, dev/kord/core/entity/Strategizable {
public abstract fun asGuildScheduledEvent (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun asGuildScheduledEventOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down Expand Up @@ -6301,22 +6325,26 @@ public final class dev/kord/core/entity/GuildEmoji : dev/kord/core/entity/Emoji,
public synthetic fun withStrategy (Ldev/kord/core/supplier/EntitySupplyStrategy;)Ldev/kord/core/entity/Strategizable;
}

public final class dev/kord/core/entity/GuildOnboarding : dev/kord/core/KordObject, dev/kord/core/entity/Strategizable {
public final class dev/kord/core/entity/GuildOnboarding : dev/kord/core/behavior/GuildOnboardingBehavior {
public fun <init> (Ldev/kord/common/entity/DiscordGuildOnboarding;Ldev/kord/core/Kord;Ldev/kord/core/supplier/EntitySupplier;)V
public synthetic fun <init> (Ldev/kord/common/entity/DiscordGuildOnboarding;Ldev/kord/core/Kord;Ldev/kord/core/supplier/EntitySupplier;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun asGuildOnboarding (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun asGuildOnboardingOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun getData ()Ldev/kord/common/entity/DiscordGuildOnboarding;
public final fun getDefaultChannelBehaviors ()Ljava/util/List;
public final fun getDefaultChannelIds ()Ljava/util/List;
public final fun getDefaultChannels ()Lkotlinx/coroutines/flow/Flow;
public final fun getGuild ()Ldev/kord/core/behavior/GuildBehavior;
public final fun getGuild (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun getGuildId ()Ldev/kord/common/entity/Snowflake;
public final fun getGuildOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun getGuild ()Ldev/kord/core/behavior/GuildBehavior;
public fun getGuild (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun getGuildId ()Ldev/kord/common/entity/Snowflake;
public fun getGuildOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun getKord ()Ldev/kord/core/Kord;
public final fun getMode ()Ldev/kord/common/entity/OnboardingMode;
public final fun getPrompts ()Ljava/util/List;
public fun getSupplier ()Ldev/kord/core/supplier/EntitySupplier;
public final fun isEnabled ()Z
public fun toString ()Ljava/lang/String;
public synthetic fun withStrategy (Ldev/kord/core/supplier/EntitySupplyStrategy;)Ldev/kord/core/behavior/GuildOnboardingBehavior;
public fun withStrategy (Ldev/kord/core/supplier/EntitySupplyStrategy;)Ldev/kord/core/entity/GuildOnboarding;
public synthetic fun withStrategy (Ldev/kord/core/supplier/EntitySupplyStrategy;)Ldev/kord/core/entity/Strategizable;
}
Expand Down
2 changes: 2 additions & 0 deletions core/src/commonMain/kotlin/Unsafe.kt
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ public class Unsafe(private val kord: Kord) {
public fun guildEmoji(guildId: Snowflake, id: Snowflake, kord: Kord): GuildEmojiBehavior =
GuildEmojiBehavior(guildId = guildId, id = id, kord = kord)

public fun guildOnboarding(guildId: Snowflake): GuildOnboardingBehavior = GuildOnboardingBehaviorImpl(guildId, kord)

public fun role(guildId: Snowflake, id: Snowflake): RoleBehavior =
RoleBehavior(guildId = guildId, id = id, kord = kord)

Expand Down
70 changes: 70 additions & 0 deletions core/src/commonMain/kotlin/behavior/GuildOnboardingBehavior.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package dev.kord.core.behavior

import dev.kord.common.entity.Snowflake
import dev.kord.common.exception.RequestException
import dev.kord.core.Kord
import dev.kord.core.KordObject
import dev.kord.core.entity.Guild
import dev.kord.core.entity.GuildOnboarding
import dev.kord.core.entity.Strategizable
import dev.kord.core.exception.EntityNotFoundException
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
import dev.kord.core.supplier.EntitySupplyStrategy.Companion.rest
import dev.kord.rest.builder.guild.GuildOnboardingModifyBuilder
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

public interface GuildOnboardingBehavior : KordObject, Strategizable {

/** The ID of the [Guild] this onboarding is part of. */
public val guildId: Snowflake

/** The behavior of the [Guild] this onboarding is part of. */
public val guild: GuildBehavior get() = GuildBehavior(guildId, kord)

// todo docs
public suspend fun asGuildOnboarding(): GuildOnboarding = kord.with(rest).getGuildOnboarding(guildId)

// todo docs
public suspend fun asGuildOnboardingOrNull(): GuildOnboarding? = kord.with(rest).getGuildOnboardingOrNull(guildId)

/**
* Requests the [Guild] this onboarding is part of.
*
* @throws RequestException if something went wrong while retrieving the guild.
* @throws EntityNotFoundException if the guild is null.
*/
public suspend fun getGuild(): Guild = supplier.getGuild(guildId)

/**
* Requests the [Guild] this onboarding is part of, returns `null` when the guild isn't present.
*
* @throws RequestException if something went wrong while retrieving the guild.
*/
public suspend fun getGuildOrNull(): Guild? = supplier.getGuildOrNull(guildId)

override fun withStrategy(strategy: EntitySupplyStrategy<*>): GuildOnboardingBehavior

override fun toString(): String
}

// todo docs
public suspend inline fun GuildOnboardingBehavior.edit(
builder: GuildOnboardingModifyBuilder.() -> Unit,
): GuildOnboarding {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
val onboarding = kord.rest.guild.modifyGuildOnboarding(guildId, builder)
return GuildOnboarding(onboarding, kord)
}

internal class GuildOnboardingBehaviorImpl(
override val guildId: Snowflake,
override val kord: Kord,
override val supplier: EntitySupplier = kord.defaultSupplier,
) : GuildOnboardingBehavior {
override fun withStrategy(strategy: EntitySupplyStrategy<*>) =
GuildOnboardingBehaviorImpl(guildId, kord, strategy.supply(kord))

override fun toString() = "GuildOnboardingBehavior(guildId=$guildId, kord=$kord, supplier=$supplier)"
}
28 changes: 12 additions & 16 deletions core/src/commonMain/kotlin/entity/GuildOnboarding.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ package dev.kord.core.entity
import dev.kord.common.entity.*
import dev.kord.common.exception.RequestException
import dev.kord.core.Kord
import dev.kord.core.KordObject
import dev.kord.core.behavior.GuildBehavior
import dev.kord.core.behavior.GuildOnboardingBehavior
import dev.kord.core.behavior.RoleBehavior
import dev.kord.core.behavior.channel.TopGuildChannelBehavior
import dev.kord.core.cache.data.toData
import dev.kord.core.entity.channel.TopGuildChannel
import dev.kord.core.exception.EntityNotFoundException
import dev.kord.core.hash
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
Expand All @@ -25,12 +23,8 @@ public class GuildOnboarding(
public val data: DiscordGuildOnboarding,
override val kord: Kord,
override val supplier: EntitySupplier = kord.defaultSupplier,
) : KordObject, Strategizable {
/** The ID of the [Guild] this onboarding is part of. */
public val guildId: Snowflake get() = data.guildId

/** The behavior of the [Guild] this onboarding is part of. */
public val guild: GuildBehavior get() = GuildBehavior(guildId, kord)
) : GuildOnboardingBehavior {
override val guildId: Snowflake get() = data.guildId

/** The [Prompt]s shown during onboarding and in customize community. */
public val prompts: List<Prompt> get() = data.prompts.map { Prompt(it, guildId, kord) }
Expand All @@ -45,20 +39,22 @@ public class GuildOnboarding(
/** Whether onboarding is enabled in the [guild]. */
public val isEnabled: Boolean get() = data.enabled

/** Current [mode][OnboardingMode] of onboarding. */
public val mode: OnboardingMode get() = data.mode

/**
* Requests the [Guild] this onboarding is part of.
* Returns `this`.
*
* @throws RequestException if something went wrong while retrieving the guild.
* @throws EntityNotFoundException if the guild is null.
* @suppress There is no need to call this function. Use `this` directly instead.
*/
public suspend fun getGuild(): Guild = supplier.getGuild(guildId)
override suspend fun asGuildOnboarding(): GuildOnboarding = this

/**
* Requests the [Guild] this onboarding is part of, returns `null` when the guild isn't present.
* Returns `this`.
*
* @throws RequestException if something went wrong while retrieving the guild.
* @suppress There is no need to call this function. Use `this` directly instead.
*/
public suspend fun getGuildOrNull(): Guild? = supplier.getGuildOrNull(guildId)
override suspend fun asGuildOnboardingOrNull(): GuildOnboarding = this

/**
* Requests the [channels][TopGuildChannel] that [Member]s get opted into automatically.
Expand Down
Loading

0 comments on commit b998829

Please sign in to comment.