- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让机器人通过嵌入消息响应命令,该消息下有多个 react 。我已经让它添加了 1 个 react ,但我还需要添加不同的 react ,如下所示:( http://prntscr.com/qd8da4 ) 网上有很多教程添加 1 个 react ,但没有一个添加多个 react 。
我正在使用最新版本的 Discord JDA。
我目前拥有的代码是:
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String[] args = event.getMessage().getContentRaw().split("\\s+");
if (args[0].equalsIgnoreCase(DiscordBot.prefix + "info")) {
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
MessageChannel channel = event.getChannel(); // Channel the command was sent in.
EmbedBuilder info = new EmbedBuilder();
info.setTitle("Server Info");
info.setDescription("Info About the bot.");
info.addField("Creator", "Name", false);
info.setColor(0xf45642);
info.setTimestamp(Instant.now());
channel.sendMessage(info.build()).queue(message -> message.addReaction("✔️").queue());
}
}
最佳答案
我自己也遇到了同样的问题,因为没有真正的本地方法可以做我想做的事情,即在单击 react 时执行某些机器人操作。
我最终创建了几个帮助程序类,允许程序在单击 react 时进行回调:
以下是将监听要单击的 react 的 react :
public class ReactionListener<T> {
private final Map<String, Consumer<Message>> reactions;
private final long userId;
private volatile T data;
private Long expiresIn, lastAction;
private boolean active;
public ReactionListener(long userId, T data) {
this.data = data;
this.userId = userId;
reactions = new LinkedHashMap<>();
active = true;
lastAction = System.currentTimeMillis();
expiresIn = TimeUnit.MINUTES.toMillis(5);
}
public boolean isActive() {
return active;
}
public void disable() {
this.active = false;
}
/**
* The time after which this listener expires which is now + specified time
* Defaults to now+5min
*
* @param timeUnit time units
* @param time amount of time units
*/
public void setExpiresIn(TimeUnit timeUnit, long time) {
expiresIn = timeUnit.toMillis(time);
}
/**
* Check if this listener has specified emote
*
* @param emote the emote to check for
* @return does this listener do anything with this emote?
*/
public boolean hasReaction(String emote) {
return reactions.containsKey(emote);
}
/**
* React to the reaction :')
*
* @param emote the emote used
* @param message the message bound to the reaction
*/
public void react(String emote, Message message) {
if (hasReaction(emote)) reactions.get(emote).accept(message);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
/**
* Register a consumer for a specified emote
* Multiple emote's will result in overriding the old one
*
* @param emote the emote to respond to
* @param consumer the behaviour when emote is used
*/
public void registerReaction(String emote, Consumer<Message> consumer) {
reactions.put(emote, consumer);
}
/**
* @return list of all emotes used in this reaction listener
*/
public Set<String> getEmotes() {
return reactions.keySet();
}
/**
* updates the timestamp when the reaction was last accessed
*/
public void updateLastAction() {
lastAction = System.currentTimeMillis();
}
/**
* When does this reaction listener expire?
*
* @return timestamp in millis
*/
public Long getExpiresInTimestamp() {
return lastAction + expiresIn;
}
public long getUserId() {
return userId;
}
}
接下来我们要处理点击时的 react 。此方法需要当前登录的用户 ID,以确保仅记录用户的操作,而不会记录其他人。如果其他人也能使用react,则可以将其修改为全局。:
public class ReactionHandler {
private final ConcurrentHashMap<Long, ConcurrentHashMap<Long, ReactionListener<?>>> reactions;
private ReactionHandler() {
reactions = new ConcurrentHashMap<>();
}
public synchronized void addReactionListener(long guildId, Message message, ReactionListener<?> handler) {
addReactionListener(guildId, message, handler, true);
}
public synchronized void addReactionListener(long guildId, Message message, ReactionListener<?> handler, boolean queue) {
if (handler == null) {
return;
}
if (message.getChannelType().equals(ChannelType.TEXT)) {
if (!PermissionUtil.checkPermission(message.getTextChannel(), message.getGuild().getSelfMember(), Permission.MESSAGE_ADD_REACTION)) {
return;
}
}
if (!reactions.containsKey(guildId)) {
reactions.put(guildId, new ConcurrentHashMap<>());
}
if (!reactions.get(guildId).containsKey(message.getIdLong())) {
for (String emote : handler.getEmotes()) {
RestAction<Void> action = message.addReaction(emote);
if (queue) action.queue(); else action.complete();
}
}
reactions.get(guildId).put(message.getIdLong(), handler);
}
public synchronized void removeReactionListener(long guildId, long messageId) {
if (!reactions.containsKey(guildId)) return;
reactions.get(guildId).remove(messageId);
}
/**
* Handles the reaction
*
* @param channel TextChannel of the message
* @param messageId id of the message
* @param userId id of the user reacting
* @param reaction the reaction
*/
public void handle(TextChannel channel, long messageId, long userId, MessageReaction reaction) {
ReactionListener<?> listener = reactions.get(channel.getGuild().getIdLong()).get(messageId);
if (!listener.isActive() || listener.getExpiresInTimestamp() < System.currentTimeMillis()) {
reactions.get(channel.getGuild().getIdLong()).remove(messageId);
} else if ((listener.hasReaction(reaction.getReactionEmote().getName())) && listener.getUserId() == userId) {
reactions.get(channel.getGuild().getIdLong()).get(messageId).updateLastAction();
Message message = channel.retrieveMessageById(messageId).complete();
listener.react(reaction.getReactionEmote().getName(), message);
}
}
/**
* Do we have an event for a message?
*
* @param guildId discord guild-id of the message
* @param messageId id of the message
* @return do we have an handler?
*/
public boolean canHandle(long guildId, long messageId) {
return reactions.containsKey(guildId) && reactions.get(guildId).containsKey(messageId);
}
public synchronized void removeGuild(long guildId) {
reactions.remove(guildId);
}
/**
* Delete expired handlers
*/
public synchronized void cleanCache() {
long now = System.currentTimeMillis();
for (Iterator<Map.Entry<Long, ConcurrentHashMap<Long, ReactionListener<?>>>> iterator = reactions.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry<Long, ConcurrentHashMap<Long, ReactionListener<?>>> mapEntry = iterator.next();
mapEntry.getValue().values().removeIf(listener -> !listener.isActive() || listener.getExpiresInTimestamp() < now);
if (mapEntry.getValue().values().isEmpty()) {
reactions.remove(mapEntry.getKey());
}
}
}
}
然后,有了这两个库,我们就可以在我们的消息中实现它们。
channel.sendMessage(info.build()).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction("✔️", (ret) -> foo());
handler.registerReaction("X", (ret) -> bar());
reactionHandler.addReactionListener(guild.getIdLong(), msg, handler);
});
关于java - 如何使用 JDA 添加多个 react 来嵌入消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416078/
public class HelloWorldBot extends ListenerAdapter { public static void main(String[] args) thro
我已经部署了Discord Bot(gradle; JDA),它说构建和部署都成功了,但该机器人本身却无法正常工作(不能在线)。可能是什么问题?我的日志说没有错误被创建。 最佳答案 我从未设法在her
我想在管理员上线、空闲、……离线时发送状态更新消息。我的代码可以运行,但有一个错误。该机器人将为服务器上的所有用户发送更新消息..我只想获取管理员的状态更新.. 这是我的代码: public clas
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 3 年前。 Improve this ques
我遇到问题,我正在尝试使用 Java Discord API (JDA) 编写机器人代码。当新用户加入服务器时,机器人应发送一条消息,但我的代码不起作用。代码: public class Us
我正在创建一个 Discord 机器人并遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。 public class Bot ext
代码如下: package volmbot.commands; import lombok.SneakyThrows; import net.dv8tion.jda.api.events.messag
如何为变量User newUser分配已登录服务器的用户? 我的计划的一部分: Main.java: public static void main(String[] args) throws Exc
我正在尝试使用 Java 和 JDA 制作一个 DiscordBOT。我已经尝试与他们合作几个小时了,但没有成功。我的机器人需要处理取决于用户的数据。在 JDA 的事件处理程序中,您不能返回任何数据类
我正在尝试创建用户可以为自己分配的角色,然后创建只有该角色才能看到的隐藏语音聊天。到目前为止,我已经创建了一个角色并使用下面的代码创建了一个隐藏的语音聊天。但现在我不知道如何为新创建的角色添加权限以加
当我执行命令 ~verify 时,我尝试发送并嵌入消息,然后它发送嵌入消息,但我找不到如何添加 react 。 我已经嵌入消息并发送了它,但可以添加 react import Main.Bot; im
我试图让机器人显示它的服务器计数,每 20 秒更新一次! 我尝试在等待就绪事件之后将其放入循环中: public void onReady(ReadyEvent event) { while (tru
试图制作一个在不和谐上提供角色的JDA,但是每当我使用 getController() 时,它都会在其下方放置一条红线,并且似乎没有任何 ir 的库,我还能如何提供角色,这是代码: if(ar
我编写了以下方法,但它们都不起作用。有人知道为什么以及如何解决它吗? PS:该机器人具有管理员权限。 public class GuildMemberJoin extends ListenerAdap
所以我想知道如果我用我的机器人发送嵌入的某些内容,之后我可以用机器人编辑它吗?如果可能的话,请告诉我该怎么做。 这是我到目前为止得到的代码,但我不知道之后如何编辑该 EmbedBuilder: pub
所以我有一个问题。我有一个服务器。我有 JDA 机器人。我需要从该服务器获取所有 channel (语音、文本)。可以用JDA制作吗?当然,机器人会看到该 channel 。 最佳答案 从JDA实例获
我想为 JDA Discord Bots 创建一个(功能)测试系统。 为此,我需要等到当前队列中的所有消息都发送完(消息用RestAction#queue发送)并测试是否有消息。 有没有办法等待所有排
有没有办法使用 java discord API 流式传输 mp4 文件?我在谷歌上搜索但没有找到任何东西。我想编写一个可以将 mp4 文件流式传输到 discord channel 以便其他人可以观
我正在尝试构建一个不和谐的应用程序,但由于某种原因它无法访问 JDA。错误如下: The POM for net.dv8tion:JDA:jar:3.6.2_362 is missing, no de
我想使用 JDA 跟踪我的机器人的语音 Activity 。我正在使用 lavaplayer 将音频流式传输到语音 channel ,并且我希望机器人在一段时间不活动或除了机器人之外没有人时离开 ch
我是一名优秀的程序员,十分优秀!