Skip to content

Commit

Permalink
Implement custom status (#857)
Browse files Browse the repository at this point in the history
See discord/discord-api-docs#6345

---------

Co-authored-by: lukellmann <lukellmann@gmail.com>
  • Loading branch information
DRSchlaubi and lukellmann authored Aug 23, 2023
1 parent d94eeca commit 59d83d9
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
12 changes: 7 additions & 5 deletions common/api/common.api
Original file line number Diff line number Diff line change
Expand Up @@ -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 <init> (ILjava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;)V
public synthetic fun <init> (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (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 <init> (Ljava/lang/String;Ldev/kord/common/entity/ActivityType;Ldev/kord/common/entity/optional/Optional;Ldev/kord/common/entity/optional/Optional;)V
public synthetic fun <init> (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
Expand Down
3 changes: 2 additions & 1 deletion common/src/commonMain/kotlin/entity/DiscordActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ import kotlinx.serialization.encoding.Encoder
public data class DiscordBotActivity(
val name: String,
val type: ActivityType,
val url: Optional<String?> = Optional.Missing()
val url: Optional<String?> = Optional.Missing(),
val state: Optional<String?> = Optional.Missing(),
)

@Serializable
Expand Down
2 changes: 2 additions & 0 deletions gateway/api/gateway.api
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
21 changes: 19 additions & 2 deletions gateway/src/commonMain/kotlin/builder/PresenceBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<String?> = Optional.Missing()
public var state: String? by ::_state.delegate()

public fun playing(name: String) {
game = DiscordBotActivity(name, ActivityType.Game)
Expand All @@ -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())
}

0 comments on commit 59d83d9

Please sign in to comment.