Move command handling out of constructor, add coin reflip command
All checks were successful
continuous-integration/drone/push Build is passing

Having heavy code run in a constructor is bad practice. We made separate methods for command handling.
This commit is contained in:
Bea 2022-11-20 22:09:58 +01:00
parent c44251ddb7
commit 3d626bb46f
9 changed files with 73 additions and 15 deletions

View File

@ -6,6 +6,7 @@ import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.requests.GatewayIntent;
import sun.misc.Signal; import sun.misc.Signal;
import wtf.beatrice.hidekobot.listeners.ButtonInteractionListener;
import wtf.beatrice.hidekobot.listeners.MessageListener; import wtf.beatrice.hidekobot.listeners.MessageListener;
import wtf.beatrice.hidekobot.listeners.SlashCommandCompleter; import wtf.beatrice.hidekobot.listeners.SlashCommandCompleter;
import wtf.beatrice.hidekobot.listeners.SlashCommandListener; import wtf.beatrice.hidekobot.listeners.SlashCommandListener;
@ -81,6 +82,7 @@ public class HidekoBot
jda.addEventListener(new MessageListener()); jda.addEventListener(new MessageListener());
jda.addEventListener(new SlashCommandListener()); jda.addEventListener(new SlashCommandListener());
jda.addEventListener(new SlashCommandCompleter()); jda.addEventListener(new SlashCommandCompleter());
jda.addEventListener(new ButtonInteractionListener());
// update slash commands (delayed) // update slash commands (delayed)
final boolean finalForceUpdateCommands = forceUpdateCommands; final boolean finalForceUpdateCommands = forceUpdateCommands;

View File

@ -12,7 +12,7 @@ import java.awt.*;
public class AvatarCommand public class AvatarCommand
{ {
public AvatarCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
event.deferReply().queue(); event.deferReply().queue();

View File

@ -15,7 +15,7 @@ import java.util.List;
public class ClearChatCommand public class ClearChatCommand
{ {
public ClearChatCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
MessageChannel channel = event.getChannel(); MessageChannel channel = event.getChannel();
@ -39,10 +39,10 @@ public class ClearChatCommand
// answer by saying that the operation has begun. // answer by saying that the operation has begun.
InteractionHook replyInteraction = event.reply("\uD83D\uDEA7 Clearing...").complete(); InteractionHook replyInteraction = event.reply("\uD83D\uDEA7 Clearing...").complete();
// int to keep track of how many messages we deleted. // int to keep track of how many messages we actually deleted.
int deleted = 0; int deleted = 0;
int limit = 95; //discord limits this method to range 2-100. we set it to 95 to be safe.. int limit = 95; //discord limits this method to range 2-100. we set it to 95 to be safe.
// increase the count by 1, because we technically aren't clearing the first ID ever // increase the count by 1, because we technically aren't clearing the first ID ever
// which is actually the slash command's ID and not a message. // which is actually the slash command's ID and not a message.

View File

@ -1,13 +1,20 @@
package wtf.beatrice.hidekobot.commands.slash; package wtf.beatrice.hidekobot.commands.slash;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.interaction.GenericInteractionCreateEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import wtf.beatrice.hidekobot.utils.RandomUtil; import wtf.beatrice.hidekobot.utils.RandomUtil;
import java.util.List;
public class CoinFlipCommand public class CoinFlipCommand
{ {
public CoinFlipCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
int rand = RandomUtil.getRandomNumber(0, 1); int rand = RandomUtil.getRandomNumber(0, 1);
String msg; String msg;
@ -19,6 +26,32 @@ public class CoinFlipCommand
msg = "It's **Tails**! :coin:"; msg = "It's **Tails**! :coin:";
} }
event.reply(msg).queue(); event.reply(msg)
.addActionRow(Button.primary("reflip", "Flip again")
.withEmoji(Emoji.fromFormatted("\uD83E\uDE99")) // coin emoji
).queue();
} }
public void buttonReflip(ButtonInteractionEvent event)
{
List<ActionRow> actionRows = event.getMessage().getActionRows();
actionRows.set(0, actionRows.get(0).asDisabled());
event.editComponents(actionRows).queue();
int rand = RandomUtil.getRandomNumber(0, 1);
String msg;
if(rand == 1)
{
msg = ":coin: It's **Heads**!";
} else {
msg = "It's **Tails**! :coin:";
}
event.getHook().sendMessage(msg)
.addActionRow(Button.primary("reflip", "Flip again")
.withEmoji(Emoji.fromFormatted("\uD83E\uDE99")) // coin emoji
).queue();
}
} }

View File

@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit;
public class DieCommand public class DieCommand
{ {
public DieCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
if(Configuration.getBotOwnerId() != event.getMember().getIdLong()) if(Configuration.getBotOwnerId() != event.getMember().getIdLong())
{ {

View File

@ -8,7 +8,7 @@ import wtf.beatrice.hidekobot.Configuration;
public class InviteCommand public class InviteCommand
{ {
public InviteCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
ReplyCallbackAction reply = event.reply("Here's your link ✨ " + Configuration.getInviteUrl()); ReplyCallbackAction reply = event.reply("Here's your link ✨ " + Configuration.getInviteUrl());

View File

@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull;
public class PingCommand public class PingCommand
{ {
public PingCommand(@NotNull SlashCommandInteractionEvent event) public void runSlashCommand(@NotNull SlashCommandInteractionEvent event)
{ {
event.reply("Pong!").queue(); event.reply("Pong!").queue();
} }

View File

@ -0,0 +1,23 @@
package wtf.beatrice.hidekobot.listeners;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import wtf.beatrice.hidekobot.commands.slash.CoinFlipCommand;
public class ButtonInteractionListener extends ListenerAdapter
{
@Override
public void onButtonInteraction(ButtonInteractionEvent event)
{
switch (event.getComponentId().toLowerCase()) {
// coinflip
case "reflip" -> new CoinFlipCommand().buttonReflip(event);
}
}
}

View File

@ -12,12 +12,12 @@ public class SlashCommandListener extends ListenerAdapter
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event)
{ {
switch (event.getName().toLowerCase()) { switch (event.getName().toLowerCase()) {
case "avatar" -> new AvatarCommand(event); case "avatar" -> new AvatarCommand().runSlashCommand(event);
case "clear" -> new ClearChatCommand(event); case "clear" -> new ClearChatCommand().runSlashCommand(event);
case "coinflip" -> new CoinFlipCommand(event); case "coinflip" -> new CoinFlipCommand().runSlashCommand(event);
case "die" -> new DieCommand(event); case "die" -> new DieCommand().runSlashCommand(event);
case "invite" -> new InviteCommand(event); case "invite" -> new InviteCommand().runSlashCommand(event);
case "ping" -> new PingCommand(event); case "ping" -> new PingCommand().runSlashCommand(event);
} }
} }
} }