diff --git a/src/main/java/com/alttd/commandManager/CommandManager.java b/src/main/java/com/alttd/commandManager/CommandManager.java index 2c927fe..c9c2882 100644 --- a/src/main/java/com/alttd/commandManager/CommandManager.java +++ b/src/main/java/com/alttd/commandManager/CommandManager.java @@ -40,7 +40,8 @@ public class CommandManager extends ListenerAdapter { new CommandSuggestion(jda, modalManager, this), new CommandSetOutputChannel(jda, this), new CommandUpdateCommands(jda, this), - new CommandEvidence(jda, modalManager, this)); + new CommandEvidence(jda, modalManager, this), + new CommandFlag(jda, this)); } @Override diff --git a/src/main/java/com/alttd/commandManager/commands/CommandFlag.java b/src/main/java/com/alttd/commandManager/commands/CommandFlag.java index c085d9b..bbc9b47 100644 --- a/src/main/java/com/alttd/commandManager/commands/CommandFlag.java +++ b/src/main/java/com/alttd/commandManager/commands/CommandFlag.java @@ -1,4 +1,155 @@ package com.alttd.commandManager.commands; -public class CommandFlag { +import com.alttd.commandManager.CommandManager; +import com.alttd.commandManager.DiscordCommand; +import com.alttd.database.queries.QueriesFlags.Flag; +import com.alttd.database.queries.QueriesFlags.QueriesFlags; +import com.alttd.database.queries.QueriesUserUUID; +import com.alttd.util.Util; +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.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.dv8tion.jda.api.requests.RestAction; + +import java.awt.*; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class CommandFlag extends DiscordCommand { + + private final CommandData commandData; + + public CommandFlag(JDA jda, CommandManager commandManager) { + this.commandData = Commands.slash(getName(), "Show flags for a user") + .addOption(OptionType.STRING, "user", "The user to show flags for", true) + .setDefaultPermissions(DefaultMemberPermissions.ENABLED); + + Util.registerCommand(commandManager, jda, commandData, getName()); + } + + @Override + public String getName() { + return "flaglist"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + OptionMapping option = event.getInteraction().getOption("user"); + if (option == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to find user option")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + + String username = option.getAsString(); + + if (username.length() == 36) + flagListUUID(username, event); + else + flagListName(username, event); + } + + private void flagListUUID(String username, SlashCommandInteractionEvent event) { + UUID uuid; + try { + uuid = UUID.fromString(username); + } catch (IllegalArgumentException e) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Invalid UUID")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + + List flags = QueriesFlags.getFlags(uuid); + + if (flags == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to retrieve flags for user")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + sendFlagEmbed(event, flags, uuid); + } + + private void flagListName(String username, SlashCommandInteractionEvent event) { + if (!username.matches("^[a-zA-Z0-9_]{2,16}$")) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Invalid username")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + + UUID uuid = QueriesUserUUID.getUUIDByUsername(username); + if (uuid == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Could not find uuid for username")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + + List flags = QueriesFlags.getFlags(uuid); + + if (flags == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to retrieve flags for user")) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + return; + } + sendFlagEmbed(event, flags, username); + } + + private void sendFlagEmbed(SlashCommandInteractionEvent event, List flags, UUID uuid) { + String username = QueriesUserUUID.getUsernameByUUID(uuid); + if (username == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to retrieve username for uuid")) + .setEphemeral(true).queue(); + return; + } + sendFlagEmbed(event, flags, username); + } + + private void sendFlagEmbed(SlashCommandInteractionEvent event, List flags, String username) { + EmbedBuilder embedBuilder = new EmbedBuilder() + .setColor(Color.ORANGE) + .setTitle("Flaglist for: " + username); + + int i = 0; + for (Flag flag : flags) { + if (i == 24) + break; + embedBuilder.addField(getFlagTitle(flag), getFlagDescription(flag), false); + i++; + } + event.replyEmbeds(embedBuilder.build()) + .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); + } + + private String getFlagTitle(Flag flag) { + long days = TimeUnit.SECONDS.toDays(flag.length()); + long daysAgo = TimeUnit.MILLISECONDS.toDays(new Date().getTime() - TimeUnit.SECONDS.toMillis(flag.startTime())); + return daysAgo + " days ago, for " + days + " days, by " + flag.flaggedBy(); + } + + private String getFlagDescription(Flag flag) { + return "Reason: " + flag.reason() + "\n[" + ((new Date().after(new Date(TimeUnit.SECONDS.toMillis(flag.expireTime())))) ? "Expired" : "Active") + "]"; + } + + @Override + public void suggest(CommandAutoCompleteInteractionEvent event) { + event.replyChoices(Collections.emptyList()).queue(); + } + + @Override + public String getHelpMessage() { + return null; + } + + @Override + public CommandData getCommandData() { + return commandData; + } } diff --git a/src/main/java/com/alttd/database/queries/QueriesFlags/Flag.java b/src/main/java/com/alttd/database/queries/QueriesFlags/Flag.java new file mode 100644 index 0000000..623f286 --- /dev/null +++ b/src/main/java/com/alttd/database/queries/QueriesFlags/Flag.java @@ -0,0 +1,6 @@ +package com.alttd.database.queries.QueriesFlags; + +import java.util.UUID; + +public record Flag(UUID uuid, String reason, long startTime, long expireTime, long length, String flaggedBy) { +} diff --git a/src/main/java/com/alttd/database/queries/QueriesFlags/QueriesFlags.java b/src/main/java/com/alttd/database/queries/QueriesFlags/QueriesFlags.java new file mode 100644 index 0000000..fb67f34 --- /dev/null +++ b/src/main/java/com/alttd/database/queries/QueriesFlags/QueriesFlags.java @@ -0,0 +1,41 @@ +package com.alttd.database.queries.QueriesFlags; + +import com.alttd.database.Database; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class QueriesFlags { + + public static List getFlags(UUID uuid) { + String sql = "SELECT * FROM flags_view WHERE uuid = ?"; + ArrayList flags = new ArrayList<>(); + try { + PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); + statement.setString(1, uuid.toString()); + + ResultSet resultSet = statement.executeQuery(); + while (resultSet.next()) { + flags.add(formatFlag(uuid, resultSet)); + } + return flags; + } catch (SQLException exception) { + exception.printStackTrace(); + } + return null; + } + + private static Flag formatFlag(UUID uuid, ResultSet resultSet) throws SQLException { + String reason = resultSet.getString("reason"); + long startTime = resultSet.getLong("time_flagged"); + long expireTime = resultSet.getLong("expire_time"); + long length = expireTime - startTime; + String flaggedBy = resultSet.getString("flagged_by"); + return new Flag(uuid, reason, startTime, expireTime, length, flaggedBy); + } + +} diff --git a/src/main/java/com/alttd/database/queries/QueriesUserUUID.java b/src/main/java/com/alttd/database/queries/QueriesUserUUID.java new file mode 100644 index 0000000..c1199fe --- /dev/null +++ b/src/main/java/com/alttd/database/queries/QueriesUserUUID.java @@ -0,0 +1,43 @@ +package com.alttd.database.queries; + +import com.alttd.database.Database; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +public class QueriesUserUUID { + + public static UUID getUUIDByUsername(String username) { + String sql = "SELECT uuid FROM luckperms_user_view WHERE username = ?"; + try { + PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql); + + preparedStatement.setString(1, username); + ResultSet resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) + return UUID.fromString(resultSet.getString("uuid")); + } catch (SQLException exception) { + exception.printStackTrace(); + } + return null; + } + + public static String getUsernameByUUID(UUID uuid) { + String sql = "SELECT username FROM luckperms_user_view WHERE uuid = ?"; + try { + PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql); + + preparedStatement.setString(1, uuid.toString()); + ResultSet resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) + return resultSet.getString("username"); + } catch (SQLException exception) { + exception.printStackTrace(); + } + return null; + } +}