From 0d15c40cb74d3cb65a2b480d0de5e79090d8100f Mon Sep 17 00:00:00 2001 From: len <40720638+destro174@users.noreply.github.com> Date: Mon, 10 May 2021 10:01:35 +0200 Subject: [PATCH] Start working on the API before adding the server implementation --- .gitignore | 3 +- api/pom.xml | 52 +++++++ api/src/main/java/com/alttd/chat/ChatAPI.java | 12 ++ .../com/alttd/chat/ChatImplementation.java | 23 +++ galaxy/pom.xml | 60 ++++++++ pom.xml | 132 +++++------------- .../com/alttd/chat/handlers/ChatHandler.java | 66 --------- velocity/pom.xml | 121 ++++++++++++++++ .../main/java/com/alttd/chat/ChatPlugin.java | 28 ++-- .../alttd/chat/api/GlobalStaffChatEvent.java | 21 +++ .../java/com/alttd/chat/api/MessageEvent.java | 0 .../alttd/chat/commands/GlobalAdminChat.java | 42 ++++++ .../com/alttd/chat/commands/GlobalChat.java | 2 +- .../alttd/chat/commands/GlobalChatToggle.java | 51 +++++++ .../java/com/alttd/chat/commands/Message.java | 0 .../java/com/alttd/chat/config/Config.java | 74 ++++++---- .../com/alttd/chat/config/ServerConfig.java | 11 ++ .../com/alttd/chat/handlers/ChatHandler.java | 132 ++++++++++++++++++ .../com/alttd/chat/handlers/ChatPlayer.java | 0 .../alttd/chat/listeners/ChatListener.java | 32 ++++- .../alttd/chat/listeners/PlayerListener.java | 0 .../main/java/com/alttd/chat/util/Regex.java | 1 + 22 files changed, 658 insertions(+), 205 deletions(-) create mode 100644 api/pom.xml create mode 100644 api/src/main/java/com/alttd/chat/ChatAPI.java create mode 100644 api/src/main/java/com/alttd/chat/ChatImplementation.java create mode 100644 galaxy/pom.xml delete mode 100644 src/main/java/com/alttd/chat/handlers/ChatHandler.java create mode 100644 velocity/pom.xml rename {src => velocity/src}/main/java/com/alttd/chat/ChatPlugin.java (75%) create mode 100644 velocity/src/main/java/com/alttd/chat/api/GlobalStaffChatEvent.java rename {src => velocity/src}/main/java/com/alttd/chat/api/MessageEvent.java (100%) create mode 100644 velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java rename {src => velocity/src}/main/java/com/alttd/chat/commands/GlobalChat.java (96%) create mode 100644 velocity/src/main/java/com/alttd/chat/commands/GlobalChatToggle.java rename {src => velocity/src}/main/java/com/alttd/chat/commands/Message.java (100%) rename {src => velocity/src}/main/java/com/alttd/chat/config/Config.java (61%) rename {src => velocity/src}/main/java/com/alttd/chat/config/ServerConfig.java (82%) create mode 100644 velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java rename {src => velocity/src}/main/java/com/alttd/chat/handlers/ChatPlayer.java (100%) rename {src => velocity/src}/main/java/com/alttd/chat/listeners/ChatListener.java (64%) rename {src => velocity/src}/main/java/com/alttd/chat/listeners/PlayerListener.java (100%) rename {src => velocity/src}/main/java/com/alttd/chat/util/Regex.java (94%) diff --git a/.gitignore b/.gitignore index 9103db8..f5f928a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -# ProxyUtils +# Chat +*/target/ .idea testserver run diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 0000000..e10dc6e --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + + 11 + 11 + + + + com.alttd.chat + Chat + 1.0 + + + chat-api + jar + + + clean package + ${project.name} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 11 + 11 + + + + + + src/main + true + + + + + + + net.luckperms + api + 5.3 + provided + + + + \ No newline at end of file diff --git a/api/src/main/java/com/alttd/chat/ChatAPI.java b/api/src/main/java/com/alttd/chat/ChatAPI.java new file mode 100644 index 0000000..e377084 --- /dev/null +++ b/api/src/main/java/com/alttd/chat/ChatAPI.java @@ -0,0 +1,12 @@ +package com.alttd.chat; + +import net.luckperms.api.LuckPerms; + +public interface ChatAPI { + + /*public static ChatAPI get() { + return ChatImplementation.INSTANCE; + }*/ + + LuckPerms getLuckPerms(); +} diff --git a/api/src/main/java/com/alttd/chat/ChatImplementation.java b/api/src/main/java/com/alttd/chat/ChatImplementation.java new file mode 100644 index 0000000..f9dae8b --- /dev/null +++ b/api/src/main/java/com/alttd/chat/ChatImplementation.java @@ -0,0 +1,23 @@ +package com.alttd.chat; + +import net.luckperms.api.LuckPerms; +import net.luckperms.api.LuckPermsProvider; + +public class ChatImplementation implements ChatAPI{ + + //public static final ChatAPI INSTANCE = new ChatImplementation(); + + private LuckPerms luckPerms; + + ChatImplementation() { + // init database + // init depends//or set them the first time they are called? + } + + @Override + public LuckPerms getLuckPerms() { + if(luckPerms == null) + luckPerms = LuckPermsProvider.get(); + return luckPerms; + } +} diff --git a/galaxy/pom.xml b/galaxy/pom.xml new file mode 100644 index 0000000..da639cd --- /dev/null +++ b/galaxy/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + + 11 + 11 + + + + com.alttd.chat + Chat + 1.0 + + + galaxy-chat + jar + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + + + src/main/resources + true + + + + + + + Alttd-Nexus + http://leo:8081/snapshots/ + + + + + + com.alttd.galaxy + galaxy-api + 1.16.5-R0.1-SNAPSHOT + + + com.alttd.chat + chat-api + ${project.version} + compile + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f7e7fc1..5030d11 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.alttd.chat Chat 1.0 - jar + pom Chat @@ -17,102 +17,42 @@ 11 + - clean package - ${project.name} - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 11 - 11 - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - package - - shade - - - - - net.kyori:* - - META-INF/*.MF - - - - - - net.kyori:adventure-text-minimessage - - - META-INF/*.MF - - - - - - - - - - src/main - true - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + - - - velocitypowered-repo - https://repo.velocitypowered.com/releases/ - - - minecraft-libraries - https://libraries.minecraft.net/ - - - jcenter - jcenter-bintray - https://jcenter.bintray.com - - - sonatype-oss-snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - - - - com.velocitypowered - velocity-api - 1.1.4 - provided - - - net.luckperms - api - 5.3 - provided - - - net.dv8tion - JDA - 4.2.0_168 - provided - - - net.kyori - adventure-text-minimessage - 4.1.0-SNAPSHOT - - + + api + galaxy + velocity + diff --git a/src/main/java/com/alttd/chat/handlers/ChatHandler.java b/src/main/java/com/alttd/chat/handlers/ChatHandler.java deleted file mode 100644 index c758017..0000000 --- a/src/main/java/com/alttd/chat/handlers/ChatHandler.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.alttd.chat.handlers; - -import com.alttd.chat.config.Config; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.proxy.Player; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; - -import java.util.*; - -public class ChatHandler { - - private List chatPlayers; - - public ChatHandler() { - chatPlayers = new ArrayList<>(); - } - - public void addPlayer(ChatPlayer chatPlayer) { - chatPlayers.add(chatPlayer); - } - - public void removePlayer(ChatPlayer chatPlayer) { - if(chatPlayer != null) - chatPlayers.remove(chatPlayer); - } - - public void removePlayer(UUID uuid) { - removePlayer(getChatPlayer(uuid)); - } - - public ChatPlayer getChatPlayer(UUID uuid) { - for(ChatPlayer p: chatPlayers) { - if(p.getUuid() == uuid) - return p; - } - return null; - } - - public List getChatPlayers() { - return Collections.unmodifiableList(chatPlayers); - } - - public void globalChat(CommandSource source, String message) { - String senderName, serverName; - Map map = new HashMap<>(); - - if (source instanceof Player) { - Player sender = (Player) source; - senderName = sender.getUsername(); - serverName = sender.getCurrentServer().isPresent() ? sender.getCurrentServer().get().getServerInfo().getName() : "Altitude"; - } else { - senderName = "Console"; // TODO console name from config - serverName = "Altitude"; - } - map.put("sender", senderName); - map.put("message", message); - map.put("server", serverName); - - for(ChatPlayer p: chatPlayers) { - if(p.isGlobalChatEnabled()); - p.getPlayer().sendMessage(MiniMessage.get().parse(Config.GCFORMAT, map)); - //TODO send global chat with format from config - } - } -} diff --git a/velocity/pom.xml b/velocity/pom.xml new file mode 100644 index 0000000..04f6295 --- /dev/null +++ b/velocity/pom.xml @@ -0,0 +1,121 @@ + + + 4.0.0 + + + 11 + 11 + + + + com.alttd.chat + Chat + 1.0 + + + velocity-chat + jar + + + clean package + ${project.name} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 11 + 11 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + net.kyori:* + + META-INF/*.MF + + + + + + net.kyori:adventure-text-minimessage + + + META-INF/*.MF + + + + + + + + + + src/main + true + + + + + + + velocitypowered-repo + https://repo.velocitypowered.com/releases/ + + + minecraft-libraries + https://libraries.minecraft.net/ + + + jcenter + jcenter-bintray + https://jcenter.bintray.com + + + sonatype-oss-snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + + + + + com.velocitypowered + velocity-api + 1.1.4 + provided + + + net.luckperms + api + 5.3 + provided + + + net.kyori + adventure-text-minimessage + 4.1.0-SNAPSHOT + + + com.alttd.chat + chat-api + ${project.version} + compile + + + + + \ No newline at end of file diff --git a/src/main/java/com/alttd/chat/ChatPlugin.java b/velocity/src/main/java/com/alttd/chat/ChatPlugin.java similarity index 75% rename from src/main/java/com/alttd/chat/ChatPlugin.java rename to velocity/src/main/java/com/alttd/chat/ChatPlugin.java index a35eeb1..8a9eaf6 100644 --- a/src/main/java/com/alttd/chat/ChatPlugin.java +++ b/velocity/src/main/java/com/alttd/chat/ChatPlugin.java @@ -1,11 +1,15 @@ package com.alttd.chat; +import com.alttd.chat.commands.GlobalAdminChat; +import com.alttd.chat.commands.GlobalChat; +import com.alttd.chat.commands.GlobalChatToggle; import com.alttd.chat.config.Config; import com.alttd.chat.handlers.ChatHandler; import com.alttd.chat.listeners.ChatListener; import com.google.inject.Inject; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.plugin.Dependency; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; @@ -18,7 +22,8 @@ import java.nio.file.Path; @Plugin(id = "chatplugin", name = "ChatPlugin", version = "1.0.0", description = "A chat plugin for Altitude Minecraft Server", - authors = {"destro174", "teri"} + authors = {"destro174", "teri"}, + dependencies = {@Dependency(id = "luckperms")} ) public class ChatPlugin { @@ -26,15 +31,15 @@ public class ChatPlugin { private final ProxyServer server; private final Logger logger; private final Path dataDirectory; - private LuckPerms luckPerms; + private ChatAPI chatAPI; private ChatHandler chatHandler; @Inject - public ChatPlugin(ProxyServer proxyServer, Logger proxylogger, @DataDirectory Path proxydataDirectory) { + public ChatPlugin(ProxyServer proxyServer, Logger proxyLogger, @DataDirectory Path proxydataDirectory) { plugin = this; server = proxyServer; - logger = proxylogger; + logger = proxyLogger; dataDirectory = proxydataDirectory; } @@ -42,10 +47,9 @@ public class ChatPlugin { public void onProxyInitialization(ProxyInitializeEvent event) { Config.init(getDataDirectory()); loadCommands(); + chatAPI = new ChatImplementation(); chatHandler = new ChatHandler(); server.getEventManager().register(this, new ChatListener()); - //statusTask = new StatusTask(); - //statusTask.init(); } public File getDataDirectory() { @@ -56,11 +60,6 @@ public class ChatPlugin { return plugin; } - public LuckPerms getLuckPerms() { - if(luckPerms == null) - luckPerms = LuckPermsProvider.get(); - return luckPerms; - } public Logger getLogger() { return logger; @@ -71,9 +70,16 @@ public class ChatPlugin { } public void loadCommands() { + new GlobalAdminChat(server); + new GlobalChatToggle(server); + new GlobalChat(server); // all commands go here } + public ChatAPI API() { + return chatAPI; + } + public ChatHandler getChatHandler() { return chatHandler; } diff --git a/velocity/src/main/java/com/alttd/chat/api/GlobalStaffChatEvent.java b/velocity/src/main/java/com/alttd/chat/api/GlobalStaffChatEvent.java new file mode 100644 index 0000000..ededb1f --- /dev/null +++ b/velocity/src/main/java/com/alttd/chat/api/GlobalStaffChatEvent.java @@ -0,0 +1,21 @@ +package com.alttd.chat.api; + +import com.velocitypowered.api.command.CommandSource; + +public class GlobalStaffChatEvent { + private final CommandSource sender; + private final String message; + + public GlobalStaffChatEvent(CommandSource sender, String message) { + this.sender = sender; + this.message = message; + } + + public CommandSource getSender() { + return sender; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/alttd/chat/api/MessageEvent.java b/velocity/src/main/java/com/alttd/chat/api/MessageEvent.java similarity index 100% rename from src/main/java/com/alttd/chat/api/MessageEvent.java rename to velocity/src/main/java/com/alttd/chat/api/MessageEvent.java diff --git a/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java b/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java new file mode 100644 index 0000000..17deb72 --- /dev/null +++ b/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java @@ -0,0 +1,42 @@ +package com.alttd.chat.commands; + +import com.alttd.chat.api.GlobalStaffChatEvent; +import com.alttd.chat.config.Config; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.ProxyServer; + +public class GlobalAdminChat { + + public GlobalAdminChat(ProxyServer proxyServer) { + LiteralCommandNode command = LiteralArgumentBuilder + .literal("globaladminchat") + .requires(ctx -> ctx.hasPermission("command.proxy.globaladminchat"))// TODO permission system? load permissions from config? + .then(RequiredArgumentBuilder + .argument("message", StringArgumentType.greedyString()) + .executes(context -> { + proxyServer.getEventManager().fire(new GlobalStaffChatEvent(context.getSource(), context.getArgument("message", String.class))); + return 1; + }) // TODO call in the same way as gc? + ) + .executes(context -> 0) + .build(); + + BrigadierCommand brigadierCommand = new BrigadierCommand(command); + + CommandMeta.Builder metaBuilder = proxyServer.getCommandManager().metaBuilder(brigadierCommand); + + for (String alias : Config.GACECOMMANDALIASES) { + metaBuilder.aliases(alias); + } + + CommandMeta meta = metaBuilder.build(); + + proxyServer.getCommandManager().register(meta, brigadierCommand); + } +} diff --git a/src/main/java/com/alttd/chat/commands/GlobalChat.java b/velocity/src/main/java/com/alttd/chat/commands/GlobalChat.java similarity index 96% rename from src/main/java/com/alttd/chat/commands/GlobalChat.java rename to velocity/src/main/java/com/alttd/chat/commands/GlobalChat.java index 4e0848c..9f46f39 100644 --- a/src/main/java/com/alttd/chat/commands/GlobalChat.java +++ b/velocity/src/main/java/com/alttd/chat/commands/GlobalChat.java @@ -16,6 +16,7 @@ public class GlobalChat { public GlobalChat(ProxyServer proxyServer) { LiteralCommandNode command = LiteralArgumentBuilder .literal("globalchat") + .requires(ctx -> ctx.hasPermission(Config.GCPERMISSION)) .requires(ctx -> ctx.hasPermission("command.proxy.globalchat"))// TODO permission system? load permissions from config? .then(RequiredArgumentBuilder .argument("message", StringArgumentType.greedyString()) @@ -25,7 +26,6 @@ public class GlobalChat { }) ) .executes(context -> 0) - .executes(context -> 0) .build(); BrigadierCommand brigadierCommand = new BrigadierCommand(command); diff --git a/velocity/src/main/java/com/alttd/chat/commands/GlobalChatToggle.java b/velocity/src/main/java/com/alttd/chat/commands/GlobalChatToggle.java new file mode 100644 index 0000000..a408b36 --- /dev/null +++ b/velocity/src/main/java/com/alttd/chat/commands/GlobalChatToggle.java @@ -0,0 +1,51 @@ +package com.alttd.chat.commands; + +import com.alttd.chat.ChatPlugin; +import com.alttd.chat.config.Config; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.node.Node; + +public class GlobalChatToggle { + + public GlobalChatToggle(ProxyServer proxyServer) { + LiteralCommandNode command = LiteralArgumentBuilder + .literal("toggleglobalchat") + .requires(ctx -> ctx instanceof Player) + .requires(ctx -> ctx.hasPermission("command.proxy.globalchat"))// TODO permission system? load permissions from config? + .then(RequiredArgumentBuilder + .argument("message", StringArgumentType.greedyString()) + .executes(context -> { + LuckPerms luckPerms = ChatPlugin.getPlugin().API().getLuckPerms(); + Player player = (Player) context; + luckPerms.getUserManager().modifyUser(player.getUniqueId(), user -> { + if(player.hasPermission(Config.GCPERMISSION)) { //TODO THIS MUST BE A CONSTANT FROM CONFIG? + user.data().add(Node.builder(Config.GCPERMISSION).build()); + } else { + user.data().remove(Node.builder(Config.GCPERMISSION).build()); + } + }); + return 1; + }) + ) + .executes(context -> 0) + .build(); + + BrigadierCommand brigadierCommand = new BrigadierCommand(command); + + CommandMeta.Builder metaBuilder = proxyServer.getCommandManager().metaBuilder(brigadierCommand); + metaBuilder.aliases("togglegc"); + + CommandMeta meta = metaBuilder.build(); + + proxyServer.getCommandManager().register(meta, brigadierCommand); + } +} diff --git a/src/main/java/com/alttd/chat/commands/Message.java b/velocity/src/main/java/com/alttd/chat/commands/Message.java similarity index 100% rename from src/main/java/com/alttd/chat/commands/Message.java rename to velocity/src/main/java/com/alttd/chat/commands/Message.java diff --git a/src/main/java/com/alttd/chat/config/Config.java b/velocity/src/main/java/com/alttd/chat/config/Config.java similarity index 61% rename from src/main/java/com/alttd/chat/config/Config.java rename to velocity/src/main/java/com/alttd/chat/config/Config.java index 0df1fb4..6ff3cd0 100644 --- a/src/main/java/com/alttd/chat/config/Config.java +++ b/velocity/src/main/java/com/alttd/chat/config/Config.java @@ -1,6 +1,8 @@ package com.alttd.chat.config; +import com.alttd.chat.ChatPlugin; import com.google.common.base.Throwables; +import com.google.common.collect.Lists; import com.google.common.reflect.TypeToken; import ninja.leaping.configurate.ConfigurationNode; import ninja.leaping.configurate.objectmapping.ObjectMappingException; @@ -34,11 +36,17 @@ public final class Config { .setFlowStyle(DumperOptions.FlowStyle.BLOCK) .build(); if (!CONFIG_FILE.getParentFile().exists()) { - CONFIG_FILE.getParentFile().mkdirs(); + if(!CONFIG_FILE.getParentFile().mkdirs()) { + ChatPlugin.getPlugin().getLogger().error("Could create config and/or directory"); + return; + } } if (!CONFIG_FILE.exists()) { try { - CONFIG_FILE.createNewFile(); + if(!CONFIG_FILE.createNewFile()) { + ChatPlugin.getPlugin().getLogger().error("Could create config and/or directory"); + return; + } } catch (IOException error) { error.printStackTrace(); } @@ -71,9 +79,8 @@ public final class Config { try { method.setAccessible(true); method.invoke(instance); - } catch (InvocationTargetException ex) { + } catch (InvocationTargetException | IllegalAccessException ex) { throw Throwables.propagate(ex.getCause()); - } catch (Exception ex) { } } } @@ -81,15 +88,15 @@ public final class Config { try { configLoader.save(config); } catch (IOException ex) { + throw Throwables.propagate(ex.getCause()); } } - public static boolean saveConfig() { + public static void saveConfig() { try { configLoader.save(config); - return true; } catch (IOException ex) { - return false; + throw Throwables.propagate(ex.getCause()); } } @@ -102,6 +109,14 @@ public final class Config { config.getNode(splitPath(path)).setValue(def); } + private static void setString(String path, String def) { + try { + if(config.getNode(splitPath(path)).isVirtual()) + config.getNode(splitPath(path)).setValue(TypeToken.of(String.class), def); + } catch(ObjectMappingException ex) { + } + } + private static boolean getBoolean(String path, boolean def) { set(path, def); return config.getNode(splitPath(path)).getBoolean(def); @@ -118,7 +133,7 @@ public final class Config { } private static String getString(String path, String def) { - set(path, def); + setString(path, def); return config.getNode(splitPath(path)).getString(def); } @@ -127,7 +142,7 @@ public final class Config { return config.getNode(splitPath(path)).getLong(def); } - private static List getList(String path, T def) { + private static List getList(String path, T def) { try { set(path, def); return config.getNode(splitPath(path)).getList(TypeToken.of(String.class)); @@ -137,38 +152,39 @@ public final class Config { } /** ONLY EDIT ANYTHING BELOW THIS LINE **/ + public static List PREFIXGROUPS = new ArrayList<>(); + private static void settings() { + PREFIXGROUPS = getList("settings.prefix-groups", + Lists.newArrayList("discord", "socialmedia", "eventteam", "eventleader", "youtube", "twitch", "developer")); + } public static List MESSAGECOMMANDALIASES = new ArrayList<>(); public static List REPLYCOMMANDALIASES = new ArrayList<>(); - public static String MESSAGESENDER = " '>(Me -> ) "; - public static String MESSAGERECIEVER = " '>( on -> Me) "; + public static String MESSAGESENDER = " >(Me -> ) "; + public static String MESSAGERECIEVER = " >( on -> Me) "; private static void messageCommand() { MESSAGECOMMANDALIASES.clear(); REPLYCOMMANDALIASES.clear(); - getList("commands.message.aliases", new ArrayList(){{ - add("msg"); - add("whisper"); - add("tell"); - }}).forEach(key -> { - MESSAGECOMMANDALIASES.add(key.toString()); - }); - getList("commands.reply.aliases", new ArrayList(){{ - add("r"); - }}).forEach(key -> { - REPLYCOMMANDALIASES.add(key.toString()); - }); + MESSAGECOMMANDALIASES = getList("commands.message.aliases", Lists.newArrayList("msg", "whisper", "tell")); + REPLYCOMMANDALIASES = getList("commands.reply.aliases", Lists.newArrayList("r")); MESSAGESENDER = getString("commands.message.sender-message", MESSAGESENDER); MESSAGERECIEVER = getString("commands.message.reciever-message", MESSAGERECIEVER); } public static List GCCOMMANDALIASES = new ArrayList<>(); - public static String GCFORMAT = "[&d{luckperms_prefix_element_highest}&f] &7{cmi_user_display_name} &eto Global&7: {message}"; + public static String GCFORMAT = " >to Global: "; + public static String GCPERMISSION = "proxy.globalchat"; private static void globalChat() { MESSAGERECIEVER = getString("commands.globalchat.format", MESSAGERECIEVER); - getList("commands.globalchat.aliases", new ArrayList(){{ - add("gc"); - }}).forEach(key -> { - GCCOMMANDALIASES.add(key.toString()); - }); + GCPERMISSION = getString("commands.globalchat.view-chat-permission", GCPERMISSION); + GCCOMMANDALIASES = getList("commands.globalchat.aliases", Lists.newArrayList("gc")); } + + public static List GACECOMMANDALIASES = new ArrayList<>(); + public static String GACFORMAT = " >( on -> Team) "; + private static void globalAdminChat() { + GACECOMMANDALIASES = getList("commands.globaladminchat.aliases", Lists.newArrayList("acg")); + GACFORMAT = getString("commands.globaladminchat.format", GACFORMAT); + } + } diff --git a/src/main/java/com/alttd/chat/config/ServerConfig.java b/velocity/src/main/java/com/alttd/chat/config/ServerConfig.java similarity index 82% rename from src/main/java/com/alttd/chat/config/ServerConfig.java rename to velocity/src/main/java/com/alttd/chat/config/ServerConfig.java index eaf8a6e..c6eaad4 100644 --- a/src/main/java/com/alttd/chat/config/ServerConfig.java +++ b/velocity/src/main/java/com/alttd/chat/config/ServerConfig.java @@ -1,5 +1,8 @@ package com.alttd.chat.config; +import com.google.common.reflect.TypeToken; +import ninja.leaping.configurate.objectmapping.ObjectMappingException; + import java.util.regex.Pattern; public final class ServerConfig { @@ -31,6 +34,14 @@ public final class ServerConfig { } } + private static void setString(String path, String def) { + try { + if(Config.config.getNode(splitPath(path)).isVirtual()) + Config.config.getNode(splitPath(path)).setValue(TypeToken.of(String.class), def); + } catch(ObjectMappingException ex) { + } + } + private boolean getBoolean(String path, boolean def) { set(defaultPath +path, def); return Config.config.getNode(splitPath(configPath+path)).getBoolean( diff --git a/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java b/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java new file mode 100644 index 0000000..d99767e --- /dev/null +++ b/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java @@ -0,0 +1,132 @@ +package com.alttd.chat.handlers; + +import com.alttd.chat.ChatPlugin; +import com.alttd.chat.config.Config; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.user.User; + +import java.util.*; + +public class ChatHandler { + + private List chatPlayers; + + public ChatHandler() { + chatPlayers = new ArrayList<>(); + } + + public void addPlayer(ChatPlayer chatPlayer) { + chatPlayers.add(chatPlayer); + } + + public void removePlayer(ChatPlayer chatPlayer) { + if(chatPlayer != null) + chatPlayers.remove(chatPlayer); + } + + public void removePlayer(UUID uuid) { + removePlayer(getChatPlayer(uuid)); + } + + public ChatPlayer getChatPlayer(UUID uuid) { + for(ChatPlayer p: chatPlayers) { + if(p.getUuid() == uuid) + return p; + } + return null; + } + + public List getChatPlayers() { + return Collections.unmodifiableList(chatPlayers); + } + + public void globalChat(CommandSource source, String message) { + String senderName, serverName, prefix; + Map map = new HashMap<>(); + + if (source instanceof Player) { + Player sender = (Player) source; + senderName = sender.getUsername(); + serverName = sender.getCurrentServer().isPresent() ? sender.getCurrentServer().get().getServerInfo().getName() : "Altitude"; + prefix = getPrefix(sender); + } else { + senderName = "Console"; // TODO console name from config + serverName = "Altitude"; + prefix = ""; + } + + MiniMessage miniMessage = MiniMessage.get(); + + map.put("sender", senderName); + map.put("message", message); + map.put("server", serverName); + map.put("prefix", prefix); + + Component component = miniMessage.parse(Config.GCFORMAT, map); + + for(Player p: ChatPlugin.getPlugin().getProxy().getAllPlayers()) { + if(p.hasPermission(Config.GCPERMISSION)); + p.sendMessage(component); + //TODO send global chat with format from config + } + + } + + /** + * returns a component containing all prefixes a player has. + * + * @param player the player + * @return a prefix component + */ + public String getPrefix(Player player) { + return getPrefix(player, false); + } + + /** + * returns a component containing all or only the highest prefix a player has. + * + * @param player the player + * @param highest + * @return a prefix component + */ + public String getPrefix(Player player, boolean highest) { + // TODO cache these components on load, and return them here? + StringBuilder prefix = new StringBuilder(); + LuckPerms luckPerms = ChatPlugin.getPlugin().API().getLuckPerms(); + User user = luckPerms.getUserManager().getUser(player.getUniqueId()); + if(user == null) return ""; + if(!highest) { + Collection inheritedGroups = user.getInheritedGroups(user.getQueryOptions()); + inheritedGroups.stream() + .sorted(Comparator.comparingInt(o -> o.getWeight().orElse(0))) + .forEach(group -> { + if (Config.PREFIXGROUPS.contains(group.getName())) { + prefix.append("[").append(group.getCachedData().getMetaData().getPrefix()).append("]"); + } + }); + } + LegacyComponentSerializer.builder().character('&').hexColors(); + prefix.append("[").append(user.getCachedData().getMetaData().getPrefix()).append("]"); + /*component= MiniMessage.get().parse(prefix.toString()); + CompletableFuture userFuture = luckPerms.getUserManager().loadUser(player.getUniqueId()); + userFuture.thenAcceptAsync(user -> { + Collection inheritedGroups = user.getInheritedGroups(user.getQueryOptions()); + inheritedGroups.stream() + .sorted((o1, o2) -> Integer.compare(o1.getWeight().orElse(0), o2.getWeight().orElse(0))) + .forEach(group -> { + if(Config.PREFIXGROUPS.contains(group.getName())) { + prefix.append("[").append(group.getCachedData().getMetaData().getPrefix()).append("]"); + } + }); + return MiniMessage.get().parse(prefix.toString()); + });*/ + //return MiniMessage.get().parse(prefix.toString()); + return prefix.toString(); + } +} diff --git a/src/main/java/com/alttd/chat/handlers/ChatPlayer.java b/velocity/src/main/java/com/alttd/chat/handlers/ChatPlayer.java similarity index 100% rename from src/main/java/com/alttd/chat/handlers/ChatPlayer.java rename to velocity/src/main/java/com/alttd/chat/handlers/ChatPlayer.java diff --git a/src/main/java/com/alttd/chat/listeners/ChatListener.java b/velocity/src/main/java/com/alttd/chat/listeners/ChatListener.java similarity index 64% rename from src/main/java/com/alttd/chat/listeners/ChatListener.java rename to velocity/src/main/java/com/alttd/chat/listeners/ChatListener.java index ef12336..eba136b 100644 --- a/src/main/java/com/alttd/chat/listeners/ChatListener.java +++ b/velocity/src/main/java/com/alttd/chat/listeners/ChatListener.java @@ -1,6 +1,7 @@ package com.alttd.chat.listeners; import com.alttd.chat.ChatPlugin; +import com.alttd.chat.api.GlobalStaffChatEvent; import com.alttd.chat.api.MessageEvent; import com.alttd.chat.config.Config; import com.velocitypowered.api.command.CommandSource; @@ -13,7 +14,7 @@ import net.kyori.adventure.text.minimessage.MiniMessage; import java.util.HashMap; import java.util.Map; - +// TODO code CLEANUP public class ChatListener { private ChatPlugin plugin; @@ -52,6 +53,35 @@ public class ChatListener { event.getRecipient().sendMessage(receiverMessage); } + @Subscribe(order = PostOrder.FIRST) + public void onGlobalStaffChat(GlobalStaffChatEvent event) { + String senderName; + String serverName; + CommandSource commandSource = event.getSender(); + if (commandSource instanceof Player) { + Player sender = (Player) event.getSender(); + senderName = sender.getUsername(); + serverName = sender.getCurrentServer().isPresent() ? sender.getCurrentServer().get().getServerInfo().getName() : "Altitude"; + } else { + senderName = "Console"; // TODO console name from config + serverName = "Proxy"; + } + + MiniMessage miniMessage = MiniMessage.get(); + + Map map = new HashMap<>(); + + map.put("sender", senderName); + map.put("message", event.getMessage()); + map.put("server", serverName); + + Component message = miniMessage.parse(Config.GACFORMAT, map); + + plugin.getProxy().getAllPlayers().stream().filter(target -> target.hasPermission("command.proxy.globaladminchat")).forEach(target -> { + target.sendMessage(message); + }); + } + @Subscribe(order = PostOrder.FIRST) public void onPlayerChat(PlayerChatEvent event) { // do stuff diff --git a/src/main/java/com/alttd/chat/listeners/PlayerListener.java b/velocity/src/main/java/com/alttd/chat/listeners/PlayerListener.java similarity index 100% rename from src/main/java/com/alttd/chat/listeners/PlayerListener.java rename to velocity/src/main/java/com/alttd/chat/listeners/PlayerListener.java diff --git a/src/main/java/com/alttd/chat/util/Regex.java b/velocity/src/main/java/com/alttd/chat/util/Regex.java similarity index 94% rename from src/main/java/com/alttd/chat/util/Regex.java rename to velocity/src/main/java/com/alttd/chat/util/Regex.java index 641fe5f..353c2f6 100644 --- a/src/main/java/com/alttd/chat/util/Regex.java +++ b/velocity/src/main/java/com/alttd/chat/util/Regex.java @@ -11,6 +11,7 @@ public class Regex { private static final HashMap> cancelRegex = new HashMap<>(); private static final HashMap replaceRegex = new HashMap<>(); + // IDEA: Regex object -> RegexPattern, shatteredPattern, replacement, replacements public static void initRegex() { //TODO load data from config (a regex string, and it's exceptions if there are any) cancelRegex.put(Pattern.compile("\\b([R]+[^\\w]?[4A]+[^\\w]?[P]+(([^\\w]?[E3]+[^\\w]?[DT]*)|([^\\w]?[I!1]+[^\\w]?[S5]+[^\\w]?[T7]+)|([^\\w]?[I!1]+[^\\w]?[N]+[^\\w]?[G69]+)))\\b"), new ArrayList<>());