diff --git a/build.gradle.kts b/build.gradle.kts index ad6cf25..57eeffc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { allprojects { val build = System.getenv("BUILD_NUMBER") ?: "SNAPSHOT" group = "com.alttd.proxydiscordlink" - version = "1.0.0-BETA-$build" + version = "1.0.1-BETA-$build" description = "A velocity plugin to link Discord and Minecraft accounts." apply(plugin = "java") @@ -38,8 +38,8 @@ dependencies { compileOnly("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") // Velocity annotationProcessor("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") // JDA - implementation("net.dv8tion:JDA:5.0.0-alpha.3") { - shadow("net.dv8tion:JDA:5.0.0-alpha.3") { + implementation("net.dv8tion:JDA:5.0.0-beta.2") { + shadow("net.dv8tion:JDA:5.0.0-beta.2") { exclude("opus-java") // exclude audio } compileOnly("com.gitlab.ruany:LitebansAPI:0.3.5") diff --git a/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java index d9e145c..636e39a 100644 --- a/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java +++ b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java @@ -19,11 +19,11 @@ import com.velocitypowered.api.plugin.Dependency; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import org.slf4j.Logger; import java.io.File; import java.nio.file.Path; import java.sql.SQLException; -import java.util.logging.Logger; @Plugin(id = "proxydiscordlink", name = "ProxyDiscordLink", version = "1.0.0", description = "A plugin that links Discord accounts with uuid's", @@ -63,8 +63,8 @@ public class DiscordLink { DatabaseConnection.initialize(); } catch (SQLException exception) { exception.printStackTrace(); - getLogger().severe("*** Could not connect to the database. ***"); - getLogger().severe("*** This plugin will be disabled. ***"); + ALogger.error("*** Could not connect to the database. ***"); + ALogger.error("*** This plugin will be disabled. ***"); //TODO shutdown plugin } loadCommands(); diff --git a/src/main/java/com/alttd/proxydiscordlink/JDAListener.java b/src/main/java/com/alttd/proxydiscordlink/JDAListener.java new file mode 100644 index 0000000..a3fe042 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/JDAListener.java @@ -0,0 +1,23 @@ +package com.alttd.proxydiscordlink; + +import com.alttd.proxydiscordlink.bot.commandManager.CommandManager; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.session.ReadyEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +public class JDAListener extends ListenerAdapter { + + private final JDA jda; + + public JDAListener(JDA jda) { + this.jda = jda; + } + + @Override + public void onReady(@NotNull ReadyEvent event) { + CommandManager commandManager = new CommandManager(jda); + jda.addEventListener(commandManager); + } + +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java b/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java index 7698500..ee22729 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java @@ -1,9 +1,12 @@ package com.alttd.proxydiscordlink.bot; +import com.alttd.proxydiscordlink.JDAListener; +import com.alttd.proxydiscordlink.bot.commandManager.CommandManager; import com.alttd.proxydiscordlink.DiscordLink; import com.alttd.proxydiscordlink.bot.listeners.DiscordMessageListener; import com.alttd.proxydiscordlink.bot.listeners.DiscordRoleListener; import com.alttd.proxydiscordlink.bot.tasks.CheckLinkSync; +import com.alttd.proxydiscordlink.bot.tasks.CheckLinkSync; import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.util.ALogger; import net.dv8tion.jda.api.EmbedBuilder; @@ -13,9 +16,11 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.exceptions.HierarchyException; import net.dv8tion.jda.api.exceptions.InsufficientPermissionException; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.utils.MemberCachePolicy; import org.jetbrains.annotations.Nullable; @@ -33,15 +38,16 @@ public class Bot { disconnect(); try { jda = JDABuilder - .createDefault(BotConfig.BOT_TOKEN) + .createDefault(BotConfig.DISCORD.BOT_TOKEN) .setMemberCachePolicy(MemberCachePolicy.ALL) .enableIntents(GatewayIntent.GUILD_MEMBERS) .build(); jda.setAutoReconnect(true); jda.awaitReady(); - jda.addEventListener(new DiscordMessageListener(), - new DiscordRoleListener()); - + jda.addEventListener( + new DiscordMessageListener(), + new DiscordRoleListener(), + new JDAListener(jda))); DiscordCommand.loadCommands(); DiscordLink.getPlugin().getProxy().getScheduler().buildTask(DiscordLink.getPlugin(), new CheckLinkSync()) .delay(120, TimeUnit.SECONDS) @@ -236,9 +242,9 @@ public class Bot { private void discordBan(Member member, @Nullable String optionalReason) { try { if (optionalReason == null) - member.ban(0).queue(); + member.ban(0, TimeUnit.DAYS).queue(); else - member.ban(0, optionalReason).queue(); + member.ban(0, TimeUnit.DAYS).reason(optionalReason).queue(); } catch (InsufficientPermissionException exception) { ALogger.warn("Unable to ban " + member.getAsMention() + " : " + member.getId() + " from Discord they might be above me."); } @@ -259,4 +265,8 @@ public class Bot { return guild.getMembers().stream().filter(member -> member.getRoles().contains(role)).toList(); } + + public void addListener(ListenerAdapter listenerAdapter) { + jda.addEventListener(listenerAdapter); + } } diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/DiscordCommand.java b/src/main/java/com/alttd/proxydiscordlink/bot/DiscordCommand.java deleted file mode 100644 index e26d055..0000000 --- a/src/main/java/com/alttd/proxydiscordlink/bot/DiscordCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.alttd.proxydiscordlink.bot; - -import com.alttd.proxydiscordlink.bot.commands.*; -import net.dv8tion.jda.api.entities.Message; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public abstract class DiscordCommand { - - private static List commands; - - public abstract String getCommand(); - public abstract String getPermission();// TODO discord and LP permissions - public abstract String getDescription(); - public abstract String getSyntax(); - public abstract long getChannel(); - - public abstract void handleCommand(Message message, String sender, String command, String[] args); - - public static void loadCommands() { - commands = new ArrayList<>(); - - loadCommand(new DiscordLinkCommand(), - new DiscordUnlink(), - new DiscordNick(), - new DiscordStaffList(), - new DiscordServerList() - ); - } - - private static void loadCommand(DiscordCommand ... discordCommands) { - Collections.addAll(commands, discordCommands); - } - - public static List getCommands() { - return commands; - } -} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/CommandManager.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/CommandManager.java new file mode 100644 index 0000000..dbbecdb --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/CommandManager.java @@ -0,0 +1,58 @@ +package com.alttd.proxydiscordlink.bot.commandManager; + +import com.alttd.proxydiscordlink.bot.commandManager.commands.*; +import com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand.CommandNick; +import com.alttd.proxydiscordlink.util.ALogger; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.List; +import java.util.Optional; + +public class CommandManager extends ListenerAdapter { + + private final List commands; + + public CommandManager(JDA jda) { + ALogger.info("Loading commands..."); + commands = List.of( + new CommandLink(jda), + new CommandUnlink(jda), + new CommandNick(jda), + new CommandServerList(jda), + new CommandStaffList(jda), + new CommandBroadcast(jda) + ); + } + + @Override + public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { + String commandName = event.getName(); + Optional first = commands.stream() + .filter(discordCommand -> discordCommand.getName().equalsIgnoreCase(commandName)) + .findFirst(); + if (first.isEmpty()) { + return; + } + first.get().execute(event); + } + + @Override + public void onCommandAutoCompleteInteraction(@NotNull CommandAutoCompleteInteractionEvent event) { + Optional first = commands.stream() + .filter(discordCommand -> discordCommand.getName().equalsIgnoreCase(event.getName())) + .findFirst(); + if (first.isEmpty()) + return; + first.get().suggest(event); + } + + public List getCommands() { + return commands; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/DiscordCommand.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/DiscordCommand.java new file mode 100644 index 0000000..9013b46 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/DiscordCommand.java @@ -0,0 +1,22 @@ +package com.alttd.proxydiscordlink.bot.commandManager; + +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; + +import java.util.ArrayList; + +public abstract class DiscordCommand { + + public abstract String getName(); + + public abstract void execute(SlashCommandInteractionEvent event); + + public void suggest(CommandAutoCompleteInteractionEvent event) { + event.replyChoices(new ArrayList<>()).queue(); + } + + public abstract CommandData getCommandData(); + + public abstract long getChannelId(); +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommand.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommand.java new file mode 100644 index 0000000..f2ed23b --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommand.java @@ -0,0 +1,29 @@ +package com.alttd.proxydiscordlink.bot.commandManager; + +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; + +import java.util.ArrayList; + +public abstract class SubCommand extends SubOption{ + + private final SubCommandGroup parentGroup; + private final boolean inSubGroup; + + protected SubCommand(SubCommandGroup parentGroup, DiscordCommand parent) { + super(parent); + this.parentGroup = parentGroup; + this.inSubGroup = parentGroup != null; + } + + public SubCommandGroup getParentGroup() { + return parentGroup; + } + + public boolean isInSubGroup() { + return inSubGroup; + } + + public void suggest(CommandAutoCompleteInteractionEvent event) { + event.replyChoices(new ArrayList<>()).queue(); + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommandGroup.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommandGroup.java new file mode 100644 index 0000000..3b62f89 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubCommandGroup.java @@ -0,0 +1,7 @@ +package com.alttd.proxydiscordlink.bot.commandManager; + +public abstract class SubCommandGroup extends SubOption{ + protected SubCommandGroup(DiscordCommand parent) { + super(parent); + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubOption.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubOption.java new file mode 100644 index 0000000..f639296 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/SubOption.java @@ -0,0 +1,21 @@ +package com.alttd.proxydiscordlink.bot.commandManager; + +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; + +public abstract class SubOption { + private final DiscordCommand parent; + + protected SubOption(DiscordCommand parent) { + this.parent = parent; + } + + public DiscordCommand getParent() { + return parent; + } + + public abstract String getName(); + + public abstract void execute(SlashCommandInteractionEvent event); + + public abstract String getHelpMessage(); +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandBroadcast.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandBroadcast.java new file mode 100644 index 0000000..50e2ea3 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandBroadcast.java @@ -0,0 +1,49 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands; + +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import com.alttd.proxydiscordlink.config.BotConfig; +import com.alttd.proxydiscordlink.util.Utilities; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; + +public class CommandBroadcast extends DiscordCommand { + + CommandData commandData; + public CommandBroadcast(JDA jda) { + commandData = Commands.slash(getName(), "Broadcast a message to all online players") + .addOption(OptionType.STRING, "text", "Text to broadcast", true) + .setDefaultPermissions(DefaultMemberPermissions.DISABLED); + Utilities.registerCommand(jda, commandData); + } + @Override + public String getName() { + return "broadcast"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + String msg = event.getOption("text", OptionMapping::getAsString); + if (msg == null) { + Utilities.commandErrAutoRem("Couldn't find text", event); + return; + } + event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Broadcast the following message:\n" + msg)) + .setEphemeral(true).queue(); + Utilities.broadcast(msg); + } + + @Override + public CommandData getCommandData() { + return null; + } + + @Override + public long getChannelId() { + return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandLink.java similarity index 53% rename from src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java rename to src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandLink.java index aa7793d..8655e43 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandLink.java @@ -1,17 +1,21 @@ -package com.alttd.proxydiscordlink.bot.commands; +package com.alttd.proxydiscordlink.bot.commandManager.commands; import com.alttd.proxydiscordlink.DiscordLink; -import com.alttd.proxydiscordlink.bot.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; import com.alttd.proxydiscordlink.bot.objects.DiscordRole; import com.alttd.proxydiscordlink.config.BotConfig; -import com.alttd.proxydiscordlink.config.Config; import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; import com.alttd.proxydiscordlink.util.Utilities; import com.velocitypowered.api.proxy.Player; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.TextChannel; -import net.dv8tion.jda.api.exceptions.HierarchyException; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.luckperms.api.model.user.User; import java.util.List; @@ -20,41 +24,34 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -public class DiscordLinkCommand extends DiscordCommand { +public class CommandLink extends DiscordCommand { + private final CommandData commandData; + public CommandLink(JDA jda) { + commandData = Commands.slash(getName(), "Link your Discord and Altitude Minecraft accounts") + .addOption(OptionType.STRING, "code", "The code you got from doing /discord link on Altitude in Minecraft", true) + .setDefaultPermissions(DefaultMemberPermissions.ENABLED); + + Utilities.registerCommand(jda, commandData); + } + @Override - public String getCommand() { + public String getName() { return "link"; } @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Link your Minecraft and Discord accounts."; - } - - @Override - public String getSyntax() { - return "link "; - } - - @Override - public long getChannel() { - return BotConfig.LINK_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { - Member member = message.getMember(); - if (member == null) + public void execute(SlashCommandInteractionEvent event) { + Member member = event.getMember(); + if (member == null) { + Utilities.commandErrAutoRem("Unable to find you", event); return; + } - UUID uuid; - if ((uuid = getUUID(message.getTextChannel(), args.length == 1 ? args[0] : "")) == null) + UUID uuid = getUUID(event.getOption("code", OptionMapping::getAsString)); + if (uuid == null) { + Utilities.commandErrAutoRem("This is not a valid link code, please check Minecraft and try again", event); return; + } List discordRoles = Utilities.getDiscordRolesForUser(uuid, member); @@ -69,10 +66,10 @@ public class DiscordLinkCommand extends DiscordCommand { .map(DiscordRole::getInternalName) .collect(Collectors.toList())); - linkAccount(discordLinkPlayer, message); + linkAccount(discordLinkPlayer, event); } - private void linkAccount(DiscordLinkPlayer discordLinkPlayer, Message message) { + private void linkAccount(DiscordLinkPlayer discordLinkPlayer, SlashCommandInteractionEvent event) { discordLinkPlayer.updateDiscord( DiscordRole.getDiscordRoles().stream() .filter(role -> discordLinkPlayer.getRoles().contains(role.getInternalName())) @@ -87,23 +84,30 @@ public class DiscordLinkCommand extends DiscordCommand { discordLinkPlayer.linkedRole(true); Player player = DiscordLink.getPlugin().getProxy().getPlayer(discordLinkPlayer.getUuid()).orElse(null); User user = Utilities.getLuckPerms().getUserManager().getUser(discordLinkPlayer.getUuid()); + Guild guild = event.getGuild(); + Member member = event.getMember(); + if (guild == null || member == null) { + Utilities.commandErrAutoRem("Unable to find guild", event); + return; + } if (player != null || user != null) DiscordLink.getPlugin().getBot().changeNick( - message.getGuild().getIdLong(), - message.getMember().getIdLong(), + guild.getIdLong(), + member.getIdLong(), player == null ? user.getUsername() : player.getUsername()); else DiscordLink.getPlugin().getBot().changeNick( - message.getGuild().getIdLong(), - message.getMember().getIdLong(), + guild.getIdLong(), + member.getIdLong(), discordLinkPlayer.getUsername()); - message.getChannel().sendMessage("You have successfully linked " + - discordLinkPlayer.getUsername() + " with " + - discordLinkPlayer.getDiscordUsername() + "!") - .queue(message1 -> message1.delete().queueAfter(5, TimeUnit.SECONDS)); + event.replyEmbeds(Utilities.genericSuccessEmbed("Success","You have successfully linked " + + discordLinkPlayer.getUsername() + " with " + + discordLinkPlayer.getDiscordUsername() + "!")) + .setEphemeral(true) + .queue(result -> result.deleteOriginal().queueAfter(5, TimeUnit.SECONDS)); DiscordLinkPlayer.addDiscordLinkPlayer(discordLinkPlayer); DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer); @@ -123,16 +127,19 @@ public class DiscordLinkCommand extends DiscordCommand { return "No User"; } - private UUID getUUID(TextChannel channel, String code) { - UUID uuid; - if (code.matches("[0-9]{6}")) { - if ((uuid = DiscordLink.getPlugin().getCache().getUUID(code)) != null) - return uuid; - } + private UUID getUUID(String code) { + if (code == null || !code.matches("[0-9]{6}")) + return null; + return DiscordLink.getPlugin().getCache().getUUID(code); + } - channel.sendMessage("Please use `&link ######` where the #'s are the code you received in-game.") - .queue(message1 -> message1.delete().queueAfter(15, TimeUnit.SECONDS, null, error -> { - })); - return null; + @Override + public CommandData getCommandData() { + return commandData; + } + + @Override + public long getChannelId() { + return BotConfig.DISCORD.LINK_CHANNEL; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordServerList.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandServerList.java similarity index 64% rename from src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordServerList.java rename to src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandServerList.java index 918f399..ed24856 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordServerList.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandServerList.java @@ -1,68 +1,58 @@ -package com.alttd.proxydiscordlink.bot.commands; +package com.alttd.proxydiscordlink.bot.commandManager.commands; import com.alttd.proxydiscordlink.DiscordLink; import com.alttd.proxydiscordlink.bot.Bot; -import com.alttd.proxydiscordlink.bot.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.util.Utilities; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerInfo; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.luckperms.api.LuckPerms; import net.luckperms.api.model.user.User; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -public class DiscordServerList extends DiscordCommand { +public class CommandServerList extends DiscordCommand { - private DiscordLink plugin; + CommandData commandData; + private final DiscordLink plugin; private final Bot bot; - - public DiscordServerList() { + public CommandServerList(JDA jda) { plugin = DiscordLink.getPlugin(); bot = plugin.getBot(); + commandData = Commands.slash(getName(), "Lists all online players on the server or a specific server") + .addOption(OptionType.STRING, "server", "Server to check online players on", false) + .setDefaultPermissions(DefaultMemberPermissions.DISABLED); + Utilities.registerCommand(jda, commandData); } + @SuppressWarnings("SpellCheckingInspection") @Override - public String getCommand() { + public String getName() { return "serverlist"; } @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Lists all online players on the server or a specific server"; - } - - @Override - public String getSyntax() { - return "serverlist"; - } - - @Override - public long getChannel() { - return BotConfig.STAFF_COMMAND_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { + public void execute(SlashCommandInteractionEvent event) { String serverName = "Altitude"; + String tmp; Collection onlinePlayer = plugin.getProxy().getAllPlayers(); ServerInfo server; - if (args.length != 0) { - Optional registeredServer = plugin.getProxy().getServer(args[0]); + if ((tmp = event.getOption("server", OptionMapping::getAsString)) != null) { + Optional registeredServer = plugin.getProxy().getServer(tmp); if (registeredServer.isEmpty()) { + Utilities.commandErrAutoRem("This server does not exist " + tmp, event); return; } onlinePlayer = registeredServer.get().getPlayersConnected(); @@ -76,7 +66,7 @@ public class DiscordServerList extends DiscordCommand { int i = Integer.compare(luckPerms.getGroupManager().getGroup(o2.getPrimaryGroup()).getWeight().orElse(0), luckPerms.getGroupManager().getGroup(o1.getPrimaryGroup()).getWeight().orElse(0)); return i != 0 ? i : o1.getUsername().compareToIgnoreCase(o2.getUsername()); }) - .collect(Collectors.toList()); + .toList(); EmbedBuilder embedBuilder = new EmbedBuilder(); String title = "Players online on " + serverName + ": " + players.size(); embedBuilder.setTitle(title); @@ -87,16 +77,14 @@ public class DiscordServerList extends DiscordCommand { int totalCharacters = title.length(); int fieldCounter = 0; - Iterator iterator = players.iterator(); - while (iterator.hasNext()) { - User user = iterator.next(); - if(user != null) { - if(!rankname.equalsIgnoreCase(user.getPrimaryGroup())) { + for (User user : players) { + if (user != null) { + if (!rankname.equalsIgnoreCase(user.getPrimaryGroup())) { if (currentFieldText.length() != 0) { totalCharacters += rankname.length() + currentFieldText.length(); fieldCounter++; if (totalCharacters > 6000 || fieldCounter > 25) { - bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300); embedBuilder.clearFields(); totalCharacters = title.length() + rankname.length() + currentFieldText.length(); fieldCounter = 1; @@ -106,16 +94,16 @@ public class DiscordServerList extends DiscordCommand { currentFieldText = new StringBuilder(); } rankname = Utilities.capitalize(user.getPrimaryGroup()); - } else if(rankname.equalsIgnoreCase(user.getPrimaryGroup())) { + } else if (rankname.equalsIgnoreCase(user.getPrimaryGroup())) { currentFieldText.append(separator); } if (entryCounter <= 50) { Optional optionalPlayer = plugin.getProxy().getPlayer(user.getUniqueId()); - if(optionalPlayer.isPresent()) { + if (optionalPlayer.isPresent()) { Player player = optionalPlayer.get(); currentFieldText.append("`").append(player.getUsername()).append("`"); } - } else if (entryCounter == 51){ + } else if (entryCounter == 51) { currentFieldText.append("..."); } entryCounter++; @@ -126,13 +114,22 @@ public class DiscordServerList extends DiscordCommand { totalCharacters = title.length() + rankname.length() + currentFieldText.length(); fieldCounter++; if (totalCharacters > 6000 || fieldCounter > 25) { - bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300); embedBuilder.clearFields(); } embedBuilder.addField(rankname, currentFieldText.toString(), true); } - message.delete().queueAfter(300, TimeUnit.SECONDS); - bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300); + } + + @Override + public CommandData getCommandData() { + return commandData; + } + + @Override + public long getChannelId() { + return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordStaffList.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandStaffList.java similarity index 71% rename from src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordStaffList.java rename to src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandStaffList.java index dac723e..d585499 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordStaffList.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandStaffList.java @@ -1,56 +1,48 @@ -package com.alttd.proxydiscordlink.bot.commands; +package com.alttd.proxydiscordlink.bot.commandManager.commands; import com.alttd.proxydiscordlink.DiscordLink; import com.alttd.proxydiscordlink.bot.Bot; -import com.alttd.proxydiscordlink.bot.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.util.Utilities; import com.velocitypowered.api.proxy.Player; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.luckperms.api.LuckPerms; import net.luckperms.api.model.user.User; -import java.util.*; -import java.util.stream.Collectors; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; -public class DiscordStaffList extends DiscordCommand { +public class CommandStaffList extends DiscordCommand { - private DiscordLink plugin; + CommandData commandData; + private final DiscordLink plugin; private final Bot bot; - - public DiscordStaffList() { + public CommandStaffList(JDA jda) { plugin = DiscordLink.getPlugin(); bot = plugin.getBot(); + commandData = Commands.slash(getName(), "Lists all online players on the server or a specific server") + .addOption(OptionType.STRING, "server", "Server to check online players on", false) + .setDefaultPermissions(DefaultMemberPermissions.DISABLED); + Utilities.registerCommand(jda, commandData); } + @SuppressWarnings("SpellCheckingInspection") @Override - public String getCommand() { + public String getName() { return "stafflist"; } @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Lists all online staff on the server"; - } - - @Override - public String getSyntax() { - return "staffList"; - } - - @Override - public long getChannel() { - return BotConfig.STAFF_COMMAND_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { + public void execute(SlashCommandInteractionEvent event) { LuckPerms luckPerms = Utilities.getLuckPerms(); List staff = plugin.getProxy().getAllPlayers() .stream().filter(player-> player.hasPermission("group." + BotConfig.SL_MINIMUMRANK)) @@ -59,7 +51,7 @@ public class DiscordStaffList extends DiscordCommand { int i = Integer.compare(luckPerms.getGroupManager().getGroup(o2.getPrimaryGroup()).getWeight().orElse(0), luckPerms.getGroupManager().getGroup(o1.getPrimaryGroup()).getWeight().orElse(0)); return i != 0 ? i : o1.getUsername().compareToIgnoreCase(o2.getUsername()); }) - .collect(Collectors.toList()); + .toList(); EmbedBuilder embedBuilder = new EmbedBuilder(); String title = "Online Staff: " + staff.size() + " - Online Players: " + plugin.getProxy().getAllPlayers().size(); embedBuilder.setTitle(title); @@ -72,16 +64,14 @@ public class DiscordStaffList extends DiscordCommand { int totalCharacters = title.length(); int fieldCounter = 0; - Iterator iterator = staff.iterator(); - while (iterator.hasNext()) { - User user = iterator.next(); - if(user != null) { - if(!rankname.equalsIgnoreCase(user.getPrimaryGroup())) { + for (User user : staff) { + if (user != null) { + if (!rankname.equalsIgnoreCase(user.getPrimaryGroup())) { if (currentFieldText.length() != 0) { totalCharacters += rankname.length() + currentFieldText.length(); fieldCounter++; if (totalCharacters > 6000 || fieldCounter > 25) { - bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1); embedBuilder.clearFields(); totalCharacters = title.length() + rankname.length() + currentFieldText.length(); fieldCounter = 1; @@ -91,15 +81,15 @@ public class DiscordStaffList extends DiscordCommand { currentFieldText = new StringBuilder(); } rankname = Utilities.capitalize(user.getPrimaryGroup()); - } else if(rankname.equalsIgnoreCase(user.getPrimaryGroup())) { + } else if (rankname.equalsIgnoreCase(user.getPrimaryGroup())) { currentFieldText.append(separator); } Optional optionalPlayer = plugin.getProxy().getPlayer(user.getUniqueId()); - if(optionalPlayer.isPresent()) { + if (optionalPlayer.isPresent()) { Player player = optionalPlayer.get(); String currentServerName = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo().getName() : ""; - if (onlineStaff.containsKey(currentServerName)){ + if (onlineStaff.containsKey(currentServerName)) { onlineStaff.put(currentServerName, onlineStaff.get(currentServerName) + 1); } else { onlineStaff.put(currentServerName, 1); @@ -107,7 +97,7 @@ public class DiscordStaffList extends DiscordCommand { if (entryCounter <= 50) { currentFieldText.append("`").append(player.getUsername()).append("`"); - } else if (entryCounter == 51){ + } else if (entryCounter == 51) { currentFieldText.append("..."); } entryCounter++; @@ -119,7 +109,7 @@ public class DiscordStaffList extends DiscordCommand { totalCharacters = title.length() + rankname.length() + currentFieldText.length(); fieldCounter++; if (totalCharacters > 6000 || fieldCounter > 25) { - bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1); embedBuilder.clearFields(); } embedBuilder.addField(rankname, currentFieldText.toString(), true); @@ -141,12 +131,22 @@ public class DiscordStaffList extends DiscordCommand { totalCharacters = title.length() + rankname.length() + currentFieldText.length(); fieldCounter++; if (totalCharacters > 6000 || fieldCounter > 25) { - bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1); embedBuilder.clearFields(); } embedBuilder.addField(rankname, currentFieldText.toString(), true); } - bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1); + bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1); + } + + @Override + public CommandData getCommandData() { + return commandData; + } + + @Override + public long getChannelId() { + return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandUnlink.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandUnlink.java new file mode 100644 index 0000000..3522468 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/CommandUnlink.java @@ -0,0 +1,66 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands; + +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import com.alttd.proxydiscordlink.config.BotConfig; +import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; +import com.alttd.proxydiscordlink.util.Utilities; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; + +import java.util.Optional; + +public class CommandUnlink extends DiscordCommand { + private final CommandData commandData; + public CommandUnlink(JDA jda) { + commandData = Commands.slash(getName(), "Unlink your Discord and Altitude Minecraft accounts") + .setDefaultPermissions(DefaultMemberPermissions.ENABLED); + + Utilities.registerCommand(jda, commandData); + } + @Override + public String getName() { + return "unlink"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + Member member = event.getMember(); + if (member == null) { + Utilities.commandErrAutoRem("Unable to find you", event); + return; + } + + DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong()); + if (discordLinkPlayer == null) { + Optional linkedRole = member.getRoles().stream().filter(role -> role.getIdLong() == BotConfig.DISCORD.LINKED_ROLE_ID).findAny(); + if (linkedRole.isPresent()) { + member.getGuild().removeRoleFromMember(member, linkedRole.get()).queue(); + event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Your Discord and Minecraft accounts have been unlinked.")) + .setEphemeral(true) + .queue(); + return; + } + Utilities.commandErrAutoRem("Your accounts aren't linked", event); + return; + } + discordLinkPlayer.unlinkDiscordLinkPlayer(); + event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Your Discord and Minecraft accounts have been unlinked.")) + .setEphemeral(true) + .queue(); + } + + @Override + public CommandData getCommandData() { + return commandData; + } + + @Override + public long getChannelId() { + return BotConfig.DISCORD.LINK_CHANNEL; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/DiscordSync.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/DiscordSync.java new file mode 100644 index 0000000..f8b5e5a --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/DiscordSync.java @@ -0,0 +1,27 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands; + +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; + +public class DiscordSync extends DiscordCommand { + @Override + public String getName() { + return "sync"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { //TODO implement + + } + + @Override + public CommandData getCommandData() { //TODO implement + return null; + } + + @Override + public long getChannelId() { //TODO implement + return 0; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/CommandNick.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/CommandNick.java new file mode 100644 index 0000000..21ee06e --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/CommandNick.java @@ -0,0 +1,101 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand; + +import com.alttd.proxydiscordlink.DiscordLink; +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.SubOption; +import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; +import com.alttd.proxydiscordlink.util.ALogger; +import com.alttd.proxydiscordlink.util.Utilities; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; + +import java.util.HashMap; + +public class CommandNick extends DiscordCommand { + CommandData commandData; + private final HashMap subOptionsMap = new HashMap<>(); + public CommandNick(JDA jda) { + commandData = Commands.slash(getName(), "Change your nickname to be your mc name/nickname") + .addSubcommands(new SubcommandData("username", "Change your name to your Minecraft username"), + new SubcommandData("nickname", "Change your name to your Minecraft nickname") + ) + .setDefaultPermissions(DefaultMemberPermissions.ENABLED); + Utilities.registerSubOptions(subOptionsMap, + new SubCommandUserName(null,this), + new SubCommandNick(null,this) + ); + Utilities.registerCommand(jda, commandData); + } + + @Override + public String getName() { + return "nick"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + if (event.getGuild() == null || event.getMember() == null) { + Utilities.commandErrAutoRem("This command can only be used within a guild: " + getName(), event); + return; + } + + String subcommandName = event.getInteraction().getSubcommandGroup(); + subcommandName = subcommandName == null ? event.getInteraction().getSubcommandName() : subcommandName; + if (subcommandName == null) { + ALogger.error("No subcommand found for " + getName()); + return; + } + + SubOption subOption = subOptionsMap.get(subcommandName); + if (subOption == null) { + event.replyEmbeds(Utilities.invalidSubcommand(subcommandName)) + .setEphemeral(true) + .queue(); + return; + } + + subOption.execute(event); + } + + @Override + public CommandData getCommandData() { + return commandData; + } + + @Override + public long getChannelId() { + return 0; + } + + public String setNickname(SlashCommandInteractionEvent event, boolean hasNick) { + Member member = event.getMember(); + if (member == null) { + Utilities.commandErrAutoRem("This command can only be run in a guild.", event); + return null; + } + DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong()); + if (discordLinkPlayer == null) { + Utilities.commandErrAutoRem("You aren't linked, please link before using this command.", event); + return null; + } + + String nick; + if (hasNick) { + nick = DiscordLink.getPlugin().getDatabase().getNick(discordLinkPlayer.getUuid()); + if (nick == null || nick.isBlank()) + nick = discordLinkPlayer.getUsername(); + } else { + nick = discordLinkPlayer.getUsername(); + } + member.modifyNickname(nick).queue(); + discordLinkPlayer.setNick(hasNick); + DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer); + return nick; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandNick.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandNick.java new file mode 100644 index 0000000..9ef86d9 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandNick.java @@ -0,0 +1,36 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand; + +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.SubCommand; +import com.alttd.proxydiscordlink.bot.commandManager.SubCommandGroup; +import com.alttd.proxydiscordlink.util.Utilities; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; + +public class SubCommandNick extends SubCommand { + protected SubCommandNick(SubCommandGroup parentGroup, DiscordCommand parent) { + super(parentGroup, parent); + } + + @Override + public String getName() { + return "nickname"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + if (!(getParent() instanceof CommandNick commandNick)) { + Utilities.commandErrAutoRem("Couldn't find parent command", event); + return; + } + + String resultingName = commandNick.setNickname(event, true); + event.replyEmbeds(Utilities.genericSuccessEmbed("Success", + "Your nickname has been set to `" + resultingName + "`.")) + .setEphemeral(true).queue(); + } + + @Override + public String getHelpMessage() { + return null; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandUserName.java b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandUserName.java new file mode 100644 index 0000000..a422132 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commandManager/commands/NickCommand/SubCommandUserName.java @@ -0,0 +1,36 @@ +package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand; + +import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand; +import com.alttd.proxydiscordlink.bot.commandManager.SubCommand; +import com.alttd.proxydiscordlink.bot.commandManager.SubCommandGroup; +import com.alttd.proxydiscordlink.util.Utilities; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; + +public class SubCommandUserName extends SubCommand { + protected SubCommandUserName(SubCommandGroup parentGroup, DiscordCommand parent) { + super(parentGroup, parent); + } + + @Override + public String getName() { + return "username"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + if (!(getParent() instanceof CommandNick commandNick)) { + Utilities.commandErrAutoRem("Couldn't find parent command", event); + return; + } + + String resultingName = commandNick.setNickname(event, false); + event.replyEmbeds(Utilities.genericSuccessEmbed("Success", + "Your nickname has been set to `" + resultingName + "`.")) + .setEphemeral(true).queue(); + } + + @Override + public String getHelpMessage() { + return null; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordBroadCast.java b/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordBroadCast.java deleted file mode 100644 index d1b1add..0000000 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordBroadCast.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.alttd.proxydiscordlink.bot.commands; - -import com.alttd.proxydiscordlink.DiscordLink; -import com.alttd.proxydiscordlink.bot.Bot; -import com.alttd.proxydiscordlink.bot.DiscordCommand; -import com.alttd.proxydiscordlink.config.BotConfig; -import com.alttd.proxydiscordlink.util.Utilities; -import net.dv8tion.jda.api.entities.Message; - -public class DiscordBroadCast extends DiscordCommand { - - private DiscordLink plugin; - private final Bot bot; - - public DiscordBroadCast() { - plugin = DiscordLink.getPlugin(); - bot = plugin.getBot(); - } - - @Override - public String getCommand() { - return "broadcast"; - } - - @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Broadcast a message to all online players"; - } - - @Override - public String getSyntax() { - return "broadcast"; - } - - @Override - public long getChannel() { - return BotConfig.STAFF_COMMAND_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { - //TODO also send this to the bot channel, optional command args for color and decoration? - String msg = String.join(" ", args); - bot.sendMessageToDiscord(BotConfig.COMMAND_CHANNEL, msg); - Utilities.broadcast(msg); - } -} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordNick.java b/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordNick.java deleted file mode 100644 index 939573a..0000000 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordNick.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.alttd.proxydiscordlink.bot.commands; - -import com.alttd.proxydiscordlink.DiscordLink; -import com.alttd.proxydiscordlink.bot.DiscordCommand; -import com.alttd.proxydiscordlink.config.BotConfig; -import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.MessageChannel; - -public class DiscordNick extends DiscordCommand { - @Override - public String getCommand() { - return "nick"; - } - - @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Change your name between your Minecraft username and Minecraft nickname."; - } - - @Override - public String getSyntax() { - return "nick "; - } - - @Override - public long getChannel() { - return BotConfig.COMMAND_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { - MessageChannel channel = message.getChannel(); - if (args.length != 1) { - channel.sendMessage("The correct syntax is: `" + - BotConfig.prefixMap.get(message.getGuild().getIdLong()) + - getSyntax() + "`.").queue(); - return; - } - - Member member = message.getMember(); - DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong()); - if (discordLinkPlayer == null) { - channel.sendMessage("You aren't linked, please link before using this command.").queue(); - return; - } - - switch (args[0].toLowerCase()) { - case "username" -> { - member.modifyNickname(discordLinkPlayer.getUsername()).queue(); - channel.sendMessage("Your nickname has been set to `" + discordLinkPlayer.getUsername() + "`.").queue(); - discordLinkPlayer.setNick(false); - DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer); - } - case "nickname" -> { - String nick = DiscordLink.getPlugin().getDatabase().getNick(discordLinkPlayer.getUuid()); - if (nick == null || nick.isBlank()) - nick = discordLinkPlayer.getUsername(); - member.modifyNickname(nick).queue(); - channel.sendMessage("Your nickname has been set to `" + nick + "`.").queue(); - discordLinkPlayer.setNick(true); - DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer); - } - default -> channel.sendMessage("The correct syntax is: `" + - BotConfig.prefixMap.get(message.getGuild().getIdLong()) + - getSyntax() + "`.").queue(); - } - } -} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordUnlink.java b/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordUnlink.java deleted file mode 100644 index 2adf311..0000000 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordUnlink.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.alttd.proxydiscordlink.bot.commands; - -import com.alttd.proxydiscordlink.bot.DiscordCommand; -import com.alttd.proxydiscordlink.config.BotConfig; -import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Message; - -public class DiscordUnlink extends DiscordCommand { - @Override - public String getCommand() { - return "unlink"; - } - - @Override - public String getPermission() { - return null; - } - - @Override - public String getDescription() { - return "Unlink your Minecraft and Discord accounts."; - } - - @Override - public String getSyntax() { - return "unlink"; - } - - @Override - public long getChannel() { - return BotConfig.LINK_CHANNEL; - } - - @Override - public void handleCommand(Message message, String sender, String command, String[] args) { - Member member = message.getMember(); - if (member == null) - return; - - DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong()); - if (discordLinkPlayer == null) { - message.getChannel().sendMessage("Your accounts aren't linked.").queue(); - return; - } - discordLinkPlayer.unlinkDiscordLinkPlayer(); - message.getChannel().sendMessage("Your Discord and Minecraft accounts have been unlinked.").queue(); - } -} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordMessageListener.java b/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordMessageListener.java deleted file mode 100644 index 2cf550b..0000000 --- a/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordMessageListener.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.alttd.proxydiscordlink.bot.listeners; - -import com.alttd.proxydiscordlink.DiscordLink; -import com.alttd.proxydiscordlink.bot.Bot; -import com.alttd.proxydiscordlink.bot.DiscordCommand; -import com.alttd.proxydiscordlink.config.BotConfig; -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; - -import java.util.Arrays; - -public class DiscordMessageListener extends ListenerAdapter { - - private final DiscordLink plugin; - private final Bot bot; - - public DiscordMessageListener() { - plugin = DiscordLink.getPlugin(); - bot = plugin.getBot(); - } - - @Override - public void onMessageReceived(MessageReceivedEvent event) { - if (!event.isFromGuild()) - return; - if (event.getAuthor() == event.getJDA().getSelfUser()) - return; - if (event.isWebhookMessage()) - return; - /* - if (event.getMessage().getChannel().getIdLong() == BotConfig.COMMAND_CHANNEL) { - String content = event.getMessage().getContentRaw(); - if (content.startsWith(BotConfig.prefixMap.get(event.getGuild().getIdLong())) && content.length() > 1) { - String[] split = content.split(" "); - String cmd = split[0].substring(1).toLowerCase(); - String[] args = Arrays.copyOfRange(split, 1, split.length); - for(DiscordCommand command : DiscordCommand.getCommands()) { - if(!command.getCommand().equalsIgnoreCase(cmd)) - continue; - if(command.getPermission() != null) { - // TODO permission check? do we need this? - } - command.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args); - } - } - } else if (event.getMessage().getChannel().getIdLong() == BotConfig.LINK_CHANNEL) { - String content = event.getMessage().getContentRaw(); - String[] split = content.split(" "); - String cmd = split[0].substring(1).toLowerCase(); - String[] args = Arrays.copyOfRange(split, 1, split.length); - if (cmd.equalsIgnoreCase("link")) - DiscordCommand.getCommands().stream() - .filter(discordCommand -> discordCommand.getCommand().equals("link")) - .findFirst() - .ifPresent(discordCommand -> discordCommand.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args)); - } - */ - String content = event.getMessage().getContentRaw(); - if (!BotConfig.prefixMap.containsKey(event.getGuild().getIdLong())) return; // early return - if (content.startsWith(BotConfig.prefixMap.get(event.getGuild().getIdLong())) && content.length() > 1) { - String[] split = content.split(" "); - String cmd = split[0].substring(1).toLowerCase(); - String[] args = Arrays.copyOfRange(split, 1, split.length); - for (DiscordCommand command : DiscordCommand.getCommands()) { - if (!command.getCommand().equalsIgnoreCase(cmd)) - continue; - if (!(event.getMessage().getChannel().getIdLong() == command.getChannel())) - continue; - if (command.getPermission() != null) { - // TODO permission check? do we need this? - } - command.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args); - } - } - } - -} diff --git a/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java b/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java index d5cd9bd..2fa7b98 100644 --- a/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java +++ b/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java @@ -35,7 +35,7 @@ public class BotConfig { public static File CONFIGPATH; public static void init() { // todo setup share for the config - CONFIGPATH = new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "DiscordLink"); + CONFIGPATH = new File(File.separator + "mnt" + File.separator + "configs" + File.separator + "DiscordLink"); CONFIG_FILE = new File(CONFIGPATH, "bot-config.yml"); configLoader = YAMLConfigurationLoader.builder() @@ -161,27 +161,31 @@ public class BotConfig { return config.getNode(splitPath(path)); } - /** * ONLY EDIT ANYTHING BELOW THIS LINE **/ + @SuppressWarnings("unused") + private static void loadSubclasses() { + BotConfig.DISCORD.settings(); + } + public static class DISCORD { + public static String BOT_TOKEN = "unconfigured"; + public static long COMMAND_CHANNEL = -1; + public static long STAFF_COMMAND_CHANNEL = -1; + public static long LINK_CHANNEL = -1; + public static long GUILD_ID = -1; + public static long EVIDENCE_CHANNEL_ID = -1; + public static long LINKED_ROLE_ID = -1; - public static String BOT_TOKEN = "unconfigured"; - public static long COMMAND_CHANNEL = -1; - public static long STAFF_COMMAND_CHANNEL = -1; - public static long LINK_CHANNEL = -1; - public static long GUILD_ID = -1; - public static long EVIDENCE_CHANNEL_ID = -1; - public static long LINKED_ROLE_ID = -1; - - private static void settings() { - BOT_TOKEN = getString("settings.token", BOT_TOKEN); - STAFF_COMMAND_CHANNEL = getLong("settings.staff-command-channel", STAFF_COMMAND_CHANNEL); - COMMAND_CHANNEL = getLong("settings.command-channel", COMMAND_CHANNEL); - LINK_CHANNEL = getLong("settings.link-channel", LINK_CHANNEL); - GUILD_ID = getLong("settings.guild-id", GUILD_ID); - EVIDENCE_CHANNEL_ID = getLong("settings.evidence-channel-id", EVIDENCE_CHANNEL_ID); - LINKED_ROLE_ID = getLong("settings.linked-role-id", LINKED_ROLE_ID); + private static void settings() { + BOT_TOKEN = getString("settings.token", BOT_TOKEN); + STAFF_COMMAND_CHANNEL = getLong("settings.staff-command-channel", STAFF_COMMAND_CHANNEL); + COMMAND_CHANNEL = getLong("settings.command-channel", COMMAND_CHANNEL); + LINK_CHANNEL = getLong("settings.link-channel", LINK_CHANNEL); + GUILD_ID = getLong("settings.guild-id", GUILD_ID); + EVIDENCE_CHANNEL_ID = getLong("settings.evidence-channel-id", EVIDENCE_CHANNEL_ID); + LINKED_ROLE_ID = getLong("settings.linked-role-id", LINKED_ROLE_ID); + } } public static String SL_MINIMUMRANK = "trainee"; diff --git a/src/main/java/com/alttd/proxydiscordlink/config/Config.java b/src/main/java/com/alttd/proxydiscordlink/config/Config.java index 2b0fe9d..36adecb 100644 --- a/src/main/java/com/alttd/proxydiscordlink/config/Config.java +++ b/src/main/java/com/alttd/proxydiscordlink/config/Config.java @@ -31,7 +31,7 @@ public final class Config { public static File CONFIGPATH; public static void init() { // todo setup share for the config - CONFIGPATH = new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "DiscordLink"); + CONFIGPATH = new File(File.separator + "mnt" + File.separator + "configs" + File.separator + "DiscordLink"); CONFIG_FILE = new File(CONFIGPATH, "config.yml"); configLoader = YAMLConfigurationLoader.builder() @@ -161,68 +161,83 @@ public final class Config { /** * ONLY EDIT ANYTHING BELOW THIS LINE **/ - public static String DRIVERS = "mysql"; - public static String IP = "localhost"; - public static String PORT = "3306"; - public static String DATABASE_NAME = "discordlink"; - public static String USERNAME = "root"; - public static String PASSWORD = "root"; - - private static void database() { - DRIVERS = getString("database.drivers", DRIVERS); - IP = getString("database.ip", IP); - PORT = getString("database.port", PORT); - DATABASE_NAME = getString("database.database_name", DATABASE_NAME); - USERNAME = getString("database.username", USERNAME); - PASSWORD = getString("database.password", PASSWORD); - } public static List DONOR_GROUPS = new ArrayList<>(List.of("donor")); public static List DISCORD_GROUPS = new ArrayList<>(List.of("nitro")); + @SuppressWarnings("unused") private static void loadGroups() { DONOR_GROUPS = getList("settings.donor-groups", DONOR_GROUPS); DISCORD_GROUPS = getList("settings.discord-groups", DISCORD_GROUPS); } - public static List DISCORD_MESSAGE = new ArrayList<>(List.of("Invite code here.")); - public static String DISCORD_LINK = "Your Minecraft and Discord accounts aren't linked yet, to link them click this message!"; - public static String GIVE_CODE = "Your code is , To link your accounts do &link in the Discord #link channel."; - public static String ALREADY_LINKED_ACCOUNTS = "Your accounts are already linked. You can unlink your accounts by doing /discord unlink."; - public static String ALREADY_GOT_CODE = "You have already got your code. Your code is "; - public static String ACCOUNTS_NOT_LINKED = "Your Minecraft and Discord accounts aren't linked"; - public static String UNLINKED_ACCOUNTS = "You have successfully unlinked your accounts."; - public static String IS_LINKED = " is ."; - public static String WHITELIST_LINK_MESSAGE = "You aren't linked yet! If you would like to link your account join our discord and use the following command in the link channel: &link ."; - public static String INVALID_PLAYER = " is not online or is not a valid player."; - public static String NO_PERMISSION = "You do not have permission to do that."; - public static String NO_CONSOLE = "This command can not be executed from console."; - public static String RELOAD_CONFIG = "Reloaded DiscordLink config."; - public static String HELP_MESSAGE = "DiscordLink commands:\n"; - public static String HELP_LINK = "/discord link: Get a code which can be used to link your Minecraft and Discord accounts."; - public static String HELP_UNLINK = "/discord unlink: Unlink your Minecraft and Discord accounts."; - public static String HELP_CHECK_LINKED = "/discord checklinked : Check if the specified user has their Minecraft and Discord accounts linked."; - public static String HELP_RELOAD = "/discord reload: Reload the config."; - public static String HELP_SYNC = "/discord sync: Manually synchronize your roles across Discord and Minecraft."; + @SuppressWarnings("unused") + private static void loadSubclasses() { + DB.database(); + MESSAGES.loadMessages(); + } - private static void loadMessages() { - DISCORD_MESSAGE = getList("messages.discord-message", DISCORD_MESSAGE); - DISCORD_LINK = getString("messages.discord-link", DISCORD_LINK); - GIVE_CODE = getString("messages.give-code", GIVE_CODE); - ALREADY_LINKED_ACCOUNTS = getString("messages.already-linked-accounts", ALREADY_LINKED_ACCOUNTS); - ALREADY_GOT_CODE = getString("messages.already-got-code", ALREADY_GOT_CODE); - ACCOUNTS_NOT_LINKED = getString("messages.accounts-not-linked", ACCOUNTS_NOT_LINKED); - UNLINKED_ACCOUNTS = getString("messages.unlinked-accounts", UNLINKED_ACCOUNTS); - IS_LINKED = getString("messages.is-linked", IS_LINKED); - WHITELIST_LINK_MESSAGE = getString("messages.whitelist-link-message", WHITELIST_LINK_MESSAGE); - INVALID_PLAYER = getString("messages.invalid-player", INVALID_PLAYER); - NO_PERMISSION = getString("messages.no-permission", NO_PERMISSION); - NO_CONSOLE = getString("messages.no-console", NO_CONSOLE); - RELOAD_CONFIG = getString("messages.reload-config", RELOAD_CONFIG); - HELP_MESSAGE = getString("messages.help-message", HELP_MESSAGE); - HELP_LINK = getString("messages.help-link", HELP_LINK); - HELP_UNLINK = getString("messages.help-unlink", HELP_UNLINK); - HELP_CHECK_LINKED = getString("messages.help-check-linked", HELP_CHECK_LINKED); - HELP_RELOAD = getString("messages.help-reload", HELP_RELOAD); + public static class DB { + public static String DRIVERS = "mysql"; + public static String IP = "localhost"; + public static String PORT = "3306"; + public static String DATABASE_NAME = "discordlink"; + public static String USERNAME = "root"; + public static String PASSWORD = "root"; + + private static void database() { + DRIVERS = getString("database.drivers", DRIVERS); + IP = getString("database.ip", IP); + PORT = getString("database.port", PORT); + DATABASE_NAME = getString("database.database_name", DATABASE_NAME); + USERNAME = getString("database.username", USERNAME); + PASSWORD = getString("database.password", PASSWORD); + } + } + + public static class MESSAGES { + + public static String ALREADY_LINKED_ACCOUNTS = "Your accounts are already linked. You can unlink your accounts by doing /discord unlink."; + public static String ALREADY_GOT_CODE = "You have already got your code. Your code is "; + public static String ACCOUNTS_NOT_LINKED = "Your Minecraft and Discord accounts aren't linked"; + public static String UNLINKED_ACCOUNTS = "You have successfully unlinked your accounts."; + public static String IS_LINKED = " is linked with discord user: ()."; + public static String IS_NOT_LINKED = " is not linked."; + public static String WHITELIST_LINK_MESSAGE = "You aren't linked yet! If you would like to link your account join our discord and use the following command in the link channel: &link ."; + public static String INVALID_PLAYER = " is not online or is not a valid player."; + public static String NO_PERMISSION = "You do not have permission to do that."; + public static String NO_CONSOLE = "This command can not be executed from console."; + public static String RELOAD_CONFIG = "Reloaded DiscordLink config."; + public static String HELP_MESSAGE = "DiscordLink commands:\n"; + public static String HELP_LINK = "/discord link: Get a code which can be used to link your Minecraft and Discord accounts."; + public static String HELP_UNLINK = "/discord unlink: Unlink your Minecraft and Discord accounts."; + public static String HELP_CHECK_LINKED = "/discord checklinked : Check if the specified user has their Minecraft and Discord accounts linked."; + public static String HELP_RELOAD = "/discord reload: Reload the config."; + public static String HELP_SYNC = "/discord sync: Manually synchronize your roles across Discord and Minecraft."; + public static List DISCORD_MESSAGE = new ArrayList<>(List.of("Invite code here.")); + public static String DISCORD_LINK = "Your Minecraft and Discord accounts aren't linked yet, to link them click this message!"; + public static String GIVE_CODE = "Your code is , To link your accounts do &link in the Discord #link channel."; + + private static void loadMessages() { + DISCORD_MESSAGE = getList("messages.discord-message", DISCORD_MESSAGE); + DISCORD_LINK = getString("messages.discord-link", DISCORD_LINK); + GIVE_CODE = getString("messages.give-code", GIVE_CODE); + ALREADY_LINKED_ACCOUNTS = getString("messages.already-linked-accounts", ALREADY_LINKED_ACCOUNTS); + ALREADY_GOT_CODE = getString("messages.already-got-code", ALREADY_GOT_CODE); + ACCOUNTS_NOT_LINKED = getString("messages.accounts-not-linked", ACCOUNTS_NOT_LINKED); + UNLINKED_ACCOUNTS = getString("messages.unlinked-accounts", UNLINKED_ACCOUNTS); + IS_LINKED = getString("messages.is-linked", IS_LINKED); + IS_NOT_LINKED = getString("messages.is-not-linked", IS_NOT_LINKED); + WHITELIST_LINK_MESSAGE = getString("messages.whitelist-link-message", WHITELIST_LINK_MESSAGE); + INVALID_PLAYER = getString("messages.invalid-player", INVALID_PLAYER); + NO_PERMISSION = getString("messages.no-permission", NO_PERMISSION); + NO_CONSOLE = getString("messages.no-console", NO_CONSOLE); + RELOAD_CONFIG = getString("messages.reload-config", RELOAD_CONFIG); + HELP_MESSAGE = getString("messages.help-message", HELP_MESSAGE); + HELP_LINK = getString("messages.help-link", HELP_LINK); + HELP_UNLINK = getString("messages.help-unlink", HELP_UNLINK); + HELP_CHECK_LINKED = getString("messages.help-check-linked", HELP_CHECK_LINKED); + HELP_RELOAD = getString("messages.help-reload", HELP_RELOAD); + } } } diff --git a/src/main/java/com/alttd/proxydiscordlink/database/DatabaseConnection.java b/src/main/java/com/alttd/proxydiscordlink/database/DatabaseConnection.java index 0a2fb2e..3fb6bd8 100644 --- a/src/main/java/com/alttd/proxydiscordlink/database/DatabaseConnection.java +++ b/src/main/java/com/alttd/proxydiscordlink/database/DatabaseConnection.java @@ -29,11 +29,11 @@ public class DatabaseConnection { e.printStackTrace(); } this.connection = DriverManager.getConnection("jdbc:" - + Config.DRIVERS + "://" - + Config.IP + ":" - + Config.PORT + "/" - + Config.DATABASE_NAME - + "?autoReconnect=true&useSSL=false", Config.USERNAME, Config.PASSWORD); + + Config.DB.DRIVERS + "://" + + Config.DB.IP + ":" + + Config.DB.PORT + "/" + + Config.DB.DATABASE_NAME + + "?autoReconnect=true&useSSL=false", Config.DB.USERNAME, Config.DB.PASSWORD); } } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/MinecraftCommand.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/MinecraftCommand.java index f18e468..19b1b53 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/MinecraftCommand.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/MinecraftCommand.java @@ -34,11 +34,11 @@ public class MinecraftCommand implements SimpleCommand { if (args.length < 1) { if (!source.hasPermission("discordlink.link")) - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); else if (source instanceof Player) - source.sendMessage(miniMessage.deserialize(Config.DISCORD_LINK)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.DISCORD_LINK)); else - source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE)); return; } @@ -98,6 +98,6 @@ public class MinecraftCommand implements SimpleCommand { if (stringBuilder.length() != 0) stringBuilder.replace(stringBuilder.length() - 1, stringBuilder.length(), ""); - return miniMessage.deserialize(Config.HELP_MESSAGE, Placeholder.unparsed("commands", stringBuilder.toString())); + return miniMessage.deserialize(Config.MESSAGES.HELP_MESSAGE, Placeholder.unparsed("commands", stringBuilder.toString())); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/CheckLinked.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/CheckLinked.java index df859f3..9894144 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/CheckLinked.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/CheckLinked.java @@ -3,6 +3,7 @@ package com.alttd.proxydiscordlink.minecraft.commands.subcommands; import com.alttd.proxydiscordlink.DiscordLink; import com.alttd.proxydiscordlink.config.Config; import com.alttd.proxydiscordlink.minecraft.commands.SubCommand; +import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -37,7 +38,7 @@ public class CheckLinked implements SubCommand { @Override public void execute(String[] args, CommandSource source) { if (!source.hasPermission(getPermission())) { - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); return; } if (args.length != 2 || !args[1].matches("\\w{3,16}")) { @@ -54,7 +55,7 @@ public class CheckLinked implements SubCommand { .getPlayer(UUID.fromString(uuidFromName)); if (optionalPlayer.isEmpty()) { - source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER, Placeholder.unparsed("player", args[1]))); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER, Placeholder.unparsed("player", args[1]))); return; } } @@ -63,12 +64,18 @@ public class CheckLinked implements SubCommand { } private void isLinked(CommandSource source, Player player) { - TagResolver tagResolver = TagResolver.resolver( - Placeholder.unparsed("linked_status", DiscordLink.getPlugin().getDatabase() - .playerIsLinked(player.getUniqueId()) ? "linked" : "not linked"), - Placeholder.unparsed("player", player.getUsername())); - - source.sendMessage(miniMessage.deserialize(Config.IS_LINKED, tagResolver)); + DiscordLinkPlayer linkPlayer = DiscordLink.getPlugin().getDatabase() + .getPlayer(player.getUniqueId()); + TagResolver tagResolver = TagResolver.resolver(Placeholder.unparsed("player", player.getUsername())); + if (!linkPlayer.isActive()) { + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.IS_NOT_LINKED, tagResolver)); + return; + } + tagResolver = TagResolver.resolver( + tagResolver, + Placeholder.unparsed("discord", linkPlayer.getDiscordUsername()), + Placeholder.unparsed("discord_id", linkPlayer.getUserId() + "")); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.IS_LINKED, tagResolver)); } @Override @@ -78,6 +85,6 @@ public class CheckLinked implements SubCommand { @Override public String getHelpMessage() { - return Config.HELP_CHECK_LINKED; + return Config.MESSAGES.HELP_CHECK_LINKED; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Link.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Link.java index 7300c42..37addc5 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Link.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Link.java @@ -36,11 +36,11 @@ public class Link implements SubCommand { @Override public void execute(String[] args, CommandSource source) { if (!(source instanceof Player player)) { - source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE)); return; } if (!player.hasPermission(getPermission())) { - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); return; } @@ -51,18 +51,18 @@ public class Link implements SubCommand { Database database = DiscordLink.getPlugin().getDatabase(); if (database.playerIsLinked(player.getUniqueId())) { - player.sendMessage(miniMessage.deserialize(Config.ALREADY_LINKED_ACCOUNTS)); + player.sendMessage(miniMessage.deserialize(Config.MESSAGES.ALREADY_LINKED_ACCOUNTS)); return; } String authCode = DiscordLink.getPlugin().getCache().getCode(player.getUniqueId()); if (authCode != null) { - player.sendMessage(miniMessage.deserialize(Config.ALREADY_GOT_CODE, Placeholder.unparsed("code", authCode))); + player.sendMessage(miniMessage.deserialize(Config.MESSAGES.ALREADY_GOT_CODE, Placeholder.unparsed("code", authCode))); return; } authCode = Utilities.getAuthKey(); - player.sendMessage(miniMessage.deserialize(Config.GIVE_CODE, Placeholder.unparsed("code", authCode))); + player.sendMessage(miniMessage.deserialize(Config.MESSAGES.GIVE_CODE, Placeholder.unparsed("code", authCode))); DiscordLink.getPlugin().getCache() .cacheCode(player.getUniqueId(), authCode); } @@ -74,6 +74,6 @@ public class Link implements SubCommand { @Override public String getHelpMessage() { - return Config.HELP_LINK; + return Config.MESSAGES.HELP_LINK; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Reload.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Reload.java index e8f6757..62a9505 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Reload.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Reload.java @@ -34,7 +34,7 @@ public class Reload implements SubCommand { @Override public void execute(String[] args, CommandSource source) { DiscordLink.getPlugin().reloadConfig(); - source.sendMessage(miniMessage.deserialize(Config.RELOAD_CONFIG)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.RELOAD_CONFIG)); } @Override @@ -44,6 +44,6 @@ public class Reload implements SubCommand { @Override public String getHelpMessage() { - return Config.HELP_RELOAD; + return Config.MESSAGES.HELP_RELOAD; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Sync.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Sync.java index 4164413..04a916a 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Sync.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Sync.java @@ -45,16 +45,16 @@ public class Sync implements SubCommand { //TODO implement @Override public void execute(String[] args, CommandSource source) { if (!(source instanceof Player player)) { - source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE)); return; } if (!player.hasPermission(getPermission())) { - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); return; } User user = Utilities.getLuckPerms().getUserManager().getUser(player.getUniqueId()); if (user == null) { - source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER)); return; } player.sendMessage(syncAccounts(user)); @@ -64,7 +64,7 @@ public class Sync implements SubCommand { //TODO implement Database database = DiscordLink.getPlugin().getDatabase(); if (!database.playerIsLinked(user.getUniqueId())) { - return miniMessage.deserialize(Config.ACCOUNTS_NOT_LINKED); + return miniMessage.deserialize(Config.MESSAGES.ACCOUNTS_NOT_LINKED); } DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(user.getUniqueId()); @@ -83,6 +83,6 @@ public class Sync implements SubCommand { //TODO implement @Override public String getHelpMessage() { - return Config.HELP_SYNC; + return Config.MESSAGES.HELP_SYNC; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Unlink.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Unlink.java index 65c673f..3aad80b 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Unlink.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/commands/subcommands/Unlink.java @@ -46,11 +46,11 @@ public class Unlink implements SubCommand { unlinkOther(args, source); } if (!(source instanceof Player player)) { - source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE)); return; } if (!player.hasPermission(getPermission())) { - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); return; } @@ -59,12 +59,12 @@ public class Unlink implements SubCommand { private void unlinkOther(String[] args, CommandSource source) { if (!source.hasPermission(getPermission() + ".other")) { - source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION)); return; } User user = Utilities.getLuckPerms().getUserManager().getUser(args[1]); if (user == null) { - source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER)); + source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER)); return; } @@ -75,7 +75,7 @@ public class Unlink implements SubCommand { Database database = DiscordLink.getPlugin().getDatabase(); if (!database.playerIsLinked(uuid)) { - return miniMessage.deserialize(Config.ACCOUNTS_NOT_LINKED); + return miniMessage.deserialize(Config.MESSAGES.ACCOUNTS_NOT_LINKED); } DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(uuid); @@ -91,7 +91,7 @@ public class Unlink implements SubCommand { .filter(role -> discordLinkPlayer.getRoles().contains(role.getInternalName())) .collect(Collectors.toList()), false); - return miniMessage.deserialize(Config.UNLINKED_ACCOUNTS); + return miniMessage.deserialize(Config.MESSAGES.UNLINKED_ACCOUNTS); } @Override @@ -101,6 +101,6 @@ public class Unlink implements SubCommand { @Override public String getHelpMessage() { - return Config.HELP_UNLINK; + return Config.MESSAGES.HELP_UNLINK; } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LiteBansBanListener.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LiteBansBanListener.java index 7bc4a52..bbcf71f 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LiteBansBanListener.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LiteBansBanListener.java @@ -45,14 +45,14 @@ public class LiteBansBanListener { return; discordLinkPlayer.setActive(false); - DiscordLink.getPlugin().getBot().discordBan(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), "Auto ban due to Minecraft ban"); + DiscordLink.getPlugin().getBot().discordBan(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), "Auto ban due to Minecraft ban"); Optional player = DiscordLink.getPlugin().getProxy().getPlayer(uuid); String username = discordLinkPlayer.getUsername(); if (player.isPresent()) username = player.get().getUsername(); - DiscordLink.getPlugin().getBot().sendEmbedToDiscord(BotConfig.EVIDENCE_CHANNEL_ID, + DiscordLink.getPlugin().getBot().sendEmbedToDiscord(BotConfig.DISCORD.EVIDENCE_CHANNEL_ID, new EmbedBuilder() .setColor(Color.RED) .setAuthor(username, null, "https://crafatar.com/avatars/" + stringUuid + "?overlay") @@ -74,7 +74,7 @@ public class LiteBansBanListener { if (uuid == null) return; DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(UUID.fromString(uuid)); - DiscordLink.getPlugin().getBot().discordUnban(BotConfig.GUILD_ID, discordLinkPlayer.getUserId()); + DiscordLink.getPlugin().getBot().discordUnban(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId()); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java index 7370009..e9b0bd8 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java @@ -34,7 +34,7 @@ public class PlayerJoin { sync = true; if (!discordLinkPlayer.hasNick()) - DiscordLink.getPlugin().getBot().changeNick(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), username); + DiscordLink.getPlugin().getBot().changeNick(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), username); } if (discordLinkPlayer.hasNick()) { //If they have a nick update it, if nick is empty set it to false and use username @@ -43,7 +43,7 @@ public class PlayerJoin { discordLinkPlayer.setNick(false); nick = discordLinkPlayer.getUsername(); } - DiscordLink.getPlugin().getBot().changeNick(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), nick); + DiscordLink.getPlugin().getBot().changeNick(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), nick); } boolean hasMinecraftNitro = Utilities.hasMinecraftNitro(player); diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/WhitelistKick.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/WhitelistKick.java index 2122731..f75ccd6 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/WhitelistKick.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/WhitelistKick.java @@ -24,6 +24,6 @@ public class WhitelistKick { HashMap stringStringHashMap = new HashMap<>(); stringStringHashMap.put("code", authCode); event.appendTemplate(stringStringHashMap); - event.appendMessage("\n\n" + Config.WHITELIST_LINK_MESSAGE); + event.appendMessage("\n\n" + Config.MESSAGES.WHITELIST_LINK_MESSAGE); } } \ No newline at end of file diff --git a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java index 6c24b47..7dd60a6 100644 --- a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java +++ b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java @@ -3,6 +3,7 @@ package com.alttd.proxydiscordlink.objects; import com.alttd.proxydiscordlink.DiscordLink; import com.alttd.proxydiscordlink.bot.objects.DiscordRole; import com.alttd.proxydiscordlink.config.BotConfig; +import com.alttd.proxydiscordlink.database.Database; import com.alttd.proxydiscordlink.util.Utilities; import net.luckperms.api.model.user.UserManager; import net.luckperms.api.node.types.InheritanceNode; @@ -89,9 +90,9 @@ public class DiscordLinkPlayer { public void updateDiscord(List roles, boolean added) { if (added) - roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.GUILD_ID)); + roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.DISCORD.GUILD_ID)); else - roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.GUILD_ID)); + roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.DISCORD.GUILD_ID)); } public void updateMinecraft(List roles, boolean added) { @@ -111,9 +112,9 @@ public class DiscordLinkPlayer { public void linkedRole(boolean add) { if (add) - DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); + DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.DISCORD.LINKED_ROLE_ID, BotConfig.DISCORD.GUILD_ID); else - DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); + DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.DISCORD.LINKED_ROLE_ID, BotConfig.DISCORD.GUILD_ID); } public void unlinkDiscordLinkPlayer() { @@ -130,6 +131,7 @@ public class DiscordLinkPlayer { .collect(Collectors.toList()), false); linkedRole(false); + DiscordLink.getPlugin().getDatabase().removeLinkedAccount(this); } //Static stuff diff --git a/src/main/java/com/alttd/proxydiscordlink/util/ALogger.java b/src/main/java/com/alttd/proxydiscordlink/util/ALogger.java index 2a1041e..ea963a3 100644 --- a/src/main/java/com/alttd/proxydiscordlink/util/ALogger.java +++ b/src/main/java/com/alttd/proxydiscordlink/util/ALogger.java @@ -1,7 +1,6 @@ package com.alttd.proxydiscordlink.util; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.slf4j.Logger; public class ALogger { @@ -11,12 +10,8 @@ public class ALogger { logger = log; } - private void log(String message) { - logger.info(message); - } - public static void warn(String message) { - logger.warning(message); + logger.warn(message); } public static void info(String message) { @@ -24,6 +19,6 @@ public class ALogger { } public static void error(String message) { - logger.log(Level.SEVERE, message); + logger.error(message); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/util/Utilities.java b/src/main/java/com/alttd/proxydiscordlink/util/Utilities.java index 8766745..1b56f6e 100644 --- a/src/main/java/com/alttd/proxydiscordlink/util/Utilities.java +++ b/src/main/java/com/alttd/proxydiscordlink/util/Utilities.java @@ -1,13 +1,22 @@ package com.alttd.proxydiscordlink.util; import com.alttd.proxydiscordlink.DiscordLink; +import com.alttd.proxydiscordlink.bot.commandManager.SubOption; import com.alttd.proxydiscordlink.bot.objects.DiscordRole; +import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.config.Config; import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.requests.RestAction; import net.kyori.adventure.text.minimessage.MiniMessage; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; @@ -15,13 +24,16 @@ import net.luckperms.api.model.user.User; import net.luckperms.api.node.NodeType; import net.luckperms.api.node.types.InheritanceNode; +import java.awt.*; +import java.util.List; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class Utilities { private static LuckPerms luckPerms; - private static MiniMessage miniMessage = MiniMessage.miniMessage(); + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); public static LuckPerms getLuckPerms() { if (luckPerms == null) @@ -142,6 +154,71 @@ public class Utilities { .collect(Collectors.toList()); } + public static void registerCommand(JDA jda, CommandData commandData) { + Guild guild = jda.getGuildById(BotConfig.DISCORD.GUILD_ID); + if (guild == null) { + ALogger.error("Unable to find guild with id: [" + BotConfig.DISCORD.GUILD_ID + "] to register commands"); + return; + } + registerCommand(guild, commandData); + } + + public static void registerCommand(Guild guild, CommandData commandData) { + guild.upsertCommand(commandData).queue(RestAction.getDefaultSuccess(), Utilities::handleFailure); + } + + public static void registerSubOptions(HashMap subCommandMap, SubOption... subOptions) { + for (SubOption subOption : subOptions) + subCommandMap.put(subOption.getName(), subOption); + } + + public static MessageEmbed invalidSubcommand(String subcommandName) { + return new EmbedBuilder() + .setTitle("Invalid sub command") + .setDescription("This is not a valid sub command: " + subcommandName) + .setColor(Color.RED) + .build(); + } + + public static MessageEmbed genericErrorEmbed(String title, String desc) { + return new EmbedBuilder() + .setTitle(title) + .setDescription(desc) + .setColor(Color.RED) + .build(); + } + + public static MessageEmbed genericSuccessEmbed(String title, String desc) { + return new EmbedBuilder() + .setTitle(title) + .setDescription(desc) + .setColor(Color.GREEN) + .build(); + } + + public static MessageEmbed genericWaitingEmbed(String title, String desc) { + return new EmbedBuilder() + .setTitle(title) + .setDescription(desc) + .setColor(Color.BLUE) + .build(); + } + + public static void ignoreSuccess(Object o) { + // IDK I thought this looked nicer in the .queue call + } + + public static void handleFailure(Throwable failure) { + ALogger.error(failure.getMessage()); + } + + public static void commandErrAutoRem(String text, SlashCommandInteractionEvent event) { + event.replyEmbeds(Utilities.genericErrorEmbed("Error", text)) + .setEphemeral(true) + .queue(res -> res.deleteOriginal().queueAfter(5, TimeUnit.SECONDS)); + } + + public static boolean removeRole(UUID uuid, String group) { User user = getLuckPerms().getUserManager().getUser(uuid); if (user == null)