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());