diff --git a/src/main/java/com/diamondfire/helpbot/bot/HelpBotInstance.java b/src/main/java/com/diamondfire/helpbot/bot/HelpBotInstance.java index 56ce7ee4..72a35bf7 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/HelpBotInstance.java +++ b/src/main/java/com/diamondfire/helpbot/bot/HelpBotInstance.java @@ -16,6 +16,7 @@ import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.utils.MemberCachePolicy; import net.dv8tion.jda.api.utils.cache.CacheFlag; +import okhttp3.OkHttpClient; import javax.security.auth.login.LoginException; @@ -24,14 +25,14 @@ public class HelpBotInstance { private static final Config config = new Config(); public static final long DF_GUILD = config.getGuild(); public static final long LOG_CHANNEL = config.getLogChannel(); - private static final CommandHandler handler = new CommandHandler(); + public static final OkHttpClient HTTP_CLIENT = new OkHttpClient(); private static JDA jda; private static final TaskRegistry loop = new TaskRegistry(); public static void initialize() throws LoginException { - handler.register( + CommandHandler.getInstance().register( // codeblock commands new CodeCommand(), new RankCommand(), @@ -128,15 +129,15 @@ public static void initialize() throws LoginException { .addEventListeners(new MessageEvent(), new ReadyEvent(), new GuildJoinEvent(), new ButtonEvent()); jda = builder.build(); - handler.initialize(); + CommandHandler.getInstance().initialize(); } public static JDA getJda() { return jda; } - public static CommandHandler getHandler() { - return handler; + public static OkHttpClient getHttpClient() { + return HTTP_CLIENT; } public static Config getConfig() { diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/CommandHandler.java b/src/main/java/com/diamondfire/helpbot/bot/command/CommandHandler.java index 71b88060..f1b8db72 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/CommandHandler.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/CommandHandler.java @@ -14,15 +14,21 @@ public class CommandHandler { private final HashMap ALIASES = new HashMap<>(); private final CommandExecutor COMMAND_EXECUTOR = new CommandExecutor(); private final DisableCommandHandler DISABLED_COMMAND_HANDLER = new DisableCommandHandler(); + + private static CommandHandler instance; + + private CommandHandler() { + instance = this; + } public void initialize() { DISABLED_COMMAND_HANDLER.initialize(); } public static Command getCommand(String name) { - Command cmd = HelpBotInstance.getHandler().getCommands().get(name.toLowerCase()); + Command cmd = CommandHandler.getInstance().getCommands().get(name.toLowerCase()); if (cmd == null) { - cmd = HelpBotInstance.getHandler().getAliases().get(name.toLowerCase()); + cmd = CommandHandler.getInstance().getAliases().get(name.toLowerCase()); } return cmd; @@ -53,4 +59,8 @@ public HashMap getAliases() { public DisableCommandHandler getDisabledHandler() { return DISABLED_COMMAND_HANDLER; } -} + + public static CommandHandler getInstance() { + return instance == null ? new CommandHandler() : instance; + } +} \ No newline at end of file diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/Argument.java b/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/Argument.java index a663106a..b6f671e4 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/Argument.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/Argument.java @@ -6,11 +6,15 @@ import java.util.Deque; -// Arguments simply parse a given value and can remove it from the stack if they process it correctly. -// This means an argument can actually use more than one argument if they want! +/** + * Arguments simply parse a given value and can remove it from the stack if they process it correctly. + * This means an argument can actually use more than one argument if they want! + * + * @param parsed value type + */ public interface Argument { T parseValue(@NotNull Deque args) throws ArgumentException; } - \ No newline at end of file + diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/MinecraftPlayerUUIDArgument.java b/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/MinecraftPlayerUUIDArgument.java new file mode 100644 index 00000000..30802910 --- /dev/null +++ b/src/main/java/com/diamondfire/helpbot/bot/command/argument/impl/types/MinecraftPlayerUUIDArgument.java @@ -0,0 +1,41 @@ +package com.diamondfire.helpbot.bot.command.argument.impl.types; + +import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.argument.impl.parsing.exceptions.ArgumentException; +import com.google.gson.*; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.UUID; + +public class MinecraftPlayerUUIDArgument extends AbstractSimpleValueArgument { + + @Override + protected UUID parse(@NotNull String argument) throws ArgumentException { + if (argument.contains("-") || argument.length() > 16) { + return UUID.fromString(argument); + } else { + JsonObject responseObject = null; + ResponseBody res = null; + Request request = new Request.Builder().url("https://api.mojang.com/users/profiles/minecraft/" + argument).get().build(); + try { + res = HelpBotInstance.getHttpClient().newCall(request).execute().body(); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + responseObject = JsonParser.parseString(res.string()).getAsJsonObject(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (responseObject.has("id")) { + return UUID.fromString(responseObject.get("id").getAsString()); + } else { + return null; + } + } + } +} diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/executor/checks/DisabledCheck.java b/src/main/java/com/diamondfire/helpbot/bot/command/executor/checks/DisabledCheck.java index e72b5059..f0351920 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/executor/checks/DisabledCheck.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/executor/checks/DisabledCheck.java @@ -1,15 +1,15 @@ package com.diamondfire.helpbot.bot.command.executor.checks; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.command.reply.PresetBuilder; import com.diamondfire.helpbot.bot.command.reply.feature.informative.*; import com.diamondfire.helpbot.bot.events.CommandEvent; public class DisabledCheck implements CommandCheck { - @Override public boolean check(CommandEvent event) { - return !HelpBotInstance.getHandler().getDisabledHandler().isDisabled(event.getCommand()); + return !CommandHandler.getInstance().getDisabledHandler().isDisabled(event.getCommand()); } @Override diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/BulkExecuteCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/BulkExecuteCommand.java index 4933ef5d..38792e17 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/BulkExecuteCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/BulkExecuteCommand.java @@ -1,6 +1,7 @@ package com.diamondfire.helpbot.bot.command.impl.other; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.command.argument.ArgumentSet; import com.diamondfire.helpbot.bot.command.argument.impl.parsing.types.MultiArgumentContainer; import com.diamondfire.helpbot.bot.command.argument.impl.types.*; @@ -43,7 +44,7 @@ public boolean cacheArgumentSet() { @Override public ArgumentSet compileArguments() { List playerCommands = new ArrayList<>(); - for (Command command : HelpBotInstance.getHandler().getCommands().values()) { + for (Command command : CommandHandler.getInstance().getCommands().values()) { if (command instanceof AbstractPlayerUUIDCommand) { playerCommands.add(command.getName()); } @@ -69,7 +70,7 @@ public void run(CommandEvent event) { for (String player : playerNames) { try { - Command command1 = HelpBotInstance.getHandler().getCommands().get(command); + Command command1 = CommandHandler.getInstance().getCommands().get(command); Field field = event.getClass().getDeclaredField("command"); field.trySetAccessible(); field.set(event, command1); diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/ChannelMuteCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/ChannelMuteCommand.java index b3866147..9fd41661 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/ChannelMuteCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/ChannelMuteCommand.java @@ -10,6 +10,8 @@ import com.diamondfire.helpbot.bot.command.reply.PresetBuilder; import com.diamondfire.helpbot.bot.command.reply.feature.informative.*; import com.diamondfire.helpbot.bot.events.CommandEvent; +import com.diamondfire.helpbot.sys.database.impl.DatabaseQuery; +import com.diamondfire.helpbot.sys.database.impl.queries.BasicQuery; import com.diamondfire.helpbot.sys.tasks.impl.MuteExpireTask; import com.diamondfire.helpbot.util.*; import net.dv8tion.jda.api.entities.*; @@ -65,8 +67,17 @@ public void run(CommandEvent event) { long timeLeft = duration.toInstant().minusSeconds(Instant.now().getEpochSecond()).toEpochMilli(); Date finalDuration = duration; event.getGuild().retrieveMemberById(user).queue((msg) -> { - //TODO Owen DBQuery - + event.getGuild().retrieveMemberById(user).queue((member) -> { + new DatabaseQuery() + .query(new BasicQuery("INSERT INTO owen.muted_members (member,muted_by,muted_at,muted_till,reason) VALUES (?,?,CURRENT_TIMESTAMP(),?,?)", (statement) -> { + statement.setLong(1, user); + statement.setLong(2, event.getAuthor().getIdLong()); + statement.setTimestamp(3, DateUtil.toTimeStamp(finalDuration)); + statement.setString(4, event.getArgument("reason")); + + })) + .compile(); + }); builder.withPreset( new InformativeReply(InformativeReplyType.SUCCESS, "Muted!", String.format("User will be muted for ``%s``.", FormatUtil.formatMilliTime(timeLeft))) diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/DisableCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/DisableCommand.java index 1fb60755..8e47af31 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/DisableCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/DisableCommand.java @@ -54,7 +54,7 @@ public void run(CommandEvent event) { } if (command != null) { - HelpBotInstance.getHandler().getDisabledHandler().disable(command); + CommandHandler.getInstance().getDisabledHandler().disable(command); builder.withPreset(new InformativeReply(InformativeReplyType.SUCCESS, String.format("Command ``%s`` has been disabled.", command.getName()))); } else { builder.withPreset(new InformativeReply(InformativeReplyType.ERROR, String.format("Command ``%s`` could not be found.", name))); diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/EnableCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/EnableCommand.java index 802d0bbf..42ab8d50 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/EnableCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/EnableCommand.java @@ -44,7 +44,7 @@ public Permission getPermission() { @Override public void run(CommandEvent event) { - DisableCommandHandler handler = HelpBotInstance.getHandler().getDisabledHandler(); + DisableCommandHandler handler = CommandHandler.getInstance().getDisabledHandler(); PresetBuilder builder = new PresetBuilder(); String name = event.getArgument("cmd"); Command command = CommandHandler.getCommand(name); diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/HelpCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/HelpCommand.java index de17f3c6..63df0137 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/HelpCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/HelpCommand.java @@ -1,6 +1,7 @@ package com.diamondfire.helpbot.bot.command.impl.other; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.command.argument.ArgumentSet; import com.diamondfire.helpbot.bot.command.argument.impl.parsing.types.SingleArgumentContainer; import com.diamondfire.helpbot.bot.command.argument.impl.types.DefinedObjectArgument; @@ -42,7 +43,7 @@ public boolean cacheArgumentSet() { @Override public ArgumentSet compileArguments() { return new ArgumentSet().addArgument("help", - new SingleArgumentContainer<>(new DefinedObjectArgument<>(HelpBotInstance.getHandler().getCommands().values().stream() + new SingleArgumentContainer<>(new DefinedObjectArgument<>(CommandHandler.getInstance().getCommands().values().stream() .map(Command::getName) .toArray(String[]::new))).optional(null)); } @@ -75,7 +76,7 @@ public void run(CommandEvent event) { categories.put(CommandCategory.CODE_BLOCK, new EmbedBuilder()); categories.put(CommandCategory.OTHER, new EmbedBuilder()); - List commandList = new ArrayList<>(HelpBotInstance.getHandler().getCommands().values()); + List commandList = new ArrayList<>(CommandHandler.getInstance().getCommands().values()); commandList.sort(Comparator.comparing(Command::getName)); for (Command command : commandList) { HelpContext context = command.getHelpContext(); @@ -97,7 +98,7 @@ public void run(CommandEvent event) { } selector.build().send(event.getJDA()); } else { - Command command = HelpBotInstance.getHandler().getCommands().get(helpInfo); + Command command = CommandHandler.getInstance().getCommands().get(helpInfo); HelpContext context = command.getHelpContext(); EmbedBuilder builder = new EmbedBuilder(); builder.setTitle("Command Information"); diff --git a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/PermUnlocksCommand.java b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/PermUnlocksCommand.java index 7e435dd6..a7c5d9f3 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/PermUnlocksCommand.java +++ b/src/main/java/com/diamondfire/helpbot/bot/command/impl/other/PermUnlocksCommand.java @@ -1,6 +1,7 @@ package com.diamondfire.helpbot.bot.command.impl.other; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.command.argument.ArgumentSet; import com.diamondfire.helpbot.bot.command.argument.impl.types.DefinedObjectArgument; import com.diamondfire.helpbot.bot.command.help.*; @@ -53,7 +54,7 @@ public void run(CommandEvent event) { ); List commands = new ArrayList<>(); - List commandList = new ArrayList<>(HelpBotInstance.getHandler().getCommands().values()); + List commandList = new ArrayList<>(CommandHandler.getInstance().getCommands().values()); commandList.sort(Comparator.comparingInt((command) -> command.getPermission().ordinal())); for (Command command : commandList) { diff --git a/src/main/java/com/diamondfire/helpbot/bot/events/CommandEvent.java b/src/main/java/com/diamondfire/helpbot/bot/events/CommandEvent.java index de911cae..c0bf75d9 100644 --- a/src/main/java/com/diamondfire/helpbot/bot/events/CommandEvent.java +++ b/src/main/java/com/diamondfire/helpbot/bot/events/CommandEvent.java @@ -1,6 +1,7 @@ package com.diamondfire.helpbot.bot.events; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.command.argument.impl.parsing.ParsedArgumentSet; import com.diamondfire.helpbot.bot.command.argument.impl.parsing.exceptions.ArgumentException; import com.diamondfire.helpbot.bot.command.argument.impl.parsing.parser.ArgumentParser; @@ -16,7 +17,8 @@ public class CommandEvent extends GuildMessageReceivedEvent { private final Command command; private final ReplyHandler replyHandler = new ReplyHandler(getChannel()); - //TODO Cleanup and refactor this. I'd like to see stuff like replying be put into it's whole own section and refactored as well. + //TODO Cleanup and refactor this. + // I'd like to see stuff like replying be put into it's whole own section and refactored as well. private ParsedArgumentSet parsedArgumentSet = null; private String aliasedUsed = null; @@ -26,10 +28,10 @@ public CommandEvent(Message message) { String commandPrefix = rawArgs[0].substring(HelpBotInstance.getConfig().getPrefix().length()).toLowerCase(); - Command cmd = HelpBotInstance.getHandler().getCommands().get(commandPrefix.toLowerCase()); + Command cmd = CommandHandler.getInstance().getCommands().get(commandPrefix.toLowerCase()); if (cmd == null) { this.aliasedUsed = commandPrefix.toLowerCase(); - cmd = HelpBotInstance.getHandler().getAliases().get(commandPrefix.toLowerCase()); + cmd = CommandHandler.getInstance().getAliases().get(commandPrefix.toLowerCase()); } this.command = cmd; diff --git a/src/main/java/com/diamondfire/helpbot/df/codeinfo/codedatabase/changelog/CodeDifferenceHandler.java b/src/main/java/com/diamondfire/helpbot/df/codeinfo/codedatabase/changelog/CodeDifferenceHandler.java index ab13c1cf..c16efc3f 100644 --- a/src/main/java/com/diamondfire/helpbot/df/codeinfo/codedatabase/changelog/CodeDifferenceHandler.java +++ b/src/main/java/com/diamondfire/helpbot/df/codeinfo/codedatabase/changelog/CodeDifferenceHandler.java @@ -11,8 +11,6 @@ public class CodeDifferenceHandler { - //TODO Cleanup - static StringBuilder differences = new StringBuilder(); static ArrayList differs = new ArrayList<>(); @@ -39,41 +37,17 @@ public static void setComparer(File toCompare) { private static void generateDifferences() throws IOException { BufferedReader txtReader = new BufferedReader(new FileReader(ExternalFiles.DB_COMPARE.getPath())); - String json = txtReader.lines().collect(Collectors.joining()); - txtReader.close(); - - JsonReader reader = new JsonReader(new StringReader(json)); - //reader.setLenient(true); - BufferedReader txtReader2 = new BufferedReader(new FileReader(ExternalFiles.DB.getPath())); - String json2 = txtReader2.lines().collect(Collectors.joining()); - txtReader2.close(); - - JsonReader reader2 = new JsonReader(new StringReader(json2)); - //reader2.setLenient(true); - - JsonObject objectOld; - try { - objectOld = JsonParser.parseReader(reader).getAsJsonObject(); - } catch (Exception e) { - System.out.println("Old db is corrupted, rewriting!"); - Files.copy(ExternalFiles.DB.toPath(), ExternalFiles.DB_COMPARE.toPath(), StandardCopyOption.REPLACE_EXISTING); - return; - } - // Setup the reader to prevent parsing problems. - - JsonObject object = JsonParser.parseReader(reader2).getAsJsonObject(); - - // object is new - // object old is old instance + List jsonObjects = readDiff(txtReader,txtReader2); - compare(object.get("codeblocks").getAsJsonArray(), objectOld.get("codeblocks").getAsJsonArray(), "name"); - compare(object.get("actions").getAsJsonArray(), objectOld.get("actions").getAsJsonArray(), "name"); - compare(object.get("gameValues").getAsJsonArray(), objectOld.get("gameValues").getAsJsonArray(), "name"); - compare(object.get("particles").getAsJsonArray(), objectOld.get("particles").getAsJsonArray(), "particle"); - compare(object.get("potions").getAsJsonArray(), objectOld.get("potions").getAsJsonArray(), "potion"); - compare(object.get("sounds").getAsJsonArray(), objectOld.get("sounds").getAsJsonArray(), "sound"); + //Clean up here maybe possible but it isn't that bad + compare(jsonObjects.get(0).get("codeblocks").getAsJsonArray(), jsonObjects.get(1).get("codeblocks").getAsJsonArray(), "name"); + compare(jsonObjects.get(0).get("actions").getAsJsonArray(), jsonObjects.get(1).get("actions").getAsJsonArray(), "name"); + compare(jsonObjects.get(0).get("gameValues").getAsJsonArray(), jsonObjects.get(1).get("gameValues").getAsJsonArray(), "name"); + compare(jsonObjects.get(0).get("particles").getAsJsonArray(), jsonObjects.get(1).get("particles").getAsJsonArray(), "particle"); + compare(jsonObjects.get(0).get("potions").getAsJsonArray(), jsonObjects.get(1).get("potions").getAsJsonArray(), "potion"); + compare(jsonObjects.get(0).get("sounds").getAsJsonArray(), jsonObjects.get(1).get("sounds").getAsJsonArray(), "sound"); if (differs.size() >= 20) { differences.append(String.format("\n+ %s Modifications...", differs.size())); } else { @@ -136,6 +110,37 @@ private static void compare(JsonArray array, JsonArray oldArray, String keyName) e.printStackTrace(); } } + + /** + * Does stuff with readers to parse old and new JSON data + * + * @param readers - readers being parsed + * @return parsed JsonObjects + * @throws IOException {@link BufferedReader#close()} + */ + private static List readDiff(BufferedReader... readers) throws IOException { + List jsonObjects = new ArrayList<>(); + + for (BufferedReader reader : readers) { + String rawJson = reader.lines().collect(Collectors.joining()); + reader.close(); + + JsonReader readerJson = new JsonReader(new StringReader(rawJson)); + + JsonObject jsonObject = null; + try { + jsonObject = JsonParser.parseReader(readerJson).getAsJsonObject(); + } catch (Exception e) { + System.out.println("Old db is corrupted, rewriting!"); + Files.copy(ExternalFiles.DB.toPath(), ExternalFiles.DB_COMPARE.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + + jsonObjects.add(jsonObject); + } + + + return jsonObjects; + } } diff --git a/src/main/java/com/diamondfire/helpbot/sys/message/acceptors/CommandAcceptor.java b/src/main/java/com/diamondfire/helpbot/sys/message/acceptors/CommandAcceptor.java index a52ca15d..5b48c619 100644 --- a/src/main/java/com/diamondfire/helpbot/sys/message/acceptors/CommandAcceptor.java +++ b/src/main/java/com/diamondfire/helpbot/sys/message/acceptors/CommandAcceptor.java @@ -1,6 +1,7 @@ package com.diamondfire.helpbot.sys.message.acceptors; import com.diamondfire.helpbot.bot.HelpBotInstance; +import com.diamondfire.helpbot.bot.command.CommandHandler; import com.diamondfire.helpbot.bot.events.CommandEvent; import net.dv8tion.jda.api.entities.Message; @@ -9,7 +10,7 @@ public class CommandAcceptor implements MessageAcceptor { @Override public boolean accept(Message message) { if (message.getContentDisplay().startsWith(HelpBotInstance.getConfig().getPrefix()) && !message.getAuthor().isBot()) { - HelpBotInstance.getHandler().run(new CommandEvent(message)); + CommandHandler.getInstance().run(new CommandEvent(message)); return true; }