RichPresence 不再适用于 JDA
Posted
技术标签:
【中文标题】RichPresence 不再适用于 JDA【英文标题】:RichPresence doesn't work anymore with JDA 【发布时间】:2019-10-23 18:53:14 【问题描述】:我注意到我的机器人没有设置 RichPresence,就像我今天看到的一样。我最后一次检查它是在星期三,代码也在那里工作。所以我今天再次执行它,RichPresence 没有像往常一样重新设置。现在我认为 Discord 会改变它的界面。
现在我将最新的 JDA 版本添加到我的项目中并修改了代码,使 DataObject 变成了 JSONObject,但它仍然无法正常工作。作为第二,我试图让我的“Spielst”对象成为 RichPresence 对象。不幸的是,这也不起作用。
旧班:
public class Spielst implements Activity
private String name;
private String url;
private ActivityType type;
public static Spielst getSpielt(String name, String url, ActivityType typ)
return new Spielst(name,url,typ);
protected Spielst(String name, String url, ActivityType typ)
this.name = name;
this.url = url;
this.type = typ;
@Override
public boolean isRich()
return false;
@Override
public RichPresence asRichPresence()
return null;
@Override
public String getName()
return name;
@Override
public String getUrl()
return url;
@Override
public ActivityType getType()
return type;
@Nullable
@Override
public Timestamps getTimestamps()
return null;
public void setPresence(OnlineStatus status, String state, String details, String application_id,
String large_image, String small_image, String large_text, String small_text,
long timestamp, long since)
if(Bot.getInstance().getBot() == null)
return;
PresenceImpl presence = new PresenceImpl((JDAImpl) Bot.getInstance().getBot()).setCacheActivity(this)
.setCacheStatus(status);
JSONObject data = presence.getFullPresence();
JSONObject game = data.getJSONObject("game");
game.put("state",state);
game.put("details", details);
game.put("application_id", application_id);
JSONObject assets = new JSONObject();
game.put("timestamps",new JSONObject().put("start",timestamp));
assets.put("large_image", large_image);
assets.put("small_image", small_image);
assets.put("large_text", large_text);
assets.put("small_text", small_text);
game.put("assets",assets);
game.put("since",since);
data.put("game",game);
((JDAImpl) Bot.getInstance().getBot())
.getClient().send((new JSONObject()).put("d", data).put("op", 3).toString());
System.out.println((new JSONObject()).put("d", data).put("op", 3).toString());
新类:
package de.letsplaybar.discordbot.main.utils;
import de.letsplaybar.discordbot.main.Bot;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.ActivityFlag;
import net.dv8tion.jda.api.entities.RichPresence;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.EnumSet;
/**
* @author Letsplaybar
* Created on 05.09.2017.
*/
public class Spielst implements RichPresence
private String name;
private String url;
private ActivityType type;
private OnlineStatus status;
private String state;
private String details;
private String application_id;
private String large_image;
private String small_image;
private String large_text;
private String small_text;
private long timestamp;
private long since;
public static Spielst getSpielt(String name, String url, ActivityType typ,OnlineStatus status, String state, String details, String application_id,
String large_image, String small_image, String large_text, String small_text,
long timestamp, long since)
return new Spielst(name,url,typ,status,state,details,application_id,large_image,small_image,large_text,small_text,timestamp, since);
protected Spielst(String name, String url, ActivityType typ,OnlineStatus status, String state, String details, String application_id,
String large_image, String small_image, String large_text, String small_text,
long timestamp, long since)
this.name = name;
this.url = url;
this.type = typ;
@Override
public boolean isRich()
return false;
@Override
public RichPresence asRichPresence()
return null;
@Override
public String getName()
return name;
@Override
public String getUrl()
return url;
@Override
public ActivityType getType()
return type;
@Nullable
@Override
public Timestamps getTimestamps()
return null;
public void setPresence()
Bot.getInstance().getBot().getPresence().setActivity(this);
@Override
public long getApplicationIdLong()
return Long.parseLong(application_id);
@Nonnull
@Override
public String getApplicationId()
return application_id;
@Nullable
@Override
public String getSessionId()
return "4b2fdce12f639de8bfa7e3591b71a0d679d7c93f";
@Nullable
@Override
public String getSyncId()
return "e7eb30d2ee025ed05c71ea495f770b76454ee4e0";
@Override
public int getFlags()
return ActivityFlag.JOIN_REQUEST.getOffset();
public long getTimestamp()
return timestamp;
public long getSince()
return since;
@Override
public EnumSet<ActivityFlag> getFlagSet()
return EnumSet.of(ActivityFlag.JOIN_REQUEST);
@Nullable
@Override
public String getState()
return state;
@Nullable
@Override
public String getDetails()
return details;
@Nullable
@Override
public Party getParty()
return new Party("party1234", 1, 6);
@Nullable
@Override
public Image getLargeImage()
return new Image(getApplicationIdLong(), large_image, large_text);
@Nullable
@Override
public Image getSmallImage()
return new Image(getApplicationIdLong(), small_image, small_text);
但是在新课程中,我错过了 syncid 和 seasonid,我也不知道我从哪里得到它们,因为它们不在 discordwebsite 的文档中。有没有人找到仍然适用于旧版本的实现,或者有没有人知道如何获得这两个值?
【问题讨论】:
仅作记录 - 发送丰富的存在并不是机器人所拥有的功能。我假设您在这里创建一个 selfbot,这违反了不和谐的 ToS,因此不受 JDA 支持。 【参考方案1】:JDA 是为机器人帐户制作的库。由于机器人根本不能使用丰富的存在,它实际上并不支持设置它。此外,discord 的 API 并没有真正支持这样设置。
使用富状态的正确方法是通过与discord-rpc SDK 或Game SDK 的IPC 连接。 您可以为 discord-rpc SDK 使用 java 库,例如 java-discord-rpc,它连接到您的 Discord 客户端并在那里设置存在。
通过网关会话(如 JDA 使用)更新丰富的状态不是记录在案的行为,可能会发生变化。
【讨论】:
【参考方案2】:机器人不能拥有丰富的存在。手动向 Discord 发送请求对您没有帮助。如果你是 selfbotting,那就违反了Discord TOS。
【讨论】:
以上是关于RichPresence 不再适用于 JDA的主要内容,如果未能解决你的问题,请参考以下文章