From 3c4c4c38bd3a5ccf65efeed12f7383da6d05c8ac Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Fri, 27 Nov 2020 12:10:41 -0500 Subject: [PATCH 1/3] Clean up irrelevant/fixed TODOs --- src/main/java/dev/salmonllama/fsbot/Main.java | 4 +--- .../fsbot/commands/developer/CreateGalleryCommand.java | 4 ++-- .../dev/salmonllama/fsbot/commands/general/OutfitCommand.java | 4 ++-- .../dev/salmonllama/fsbot/commands/general/StatsCommand.java | 2 +- .../salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java | 2 +- src/main/java/dev/salmonllama/fsbot/guthix/Registry.java | 2 +- .../java/dev/salmonllama/fsbot/listeners/ServerJoined.java | 2 +- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index a6a3494..47cb97c 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -17,8 +17,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -// TODO: auto-switching status messages. -// TODO: Add an official Logger --> logging to Discord, not console + @SpringBootApplication public class Main { @@ -28,7 +27,6 @@ public class Main { public static void main(String[] args) { String configLocation = Constants.BOT_FOLDER.concat(Constants.CONFIG_NAME); BotConfig.initConfig(configLocation, false); - // TODO: Use args to dictate newFiling. Also use args to dictate database setup. FSDB.init(); diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 1a38b3d..a58c5f7 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -16,7 +16,7 @@ import java.awt.*; import java.util.Arrays; import java.util.List; -public class CreateGalleryCommand extends Command { // TODO: This command needs help. +public class CreateGalleryCommand extends Command { @Override public String name() { return "Create Gallery"; } @Override public String description() { return "Creates a channel gallery, tracking any posted images"; } @Override public String usage() { return "creategallery "; } @@ -27,7 +27,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs @Override public void onCommand(CommandContext ctx) { if (ctx.isPrivateMessage()) { - ctx.reply("This command can only be used in a server!"); // TODO: Stop this. Turn this into a preset no-no embed. + ctx.reply("This command can only be used in a server!"); return; } if (ctx.getArgs().length < 1) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java index e530526..196238a 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java @@ -49,7 +49,7 @@ public class OutfitCommand extends Command { switch (args.length) { case 0: // Send one single random outfit of the given tag - OutfitController.findRandomByTag(command).thenAccept(possibleOutfit -> { // TODO: Add an orElse case + OutfitController.findRandomByTag(command).thenAccept(possibleOutfit -> { possibleOutfit.ifPresent(outfit -> { ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { EmbedBuilder response = new EmbedBuilder() @@ -91,7 +91,7 @@ public class OutfitCommand extends Command { }); }); } else { - ctx.reply("Improper command usage"); // TODO: Logging update reminder + ctx.reply("Improper command usage"); } } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java index b8f78c0..43ac046 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java @@ -27,7 +27,7 @@ public class StatsCommand extends Command { int userCount = ctx.getApi().getCachedUsers().size(); // Will these be accurate with sharding? int serverCount = ctx.getApi().getServers().size(); - EmbedBuilder embed = new EmbedBuilder(); // TODO: Standard embeds yeah? + EmbedBuilder embed = new EmbedBuilder(); embed.setTitle("Stats"); embed.addField("Users:", String.valueOf(userCount)); embed.addField("Servers:", String.valueOf(serverCount)); diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java index ff7417b..2313189 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java @@ -51,7 +51,7 @@ public class ImgurAPIConnection { try (Response response = client.newCall(request).execute()) { json = new JSONObject(response.body().string()).getJSONObject("data"); } catch (IOException e) { - e.printStackTrace(); // TODO: Do tha logging thang. + e.printStackTrace(); return null; } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java b/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java index 642790c..49e8a77 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java @@ -19,7 +19,7 @@ class Registry { commandsMap = new HashMap<>(); } - Predicate valueMatch(String input) { // TODO: Move to a helper class + Predicate valueMatch(String input) { return str -> str.equals(input); } diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java index 54efc79..71a813f 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java @@ -10,7 +10,7 @@ import org.javacord.api.listener.server.ServerJoinListener; public class ServerJoined implements ServerJoinListener { - public void onServerJoin(ServerJoinEvent event) { // TODO: This needs fixing yo + public void onServerJoin(ServerJoinEvent event) { // db.newServerProcess(event.getServer()); // EmbedBuilder embed = new EmbedBuilder() From 437512b0b9d1e60c6059aeb37706ef6f84187897 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 2 Jan 2021 00:14:50 -0500 Subject: [PATCH 2/3] Added support for MessageAttachments in reports --- src/main/java/dev/salmonllama/fsbot/Main.java | 2 -- .../dev/salmonllama/fsbot/listeners/ReportListener.java | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 47cb97c..bd798e6 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -17,8 +17,6 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - - @SpringBootApplication public class Main { diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ReportListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ReportListener.java index a1438f9..bf0ecfe 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ReportListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ReportListener.java @@ -9,6 +9,7 @@ import org.javacord.api.DiscordApi; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.MessageAuthor; +import org.javacord.api.entity.message.MessageBuilder; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; @@ -37,6 +38,12 @@ public class ReportListener implements MessageCreateListener { } String content = message.getContent(); + message.getAttachments().forEach( + attachment -> attachment.downloadAsImage().thenAcceptAsync( + image -> new MessageBuilder() + .addAttachment(image, "evidence") + .setContent("Report Evidence:") + .send(channel))); message.delete().join(); From 7d0b20b2c671ef7952354ad20204746442ce74b6 Mon Sep 17 00:00:00 2001 From: salmonllama Date: Sun, 6 Jun 2021 22:07:46 -0400 Subject: [PATCH 3/3] Added Restore Command --- .../commands/staff/RestoreOutfitCommand.java | 98 +++++++++++++++++++ .../controllers/OutfitController.java | 14 +++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 1 + 3 files changed, 113 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/staff/RestoreOutfitCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RestoreOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RestoreOutfitCommand.java new file mode 100644 index 0000000..81a0514 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RestoreOutfitCommand.java @@ -0,0 +1,98 @@ +package dev.salmonllama.fsbot.commands.staff; + +import com.vdurmont.emoji.EmojiParser; +import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.guthix.*; +import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.util.*; +import java.util.List; + +public class RestoreOutfitCommand extends Command { + @Override public String name() { return "Restore Outfit"; } + @Override public String description() { return "Restores a previously deleted outfit"; } + @Override public String usage() { return "restore [outfit ID]"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } + @Override public List aliases() { return Arrays.asList("restoreoutfit", "restore"); } + + @Override + public void onCommand(CommandContext ctx) { + String[] args = ctx.getArgs(); + TextChannel channel = ctx.getChannel(); + long authorId = ctx.getUser().getId(); + + if (args.length != 1) { + channel.sendMessage("You must supply a valid outfit ID."); + return; + } + + // get the outfit, confirm restoration through reaction. + String outfitId = args[0]; + OutfitController.findById(outfitId).thenAcceptAsync(possibleOutfit -> possibleOutfit.ifPresentOrElse(outfit -> { + // Send outfit info, react with selectors, add a listener to the message + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Really restore this outfit?") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) + .setUrl(outfit.getLink()) + .setFooter(String.format("Tag: %s", outfit.getTag())) + .addField("Added", outfit.getCreated().toString(), true) + .addField("Updated", outfit.getUpdated().toString(), true) + .addField("Submitted by:", ctx.getApi().getUserById(outfit.getSubmitter()).join().getDiscriminatedName()) + .addField("Deleted", outfit.isDeleted() ? "True" : "False", true) + .addField("Featured", outfit.isFeatured() ? "True" : "False", true) + .addField("Deleted by:", "Lily <3", true); + + ctx.reply(embed).thenAcceptAsync(msg -> { + msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); + msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); + + msg.addReactionAddListener(event -> { + if (event.getUserId() != authorId) { + return; + } + + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { + // Restore the outfit + OutfitController.restore(outfit); + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Outfit Restored!") + .setDescription(String.format("Outfit %s is now active again!", outfit.getId())); + + msg.delete(); + ctx.reply(response); + + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Restored as Active") + .setThumbnail(outfit.getLink()) + .setColor(Color.BLUE) + .addField("Restored By:", ctx.getAuthor().getDiscriminatedName()); + + ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent( + chnl -> chnl.sendMessage(log) + ); + + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { + // Do nothing + EmbedBuilder response = new EmbedBuilder() + .setTitle("Restoration Aborted") + .setDescription(String.format("No modifications were made to %s", outfit.getId())); + + ctx.reply(response); + } + }); + }); + }, () -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Outfit not Found") + .setDescription(String.format("ID %s does not exist", outfitId)); + + ctx.reply(response); + })); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 059ed16..a9481ac 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -200,6 +200,18 @@ public class OutfitController { }); } + public static CompletableFuture restore(Outfit outfit) { + return CompletableFuture.runAsync(() -> { + try { + Outfit newOutfit = new Outfit.OutfitBuilder(outfit).setDeleted(false).build(); + System.out.println(newOutfit.isDeleted()); + updateExec(newOutfit); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture forceRemove(String id) { return CompletableFuture.runAsync(() -> { try { @@ -363,6 +375,7 @@ public class OutfitController { "meta = ?," + "updated = ?," + "featured = ?," + + "deleted = ?," + "display_count = ?" + "WHERE id = ?", outfit.getLink(), @@ -371,6 +384,7 @@ public class OutfitController { outfit.getMeta(), outfit.getUpdated(), outfit.isFeatured(), + outfit.isDeleted(), outfit.getDisplayCount(), outfit.getId()); } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 835e65d..e3ec5e5 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -66,6 +66,7 @@ public class Guthix implements MessageCreateListener { addCommand(new ShowGalleriesCommand()); addCommand(new EditMetaCommand()); addCommand(new BlacklistUserCommand()); + addCommand(new RestoreOutfitCommand()); // General Commands addCommand(new PingCommand());