diff --git a/build.gradle b/build.gradle index 6e271dd..b8dbbb8 100644 --- a/build.gradle +++ b/build.gradle @@ -26,10 +26,11 @@ repositories { dependencies { implementation 'org.xerial:sqlite-jdbc:3.30.1' implementation 'com.github.Kaaz:ConfigurationBuilder:0.4' - implementation 'org.javacord:javacord:3.0.6' + implementation 'org.javacord:javacord:3.1.1' implementation 'com.vdurmont:emoji-java:4.0.0' implementation 'com.squareup.okhttp3:okhttp:4.4.0' implementation 'ch.qos.logback:logback-classic:1.2.3' + implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-web' diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 794cb29..482f7e2 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -12,6 +12,8 @@ import dev.salmonllama.fsbot.listeners.*; import org.javacord.api.DiscordApiBuilder; import dev.salmonllama.fsbot.utilities.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -20,6 +22,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Main { + + private final static Logger logger = LoggerFactory.getLogger(Main.class); + public static void main(String[] args) { String configLocation = Constants.BOT_FOLDER.concat(Constants.CONFIG_NAME); BotConfig.initConfig(configLocation, false); @@ -29,7 +34,6 @@ public class Main { new DiscordApiBuilder().setToken(BotConfig.TOKEN).login().thenAccept(api -> { - @SuppressWarnings("unused") Guthix guthix = new Guthix(api); // Register listeners @@ -40,8 +44,7 @@ public class Main { api.addMessageCreateListener(new AchievementListener()); api.addMessageCreateListener(new ReportListener()); - System.out.printf("Bot invite: %s%n", api.createBotInvite()); - System.out.printf("Logged in as %s%n", api.getYourself().getDiscriminatedName()); + logger.info("{} reporting for duty", api.getYourself().getDiscriminatedName()); }); SpringApplication.run(Main.class, args); diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java index 5a8cfe4..8a7ff04 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java @@ -2,22 +2,19 @@ package dev.salmonllama.fsbot.commands.developer; import dev.salmonllama.fsbot.database.controllers.UserBlacklistController; import dev.salmonllama.fsbot.database.models.UserBlacklist; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class BlacklistUserCommand extends Command { @Override public String name() { return "Blacklist User"; } @Override public String description() { return "Adds the user to the bot's blacklist, preventing them from using any commands or features"; } @Override public String usage() { return "blacklistuser "; } - @Override public String category() { return "Developer"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } - @Override public Collection aliases() { return Arrays.asList("blacklistuser", "bluser", "sabusr"); } + @Override public List aliases() { return Arrays.asList("blacklistuser", "bluser", "sabusr"); } @Override public void onCommand(CommandContext ctx) { 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 5838bc6..1a38b3d 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -5,30 +5,24 @@ package dev.salmonllama.fsbot.commands.developer; -import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.util.logging.ExceptionLogger; import java.awt.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class CreateGalleryCommand extends Command { // TODO: This command needs help. @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 "; } - @Override public String category() { return "Developer"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); } + @Override public List aliases() { return Arrays.asList("creategallery", "addgallery", "newgallery"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java index ad811a4..ffa135e 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java @@ -1,21 +1,18 @@ package dev.salmonllama.fsbot.commands.developer; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.util.Collection; import java.util.Collections; +import java.util.List; public class DefaultCommand extends Command { @Override public String name() { return "Default"; } @Override public String description() { return "The command that gets invoked when the prefix is used, but the command is not recognized"; } @Override public String usage() { return "you don't use this command"; } - @Override public String category() { return "Invisible"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return Collections.singletonList("default"); } + @Override public List aliases() { return Collections.singletonList("default"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java index 487e8de..01ca801 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java @@ -5,24 +5,22 @@ package dev.salmonllama.fsbot.commands.developer; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.DiscordApi; import org.javacord.api.entity.channel.TextChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; public class InviteCommand extends Command { @Override public String name() { return "Invite"; } @Override public String description() { return "Spits out a bot invite"; } @Override public String usage() { return "invite"; } - @Override public String category() { return "Developer"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("invite", "inv")); } + @Override public List aliases() { return Arrays.asList("invite", "inv"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java index 676c7d6..caeab46 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -7,26 +7,22 @@ package dev.salmonllama.fsbot.commands.developer; import dev.salmonllama.fsbot.database.controllers.StaticPermissionController; import dev.salmonllama.fsbot.database.models.StaticPermission; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.user.User; import org.javacord.api.util.logging.ExceptionLogger; import java.awt.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class PermissionCommand extends Command { @Override public String name() { return "Permission"; } @Override public String description() { return "Manages a user's static permissions"; } @Override public String usage() { return "permission "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("permission", "permissions", "perm", "perms")); } + @Override public List aliases() { return Arrays.asList("permission", "permissions", "perm", "perms"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index a32ef6f..69e1336 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -6,29 +6,26 @@ package dev.salmonllama.fsbot.commands.developer; import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class TestCommand extends Command { @Override public String name() { return "Test"; } @Override public String description() { return "A test command"; } @Override public String usage() { return "test"; } - @Override public String category() { return "Developer"; } + @Override public CommandCategory category() { return CommandCategory.DEVELOPER; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("test", "t")); } + @Override public List aliases() { return Arrays.asList("test", "t"); } @Override public void onCommand(CommandContext ctx) { ScapeFashionConnection conn = new ScapeFashionConnection(); try { - ctx.reply(conn.osrsColor("#00ff00").toString(2)); + var result = conn.osrsColor("#00ff00"); + ctx.reply(String.format("Best match: %s", result.getItems().get(0).toString())); } catch (Exception e) { ctx.reply(e.getMessage()); } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java index ca11050..c9ac0d5 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java @@ -7,25 +7,21 @@ package dev.salmonllama.fsbot.commands.general; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.ColorRoleController; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.apache.logging.log4j.util.Strings; import org.javacord.api.entity.server.Server; import org.javacord.api.entity.user.User; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class ColorCommand extends Command { @Override public String name() { return "Color"; } @Override public String description() { return "Assigns the provided cosmetic role"; } @Override public String usage() { return "color "; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("color", "colour")); } + @Override public List aliases() { return Arrays.asList("color", "colour"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java index 6fa021e..762003e 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java @@ -7,23 +7,19 @@ package dev.salmonllama.fsbot.commands.general; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.ColorRoleController; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class ColorsCommand extends Command { @Override public String name() { return "Colors"; } @Override public String description() { return "Lists available cosmetic roles"; } @Override public String usage() { return "colors"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("colors", "colours")); } + @Override public List aliases() { return Arrays.asList("colors", "colours"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/HelpCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/HelpCommand.java index 224e331..22cdefd 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/HelpCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/HelpCommand.java @@ -21,9 +21,9 @@ public class HelpCommand extends Command { @Override public String name() { return "Help"; } @Override public String description() { return "Shows all commands, or a specific command's information"; } @Override public String usage() { return "help [String command]"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("help", "h")); } + @Override public List aliases() { return Arrays.asList("help", "h"); } private final Guthix guthix; @@ -60,7 +60,7 @@ public class HelpCommand extends Command { List categories = new ArrayList<>(); for (Command cmd : guthix.listCommands()) { - String category = cmd.category(); + String category = cmd.category().getCategory(); if (!categories.contains(category)) { categories.add(category); @@ -82,9 +82,9 @@ public class HelpCommand extends Command { StringBuilder builder = new StringBuilder().append("```yml"); for (Command cmd : guthix.listCommands()) { - String cat = cmd.category().toLowerCase(); + String cat = cmd.category().getCategory().toLowerCase(); if (cat.equals(category.toLowerCase())) { - builder.append("\n- ").append(cmd.name()); + builder.append("\n- ").append(cmd.aliases().get(0)); } } @@ -161,7 +161,7 @@ public class HelpCommand extends Command { public boolean isCategory(String input) { for (Command cmd : guthix.listCommands()) { - String category = cmd.category(); + String category = cmd.category().getCategory().toLowerCase(); if (category.toLowerCase().equals(input.toLowerCase())) { return true; } 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 4540ecd..ce5dc62 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java @@ -7,10 +7,7 @@ package dev.salmonllama.fsbot.commands.general; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.models.Outfit; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.util.logging.ExceptionLogger; @@ -18,6 +15,7 @@ import org.javacord.api.util.logging.ExceptionLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.concurrent.CompletableFuture; public class OutfitCommand extends Command { @@ -27,9 +25,9 @@ public class OutfitCommand extends Command { @Override public String name() { return "Outfit"; } @Override public String description() { return "Generates a random image with the given tag. Use ~tags to see valid tags."; } @Override public String usage() { return "outfit "; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return initAliases(); } + @Override public List aliases() { return initAliases(); } @Override public void onCommand(CommandContext ctx) { @@ -195,8 +193,8 @@ public class OutfitCommand extends Command { } } - private Collection initAliases() { - Collection aliases = OutfitController.getDistinctTags().join(); + private List initAliases() { + List aliases = OutfitController.getDistinctTags().join(); aliases.addAll(NON_TAG_ALIASES); return aliases; } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/PingCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/PingCommand.java index 5ef8811..8138376 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/PingCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/PingCommand.java @@ -5,10 +5,7 @@ package dev.salmonllama.fsbot.commands.general; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import java.util.*; @@ -16,9 +13,9 @@ public class PingCommand extends Command { @Override public String name() { return "Ping"; } @Override public String description() { return "Pings the bot, checks for a heartbeat"; } @Override public String usage() { return "ping"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("ping")); } + @Override public List aliases() { return Collections.singletonList("ping"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java index 253f115..753be84 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java @@ -1,26 +1,23 @@ package dev.salmonllama.fsbot.commands.general; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.util.Collection; import java.util.Collections; +import java.util.List; public class PrivacyCommand extends Command { @Override public String name() { return "Privacy"; } @Override public String description() { return "Directs users to the bot's privacy policy"; } @Override public String usage() { return "privacy"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return Collections.singletonList("privacy"); } + @Override public List aliases() { return Collections.singletonList("privacy"); } @Override public void onCommand(CommandContext ctx) { - String privacyUrl = "https://github.com/Salmonllama/Fashionscape-Bot/blob/database-rewrite/privacy.md"; // TODO: Change this to master + String privacyUrl = "https://github.com/Salmonllama/Fashionscape-Bot/blob/master/privacy.md"; EmbedBuilder response = new EmbedBuilder() .setTitle("Click Here to open") diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java index 6467fbd..2c04ac4 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java @@ -5,34 +5,31 @@ package dev.salmonllama.fsbot.commands.general; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.stream.Collectors; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.channel.ServerTextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; import org.javacord.api.util.logging.ExceptionLogger; public class ShowGalleriesCommand extends Command { @Override public String name() { return "Show Galleries"; } @Override public String description() { return "Shows registered gallery channels in the current server"; } @Override public String usage() { return "showgalleries"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("showgalleries", "listgalleries")); } + @Override public List aliases() { return Arrays.asList("showgalleries", "listgalleries"); } @Override public void onCommand(CommandContext ctx) { if (ctx.isPrivateMessage()) { - ctx.reply("This command can only be used within a server"); // TODO: Preset embeds again, yeah + ctx.reply("This command can only be used within a server"); return; } @@ -45,7 +42,7 @@ public class ShowGalleriesCommand extends Command { }); } - EmbedBuilder galleryEmbed(Collection galleries, Server server) { // TODO: Base FSBot embed. + EmbedBuilder galleryEmbed(Collection galleries, Server server) { EmbedBuilder embed = new EmbedBuilder() .setTitle("Server Gallery Channels"); 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 c2338f2..b8f78c0 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java @@ -1,24 +1,19 @@ package dev.salmonllama.fsbot.commands.general; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import java.util.*; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; import dev.salmonllama.fsbot.database.controllers.OutfitController; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; public class StatsCommand extends Command { @Override public String name() { return "Stats"; } @Override public String description() { return "Shows various stats from Fashionscape Bot"; } @Override public String usage() { return "stats"; } - @Override public String category() { return "General"; } + @Override public CommandCategory category() { return CommandCategory.GENERAL; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("stats")); } + @Override public List aliases() { return Collections.singletonList("stats"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsBodyCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsBodyCommand.java new file mode 100644 index 0000000..e10a9d3 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsBodyCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsBodyCommand extends Command { + @Override public String name() { return "OSRS Body"; } + @Override public String description() { return "Searches scape.fashion for body slot items."; } + @Override public String usage() { return "osrsbody <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07body", "osrsbody"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsBodyCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.BODY); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.BODY); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsCapeCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsCapeCommand.java new file mode 100644 index 0000000..00a04af --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsCapeCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsCapeCommand extends Command { + @Override public String name() { return "OSRS Cape"; } + @Override public String description() { return "Searches scape.fashion for cape slot items."; } + @Override public String usage() { return "osrscape <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07cape", "osrscape"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsCapeCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.CAPE); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.CAPE); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsFeetCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsFeetCommand.java new file mode 100644 index 0000000..0ec2345 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsFeetCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsFeetCommand extends Command { + @Override public String name() { return "OSRS Feet"; } + @Override public String description() { return "Searches scape.fashion for foot slot items."; } + @Override public String usage() { return "osrsfeet <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07feet", "osrsfeet"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsFeetCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.FEET); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.FEET); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHandCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHandCommand.java new file mode 100644 index 0000000..5307266 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHandCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsHandCommand extends Command { + @Override public String name() { return "OSRS Hand"; } + @Override public String description() { return "Searches scape.fashion for hand slot items."; } + @Override public String usage() { return "osrshand <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07hand", "osrshand"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsHandCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.HAND); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.HAND); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHeadCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHeadCommand.java new file mode 100644 index 0000000..c180bd3 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsHeadCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsHeadCommand extends Command { + @Override public String name() { return "OSRS Head"; } + @Override public String description() { return "Searches scape.fashion for head slot items."; } + @Override public String usage() { return "osrshead <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07head", "osrshead"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsHeadCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.HEAD); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.HEAD); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsLegsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsLegsCommand.java new file mode 100644 index 0000000..0cc79b6 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsLegsCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsLegsCommand extends Command { + @Override public String name() { return "OSRS Legs"; } + @Override public String description() { return "Searches scape.fashion for leg slot items."; } + @Override public String usage() { return "osrslegs <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07legs", "osrslegs"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsLegsCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.LEG); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.LEG); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsNeckCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsNeckCommand.java new file mode 100644 index 0000000..e6ac5c8 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsNeckCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsNeckCommand extends Command { + @Override public String name() { return "OSRS Neck"; } + @Override public String description() { return "Searches scape.fashion for neck slot items."; } + @Override public String usage() { return "osrsneck <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07neck", "osrsneck"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsNeckCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.NECK); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.NECK); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchCommand.java new file mode 100644 index 0000000..695fe01 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchCommand.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsSearchCommand extends Command { + @Override public String name() { return "OSRS Search"; } + @Override public String description() { return "Searches scape.fashion for any items."; } + @Override public String usage() { return "osrssearch <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07search", "osrssearch"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsSearchCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchUtilities.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchUtilities.java new file mode 100644 index 0000000..d337a2c --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsSearchUtilities.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionResult; +import org.apache.logging.log4j.util.Strings; +import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.util.Arrays; + +public class OsrsSearchUtilities { + static boolean isColor(String s) { + return s.startsWith("#"); + } + + static void sendResult(ScapeFashionResult result, TextChannel channel) { + var bestMatch = result.getItems().get(0); + var colors = Strings.join(Arrays.asList(bestMatch.getColors()), ','); + EmbedBuilder embed = new EmbedBuilder() + .setTitle(String.format("Best Match - %s", bestMatch.getName())) + .setImage(bestMatch.getImages().getDetail()) + .setAuthor(String.format("Wiki: %s", bestMatch.getName()), bestMatch.getWiki().getLink(), bestMatch.getImages().getDetail()) + .setUrl(result.getLink()) + .setColor(Color.decode(bestMatch.getColors()[0])) + .addField("Match:", String.valueOf(bestMatch.getMatch()), true) + .addField("Colors:", colors, true); + + channel.sendMessage(embed); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsShieldCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsShieldCommand.java new file mode 100644 index 0000000..51262ed --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsShieldCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsShieldCommand extends Command { + @Override public String name() { return "OSRS Shield"; } + @Override public String description() { return "Searches scape.fashion for shield slot items."; } + @Override public String usage() { return "osrsshield <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07shield", "osrsshield"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsShieldCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.SHIELD); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.SHIELD); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsWeaponCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsWeaponCommand.java new file mode 100644 index 0000000..ea2d7c9 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/osrssearch/OsrsWeaponCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.osrssearch; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotOsrs; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class OsrsWeaponCommand extends Command { + @Override public String name() { return "OSRS Weapon"; } + @Override public String description() { return "Searches scape.fashion for weapo slot items."; } + @Override public String usage() { return "osrsweapon <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.OSRS_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("07weapon", "osrsweapon"); } + + private static final Logger logger = LoggerFactory.getLogger(OsrsWeaponCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (OsrsSearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.osrsColor(params, ScapeFashionSlotOsrs.WEAPON); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.osrsItem(params, ScapeFashionSlotOsrs.WEAPON); + OsrsSearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BackCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BackCommand.java new file mode 100644 index 0000000..3fffdc4 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BackCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3BackCommand extends Command { + @Override public String name() { return "RS3 Back"; } + @Override public String description() { return "Searches scape.fashion for rs3 back slot items."; } + @Override public String usage() { return "rs3back <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3back"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3BackCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.BACK); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.BACK); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BodyCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BodyCommand.java new file mode 100644 index 0000000..1102423 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3BodyCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3BodyCommand extends Command { + @Override public String name() { return "RS3 Body"; } + @Override public String description() { return "Searches scape.fashion for rs3 body slot items."; } + @Override public String usage() { return "rs3body <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3body"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3BodyCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.TORSO); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.TORSO); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3FeetCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3FeetCommand.java new file mode 100644 index 0000000..bf3ee85 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3FeetCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3FeetCommand extends Command { + @Override public String name() { return "RS3 Feet"; } + @Override public String description() { return "Searches scape.fashion for rs3 foot slot items."; } + @Override public String usage() { return "rs3feet <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3feet"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3FeetCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.FEET); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.FEET); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HandCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HandCommand.java new file mode 100644 index 0000000..25b4c88 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HandCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3HandCommand extends Command { + @Override public String name() { return "RS3 Hand"; } + @Override public String description() { return "Searches scape.fashion for rs3 hand slot items."; } + @Override public String usage() { return "rs3hand <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3hand"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3HandCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HeadCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HeadCommand.java new file mode 100644 index 0000000..6311fe7 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3HeadCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3HeadCommand extends Command { + @Override public String name() { return "RS3 Head"; } + @Override public String description() { return "Searches scape.fashion for rs3 head slot items."; } + @Override public String usage() { return "rs3head <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3head"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3HeadCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.HEAD); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.HEAD); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3LegsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3LegsCommand.java new file mode 100644 index 0000000..fdf245d --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3LegsCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3LegsCommand extends Command { + @Override public String name() { return "RS3 Legs"; } + @Override public String description() { return "Searches scape.fashion for rs3 leg slot items."; } + @Override public String usage() { return "rs3legs <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3legs"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3LegsCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.LEG); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.LEG); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3MainhandCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3MainhandCommand.java new file mode 100644 index 0000000..1ae22a5 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3MainhandCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class Rs3MainhandCommand extends Command { + @Override public String name() { return "RS3 Mainhand"; } + @Override public String description() { return "Searches scape.fashion for rs3 mainhand slot items."; } + @Override public String usage() { return "rs3mainhand <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("rs3mainhand", "rs3mh"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3MainhandCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.MAIN_HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.MAIN_HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3NeckCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3NeckCommand.java new file mode 100644 index 0000000..466ed77 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3NeckCommand.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3NeckCommand extends Command { + @Override public String name() { return "RS3 Neck"; } + @Override public String description() { return "Searches scape.fashion for rs3 neck slot items."; } + @Override public String usage() { return "rs3neck <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3neck"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3NeckCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.NECK); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.NECK); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3OffhandCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3OffhandCommand.java new file mode 100644 index 0000000..a5fe708 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3OffhandCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class Rs3OffhandCommand extends Command { + @Override public String name() { return "RS3 Offhand"; } + @Override public String description() { return "Searches scape.fashion for rs3 offhand slot items."; } + @Override public String usage() { return "rs3offhand <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("rs3offhand", "rs3oh"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3OffhandCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.OFF_HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.OFF_HAND); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchCommand.java new file mode 100644 index 0000000..362496c --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Rs3SearchCommand extends Command { + @Override public String name() { return "RS3 Search"; } + @Override public String description() { return "Searches scape.fashion for rs3 items."; } + @Override public String usage() { return "rs3search <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Collections.singletonList("rs3search"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3SearchCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchUtilities.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchUtilities.java new file mode 100644 index 0000000..d2d22d6 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3SearchUtilities.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionResult; +import org.apache.logging.log4j.util.Strings; +import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.util.Arrays; + +public class Rs3SearchUtilities { + static boolean isColor(String s) { + return s.startsWith("#"); + } + + static void sendResult(ScapeFashionResult result, TextChannel channel) { + var bestMatch = result.getItems().get(0); + var colors = Strings.join(Arrays.asList(bestMatch.getColors()), ','); + EmbedBuilder embed = new EmbedBuilder() + .setTitle(String.format("Best Match - %s", bestMatch.getName())) + .setImage(bestMatch.getImages().getDetail()) + .setAuthor(String.format("Wiki: %s", bestMatch.getName()), bestMatch.getWiki().getLink(), bestMatch.getImages().getDetail()) + .setUrl(result.getLink()) + .setColor(Color.decode(bestMatch.getColors()[0])) + .addField("Match:", String.valueOf(bestMatch.getMatch()), true) + .addField("Colors:", colors, true); + + channel.sendMessage(embed); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3TwohandedCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3TwohandedCommand.java new file mode 100644 index 0000000..3499732 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/rs3search/Rs3TwohandedCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.rs3search; + +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionConnection; +import dev.salmonllama.fsbot.endpoints.scapefashion.ScapeFashionSlotRs3; +import dev.salmonllama.fsbot.guthix.*; +import dev.salmonllama.fsbot.utilities.DiscordUtilities; +import org.apache.logging.log4j.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class Rs3TwohandedCommand extends Command { + @Override public String name() { return "RS3 Twohanded"; } + @Override public String description() { return "Searches scape.fashion for rs3 twohanded slot items."; } + @Override public String usage() { return "rs3twohanded <#color or item name>"; } + @Override public CommandCategory category() { return CommandCategory.RS3_ITEM_SEARCH; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public List aliases() { return Arrays.asList("rs3twohanded", "rs32h"); } + + private static final Logger logger = LoggerFactory.getLogger(Rs3TwohandedCommand.class); + + @Override + public void onCommand(CommandContext ctx) { + if (ctx.getArgs().length == 0) { + ctx.reply("Specify something"); + return; + } + + var args = ctx.getArgs(); + ScapeFashionConnection conn = new ScapeFashionConnection(); + var params = Strings.join(Arrays.asList(args), ' '); + + if (Rs3SearchUtilities.isColor(args[0])) { + // Color search + try { + var bestMatch = conn.rs3Color(params, ScapeFashionSlotRs3.TWO_HANDED); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } else { + // Item search + try { + var bestMatch = conn.rs3Item(params, ScapeFashionSlotRs3.TWO_HANDED); + Rs3SearchUtilities.sendResult(bestMatch, ctx.getChannel()); + } catch (Exception e) { + logger.error(e.getMessage()); + DiscordUtilities.handleException(e, ctx); + } + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java index 2863f78..8ff0c0e 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java @@ -8,24 +8,19 @@ package dev.salmonllama.fsbot.commands.staff; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.ColorRoleController; import dev.salmonllama.fsbot.database.models.ColorRole; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.permission.Role; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; public class AddColorCommand extends Command { @Override public String name() { return "Add Color"; } @Override public String description() { return "adds the provided role to the toggleable cosmetic roles."; } @Override public String usage() { return "addcolor "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("addcolor", "addcolour", "addclr")); } + @Override public List aliases() { return Arrays.asList("addcolor", "addcolour", "addclr"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java index a2dee70..82076fe 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java @@ -5,23 +5,18 @@ package dev.salmonllama.fsbot.commands.staff; -import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; +import java.util.List; public class EchoCommand extends Command { @Override public String name() { return "Echo"; } @Override public String description() { return "Echos your message. Typical bash"; } @Override public String usage() { return "echo "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("echo")); } + @Override public List aliases() { return Collections.singletonList("echo"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/EditMetaCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/EditMetaCommand.java new file mode 100644 index 0000000..0fc61df --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/EditMetaCommand.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.apache.logging.log4j.util.Strings; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.util.Arrays; +import java.util.List; + +public class EditMetaCommand extends Command { + @Override public String name() { return "Edit Meta"; } + @Override public String description() { return "Edit the meta information on the given outfit"; } + @Override public String usage() { return "editmeta "; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } + @Override public List aliases() { return Arrays.asList("editmeta", "emeta"); } + + @Override + public void onCommand(CommandContext ctx) { + var args = ctx.getArgs(); + var newMeta = Strings.join(Arrays.asList(Arrays.copyOfRange(args, 1, args.length)), ' '); + var channel = ctx.getChannel(); + var authorId = ctx.getUser().getId(); + + if (args.length != 1) { + channel.sendMessage("You must supply a valid outfit ID."); + return; + } + + // get the outfit, confirm meta-edit through confirmation + 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("Confirm Meta Edit") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) + .setUrl(outfit.getLink()) + .setFooter(String.format("Tag: %s", outfit.getTag())) + .addField("Submitted by:", ctx.getApi().getUserById(outfit.getSubmitter()).join().getDiscriminatedName()) + .addField("Current Meta", outfit.getMeta()) + .addField("Proposed Meta", newMeta); + + 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:"))) { + // Edit the outfit's meta + + outfit.setMeta(newMeta); + OutfitController.update(outfit); + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Meta Modification Successful!") + .setDescription(String.format("New Meta: %s", outfit.getMeta())); + + msg.delete(); + ctx.reply(response); + + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Meta Changed") + .setThumbnail(outfit.getLink()) + .setColor(Color.YELLOW) + .addField("Edited 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("Meta Modification 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/commands/staff/GetOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java index 583c043..b5d8911 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java @@ -6,22 +6,18 @@ package dev.salmonllama.fsbot.commands.staff; import dev.salmonllama.fsbot.database.controllers.OutfitController; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; -public class GetOutfitCommand extends Command { // TODO: This command also needs HELP +public class GetOutfitCommand extends Command { @Override public String name() { return "Get Outift"; } @Override public String description() { return "Shows the outfit, given an ID"; } @Override public String usage() { return "getoutfit "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("getoutfit", "get")); } + @Override public List aliases() { return Arrays.asList("getoutfit", "get"); } @Override public void onCommand(CommandContext ctx) { @@ -29,11 +25,9 @@ public class GetOutfitCommand extends Command { // TODO: This command also needs String[] args = ctx.getArgs(); String id = args[0]; - OutfitController.findById(id).thenAccept(outfitOpt -> { - outfitOpt.ifPresentOrElse( - outfit -> ctx.reply(outfit.toString()), - () -> ctx.reply("Outfit not found, did you get the id right?") - ); - }); + OutfitController.findById(id).thenAccept(outfitOpt -> outfitOpt.ifPresentOrElse( + outfit -> ctx.reply(outfit.toString()), + () -> ctx.reply("Outfit not found, did you get the id right?") + )); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java index 54be113..7c6207f 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java @@ -5,27 +5,22 @@ package dev.salmonllama.fsbot.commands.staff; -import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.DiscordApi; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; import java.awt.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class GetServersCommand extends Command { @Override public String name() { return "Get Servers"; } @Override public String description() { return "Lists all the servers the bot is in"; } @Override public String usage() { return "getservers"; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("getservers", "servers")); } + @Override public List aliases() { return Arrays.asList("getservers", "servers"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java index 607d36c..f1de22d 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java @@ -5,25 +5,20 @@ package dev.salmonllama.fsbot.commands.staff; -import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.OutfitController; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class OutfitInfoCommand extends Command { @Override public String name() { return "Outfit Info"; } @Override public String description() { return "Shows all related info about the outfit"; } @Override public String usage() { return "outfitinfo "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("outfitinfo", "oinfo")); } + @Override public List aliases() { return Arrays.asList("outfitinfo", "oinfo"); } @Override public void onCommand(CommandContext ctx) { @@ -35,23 +30,19 @@ public class OutfitInfoCommand extends Command { } String id = args[0]; - OutfitController.findById(id).thenAcceptAsync(possibleOutfit -> { - possibleOutfit.ifPresentOrElse(outfit -> { - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Outfit Info") - .setThumbnail(outfit.getLink()) - .setAuthor(ctx.getApi().getYourself()) - .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); - ctx.reply(embed); - }, () -> { - ctx.reply("Outfit not found"); - }); - }); + OutfitController.findById(id).thenAcceptAsync(possibleOutfit -> possibleOutfit.ifPresentOrElse(outfit -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Outfit Info") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getYourself()) + .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); + ctx.reply(embed); + }, () -> ctx.reply("Outfit not found"))); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index 3912aad..92f19a5 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -8,24 +8,21 @@ 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.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.util.ArrayList; +import java.awt.Color; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class RemoveOutfitCommand extends Command { @Override public String name() { return "Remove Outfit"; } @Override public String description() { return "Removes an outfit from the database given an id"; } @Override public String usage() { return "remove "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("removeoutfit", "remove")); } + @Override public List aliases() { return Arrays.asList("removeoutfit", "remove"); } @Override public void onCommand(CommandContext ctx) { @@ -40,67 +37,66 @@ public class RemoveOutfitCommand extends Command { // get the outfit, confirm deletion 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("Confirm Outfit Deletion") - .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); + 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("Confirm Outfit Deletion") + .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); - ctx.reply(embed).thenAcceptAsync(msg -> { - msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); - msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); + ctx.reply(embed).thenAcceptAsync(msg -> { + msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); + msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); - msg.addReactionAddListener(event -> { - if (event.getUser().getId() != authorId) { - return; - } + msg.addReactionAddListener(event -> { + if (event.getUserId() != authorId) { + return; + } - if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { - // Delete the outfit - OutfitController.delete(outfit.getId()); + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { + // Delete the outfit + OutfitController.delete(outfit.getId()); - EmbedBuilder response = new EmbedBuilder() - .setTitle("Deletion Successful!") - .setDescription(String.format("Outfit %s marked as deleted", outfit.getId())); + EmbedBuilder response = new EmbedBuilder() + .setTitle("Deletion Successful!") + .setDescription(String.format("Outfit %s marked as deleted", outfit.getId())); - msg.delete(); - ctx.reply(response); + msg.delete(); + ctx.reply(response); - EmbedBuilder log = new EmbedBuilder() - .setTitle("Outfit Marked as Deleted") - .setThumbnail(outfit.getLink()) - .addField("Deleted By:", ctx.getAuthor().getDiscriminatedName()); + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Marked as Deleted") + .setThumbnail(outfit.getLink()) + .setColor(Color.RED) + .addField("Deleted By:", ctx.getAuthor().getDiscriminatedName()); - ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { - chnl.sendMessage(log); - }); + 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("Deletion Aborted") - .setDescription(String.format("No modifications were made to %s", outfit.getId())); + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { + // Do nothing + EmbedBuilder response = new EmbedBuilder() + .setTitle("Deletion 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); + } + }); + }); + }, () -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Outfit not Found") + .setDescription(String.format("ID %s does not exist", outfitId)); - ctx.reply(response); - }); - }); + ctx.reply(response); + })); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java index c362e3e..a503a56 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java @@ -9,26 +9,22 @@ import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.models.Outfit; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +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.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; +import java.util.List; public class RetagCommand extends Command { @Override public String name() { return "Retag"; } @Override public String description() { return "Changes the tag of the given outfit"; } @Override public String usage() { return "retag "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("retag")); } + @Override public List aliases() { return Collections.singletonList("retag"); } @Override public void onCommand(CommandContext ctx) { @@ -45,71 +41,70 @@ public class RetagCommand extends Command { String outfitId = args[0]; String newTag = args[1]; - OutfitController.findById(outfitId).thenAcceptAsync(possibleOutfit -> { - possibleOutfit.ifPresentOrElse(outfit -> { - // Send info, confirmation, and add reaction listener - EmbedBuilder response = new EmbedBuilder() - .setTitle("Confirm Tag Edit") - .setThumbnail(outfit.getLink()) - .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) - .setUrl(outfit.getLink()) - .addField("Current Tag:", outfit.getTag()) - .addField("New Tag:", newTag); + OutfitController.findById(outfitId).thenAcceptAsync(possibleOutfit -> possibleOutfit.ifPresentOrElse(outfit -> { + // Send info, confirmation, and add reaction listener + EmbedBuilder response = new EmbedBuilder() + .setTitle("Confirm Tag Edit") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) + .setUrl(outfit.getLink()) + .addField("Current Tag:", outfit.getTag()) + .addField("New Tag:", newTag); - ctx.reply(response).thenAcceptAsync(msg -> { - msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); - msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); + ctx.reply(response).thenAcceptAsync(msg -> { + msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); + msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); - msg.addReactionAddListener(event -> { - if (event.getUser().getId() != authorId) { - return; - } + msg.addReactionAddListener(event -> { + if (event.getUserId() != authorId) { + return; + } - if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { - // Update the outfit - Outfit newOutfit = new Outfit.OutfitBuilder(outfit) - .setTag(newTag) - .setUpdated(new Timestamp(System.currentTimeMillis())) - .build(); + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { + // Update the outfit + Outfit newOutfit = new Outfit.OutfitBuilder(outfit) + .setTag(newTag) + .setUpdated(new Timestamp(System.currentTimeMillis())) + .build(); - OutfitController.update(newOutfit).thenAcceptAsync((Void) -> { - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Outfit retagged successfully!") - .setDescription(String.format("Outfit %s will now display as %s", newOutfit.getId(), newOutfit.getTag())); - - msg.delete(); - ctx.reply(embed); - - EmbedBuilder log = new EmbedBuilder() - .setTitle("Outfit Retagged") - .setThumbnail(outfit.getLink()) - .addField("New tag:", newTag); - - ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { - chnl.sendMessage(log); - }); - }); - - } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { - // Do nothing - msg.delete(); + OutfitController.update(newOutfit).thenAcceptAsync((Void) -> { EmbedBuilder embed = new EmbedBuilder() - .setTitle("Update Cancelled") - .setDescription("No modifications were made"); + .setTitle("Outfit retagged successfully!") + .setDescription(String.format("Outfit %s will now display as %s", newOutfit.getId(), newOutfit.getTag())); + msg.delete(); ctx.reply(embed); - } - }); - }); - }, () -> { - // Err, outfit not found - EmbedBuilder response = new EmbedBuilder() - .setTitle("Error occurred") - .setDescription("That ID was not found in the database") - .setColor(Color.RED); - ctx.reply(response); + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Retagged") + .setColor(Color.YELLOW) + .setThumbnail(outfit.getLink()) + .addField("New tag:", newTag); + + ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent( + chnl -> chnl.sendMessage(log) + ); + }); + + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { + // Do nothing + msg.delete(); + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Update Cancelled") + .setDescription("No modifications were made"); + + ctx.reply(embed); + } + }); }); - }); + }, () -> { + // Err, outfit not found + EmbedBuilder response = new EmbedBuilder() + .setTitle("Error occurred") + .setDescription("That ID was not found in the database") + .setColor(Color.RED); + + ctx.reply(response); + })); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java index 785371a..7199d10 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java @@ -6,25 +6,22 @@ package dev.salmonllama.fsbot.commands.staff; import com.vdurmont.emoji.EmojiParser; -import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; public class SetStatusCommand extends Command { @Override public String name() { return "Set Status"; } @Override public String description() { return "Updates the bot's current status"; } @Override public String usage() { return "updatestatus "; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("setstatus", "status")); } + @Override public List aliases() { return Arrays.asList("setstatus", "status"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java index 997260d..cc678db 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java @@ -8,24 +8,20 @@ package dev.salmonllama.fsbot.commands.staff; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.ServerConfigController; import dev.salmonllama.fsbot.database.models.ServerConfig; -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.guthix.*; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.util.logging.ExceptionLogger; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.List; public class WelcomeMessageCommand extends Command { @Override public String name() { return "Welcome Message"; } @Override public String description() { return "View or update the server welcome message. Options: get|set|getchannel|setchannel."; } @Override public String usage() { return "welcomemessage [String newMessage]"; } - @Override public String category() { return "Staff"; } + @Override public CommandCategory category() { return CommandCategory.STAFF; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("welcomemessage", "wmsg")); } + @Override public List aliases() { return Arrays.asList("welcomemessage", "wmsg"); } @Override public void onCommand(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index f202a66..5424747 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -63,6 +63,9 @@ public class BotConfig { @ConfigurationOption public static String HYDRIX_ROLE = "hydrix role id here"; + @ConfigurationOption + public static String MEMBER_ROLE = "member role id here"; + @ConfigurationOption public static String IMGUR_ID = "imgur_id_here"; 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 8d6e385..ae9de84 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -13,6 +13,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -159,7 +160,7 @@ public class OutfitController { }); } - public static CompletableFuture> getDistinctTags() { + public static CompletableFuture> getDistinctTags() { return CompletableFuture.supplyAsync(() -> { try { return getDistinctTagsExec(); @@ -332,10 +333,10 @@ public class OutfitController { return extractCount(rs); } - private static Collection getDistinctTagsExec() throws SQLException { + private static List getDistinctTagsExec() throws SQLException { ResultSet rs = FSDB.get().select("SELECT DISTINCT tag FROM outfits"); - Collection tags = new ArrayList<>(); + List tags = new ArrayList<>(); while (rs.next()) { tags.add(rs.getString("tag")); } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 6791f5d..3e436ac 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -56,6 +56,10 @@ public class Outfit extends DatabaseModel { return meta; } + public void setMeta(String meta) { + this.meta = meta; + } + public Timestamp getCreated() { return created; } diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionConnection.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionConnection.java index 947bf7c..19ce43a 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionConnection.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionConnection.java @@ -5,15 +5,16 @@ package dev.salmonllama.fsbot.endpoints.scapefashion; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.json.JSONArray; -import org.json.JSONObject; +import com.google.gson.Gson; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.URI; import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; public class ScapeFashionConnection { @@ -23,70 +24,114 @@ public class ScapeFashionConnection { private final String OSRS_REQUEST_URL = "https://api.scape.fashion"; private final String OSRS_LINK_URL = "https://scape.fashion"; - private final String USER_AGENT = "Fashionscape-Bot github.com/salmonllama/fashionscape-bot"; + private static final Logger logger = LoggerFactory.getLogger(ScapeFashionConnection.class); - private final OkHttpClient client; - private final Request.Builder requestBuilder; - - public ScapeFashionConnection() { - - client = new OkHttpClient().newBuilder().build(); - requestBuilder = new Request.Builder(); - } + public ScapeFashionConnection() {} // Uses the color endpoint to search for items // Returns an object with a list of the top results, and a link redirect to see full list - public JSONArray osrsColor(String color) throws IOException { - String url = OSRS_REQUEST_URL + "/colors/" + encode(color); - System.out.println(url); + public ScapeFashionResult osrsColor(String color) throws Exception { + String uri = OSRS_REQUEST_URL + "/colors/" + encode(color); + String link = OSRS_LINK_URL + "/colors/" + encode(color); - return makeRequest(url); + var response = makeRequest(uri); + response.setLink(link); + return response; } - private void osrsColor(String color, String slot) { + public ScapeFashionResult osrsColor(String color, ScapeFashionSlotOsrs slot) throws Exception { + String uri = OSRS_REQUEST_URL + "/colors/" + encode(color) + "?slot=" + encode(slot.getValue()); + String link = OSRS_LINK_URL + "/colors/" + encode(color) + "?slot=" + encode(slot.getValue()); + var response = makeRequest(uri); + response.setLink(link); + return response; } - private void osrsItem(String item) { + public ScapeFashionResult osrsItem(String item) throws Exception { + String uri = OSRS_REQUEST_URL + "/items/" + encode(item); + String link = OSRS_LINK_URL + "/items/" + encode(item); + var response = makeRequest(uri); + response.setLink(link); + if (response.getItems().get(0).getName().toLowerCase().equals(item.toLowerCase())) { + response.getItems().remove(0); + } + return response; } - private void osrsItem(String item, String slot) { + public ScapeFashionResult osrsItem(String item, ScapeFashionSlotOsrs slot) throws Exception { + String uri = OSRS_REQUEST_URL + "/items/" + encode(item) + "?slot=" + encode(slot.getValue()); + String link = OSRS_LINK_URL + "/items/" + encode(item) + "?slot=" + encode(slot.getValue()); + var response = makeRequest(uri); + response.setLink(link); + if (response.getItems().get(0).getName().toLowerCase().equals(item.toLowerCase())) { + response.getItems().remove(0); + } + return response; } - private void rs3Color(String color) { + public ScapeFashionResult rs3Color(String color) throws Exception { + String uri = RS3_REQUEST_URL + "/colors/" + encode(color); + String link = RS3_LINK_URL + "/colors/" + encode(color); + var response = makeRequest(uri); + response.setLink(link); + return response; } - private void rs3Color(String color, String slot) { + public ScapeFashionResult rs3Color(String color, ScapeFashionSlotRs3 slot) throws Exception { + String uri = RS3_REQUEST_URL + "/colors/" + encode(color) + "?slot=" + encode(slot.getValue()); + String link = RS3_LINK_URL + "/colors/" + encode(color) + "?slot=" + encode(slot.getValue()); + var response = makeRequest(uri); + response.setLink(link); + return response; } - private void rs3Item(String item) { + public ScapeFashionResult rs3Item(String item) throws Exception { + String uri = RS3_REQUEST_URL + "/items/" + encode(item); + String link = RS3_LINK_URL + "/items/" + encode(item); + var response = makeRequest(uri); + response.setLink(link); + if (response.getItems().get(0).getName().toLowerCase().equals(item.toLowerCase())) { + response.getItems().remove(0); + } + return response; } - private void rs3Item(String item, String slot) { + public ScapeFashionResult rs3Item(String item, ScapeFashionSlotRs3 slot) throws Exception { + String uri = RS3_REQUEST_URL + "/items/" + encode(item) + "?slot=" + encode(slot.getValue()); + String link = RS3_LINK_URL + "/items/" + encode(item) + "?slot=" + encode(slot.getValue()); + var response = makeRequest(uri); + response.setLink(link); + if (response.getItems().get(0).getName().toLowerCase().equals(item.toLowerCase())) { + response.getItems().remove(0); + } + return response; } - private JSONArray makeRequest(String url) throws IOException { - // Returns the items JSONObject - Request request = requestBuilder.get().url(url).addHeader("User-Agent", USER_AGENT).build(); + private ScapeFashionResult makeRequest(String url) throws Exception { + var client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build(); - Response response = client.newCall(request).execute(); - // returns a JSONArray of JSONObjects - System.out.println(response.body().string()); - return new JSONObject(response.body().string()).getJSONArray("items"); + String USER_AGENT = "Fashionscape-Bot github.com/salmonllama/fashionscape-bot"; + + HttpRequest request = HttpRequest.newBuilder(URI.create(url)) + .header("Content-Type", "application/json") + .header("User-Agent", USER_AGENT) + .GET() + .build(); + + Gson gson = new Gson(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + var json = response.body(); + return gson.fromJson(json, ScapeFashionResult.class); } private String encode(String value) throws UnsupportedEncodingException { - return URLEncoder.encode(value, StandardCharsets.UTF_8.toString()); - } - - private ScapeFashionResult extract(JSONObject json) { - - return null; + return URLEncoder.encode(value, StandardCharsets.UTF_8.toString()).replace("+", "%20"); } } diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionImages.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionImages.java new file mode 100644 index 0000000..9bc208c --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionImages.java @@ -0,0 +1,13 @@ +package dev.salmonllama.fsbot.endpoints.scapefashion; + +public class ScapeFashionImages { + private String detail; + + public ScapeFashionImages() { + + } + + public String getDetail() { + return detail; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionItem.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionItem.java index d245bbd..051e9d2 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionItem.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionItem.java @@ -6,24 +6,56 @@ package dev.salmonllama.fsbot.endpoints.scapefashion; public class ScapeFashionItem { + private final ScapeFashionImages images; private final String name; private final String slot; - private final String link; + private final ScapeFashionWiki wiki; private final String[] colors; private final float match; private ScapeFashionItem(Builder builder) { + this.images = builder.images; this.name = builder.name; this.slot = builder.slot; - this.link = builder.link; + this.wiki = builder.wiki; this.colors = builder.colors; this.match = builder.match; } + public ScapeFashionImages getImages() { + return images; + } + + public String getName() { + return name; + } + + public String getSlot() { + return slot; + } + + public ScapeFashionWiki getWiki() { + return wiki; + } + + public String[] getColors() { + return colors; + } + + public float getMatch() { + return match; + } + + @Override + public String toString() { + return String.format("Item: [%s]", name); + } + public static class Builder { + private ScapeFashionImages images; private String name; private String slot; - private String link; + private ScapeFashionWiki wiki; private String[] colors; private float match; @@ -31,6 +63,11 @@ public class ScapeFashionItem { } + public Builder setImages(ScapeFashionImages images) { + this.images = images; + return this; + } + public Builder setName(String name) { this.name = name; return this; @@ -41,8 +78,8 @@ public class ScapeFashionItem { return this; } - public Builder setLink(String link) { - this.link = link; + public Builder setWiki(ScapeFashionWiki wiki) { + this.wiki = wiki; return this; } diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionResult.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionResult.java index 8bc8518..00b76fd 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionResult.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionResult.java @@ -5,16 +5,22 @@ package dev.salmonllama.fsbot.endpoints.scapefashion; +import com.google.gson.annotations.SerializedName; + import java.util.ArrayList; -import java.util.Collection; +import java.util.List; public class ScapeFashionResult { - private final String link; - private Collection items; + private String link; + @SerializedName("items") + private final List items = new ArrayList<>(); + + public ScapeFashionResult() { + + } public ScapeFashionResult(String link) { this.link = link; - items = new ArrayList<>(); } public ScapeFashionResult addItem(ScapeFashionItem item) { @@ -22,11 +28,15 @@ public class ScapeFashionResult { return this; } + public void setLink(String link) { + this.link = link; + } + public String getLink() { return link; } - public Collection getItems() { + public List getItems() { return items; } } diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotOsrs.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotOsrs.java new file mode 100644 index 0000000..04a5651 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotOsrs.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.endpoints.scapefashion; + +import java.util.Optional; + +// Source: https://github.com/ncpierson/fashionscape/blob/master/api/data/tools/slot.js +public enum ScapeFashionSlotOsrs { + AMMUNITION("ammunition"), + BODY("body"), + CAPE("cape"), + FEET("feet"), + HAND("hand"), + HEAD("head"), + LEG("leg"), + NECK("neck"), + RING("ring"), + SHIELD("shield"), + WEAPON("weapon"); + + private final String value; + + ScapeFashionSlotOsrs(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static Optional matches(String s) { + try { + var slot = ScapeFashionSlotOsrs.valueOf(s); + return Optional.of(slot); + } catch (IllegalArgumentException e) { + return Optional.empty(); + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotRs3.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotRs3.java new file mode 100644 index 0000000..d99cbe1 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionSlotRs3.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.endpoints.scapefashion; + +import java.util.Optional; + +// Source: https://github.com/ncpierson/fashionscape/blob/master/api/data/tools/slot.js +public enum ScapeFashionSlotRs3 { + AMMUNITION("ammunition"), + BACK("back"), + FEET("feet"), + HAND("hand"), + HEAD("head"), + LEG("leg"), + MAIN_HAND("main_hand"), + NECK("neck"), + OFF_HAND("off-hand"), + POCKET("pocket"), + RING("ring"), + SIGIL("sigil"), + TORSO("torso"), + TWO_HANDED("two-handed"); + + private final String value; + + ScapeFashionSlotRs3(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static Optional matches(String s) { + try { + var slot = ScapeFashionSlotRs3.valueOf(s); + return Optional.of(slot); + } catch (IllegalArgumentException e) { + return Optional.empty(); + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionWiki.java b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionWiki.java new file mode 100644 index 0000000..2bb26a4 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/scapefashion/ScapeFashionWiki.java @@ -0,0 +1,23 @@ +package dev.salmonllama.fsbot.endpoints.scapefashion; + +public class ScapeFashionWiki { + private String api; + private String link; + private int pageId; + + public ScapeFashionWiki() { + + } + + public String getApi() { + return api; + } + + public String getLink() { + return link; + } + + public int getPageId() { + return pageId; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Command.java b/src/main/java/dev/salmonllama/fsbot/guthix/Command.java index 92c8df8..c904818 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Command.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Command.java @@ -5,16 +5,16 @@ package dev.salmonllama.fsbot.guthix; -import java.util.Collection; +import java.util.List; import java.util.concurrent.CompletableFuture; public abstract class Command { public abstract String name(); public abstract String description(); public abstract String usage(); - public abstract String category(); + public abstract CommandCategory category(); public abstract CommandPermission permission(); - public abstract Collection aliases(); + public abstract List aliases(); public abstract void onCommand(CommandContext ctx); diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/CommandCategory.java b/src/main/java/dev/salmonllama/fsbot/guthix/CommandCategory.java new file mode 100644 index 0000000..36edc54 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/guthix/CommandCategory.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.guthix; + +public enum CommandCategory { + DEVELOPER("Developer"), + GENERAL("General"), + OSRS_ITEM_SEARCH("07Search"), + RS3_ITEM_SEARCH("RS3Search"), + STAFF("Staff"); + + private final String category; + + CommandCategory(String category) { + this.category = category; + } + + public String getCategory() { + return category; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index e65f7ae..edcda78 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -7,6 +7,8 @@ package dev.salmonllama.fsbot.guthix; import dev.salmonllama.fsbot.commands.developer.*; import dev.salmonllama.fsbot.commands.general.*; +import dev.salmonllama.fsbot.commands.osrssearch.*; +import dev.salmonllama.fsbot.commands.rs3search.*; import dev.salmonllama.fsbot.commands.staff.OutfitInfoCommand; import dev.salmonllama.fsbot.commands.staff.*; import org.javacord.api.DiscordApi; @@ -22,10 +24,10 @@ import java.util.HashMap; */ public class Guthix implements MessageCreateListener { @SuppressWarnings("unused") - private DiscordApi api; + private final DiscordApi api; - private Registry registry; - private PermissionManager manager; + private final Registry registry; + private final PermissionManager manager; public Guthix(DiscordApi api) { this.api = api; @@ -55,6 +57,7 @@ public class Guthix implements MessageCreateListener { addCommand(new SetStatusCommand()); addCommand(new WelcomeMessageCommand()); addCommand(new ShowGalleriesCommand()); + addCommand(new EditMetaCommand()); // General Commands addCommand(new PingCommand()); @@ -64,6 +67,31 @@ public class Guthix implements MessageCreateListener { addCommand(new HelpCommand(this)); addCommand(new StatsCommand()); addCommand(new PrivacyCommand()); + + // Osrs Search Commands + addCommand(new OsrsSearchCommand()); + addCommand(new OsrsHeadCommand()); + addCommand(new OsrsBodyCommand()); + addCommand(new OsrsHandCommand()); + addCommand(new OsrsLegsCommand()); + addCommand(new OsrsFeetCommand()); + addCommand(new OsrsCapeCommand()); + addCommand(new OsrsNeckCommand()); + addCommand(new OsrsShieldCommand()); + addCommand(new OsrsWeaponCommand()); + + // Rs3 Search Commands + addCommand(new Rs3SearchCommand()); + addCommand(new Rs3HeadCommand()); + addCommand(new Rs3BodyCommand()); + addCommand(new Rs3NeckCommand()); + addCommand(new Rs3HandCommand()); + addCommand(new Rs3FeetCommand()); + addCommand(new Rs3LegsCommand()); + addCommand(new Rs3BackCommand()); + addCommand(new Rs3MainhandCommand()); + addCommand(new Rs3OffhandCommand()); + addCommand(new Rs3TwohandedCommand()); } public void addCommand(Command cmd) { diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 986b203..a9bee05 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -17,6 +17,7 @@ import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; import org.javacord.api.util.logging.ExceptionLogger; +import java.awt.Color; import java.util.UUID; @@ -105,6 +106,7 @@ public class ImageListener implements MessageCreateListener { .setThumbnail(outfit.getLink()) .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) .setUrl(outfit.getLink()) + .setColor(Color.GREEN) .addField("Uploaded:", outfit.getCreated().toString()); if (!outfit.getMeta().equals("")) { diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java index 458b439..6e477c3 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java @@ -7,22 +7,32 @@ package dev.salmonllama.fsbot.listeners; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.ServerConfigController; +import dev.salmonllama.fsbot.services.MemberRoleService; import org.javacord.api.event.server.member.ServerMemberJoinEvent; import org.javacord.api.listener.server.member.ServerMemberJoinListener; +import java.util.concurrent.TimeUnit; + public class NewMemberListener implements ServerMemberJoinListener { + ServerMemberJoinEvent event; + public void onServerMemberJoin(ServerMemberJoinEvent event) { + this.event = event; if (!event.getServer().getIdAsString().equals(BotConfig.HOME_SERVER)) { // Only active in the Fashionscape server, currently. return; } - // TODO: Use the ServerConfig to retrieve the welcome channel as well. + // Send the welcome message in the welcome channel event.getApi().getServerTextChannelById(BotConfig.WELCOME_CHANNEL).ifPresent( // Get the Welcome Channel channel -> ServerConfigController.get(event.getServer().getIdAsString()).thenAcceptAsync( // Fetch the server config, if set. possibleConfig -> possibleConfig.ifPresent( // If config exists config -> channel.sendMessage(String.format(config.getWelcomeMessage(), event.getUser().getMentionTag()))))); // Send the welcome message + + // Add the Member role after 5 minutes + var memberRoleService = new MemberRoleService(event); + event.getApi().getThreadPool().getScheduler().schedule(memberRoleService, 5, TimeUnit.MINUTES); } } diff --git a/src/main/java/dev/salmonllama/fsbot/services/MemberRoleService.java b/src/main/java/dev/salmonllama/fsbot/services/MemberRoleService.java new file mode 100644 index 0000000..a778cb6 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/services/MemberRoleService.java @@ -0,0 +1,18 @@ +package dev.salmonllama.fsbot.services; + +import dev.salmonllama.fsbot.config.BotConfig; +import org.javacord.api.event.server.member.ServerMemberJoinEvent; + +public class MemberRoleService implements Runnable { + + ServerMemberJoinEvent event; + + public MemberRoleService(ServerMemberJoinEvent event) { + this.event = event; + } + + @Override + public void run() { + event.getApi().getRoleById(BotConfig.MEMBER_ROLE).ifPresent(event.getUser()::addRole); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/DiscordUtilities.java b/src/main/java/dev/salmonllama/fsbot/utilities/DiscordUtilities.java new file mode 100644 index 0000000..770c72b --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/utilities/DiscordUtilities.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.utilities; + +import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.guthix.CommandContext; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.util.Arrays; + +public class DiscordUtilities { + public static void handleException(Exception e, CommandContext ctx) { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Exception caught in command thread:") + .addField("message:", e.getMessage()) + .setColor(Color.RED); + + logException(e, ctx); + ctx.reply(embed); + } + + private static void logException(Exception e, CommandContext ctx) { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Runtime error:") + .addField("Message:", e.getMessage()) + .setColor(Color.RED); + + ctx.getApi().getTextChannelById(BotConfig.ACTIVITY_LOG).ifPresent(channel -> channel.sendMessage(embed)); + } + +// public static void report(Class... throwable) { +// System.out.println(Arrays.stream(throwable)); +// } +}