diff --git a/common/api/common.api b/common/api/common.api index 98c6e53cc2de..0f13188f75e6 100644 --- a/common/api/common.api +++ b/common/api/common.api @@ -2803,16 +2803,18 @@ public final class dev/kord/common/entity/DiscordAutoModerationRuleTriggerMetada public final class dev/kord/common/entity/DiscordBotActivity { public static final field Companion Ldev/kord/common/entity/DiscordBotActivity$Companion; - public synthetic fun (ILjava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;)V - public synthetic fun (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILjava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; public final fun component2 ()Ldev/kord/common/entity/ActivityType; public final fun component3 ()Ldev/kord/common/entity/optional/Optional; - public final fun copy (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;)Ldev/kord/common/entity/DiscordBotActivity; - public static synthetic fun copy$default (Ldev/kord/common/entity/DiscordBotActivity;Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;ILjava/lang/Object;)Ldev/kord/common/entity/DiscordBotActivity; + public final fun component4 ()Ldev/kord/common/entity/optional/Optional; + public final fun copy (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;)Ldev/kord/common/entity/DiscordBotActivity; + public static synthetic fun copy$default (Ldev/kord/common/entity/DiscordBotActivity;Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;ILjava/lang/Object;)Ldev/kord/common/entity/DiscordBotActivity; public fun equals (Ljava/lang/Object;)Z public final fun getName ()Ljava/lang/String; + public final fun getState ()Ldev/kord/common/entity/optional/Optional; public final fun getType ()Ldev/kord/common/entity/ActivityType; public final fun getUrl ()Ldev/kord/common/entity/optional/Optional; public fun hashCode ()I diff --git a/common/src/commonMain/kotlin/entity/DiscordActivity.kt b/common/src/commonMain/kotlin/entity/DiscordActivity.kt index b233edc206f3..6f72b6c3f72d 100644 --- a/common/src/commonMain/kotlin/entity/DiscordActivity.kt +++ b/common/src/commonMain/kotlin/entity/DiscordActivity.kt @@ -31,7 +31,8 @@ import kotlinx.serialization.encoding.Encoder public data class DiscordBotActivity( val name: String, val type: ActivityType, - val url: Optional = Optional.Missing() + val url: Optional = Optional.Missing(), + val state: Optional = Optional.Missing(), ) @Serializable diff --git a/gateway/api/gateway.api b/gateway/api/gateway.api index 8e6f0f90642c..7c225bc5cbc7 100644 --- a/gateway/api/gateway.api +++ b/gateway/api/gateway.api @@ -1975,11 +1975,13 @@ public final class dev/kord/gateway/builder/PresenceBuilder { public final fun competing (Ljava/lang/String;)V public final fun getAfk ()Z public final fun getSince ()Lkotlinx/datetime/Instant; + public final fun getState ()Ljava/lang/String; public final fun getStatus ()Ldev/kord/common/entity/PresenceStatus; public final fun listening (Ljava/lang/String;)V public final fun playing (Ljava/lang/String;)V public final fun setAfk (Z)V public final fun setSince (Lkotlinx/datetime/Instant;)V + public final fun setState (Ljava/lang/String;)V public final fun setStatus (Ldev/kord/common/entity/PresenceStatus;)V public final fun streaming (Ljava/lang/String;Ljava/lang/String;)V public final fun toPresence ()Ldev/kord/gateway/DiscordPresence; diff --git a/gateway/src/commonMain/kotlin/builder/PresenceBuilder.kt b/gateway/src/commonMain/kotlin/builder/PresenceBuilder.kt index 66204208460c..a7f86906038b 100644 --- a/gateway/src/commonMain/kotlin/builder/PresenceBuilder.kt +++ b/gateway/src/commonMain/kotlin/builder/PresenceBuilder.kt @@ -5,6 +5,7 @@ import dev.kord.common.entity.ActivityType import dev.kord.common.entity.DiscordBotActivity import dev.kord.common.entity.PresenceStatus import dev.kord.common.entity.optional.Optional +import dev.kord.common.entity.optional.delegate.delegate import dev.kord.gateway.DiscordPresence import dev.kord.gateway.UpdateStatus import kotlinx.datetime.Instant @@ -15,6 +16,8 @@ public class PresenceBuilder { public var status: PresenceStatus = PresenceStatus.Online public var afk: Boolean = false public var since: Instant? = null + private var _state: Optional = Optional.Missing() + public var state: String? by ::_state.delegate() public fun playing(name: String) { game = DiscordBotActivity(name, ActivityType.Game) @@ -36,7 +39,21 @@ public class PresenceBuilder { game = DiscordBotActivity(name, ActivityType.Competing) } - public fun toUpdateStatus(): UpdateStatus = UpdateStatus(since, listOfNotNull(game), status, afk) + private fun buildGame(): DiscordBotActivity? { + val game = game + val state = _state + return when { + game != null -> game.copy(state = state) + state !is Optional.Missing -> DiscordBotActivity( + name = "Custom Status", // https://github.com/discord/discord-api-docs/pull/6345#issuecomment-1672271748 + ActivityType.Custom, + state = state, + ) + else -> null + } + } + + public fun toUpdateStatus(): UpdateStatus = UpdateStatus(since, listOfNotNull(buildGame()), status, afk) - public fun toPresence(): DiscordPresence = DiscordPresence(status, afk, since, game) + public fun toPresence(): DiscordPresence = DiscordPresence(status, afk, since, buildGame()) }