目录

  • 第一章 Discord账号注册
  • 第二章 Discord创建服务器
  • 第三章 Discord创建机器人
    • 3.1、创建应用
    • 3.2、创建机器人
    • 3.3、配置机器人
    • 3.4、添加机器人
  • 第四章 Discord机器人开发准备
    • 4.1、推荐资料
    • 4.2、创建工程
    • 4.3、添加依赖
    • 4.4、获取Token
    • 4.5、编写主类
  • 第五章 Discord机器人开发初级
    • 5.1、和机器人对话
    • 5.2、获取历史消息
    • 5.3、删除指定消息
    • 5.4、删除所有消息
  • 第六章 Discord机器人开发中级
    • 6.1、监听公会事件
    • 6.2、监听频道事件
    • 6.3、监听消息事件
  • 第七章 Discord机器人开发高级
    • 7.1、指令行的开发
    • 7.2、右键菜单开发
    • 7.3、下拉列表开发
    • 7.4、各种按钮开发
    • 7.5、模态框的开发

第一章 Discord账号注册

温馨提示:在阅读本文章内容之前,请确保您能正常访问外网。

官方网址: https://discord.com/

注册页面: https://discord.com/register

第二章 Discord创建服务器

第三章 Discord创建机器人

3.1、创建应用

开发者平台: https://discord.com/developers/applications

3.2、创建机器人

3.3、配置机器人

3.4、添加机器人

第四章 Discord机器人开发准备

温馨提示:在进行开发前,请确保您的开发环境是:jdk1.8、maven3.6.3、idea2021.1

4.1、推荐资料

  • JDA推荐视频: 点击打开
  • JDA开发文档: 点击打开
  • JDA源码地址: 点击打开

4.2、创建工程

4.3、添加依赖

<dependencies><dependency><groupId>net.dv8tion</groupId><artifactId>JDA</artifactId><version>5.0.0-alpha.12</version></dependency>
</dependencies>

4.4、获取Token

4.5、编写主类

package cn.caochenlei;import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;public class JavaBotApp {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {JDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();}
}

第五章 Discord机器人开发初级

5.1、和机器人对话

JavaBotApp

package cn.caochenlei;import cn.caochenlei.event.MessageEvent;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;public class JavaBotApp {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {JDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();jda.addEventListener(new MessageEvent());}
}

MessageEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;import java.util.EnumSet;
import java.util.List;public class MessageEvent extends ListenerAdapter {@Overridepublic void onMessageReceived(@NotNull MessageReceivedEvent event) {//如果是机器人发消息触发这个事件则忽略//如果不加,则这个事件会变成死循环事件if (event.getAuthor().isBot()) {return;}Message message = event.getMessage();//获取服务器(公会)信息Guild guild = message.getGuild();String guildId = guild.getId();String guildName = guild.getName();System.out.println("guildId = " + guildId);//输出服务器(公会)idSystem.out.println("guildName = " + guildName);//输出服务器(公会)名称//获取频道信息MessageChannel channel = message.getChannel();String channelId = channel.getId();String channelName = channel.getName();ChannelType channelType = channel.getType();System.out.println("channelId = " + channelId);//输出频道idSystem.out.println("channelName = " + channelName);//输出频道名称System.out.println("channelType = " + channelType);//输出频道类型//获取发消息人Member member = message.getMember();String memberId = member.getId();String memberNickname = member.getNickname();String memberEffectiveName = member.getEffectiveName();List<Role> memberRoles = member.getRoles();EnumSet<Permission> memberPermissions = member.getPermissions();OnlineStatus memberOnlineStatus = member.getOnlineStatus();System.out.println("memberId = " + memberId);//输出发送消息人的idSystem.out.println("memberNickname = " + memberNickname);//输出发送消息人的昵称System.out.println("memberEffectiveName = " + memberEffectiveName);//输出发送消息人的有效名称System.out.println("memberRoles = " + memberRoles);//输出发送消息人的角色列表System.out.println("memberPermissions = " + memberPermissions);//输出发送消息人的权限列表System.out.println("memberOnlineStatus = " + memberOnlineStatus);//输出发送消息人的在线状态//获取消息信息String messageId = message.getId();String messageContentRaw = message.getContentRaw();MessageType messageType = message.getType();System.out.println("messageId = " + messageId);//输出消息idSystem.out.println("messageContentRaw = " + messageContentRaw);//输出消息内容System.out.println("messageType = " + messageType);//输出消息类型//回应用户消息channel.sendMessage("bot already received").queue();}
}

5.2、获取历史消息

JavaBotApp

package cn.caochenlei;import cn.caochenlei.event.MessageEvent;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.VoiceChannel;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;public class JavaBotApp {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {JDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//jda.addEventListener(new MessageEvent());Guild guild = jda.getGuildById("985525076327792690");//获取服务器(公会)TextChannel textChannel = jda.getTextChannelById("985525076822724670");//获取文本频道VoiceChannel voiceChannel = jda.getVoiceChannelById("985525076822724671");//获取语音频道//获取文本频道历史消息List<Message> historyMessage = getHistoryMessage(textChannel);System.out.println("historyMessageSize = " + historyMessage.size());historyMessage.forEach(message -> {System.out.println(message.getContentRaw());});}public static List<Message> getHistoryMessage(TextChannel textChannel) {List<Message> messageList = new ArrayList<>();int limit = 100;int size;String lastMsgId = null;List<Message> retrievedHistory;//循环请求历史消息do {if (lastMsgId == null) {retrievedHistory = textChannel.getHistoryFromBeginning(limit).complete().getRetrievedHistory();} else {retrievedHistory = textChannel.getHistoryAfter(lastMsgId, limit).complete().getRetrievedHistory();}Objects.requireNonNull(retrievedHistory);messageList.addAll(retrievedHistory);size = retrievedHistory.size();System.out.printf("current request size %d\n", size);if (!retrievedHistory.isEmpty()) {//分页返回的内容都是反序,所以首个其实是最后一个lastMsgId = retrievedHistory.get(0).getId();}if (size < limit) {break;}} while (true);//根据创建时间升序messageList.sort(((o1, o2) -> (int) (o1.getTimeCreated().toEpochSecond() - o2.getTimeCreated().toEpochSecond())));//返回最终历史消息return messageList;}
}

除此之外另外一种方式:

//获取文本频道历史消息
getHistoryMessage(textChannel, messagesList -> {messagesList.forEach(message -> {System.out.println(message.getContentRaw());});
});public static void getHistoryMessage(MessageChannel channel, Consumer<List<Message>> callback) {List<Message> messages = new ArrayList<>();channel.getIterableHistory().cache(false).forEachAsync((message) -> messages.add(message)).thenRun(() -> messages.sort(((o1, o2) -> (int) (o1.getTimeCreated().toEpochSecond() - o2.getTimeCreated().toEpochSecond())))).thenRun(() -> callback.accept(messages));
}

获取最近指定条数消息:

//获取最近指定条数消息
getLastMessage(textChannel, 5, messagesList -> {messagesList.forEach(message -> {System.out.println(message.getContentRaw());});
});public static void getLastMessage(MessageChannel channel, int limit, Consumer<List<Message>> callback) {List<Message> messages = new ArrayList<>(limit);channel.getIterableHistory().cache(false).forEachAsync((message) -> {messages.add(message);return messages.size() < limit;}).thenRun(() -> messages.sort(((o1, o2) -> (int) (o1.getTimeCreated().toEpochSecond() - o2.getTimeCreated().toEpochSecond())))).thenRun(() -> callback.accept(messages));
}

5.3、删除指定消息

JavaBotApp

//删除最近的一条消息
if (!historyMessage.isEmpty()) {textChannel.deleteMessageById(historyMessage.get(historyMessage.size() - 1).getId()).queue();System.out.println("delete last message complete");
}

5.4、删除所有消息

POM.XML

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>

JavaBotApp

//只能删除两周内消息
//删除所有的历史消息
if (!historyMessage.isEmpty()) {//获取所有消息List<String> messageIds = historyMessage.stream().map(Message::getId).collect(Collectors.toList());//切分消息列表List<List<String>> partitionList = Lists.partition(messageIds, 100);//循环删除消息for (List<String> partitionIds : partitionList) {textChannel.deleteMessagesByIds(partitionIds).queue();}System.out.println("delete all message complete");
}

第六章 Discord机器人开发中级

事件列表:点击访问

6.1、监听公会事件

常见示例代码: GuildEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteCreateEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteDeleteEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleAddEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleRemoveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;public class GuildEvent extends ListenerAdapter {@Overridepublic void onGuildInviteCreate(@NotNull GuildInviteCreateEvent event) {System.out.println("一个邀请被创建了");}@Overridepublic void onGuildInviteDelete(@NotNull GuildInviteDeleteEvent event) {System.out.println("一个邀请被删除了");}@Overridepublic void onGuildMemberJoin(@NotNull GuildMemberJoinEvent event) {System.out.println("有新成员进入公会");}@Overridepublic void onGuildLeave(@NotNull GuildLeaveEvent event) {System.out.println("有老成员离开公会");}@Overridepublic void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {System.out.println("有成员被移除公会");}@Overridepublic void onGuildMemberRoleAdd(@NotNull GuildMemberRoleAddEvent event) {System.out.println("公会成员添加角色");}@Overridepublic void onGuildMemberRoleRemove(@NotNull GuildMemberRoleRemoveEvent event) {System.out.println("公会成员移除角色");}
}

6.2、监听频道事件

常见示例代码: ChannelEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.events.channel.ChannelCreateEvent;
import net.dv8tion.jda.api.events.channel.ChannelDeleteEvent;
import net.dv8tion.jda.api.events.channel.update.ChannelUpdateNameEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;public class ChannelEvent extends ListenerAdapter {@Overridepublic void onChannelCreate(@NotNull ChannelCreateEvent event) {System.out.println("频道被创建了");}@Overridepublic void onChannelDelete(@NotNull ChannelDeleteEvent event) {System.out.println("频道被删除了");}@Overridepublic void onChannelUpdateName(@NotNull ChannelUpdateNameEvent event) {System.out.println("频道名称变了");}
}

6.3、监听消息事件

常见示例代码: MessageEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
import net.dv8tion.jda.api.events.message.MessageEmbedEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;import java.util.EnumSet;
import java.util.List;public class MessageEvent extends ListenerAdapter {@Overridepublic void onMessageReceived(@NotNull MessageReceivedEvent event) {System.out.println("消息被接收了");}@Overridepublic void onMessageDelete(@NotNull MessageDeleteEvent event) {System.out.println("消息被删除了");}@Overridepublic void onMessageUpdate(@NotNull MessageUpdateEvent event) {System.out.println("消息被更新了");}@Overridepublic void onMessageEmbed(@NotNull MessageEmbedEvent event) {System.out.println("接收卡片消息");}
}

第七章 Discord机器人开发高级

7.1、指令行的开发

SlashCommandEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import org.jetbrains.annotations.NotNull;public class SlashCommandEvent extends ListenerAdapter {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {//初始化 JDAJDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//注册监听事件jda.addEventListener(new SlashCommandEvent());//注册指令命令for (Guild guild : jda.getGuilds()) {guild.updateCommands().addCommands(Commands.slash("show_slash_command", "show slash command example").addOption(OptionType.STRING, "param1", "Please enter param1", true).addOption(OptionType.STRING, "param2", "Please enter param2", true)).queue();}}@Overridepublic void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("show_slash_command".equals(event.getName())) {//接收参数String param1 = event.getOption("param1").getAsString();String param2 = event.getOption("param2").getAsString();//卡片消息EmbedBuilder embedBuilder = new EmbedBuilder();embedBuilder.setTitle("Result");embedBuilder.addField("param1:", param1, false);embedBuilder.addField("param2:", param2, false);embedBuilder.setFooter("This is a footer.");//回复消息event.getHook().sendMessageEmbeds(embedBuilder.build()).queue();}}
}

7.2、右键菜单开发

ContextEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.UserContextInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.build.Commands;public class ContextEvent extends ListenerAdapter {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {//初始化 JDAJDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//注册监听事件jda.addEventListener(new ContextEvent());//注册指令命令for (Guild guild : jda.getGuilds()) {guild.updateCommands().addCommands(Commands.user("Get user avatar"),//注册用户右键菜单app命令Commands.message("Count words")//注册消息右键菜单app命令).queue();}}@Overridepublic void onUserContextInteraction(UserContextInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("Get user avatar".equals(event.getName())) {event.getHook().sendMessage("Avatar: " + event.getTarget().getEffectiveAvatarUrl()).queue();}}@Overridepublic void onMessageContextInteraction(MessageContextInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("Count words".equals(event.getName())) {event.getHook().sendMessage("Words: " + event.getTarget().getContentRaw().split("\\s+").length).queue();}}
}

7.3、下拉列表开发

DropdownEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.components.selections.SelectMenu;
import net.dv8tion.jda.api.interactions.components.selections.SelectOption;
import org.jetbrains.annotations.NotNull;public class DropdownEvent extends ListenerAdapter {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {//初始化 JDAJDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//注册监听事件jda.addEventListener(new DropdownEvent());//注册指令命令for (Guild guild : jda.getGuilds()) {guild.updateCommands().addCommands(Commands.slash("show_dropdown", "This is a command description.")).queue();}}@Overridepublic void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("show_dropdown".equals(event.getName())) {SelectMenu selectMenu = SelectMenu.create("choose-food")// SelectOption with only the label, value, and description.addOption("Pizza", "pizza", "this is a pizza").addOption("Hot Dog", "hot dog", "this is a hot dog").addOption("Noodle", "noodle", "this is a noodle")// Another way to create a SelectOption.addOptions(SelectOption.of("hamburger", "hamburger").withDescription("this is a hamburger").withEmoji(Emoji.fromUnicode("\uD83C\uDF54")) // and an emoji.withDefault(true)) // while also being the default option.build();event.getHook().sendMessage("Choose your favorite food").addActionRow(selectMenu).queue();}}@Overridepublic void onSelectMenuInteraction(@NotNull SelectMenuInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("choose-food".equals(event.getComponentId())) {event.getHook().sendMessage("You chose " + event.getValues().get(0)).queue();}}
}

7.4、各种按钮开发

ButtonEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import org.jetbrains.annotations.NotNull;public class ButtonEvent extends ListenerAdapter {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {//初始化 JDAJDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//注册监听事件jda.addEventListener(new ButtonEvent());//注册指令命令for (Guild guild : jda.getGuilds()) {guild.updateCommands().addCommands(Commands.slash("show_button", "This is a command description.")).queue();}}@Overridepublic void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {String name = event.getName();if ("show_button".equals(name)) {event.reply("Click the button to say hello").addActionRow(// Button with only a label//Button.primary("btn1", "Click Me"),//Button.success("btn2", "Click Me"),//Button.secondary("btn3", "Click Me"),//Button.danger("btn4", "Click Me"),//Button.link("https://www.baidu.com/", "百度一下")//,// Button with only an emoji//Button.primary("btn1", Emoji.fromMarkdown("<:minn:245267426227388416>")),//Button.success("btn2", Emoji.fromMarkdown("<:minn:245267426227388416>")),//Button.secondary("btn3", Emoji.fromMarkdown("<:minn:245267426227388416>")),//Button.danger("btn4", Emoji.fromMarkdown("<:minn:245267426227388416>")),//Button.link("https://www.baidu.com/", Emoji.fromMarkdown("<:minn:245267426227388416>"))//,// Button with label and emojiButton.primary("btn1", "Click Me").withEmoji(Emoji.fromMarkdown("<:github:849286315580719104>")),Button.success("btn2", "Click Me").withEmoji(Emoji.fromMarkdown("<:github:849286315580719104>")),Button.secondary("btn3", "Click Me").withEmoji(Emoji.fromMarkdown("<:github:849286315580719104>")),Button.danger("btn4", "Click Me").withEmoji(Emoji.fromMarkdown("<:github:849286315580719104>")),Button.link("https://www.baidu.com/", "百度一下").withEmoji(Emoji.fromMarkdown("<:github:849286315580719104>"))).queue();}}@Overridepublic void onButtonInteraction(@NotNull ButtonInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("btn1".equals(event.getComponentId())) {event.getHook().sendMessage("you click btn1 and say hello").queue();} else if ("btn2".equals(event.getComponentId())) {event.getHook().sendMessage("you click btn2 and say hello").queue();} else if ("btn3".equals(event.getComponentId())) {event.getHook().sendMessage("you click btn3 and say hello").queue();} else if ("btn4".equals(event.getComponentId())) {event.getHook().sendMessage("you click btn4 and say hello").queue();}}
}

7.5、模态框的开发

ModalEvent

package cn.caochenlei.event;import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.Modal;
import net.dv8tion.jda.api.interactions.components.text.TextInput;
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
import org.jetbrains.annotations.NotNull;public class ModalEvent extends ListenerAdapter {private static final String TOKEN = "******替换成你自己的******";public static void main(String[] args) throws Exception {//初始化 JDAJDA jda = JDABuilder.createDefault(TOKEN).build().awaitReady();//注册监听事件jda.addEventListener(new ModalEvent());//注册指令命令for (Guild guild : jda.getGuilds()) {guild.updateCommands().addCommands(Commands.slash("show_modal", "This is a command description.")).queue();}}@Overridepublic void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {// 注意:模态框不能延迟回复,延迟回复是无意义的if ("show_modal".equals(event.getName())) {TextInput subject = TextInput.create("subject", "Subject", TextInputStyle.SHORT).setPlaceholder("Subject of this ticket").setMinLength(1).setMaxLength(10).build();TextInput body = TextInput.create("body", "Body", TextInputStyle.PARAGRAPH).setPlaceholder("Your concerns go here").setMinLength(1).setMaxLength(10).build();Modal modal = Modal.create("form", "Modal Form").addActionRows(ActionRow.of(subject), ActionRow.of(body)).build();event.replyModal(modal).queue();}}@Overridepublic void onModalInteraction(@NotNull ModalInteractionEvent event) {// 告诉机器人,延迟回复它(deferReply参数为true,代表仅发起者可见,反之则所有人可见)// event.deferReply().queue() + event.getHook()... = ✔// event.deferReply().queue() + event.reply()...   = ❌event.deferReply().queue();if ("form".equals(event.getModalId())) {String subject = event.getValue("subject").getAsString();String body = event.getValue("body").getAsString();System.out.println("subject = " + subject);System.out.println("body = " + body);event.getHook().sendMessage("Thanks for your request!").queue();}}
}

Discord机器人开发相关推荐

  1. 【Rust日报】2022-09-11 Shuttle 创建和部署带有ShuttleSerenity的 Discord 机器人!

    Shuttle v0.5.1 已发布 ━ 创建和部署一个带有Shuttle & Serenity 的 Discord 机器人! 对于任何想要让 Discord 机器人启动并运行(使用 Rust ...

  2. 自托管 NodeJS ChatGPT Discord 机器人

    GBTI Labs 宣布面向开发人员的自托管 NodeJS ChatGPT Discord Bot BTI Labs 是一个私人开发运营团体和会员社区,自豪地宣布发布其自托管 NodeJS ChatG ...

  3. 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划

    作者 | 无名之辈FTER 责编 | 夕颜 出品 | 程序人生(ID:coder_life) 本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展, ...

  4. 微信机器人开发SDK使用教程--养号任务停止

    微信机器人开发SDK使用教程--养号任务停止 case "PostStopWeChatMaintenanceTask": {// 养号任务停止 log.debug("we ...

  5. 如何给定两个gps坐标 算出航向角_机器人开发如何配置ROS中的TF变换关系?

    当我们进行机器人开发时,常常需要面对TF坐标转换,本文以 Autolabor Pro1 与思岚激光雷达为例,介绍ROS TF的使用. Autolabor Pro1是什么? Autolabor Pro1 ...

  6. [译] 如何用 Python 写一个 Discord 机器人

    原文地址:How to write a Discord bot in Python 原文作者:Junpei Shimotsu 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/go ...

  7. 微信机器人开发SDK使用教程--删除朋友圈

    微信机器人开发SDK使用教程--删除朋友圈 case "DeleteSNSNewsTask": {// 删除朋友圈 log.debug("websocket:msgtyp ...

  8. 宁德时代机器人编程开发_高通发布5G机器人开发平台,内置强大AI算力。各大厂商竞相发布机器人处理平台,万物互联的时代即将到来...

    高通发布了强大机器人平台Robotics RB5 Platform,内置工业级QRB5165机器人处理器,拥有15TOPS AI 算力,强大的AI算力可应用于机器学习,增强计算机视觉,多摄像头并发处理 ...

  9. 微信机器人开发SDK使用教程--群发消息任务

    微信机器人开发SDK使用教程--群发消息任务 case "WeChatGroupSendTask": {// 群发消息任务 log.debug("websocket:ms ...

最新文章

  1. 如何将Android的AOSP仓库放置到自己的gitlab服务器上?
  2. DFT实训教程笔记1(bibili版本)- introduction to DFT DFT Architecture
  3. PostgreSQL在何处处理 sql查询之六
  4. mysql续型_mysql续集1
  5. 宫崎骏的动画片真有意思啊。
  6. Sharepoint 2010使用手记(1)
  7. pythonrequests证书_python requests证书问题解决
  8. 【分享】哪些句子一眼就会让你爱上
  9. (转) Eclipse Maven 编译错误 Dynamic Web Module 3.1 requires Java 1.7 or newer 解决方案
  10. Vscode 如何使用内置浏览器?
  11. linux系统常见的压缩命令,Linux 系统常见的压缩指令
  12. 大白菜U盘启动盘手动去除捆绑第三方赞助软件
  13. query相关搜索词推荐
  14. 同花顺-图像算法工程师-笔试题
  15. PowerPivot的杀手锏是什么?
  16. 原来等待我做的事情还有很多
  17. excel每页都显示标题的方法
  18. SpringBoot框架中的DAO(mapper)层、Entity层、Service层、Controller层
  19. Excel Sheet Column Title
  20. CSS 基础篇、绝对有你想要

热门文章

  1. Vue使用Eslint报“Parsing error: x-invalid-end-tag“错误的解决方案
  2. 上班族是如何预防电脑辐射的
  3. 企业中一些职位的简称
  4. win7系统备份还原软件_易数一键还原是一款免费的、功能强大的备份还原软件,支持EFI架构的操作系统和安全启动。...
  5. echarts 配置项 series 中的data 多维度
  6. Kubernetes服务发现:Service、Kube-Proxy(Netfilter)
  7. ASF文件格式之Objects与Guid总结
  8. Jetson Nano 人工智能计算
  9. CMake之add_custom_target
  10. 自动弹窗加qq群教程