Merge remote-tracking branch 'origin/master'

This commit is contained in:
Salmonllama 2020-11-11 11:38:30 -05:00
commit 64821b16b3
66 changed files with 2070 additions and 380 deletions

View File

@ -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'

View File

@ -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);

View File

@ -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 <userId> <reason>"; }
@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<String> aliases() { return Arrays.asList("blacklistuser", "bluser", "sabusr"); }
@Override public List<String> aliases() { return Arrays.asList("blacklistuser", "bluser", "sabusr"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 <String tag>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); }
@Override public List<String> aliases() { return Arrays.asList("creategallery", "addgallery", "newgallery"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return Collections.singletonList("default"); }
@Override public List<String> aliases() { return Collections.singletonList("default"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("invite", "inv")); }
@Override public List<String> aliases() { return Arrays.asList("invite", "inv"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 <list|add|remove> <keyword>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("permission", "permissions", "perm", "perms")); }
@Override public List<String> aliases() { return Arrays.asList("permission", "permissions", "perm", "perms"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("test", "t")); }
@Override public List<String> 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());
}

View File

@ -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 <colorName>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("color", "colour")); }
@Override public List<String> aliases() { return Arrays.asList("color", "colour"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("colors", "colours")); }
@Override public List<String> aliases() { return Arrays.asList("colors", "colours"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("help", "h")); }
@Override public List<String> aliases() { return Arrays.asList("help", "h"); }
private final Guthix guthix;
@ -60,7 +60,7 @@ public class HelpCommand extends Command {
List<String> 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;
}

View File

@ -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 <String tag>"; }
@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<String> aliases() { return initAliases(); }
@Override public List<String> aliases() { return initAliases(); }
@Override
public void onCommand(CommandContext ctx) {
@ -195,8 +193,8 @@ public class OutfitCommand extends Command {
}
}
private Collection<String> initAliases() {
Collection<String> aliases = OutfitController.getDistinctTags().join();
private List<String> initAliases() {
List<String> aliases = OutfitController.getDistinctTags().join();
aliases.addAll(NON_TAG_ALIASES);
return aliases;
}

View File

@ -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<String> aliases() { return new ArrayList<>(Collections.singletonList("ping")); }
@Override public List<String> aliases() { return Collections.singletonList("ping"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> aliases() { return Collections.singletonList("privacy"); }
@Override public List<String> 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")

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("showgalleries", "listgalleries")); }
@Override public List<String> 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<GalleryChannel> galleries, Server server) { // TODO: Base FSBot embed.
EmbedBuilder galleryEmbed(Collection<GalleryChannel> galleries, Server server) {
EmbedBuilder embed = new EmbedBuilder()
.setTitle("Server Gallery Channels");

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("stats")); }
@Override public List<String> aliases() { return Collections.singletonList("stats"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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);
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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);
}
}

View File

@ -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<String> 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);
}
}
}
}

View File

@ -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 <colorName> <roleId>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("addcolor", "addcolour", "addclr")); }
@Override public List<String> aliases() { return Arrays.asList("addcolor", "addcolour", "addclr"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 <message>"; }
@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<String> aliases() { return new ArrayList<>(Collections.singletonList("echo")); }
@Override public List<String> aliases() { return Collections.singletonList("echo"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 <String id> <String newMeta>"; }
@Override public CommandCategory category() { return CommandCategory.STAFF; }
@Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); }
@Override public List<String> 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);
}));
}
}

View File

@ -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 <String id>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("getoutfit", "get")); }
@Override public List<String> 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?")
));
}
}

View File

@ -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<String> aliases() { return new ArrayList<>(Arrays.asList("getservers", "servers")); }
@Override public List<String> aliases() { return Arrays.asList("getservers", "servers"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 <String id>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("outfitinfo", "oinfo")); }
@Override public List<String> 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")));
}
}

View File

@ -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 <String id>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("removeoutfit", "remove")); }
@Override public List<String> 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);
}));
}
}

View File

@ -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 <String id> <String newtag>"; }
@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<String> aliases() { return new ArrayList<>(Collections.singletonList("retag")); }
@Override public List<String> 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);
}));
}
}

View File

@ -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 <String status>"; }
@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<String> aliases() { return new ArrayList<>(Arrays.asList("setstatus", "status")); }
@Override public List<String> aliases() { return Arrays.asList("setstatus", "status"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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 opt> [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<String> aliases() { return new ArrayList<>(Arrays.asList("welcomemessage", "wmsg")); }
@Override public List<String> aliases() { return Arrays.asList("welcomemessage", "wmsg"); }
@Override
public void onCommand(CommandContext ctx) {

View File

@ -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";

View File

@ -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<Collection<String>> getDistinctTags() {
public static CompletableFuture<List<String>> getDistinctTags() {
return CompletableFuture.supplyAsync(() -> {
try {
return getDistinctTagsExec();
@ -332,10 +333,10 @@ public class OutfitController {
return extractCount(rs);
}
private static Collection<String> getDistinctTagsExec() throws SQLException {
private static List<String> getDistinctTagsExec() throws SQLException {
ResultSet rs = FSDB.get().select("SELECT DISTINCT tag FROM outfits");
Collection<String> tags = new ArrayList<>();
List<String> tags = new ArrayList<>();
while (rs.next()) {
tags.add(rs.getString("tag"));
}

View File

@ -56,6 +56,10 @@ public class Outfit extends DatabaseModel {
return meta;
}
public void setMeta(String meta) {
this.meta = meta;
}
public Timestamp getCreated() {
return created;
}

View File

@ -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<String> 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");
}
}

View File

@ -0,0 +1,13 @@
package dev.salmonllama.fsbot.endpoints.scapefashion;
public class ScapeFashionImages {
private String detail;
public ScapeFashionImages() {
}
public String getDetail() {
return detail;
}
}

View File

@ -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;
}

View File

@ -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<ScapeFashionItem> items;
private String link;
@SerializedName("items")
private final List<ScapeFashionItem> 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<ScapeFashionItem> getItems() {
public List<ScapeFashionItem> getItems() {
return items;
}
}

View File

@ -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<ScapeFashionSlotOsrs> matches(String s) {
try {
var slot = ScapeFashionSlotOsrs.valueOf(s);
return Optional.of(slot);
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
}

View File

@ -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<ScapeFashionSlotRs3> matches(String s) {
try {
var slot = ScapeFashionSlotRs3.valueOf(s);
return Optional.of(slot);
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
}

View File

@ -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;
}
}

View File

@ -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<String> aliases();
public abstract List<String> aliases();
public abstract void onCommand(CommandContext ctx);

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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("")) {

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<? extends Throwable>... throwable) {
// System.out.println(Arrays.stream(throwable));
// }
}