From a2fa8105fa82e72aebe81d804809fb462911e45c Mon Sep 17 00:00:00 2001 From: Daedalus <16168171+RedDaedalus@users.noreply.github.com> Date: Thu, 10 Aug 2023 13:46:34 -0600 Subject: [PATCH] Add custom status support for bots (#2521) --- .../dv8tion/jda/api/entities/Activity.java | 31 +++++++++++++------ .../jda/internal/entities/EntityBuilder.java | 2 +- .../jda/internal/managers/PresenceImpl.java | 12 ++++++- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/dv8tion/jda/api/entities/Activity.java b/src/main/java/net/dv8tion/jda/api/entities/Activity.java index fe21821120..2553d74ea7 100644 --- a/src/main/java/net/dv8tion/jda/api/entities/Activity.java +++ b/src/main/java/net/dv8tion/jda/api/entities/Activity.java @@ -15,7 +15,6 @@ */ package net.dv8tion.jda.api.entities; -import net.dv8tion.jda.annotations.Incubating; import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.entities.emoji.EmojiUnion; import net.dv8tion.jda.internal.entities.EntityBuilder; @@ -194,11 +193,8 @@ static Activity listening(@Nonnull String name) * if the specified name is null, empty, blank or longer than 128 characters * * @return A valid Activity instance with the provided name with {@link net.dv8tion.jda.api.entities.Activity.ActivityType#WATCHING} - * - * @incubating This feature is not yet confirmed for the official bot API */ @Nonnull - @Incubating static Activity watching(@Nonnull String name) { Checks.notBlank(name, "Name"); @@ -230,6 +226,27 @@ static Activity competing(@Nonnull String name) return EntityBuilder.createActivity(name, null, ActivityType.COMPETING); } + /** + * Creates a new Activity instance with the specified name. + *
This will display without a prefix in the official client + * + * @param name + * The not-null name of the newly created status + * + * @throws IllegalArgumentException + * If the specified name is null, empty, blank or longer than 128 characters + * + * @return A valid Activity instance with the provided name with {@link net.dv8tion.jda.api.entities.Activity.ActivityType#CUSTOM_STATUS} + */ + @Nonnull + static Activity customStatus(@Nonnull String name) + { + Checks.notBlank(name, "Name"); + name = name.trim(); + Checks.notLonger(name, 128, "Name"); + return EntityBuilder.createActivity(name, null, ActivityType.CUSTOM_STATUS); + } + /** * Creates a new Activity instance with the specified name. * @@ -331,18 +348,12 @@ enum ActivityType /** * Used to indicate that the {@link Activity Activity} should display * as {@code Watching...} in the official client. - * - * @incubating This feature is not yet confirmed for the official bot API */ - @Incubating WATCHING(3), /** * Used to indicate that the {@link Activity Activity} should display as a custom status * in the official client. - * - * @incubating This Activity type is read-only for bots */ - @Incubating CUSTOM_STATUS(4), /** diff --git a/src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java b/src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java index 2b4fc0d644..7a63c0ca2d 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java @@ -931,7 +931,7 @@ public static Activity createActivity(DataObject gameJson) if (type == Activity.ActivityType.CUSTOM_STATUS) { - if (gameJson.hasKey("state") && name.equalsIgnoreCase("Custom Status")) + if (gameJson.hasKey("state")) { name = gameJson.getString("state", ""); gameJson = gameJson.remove("state"); diff --git a/src/main/java/net/dv8tion/jda/internal/managers/PresenceImpl.java b/src/main/java/net/dv8tion/jda/internal/managers/PresenceImpl.java index c1ec83cb30..c858fcdeb8 100644 --- a/src/main/java/net/dv8tion/jda/internal/managers/PresenceImpl.java +++ b/src/main/java/net/dv8tion/jda/internal/managers/PresenceImpl.java @@ -184,7 +184,17 @@ private DataObject getGameJson(Activity activity) if (activity == null || activity.getName() == null || activity.getType() == null) return null; DataObject gameObj = DataObject.empty(); - gameObj.put("name", activity.getName()); + + if (activity.getType() == Activity.ActivityType.CUSTOM_STATUS) + { + gameObj.put("name", "Custom Status"); + gameObj.put("state", activity.getName()); + } + else + { + gameObj.put("name", activity.getName()); + } + gameObj.put("type", activity.getType().getKey()); if (activity.getUrl() != null) gameObj.put("url", activity.getUrl());