diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 6f0854a2..71813715 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -19,4 +19,4 @@ Add any other context or screenshots about the feature request here. # Checklist: - [ ] I have checked for similar issues. -- [ ] This is a feature request, not improvement request, bug report, or security vulnerability report. \ No newline at end of file +- [ ] This is a feature request, not an improvement request, bug report, or security vulnerability report. \ No newline at end of file diff --git a/README.md b/README.md index a84df215..7ec4b993 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@

A cafe bot for your discord server!
- Explore the docs ยป + Explore the Docs ยป

View Demo @@ -133,8 +133,10 @@ As you can see, this was shown using the command `/help order`. It shows each pa * `feature-request` - Request a bot feature. * `generate-code` - Generate a random 32-digit long code! * `help` - Shows the list of command sections and command list for those sections. -* `ping` - Show bot information! +* `info` - Show information about the bot! +* `ping` - Show technical information about the bot! * `remove-my-data` - Request to remove your data from the bot! +* `stats` - Show statistics such as commands run, current servers, and users! * `support` - Get support for the bot! * `user-info` - Get user information about someone. ##### 2. **CAFE** @@ -145,11 +147,14 @@ As you can see, this was shown using the command `/help order`. It shows each pa * `serve` - Get beanCoins! Essentially you run this command by doing `/serve (dictionary word)`! This must be an english word. The longer the word, the more money you get. However, the more popular the word is, the less money you will get for it. ##### 3. **FUN** * `avatar` - Get yours or someone else's avatar image! +* `banner` - Get yours or someone else's profile banner! * `birthday` - Add, change, or remove your birthday! Even get someone else's birthday! * `coffee-meme` - Get a coffee meme! * `counting-statistics` - Get counting information for your server! * `joke` - Send a joke in the current channel. (SFW) * `meme` - Send a meme in the current channel. (SFW) +* `rate` - Rate the percentages of someone! (*somewhat* NSFW) +* `snipe` - Snipe a recently deleted message! (30 Seconds) * `tea-meme` - Get a tea meme! ##### 4. **GAMES** * `8-ball` - Ask a yes or no question! diff --git a/src/main/java/com/beanbeanjuice/Bot.java b/src/main/java/com/beanbeanjuice/Bot.java index 6652c3ba..7676d2d5 100644 --- a/src/main/java/com/beanbeanjuice/Bot.java +++ b/src/main/java/com/beanbeanjuice/Bot.java @@ -100,6 +100,7 @@ public Bot() throws LoginException, InterruptedException { commandHandler, new ServerListener(), // Listening for Guild Joins/Leaves new MessageListener(), // Listening for specific messages + new MessageDeleteListener(), // Listening for message deletions new WelcomeListener(), // Listening for user joins for a guild. new AIResponseListener(), // Listening for messages. new VoiceChatRoleBindListener(), // Listening for voice joins/leaves @@ -120,7 +121,7 @@ public Bot() throws LoginException, InterruptedException { VoiceChatRoleBindHandler.start(); bot.getPresence().setStatus(OnlineStatus.ONLINE); - updateGuildPresence(); + Helper.startBioUpdateTimer(); logger.log(Bot.class, LogLevel.OKAY, "The bot is online!"); new GitHubUpdateHelper().start(); // Notify Guilds of Update @@ -171,11 +172,4 @@ public static CommandHandler getCommandHandler() { return commandHandler; } - /** - * Updates the presence for the {@link JDA}. - */ - public static void updateGuildPresence() { - bot.getPresence().setActivity(Activity.playing("/help | cafeBot " + BOT_VERSION + " - Currently in " + bot.getGuilds().size() + " servers!")); - } - } diff --git a/src/main/java/com/beanbeanjuice/command/fun/AvatarCommand.java b/src/main/java/com/beanbeanjuice/command/fun/AvatarCommand.java index 964c51b2..8f701b73 100644 --- a/src/main/java/com/beanbeanjuice/command/fun/AvatarCommand.java +++ b/src/main/java/com/beanbeanjuice/command/fun/AvatarCommand.java @@ -33,7 +33,7 @@ public void handle(@NotNull SlashCommandInteractionEvent event) { @NotNull private MessageEmbed avatarEmbed(@NotNull User user) { return new EmbedBuilder() - .setTitle(user.getName() + "'s Avatar", user.getAvatarUrl()) + .setTitle(user.getName() + "'s Avatar") .setImage(user.getAvatarUrl() + "?size=512") .setColor(Helper.getRandomColor()) .build(); diff --git a/src/main/java/com/beanbeanjuice/command/fun/BannerCommand.java b/src/main/java/com/beanbeanjuice/command/fun/BannerCommand.java new file mode 100644 index 00000000..1eb85c29 --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/BannerCommand.java @@ -0,0 +1,126 @@ +package com.beanbeanjuice.command.fun; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ICommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +/** + * An {@link ICommand} used to get the banner of a {@link net.dv8tion.jda.api.entities.User User}. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class BannerCommand implements ICommand { + + private final String filename = "banner_image.jpg"; + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + String username = user.getName(); + String avatarURL = user.getAvatarUrl(); + + user.retrieveProfile().queue( + (profile) -> { + if (profile.getBannerUrl() != null) { + event.getHook().sendMessageEmbeds(bannerEmbed(username, avatarURL, profile)).queue(); + } else { + File file = new File(filename); + event.getHook().sendMessageEmbeds(bannerEmbed(username, avatarURL, profile)) + .addFile(file, filename).queue((message) -> { + file.delete(); // Finally delete the file once the message is sent. + }); + } + }, + (failure) -> { + event.getHook().sendMessageEmbeds(Helper.errorEmbed( + "Error Getting Banner", + "There was an error getting " + username + "'s banner. " + + "Please try again later." + )).queue(); + }); + } + + @NotNull + private MessageEmbed bannerEmbed(@NotNull String username, @NotNull String avatarURL, @NotNull User.Profile profile) { + EmbedBuilder embedBuilder = new EmbedBuilder() + .setColor(profile.getAccentColor()) + .setAuthor(username + "'s Banner", null, avatarURL); + + if (profile.getBannerUrl() != null) { + embedBuilder.setImage(profile.getBannerUrl() + "?size=600"); + } else { + int width = 600, height = 240; + + // Creating the image in code. + BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics2D = bufferedImage.createGraphics(); + + // Setting the colour and filling it. + graphics2D.setColor(profile.getAccentColor()); + graphics2D.fillRect(0, 0, width, height); + + // Clearing up resources. + graphics2D.dispose(); + + // Creating the file, and writing the file. + File file = new File(filename); + try { + ImageIO.write(bufferedImage, "jpg", file); + embedBuilder.setImage("attachment://" + filename); + } catch (IOException ignored) { } + } + + return embedBuilder.build(); + } + + @NotNull + @Override + public String getDescription() { + return "Get your or another user's banner!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/banner` or `/banner @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "The user you want to get the banner of.", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public Boolean allowDM() { + return true; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/SnipeCommand.java b/src/main/java/com/beanbeanjuice/command/fun/SnipeCommand.java new file mode 100644 index 00000000..5716f19f --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/SnipeCommand.java @@ -0,0 +1,52 @@ +package com.beanbeanjuice.command.fun; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ICommand; +import com.beanbeanjuice.utility.handler.snipe.SnipeHandler; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * An {@link ICommand} to use with the {@link com.beanbeanjuice.utility.handler.snipe.SnipeHandler SnipeHandler}. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class SnipeCommand implements ICommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + MessageEmbed embed = SnipeHandler.getLatestSnipe(event.getTextChannel().getId()); + + if (embed == null) { + event.getHook().sendMessageEmbeds(Helper.errorEmbed( + "No Snipe", + "There was nothing to snipe!" + )).queue(); + return; + } + + event.getHook().sendMessageEmbeds(embed).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Snipe a message in this channel!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/snipe`"; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RateCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RateCommand.java new file mode 100644 index 00000000..12dc40ae --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RateCommand.java @@ -0,0 +1,58 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ICommand; +import com.beanbeanjuice.utility.command.ISubCommand; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ICommand} used to rate people. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RateCommand implements ICommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { } + + @NotNull + @Override + public String getDescription() { + return "Rate someone!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate simp` or `/rate insane @beanbeanjuice`"; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public ArrayList getSubCommands() { + ArrayList subCommands = new ArrayList<>(); + subCommands.add(new RateSimpSubCommand()); + subCommands.add(new RateGaySubCommand()); + subCommands.add(new RateSmartSubCommand()); + subCommands.add(new RatePoorSubCommand()); + subCommands.add(new RateInsaneSubCommand()); + return subCommands; + } + + @NotNull + @Override + public Boolean allowDM() { + return true; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RateGaySubCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RateGaySubCommand.java new file mode 100644 index 00000000..fc2f2b2f --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RateGaySubCommand.java @@ -0,0 +1,66 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ISubCommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ISubCommand} used to rate someone's gay percentage. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RateGaySubCommand implements ISubCommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + event.getHook().sendMessageEmbeds(Helper.smallAuthorEmbed( + "Gay Rating", null, user.getAvatarUrl(), + "The gay rating is `" + Helper.getRandomNumber(0, 101) + "`%! ๐Ÿณ๏ธโ€๐ŸŒˆ" // Gay Pride Flag + )).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Rate someone's gay percentage!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate gay` or `/rate gay @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "THe person to rate!", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public String getName() { + return "gay"; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RateInsaneSubCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RateInsaneSubCommand.java new file mode 100644 index 00000000..d08e3f26 --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RateInsaneSubCommand.java @@ -0,0 +1,66 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ISubCommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ISubCommand} used to rate how insane someone is! + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RateInsaneSubCommand implements ISubCommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + event.getHook().sendMessageEmbeds(Helper.smallAuthorEmbed( + "Insane Rating", null, user.getAvatarUrl(), + "The insane rating is `" + Helper.getRandomNumber(0, 101) + "`%! " + )).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Rate how insane someone is!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate insane` or `/rate insane @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "THe person to rate!", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public String getName() { + return "insane"; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RatePoorSubCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RatePoorSubCommand.java new file mode 100644 index 00000000..a6e780fd --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RatePoorSubCommand.java @@ -0,0 +1,66 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ISubCommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ISubCommand} used to rate how poor someone is! + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RatePoorSubCommand implements ISubCommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + event.getHook().sendMessageEmbeds(Helper.smallAuthorEmbed( + "Poor Rating", null, user.getAvatarUrl(), + "The poor rating is `" + Helper.getRandomNumber(0, 101) + "`%! <:HUH:996901946344607764>" + )).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Rate how poor someone is!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate poor` or `/rate poor @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "THe person to rate!", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public String getName() { + return "poor"; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RateSimpSubCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RateSimpSubCommand.java new file mode 100644 index 00000000..b03312d0 --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RateSimpSubCommand.java @@ -0,0 +1,66 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ISubCommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ISubCommand} used to rate someone's simp level. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RateSimpSubCommand implements ISubCommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + event.getHook().sendMessageEmbeds(Helper.smallAuthorEmbed( + "Simp Rating", null, user.getAvatarUrl(), + "The simp rating is `" + Helper.getRandomNumber(0, 101) + "`%!" + )).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Rate someone's simp level!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate simp` or `/rate simp @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "THe person to rate!", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public String getName() { + return "simp"; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/fun/rate/RateSmartSubCommand.java b/src/main/java/com/beanbeanjuice/command/fun/rate/RateSmartSubCommand.java new file mode 100644 index 00000000..c66edf55 --- /dev/null +++ b/src/main/java/com/beanbeanjuice/command/fun/rate/RateSmartSubCommand.java @@ -0,0 +1,66 @@ +package com.beanbeanjuice.command.fun.rate; + +import com.beanbeanjuice.utility.command.CommandCategory; +import com.beanbeanjuice.utility.command.ISubCommand; +import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * An {@link ISubCommand} used to rate how smart someone is. + * + * @author beanbeanjuice + * @since v3.1.0 + */ +public class RateSmartSubCommand implements ISubCommand { + + @Override + public void handle(@NotNull SlashCommandInteractionEvent event) { + User user = event.getUser(); + if (event.getOption("user") != null) + user = event.getOption("user").getAsUser(); + + event.getHook().sendMessageEmbeds(Helper.smallAuthorEmbed( + "Smart Rating", null, user.getAvatarUrl(), + "The smart rating is `" + Helper.getRandomNumber(0, 101) + "`%! <:smartPeepo:1000248538376196280>" + )).queue(); + } + + @NotNull + @Override + public String getDescription() { + return "Rate how smart someone is!"; + } + + @NotNull + @Override + public String exampleUsage() { + return "`/rate smart` or `/rate smart @beanbeanjuice`"; + } + + @NotNull + @Override + public ArrayList getOptions() { + ArrayList options = new ArrayList<>(); + options.add(new OptionData(OptionType.USER, "user", "THe person to rate!", false)); + return options; + } + + @NotNull + @Override + public CommandCategory getCategoryType() { + return CommandCategory.FUN; + } + + @NotNull + @Override + public String getName() { + return "smart"; + } + +} diff --git a/src/main/java/com/beanbeanjuice/command/generic/BotUpvoteCommand.java b/src/main/java/com/beanbeanjuice/command/generic/BotUpvoteCommand.java index 30ff1b0a..6be30aa4 100644 --- a/src/main/java/com/beanbeanjuice/command/generic/BotUpvoteCommand.java +++ b/src/main/java/com/beanbeanjuice/command/generic/BotUpvoteCommand.java @@ -3,20 +3,39 @@ import com.beanbeanjuice.utility.command.CommandCategory; import com.beanbeanjuice.utility.command.ICommand; import com.beanbeanjuice.utility.helper.Helper; +import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.components.buttons.Button; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; + +/** + * An {@link ICommand} used to upvote the bot. + * + * @author beanbeanjuice + * @since v3.1.0 + */ public class BotUpvoteCommand implements ICommand { @Override public void handle(@NotNull SlashCommandInteractionEvent event) { - event.getHook().sendMessageEmbeds(Helper.successEmbed( - "Bot Upvote", - """ - If you want to show your support for the bot, please click the links below! Please click the links below + event.getHook().sendMessageEmbeds(Helper.errorEmbed( + "Voting List", + "If you want to show support for the bot, click the buttons below! " + + "Soon, there will be a feature where you can get perks for up-voting the bot. " + + "Any and all support is welcome!" + )).addActionRow(getButtons()).queue(); + } - **Link 1**: [top.gg](https://top.gg/bot/787162619504492554).""" - )).queue(); + @NotNull + private ArrayList