From 7a7d797401cbff7dd3e81d5f63061acccccb911c Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Fri, 10 Sep 2021 19:31:36 +0200 Subject: [PATCH] Initial commit ProxyDiscordLink --- .gitignore | 7 + .../alttd/proxydiscordlink/DiscordLink.java | 92 ++++++ .../commands/DiscordCommand.java | 92 ++++++ .../proxydiscordlink/commands/SubCommand.java | 19 ++ .../commands/subcommands/CheckLinked.java | 79 +++++ .../commands/subcommands/Link.java | 77 +++++ .../commands/subcommands/Unlink.java | 70 +++++ .../alttd/proxydiscordlink/config/Config.java | 220 +++++++++++++ .../proxydiscordlink/database/Database.java | 295 ++++++++++++++++++ .../database/DatabaseConnection.java | 49 +++ .../proxydiscordlink/events/playerJoin.java | 52 +++ .../proxydiscordlink/events/playerLeave.java | 23 ++ .../alttd/proxydiscordlink/util/ALogger.java | 29 ++ .../alttd/proxydiscordlink/util/Cache.java | 28 ++ .../proxydiscordlink/util/Utilities.java | 89 ++++++ 15 files changed, 1221 insertions(+) create mode 100644 .gitignore create mode 100644 src/main/java/com/alttd/proxydiscordlink/DiscordLink.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/commands/DiscordCommand.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/commands/SubCommand.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/commands/subcommands/CheckLinked.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/commands/subcommands/Link.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/commands/subcommands/Unlink.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/config/Config.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/database/Database.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/database/DatabaseConnection.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/events/playerJoin.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/events/playerLeave.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/util/ALogger.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/util/Cache.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/util/Utilities.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..71dd23b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.idea/ +*.iml +*.bat +*.xml +target/ +src/test/ +src/main/resources/ \ No newline at end of file diff --git a/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java new file mode 100644 index 0000000..6724426 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java @@ -0,0 +1,92 @@ +package com.alttd.proxydiscordlink; + +import com.alttd.proxydiscordlink.commands.DiscordCommand; +import com.alttd.proxydiscordlink.config.Config; +import com.alttd.proxydiscordlink.database.Database; +import com.alttd.proxydiscordlink.database.DatabaseConnection; +import com.alttd.proxydiscordlink.util.ALogger; +import com.alttd.proxydiscordlink.util.Cache; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.ProxyServer; + +import java.io.File; +import java.nio.file.Path; +import java.sql.SQLException; +import java.util.logging.Logger; + +@Plugin(id = "proxydiscordlink", name = "ProxyDiscordLink", version = "1.0.0", + description = "A plugin that links Discord accounts with uuid's", + authors = {"Teri"} +) +public class DiscordLink { + + private static DiscordLink plugin; + private final ProxyServer server; + private final Logger logger; + private final Path dataDirectory; + private final Database database; + private final Cache cache; + + @Inject + public DiscordLink(ProxyServer proxyServer, Logger proxyLogger, @DataDirectory Path proxydataDirectory) + { + plugin = this; + server = proxyServer; + logger = proxyLogger; + dataDirectory = proxydataDirectory; + database = new Database(); + cache = new Cache(); + } + + @Subscribe + public void onProxyInitialization(ProxyInitializeEvent event) { + ALogger.init(logger); + ReloadConfig(); + try { + DatabaseConnection.initialize(); + } catch (SQLException exception) { + exception.printStackTrace(); + getLogger().severe("*** Could not connect to the database. ***"); + getLogger().severe("*** This plugin will be disabled. ***"); + //TODO shutdown plugin + } + loadCommands(); + } + + public void ReloadConfig() { + Config.init(); + ALogger.info("Reloaded DiscordLink config."); + } + + public void loadCommands() {// all (proxy)commands go here + server.getCommandManager().register("discord", new DiscordCommand(), "discordlink"); + } + + public File getDataDirectory() { + return dataDirectory.toFile(); + } + + public static DiscordLink getPlugin() { + return plugin; + } + + public Logger getLogger() { + return logger; + } + + public ProxyServer getProxy() { + return server; + } + + public Database getDatabase() { + return database; + } + + public Cache getCache() { + return cache; + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/commands/DiscordCommand.java b/src/main/java/com/alttd/proxydiscordlink/commands/DiscordCommand.java new file mode 100644 index 0000000..e98bd6a --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/commands/DiscordCommand.java @@ -0,0 +1,92 @@ +package com.alttd.proxydiscordlink.commands; + +import com.alttd.proxydiscordlink.commands.subcommands.CheckLinked; +import com.alttd.proxydiscordlink.commands.subcommands.Link; +import com.alttd.proxydiscordlink.commands.subcommands.Unlink; +import com.alttd.proxydiscordlink.config.Config; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.SimpleCommand; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.Template; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class DiscordCommand implements SimpleCommand { + + private final List subCommands; + private final MiniMessage miniMessage; + + public DiscordCommand() { + subCommands = Arrays.asList(new CheckLinked(), new Link(), new Unlink()); + miniMessage = MiniMessage.get(); + } + + @Override + public void execute(Invocation invocation) { + String[] args = invocation.arguments(); + CommandSource source = invocation.source(); + + if (args.length < 1) { + if (!source.hasPermission("discordlink.link")) + source.sendMessage(miniMessage.parse(Config.NO_PERMISSION)); + else + source.sendMessage(miniMessage.parse(Config.DISCORD_LINK)); + return; + } + + subCommands.stream() + .filter(subCommand -> subCommand.getName().equalsIgnoreCase(args[0])) + .findFirst() + .ifPresentOrElse(subCommand -> subCommand.execute(args, source) + , () -> source.sendMessage(getHelpMessage(source))); + } + + @Override + public List suggest(Invocation invocation) { + String[] args = invocation.arguments(); + List suggest = new ArrayList<>(); + + if (args.length == 0) { + subCommands.forEach(subCommand -> suggest.add(subCommand.getName())); + } else if (args.length <= 1) { + subCommands.stream().filter(subCommand -> subCommand.getName().startsWith(args[0].toLowerCase())) + .forEach(subCommand -> suggest.add(subCommand.getName())); + } else { + subCommands.stream().filter(subCommand -> subCommand.getName().equalsIgnoreCase(args[0])).findFirst() + .ifPresent(subCommand -> suggest.addAll(subCommand.suggest(args))); + } + + if (args.length == 0) + return suggest; + else + return finalizeSuggest(suggest, args[args.length - 1]); + } + + public List finalizeSuggest(List possibleValues, String remaining) { + List finalValues = new ArrayList<>(); + + for (String str : possibleValues) { + if (str.toLowerCase().startsWith(remaining)) { + finalValues.add(StringArgumentType.escapeIfRequired(str)); + } + } + + return finalValues; + } + + private Component getHelpMessage(CommandSource source) { + StringBuilder stringBuilder = new StringBuilder(); + + subCommands.stream() + .filter(subCommand -> source.hasPermission(subCommand.getPermission())) + .forEach(subCommand -> stringBuilder.append(subCommand.getHelpMessage()).append("\n")); + if (stringBuilder.length() != 0) + stringBuilder.replace(stringBuilder.length() - 1, stringBuilder.length(), ""); + + return miniMessage.parse(Config.HELP_MESSAGE, Template.of("commands", stringBuilder.toString())); + } +} diff --git a/src/main/java/com/alttd/proxydiscordlink/commands/SubCommand.java b/src/main/java/com/alttd/proxydiscordlink/commands/SubCommand.java new file mode 100644 index 0000000..36d8f71 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/commands/SubCommand.java @@ -0,0 +1,19 @@ +package com.alttd.proxydiscordlink.commands; + +import com.velocitypowered.api.command.CommandSource; + +import java.util.List; + +public interface SubCommand { + + String getName(); + + String getPermission(); + + void execute(String[] args, CommandSource source); + + List suggest(String[] args); + + String getHelpMessage(); + +} diff --git a/src/main/java/com/alttd/proxydiscordlink/commands/subcommands/CheckLinked.java b/src/main/java/com/alttd/proxydiscordlink/commands/subcommands/CheckLinked.java new file mode 100644 index 0000000..db98c38 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/commands/subcommands/CheckLinked.java @@ -0,0 +1,79 @@ +package com.alttd.proxydiscordlink.commands.subcommands; + +import com.alttd.proxydiscordlink.DiscordLink; +import com.alttd.proxydiscordlink.commands.SubCommand; +import com.alttd.proxydiscordlink.config.Config; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.Template; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class CheckLinked implements SubCommand { + + private final String name; + private final String permission; + private final MiniMessage miniMessage; + + public CheckLinked() { + name = "checklinked"; + permission = "discordlink.checklinked"; + miniMessage = MiniMessage.get(); + } + + public String getName() { + return name; + } + + public String getPermission() { + return permission; + } + + @Override + public void execute(String[] args, CommandSource source) { + if (!source.hasPermission(getPermission())) { + source.sendMessage(miniMessage.parse(Config.NO_PERMISSION)); + return; + } + if (args.length != 2 || !args[1].matches("\\w{3,16}")) { + source.sendMessage(miniMessage.parse(getHelpMessage())); + return; + } + + Optional optionalPlayer = DiscordLink.getPlugin().getProxy().getPlayer(args[1]); + if (optionalPlayer.isEmpty()) + { + optionalPlayer = DiscordLink.getPlugin().getProxy() + .getPlayer(UUID.fromString(DiscordLink.getPlugin().getDatabase().uuidFromName(args[1]))); + if (optionalPlayer.isEmpty()) + { + source.sendMessage(miniMessage.parse(Config.INVALID_PLAYER)); + return; + } + } + + isLinked(source, optionalPlayer.get()); + } + + private void isLinked(CommandSource source, Player player) { + List