【问题标题】:Discord Bot, Embed message wont send to the channelDiscord Bot,嵌入消息不会发送到频道
【发布时间】:2023-03-07 02:37:02
【问题描述】:

我的机器人不会不和谐地显示嵌入消息。它打印的错误位于代码下方。它命中了 if 语句,因为我在其中放置了一条普通消息并显示了该消息。但嵌入消息不会显示。

import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.awt.Color;


public class Commands extends ListenerAdapter{
    
    public String prefix = "!";
    
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
        
        String[] args = event.getMessage().getContentRaw().split(" ");
        
        if (args[0].equalsIgnoreCase(prefix + "test")) {
            
            EmbedBuilder embed = new EmbedBuilder();
            embed.setTitle("Stonks Thang", null);
            embed.setDescription("this is the description");
            embed.addField("Embed Feild 1", "This is the field", false);
            embed.setColor(Color.GREEN);
            embed.setFooter("Created by Nick", "");
            event.getChannel().sendMessage(embed.build()).queue();
            embed.clear();
            
        }
    }
    
}

打印出来的错误是这样的

[JDA MainWS-ReadThread] ERROR JDA - One of the EventListeners had an uncaught exception
java.lang.IllegalArgumentException: URL must be a valid http(s) or attachment url.
    at net.dv8tion.jda.internal.utils.Checks.check(Checks.java:48)
    at net.dv8tion.jda.api.EmbedBuilder.urlCheck(EmbedBuilder.java:801)
    at net.dv8tion.jda.api.EmbedBuilder.setFooter(EmbedBuilder.java:694)
    at Commands.onGuildMessageReceived(Commands.java:22)
    at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:466)
    at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
    at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:160)
    at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:97)
    at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:952)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:839)
    at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:817)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:990)
    at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
    at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
    at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
    at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
    at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
    at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
    at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)

【问题讨论】:

  • 这个问题是 (setFooter) 部分。 setFooter 的第二部分是寻找一个 URL,而不是一个空字符串。如果您也遇到此问题,请确保您的页脚在第二部分有 URL 或“null”。
  • 另外,您应该使用sendMessageEmbeds(),而不需要调用EmbedBuilder#clear
  • 您不想调用 clear 函数以便为下一次运行清除它吗?
  • 每次运行此代码时,您都在创建一个具有清晰状态的全新构建器,然后您调用 clear 并且之后不再使用它。这意味着您无缘无故地清除了构建器状态。当您的方法返回时,整个构建器实例将无法访问。
  • 哦,明白了!感谢您的帮助!

标签: java discord chatbot discord-jda


【解决方案1】:

试试下面的代码:

import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.awt.Color;


public class Commands extends ListenerAdapter{
    
    public String prefix = "!";
    
    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
        
        String[] args = event.getMessage().getContentRaw().split(" ");
        
        if (args[0].equalsIgnoreCase(prefix + "test")) {
            
            EmbedBuilder embed = new EmbedBuilder();
            embed.setTitle("Stonks Thang");
            embed.setDescription("this is the description");
            embed.addField("Embed Feild 1", "This is the field", false);
            embed.setColor(Color.GREEN);
            embed.setFooter("Created by Nick");
            event.getChannel().sendMessage(embed.build()).queue();
        }
    }
    
}

setTitle 和 setFooter 都可以使用 1 个参数而不是 2 个参数。因为如果这样做,默认情况下不会设置它们。 此外,每次您的代码通过 EmbedBuilder 时,它都会创建一个新的构建器。所以你不需要清除它。

【讨论】:

  • 好的,这是有道理的,看起来更干净。感谢您的帮助!