From 96dbdc6dd0399b5659862b95aba837cc24966bd1 Mon Sep 17 00:00:00 2001 From: destro174 <40720638+destro174@users.noreply.github.com> Date: Sun, 18 Jul 2021 00:48:55 +0200 Subject: [PATCH] Fix nicknames and prefixes --- api/pom.xml | 2 +- .../com/alttd/chat/ChatImplementation.java | 6 +- .../java/com/alttd/chat/config/Config.java | 2 +- .../chat/database/DatabaseConnection.java | 2 - .../java/com/alttd/chat/objects/ChatUser.java | 39 ++---- .../java/com/alttd/chat/util/Utility.java | 129 ++++++++++++++---- galaxy/dependency-reduced-pom.xml | 18 +++ galaxy/pom.xml | 18 ++- .../java/com/alttd/chat/commands/Message.java | 1 - .../com/alttd/chat/handler/ChatHandler.java | 8 +- .../alttd/chat/listeners/ChatListener.java | 19 +-- galaxy/src/main/resources/plugin.yml | 2 +- pom.xml | 7 +- .../alttd/chat/commands/GlobalAdminChat.java | 2 +- .../java/com/alttd/chat/commands/Message.java | 2 +- .../com/alttd/chat/commands/SendMail.java | 2 +- .../com/alttd/chat/handlers/ChatHandler.java | 20 ++- .../alttd/chat/listeners/ChatListener.java | 8 +- 18 files changed, 178 insertions(+), 109 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 2eb8b2a..ce30257 100755 --- a/api/pom.xml +++ b/api/pom.xml @@ -20,7 +20,7 @@ jar - + org.spongepowered configurate-yaml 3.7.1 diff --git a/api/src/main/java/com/alttd/chat/ChatImplementation.java b/api/src/main/java/com/alttd/chat/ChatImplementation.java index 28a4c49..853c868 100755 --- a/api/src/main/java/com/alttd/chat/ChatImplementation.java +++ b/api/src/main/java/com/alttd/chat/ChatImplementation.java @@ -13,15 +13,15 @@ public class ChatImplementation implements ChatAPI{ private static ChatAPI instance; private LuckPerms luckPerms; - private DatabaseConnection databaseConnection; // todo this isn't needed can be removed + private DatabaseConnection databaseConnection; public ChatImplementation() { instance = this; Config.init(); luckPerms = getLuckPerms(); - databaseConnection = getDataBase(); // todo fix sql - Queries.createTables(); // todo fix sql + databaseConnection = getDataBase(); + Queries.createTables(); ChatUserManager.initialize(); // loads all the users from the db and adds them. RegexManager.initialize(); // load the filters and regexes from config diff --git a/api/src/main/java/com/alttd/chat/config/Config.java b/api/src/main/java/com/alttd/chat/config/Config.java index 2602258..017f5ea 100755 --- a/api/src/main/java/com/alttd/chat/config/Config.java +++ b/api/src/main/java/com/alttd/chat/config/Config.java @@ -202,7 +202,7 @@ public final class Config { } // TODO prefixes need hovers, this hasn't been setup yet! - public static String CHATFORMAT = " : "; // @teri help with the default formatting? + public static String CHATFORMAT = " : "; private static void Chat() { CHATFORMAT = getString("chat.format", CHATFORMAT); } diff --git a/api/src/main/java/com/alttd/chat/database/DatabaseConnection.java b/api/src/main/java/com/alttd/chat/database/DatabaseConnection.java index 7a4afcd..0a78079 100755 --- a/api/src/main/java/com/alttd/chat/database/DatabaseConnection.java +++ b/api/src/main/java/com/alttd/chat/database/DatabaseConnection.java @@ -45,8 +45,6 @@ public class DatabaseConnection { e.printStackTrace(); } - ALogger.info("jdbc:mysql://" + Config.IP + ":" + Config.PORT + "/" + Config.DATABASE + "?autoReconnect=true"+ - "&useSSL=false"); connection = DriverManager.getConnection( "jdbc:mysql://" + Config.IP + ":" + Config.PORT + "/" + Config.DATABASE + "?autoReconnect=true"+ "&useSSL=false", diff --git a/api/src/main/java/com/alttd/chat/objects/ChatUser.java b/api/src/main/java/com/alttd/chat/objects/ChatUser.java index e4137a2..eda3b1a 100755 --- a/api/src/main/java/com/alttd/chat/objects/ChatUser.java +++ b/api/src/main/java/com/alttd/chat/objects/ChatUser.java @@ -2,6 +2,7 @@ package com.alttd.chat.objects; import com.alttd.chat.database.Queries; import com.alttd.chat.util.Utility; +import net.kyori.adventure.text.Component; import java.util.LinkedList; import java.util.UUID; @@ -10,10 +11,11 @@ public class ChatUser { private final UUID uuid; // player uuid private final int partyId; // the party they are in private boolean toggledPartyChat; // should chat messages instantly go to party chat when added, idk if this should be saved - private String displayName; // the nickname, doesn't need to be saved with the chatuser object, could be saved but we can get it from the nicknamesview - private String prefix; // doesn't need saving, we get this from luckperms - private String staffPrefix; // doesn't need saving, we get this from luckperms - private String prefixAll; // doesn't need saving, we get this from luckperms + private String name; // the nickname, doesn't need to be saved with the chatuser object, could be saved but we can get it from the nicknamesview + private Component displayName; // the nickname, doesn't need to be saved with the chatuser object, could be saved but we can get it from the nicknamesview + private Component prefix; // doesn't need saving, we get this from luckperms + private Component staffPrefix; // doesn't need saving, we get this from luckperms + private Component prefixAll; // doesn't need saving, we get this from luckperms private boolean toggleGc; // should be saved, this toggles if the player can see and use global chat private String replyTarget; // reply target for use in /msg i don't mind setting this to null on login, feedback? private long gcCooldown; // the time when they last used gc, is used for the cooldown, i wouldn't save this, but setting this to the login time means they can't use gc for 30 seconds after logging in @@ -27,10 +29,11 @@ public class ChatUser { this.partyId = partyId; this.toggledPartyChat = toggledChat; - displayName = Queries.getNickname(uuid); // todo fix sql - if (displayName == null) { - displayName = Utility.getDisplayName(uuid); + name = Queries.getNickname(uuid); + if (name == null) { + name = Utility.getDisplayName(uuid); } + setDisplayName(name); prefix = Utility.getPrefix(uuid, true); staffPrefix = Utility.getStaffPrefix(uuid); @@ -62,38 +65,26 @@ public class ChatUser { Queries.setPartyChatState(toggledPartyChat, uuid); //TODO: Async pls - no CompleteableFuture<>! } - public String getDisplayName() { + public Component getDisplayName() { return displayName; } public void setDisplayName(String displayName) { - this.displayName = displayName; + this.displayName = Utility.applyColor(displayName); } - public String getPrefix() { + public Component getPrefix() { return prefix; } - public void setPrefix(String prefix) { - this.prefix = prefix; - } - - public String getStaffPrefix() { + public Component getStaffPrefix() { return staffPrefix; } - public void setStaffPrefix(String staffPrefix) { - this.staffPrefix = staffPrefix; - } - - public String getPrefixAll() { + public Component getPrefixAll() { return prefixAll; } - public void setPrefixAll(String prefixAll) { - this.prefixAll = prefixAll; - } - public void toggleGc() { toggleGc = !toggleGc; } diff --git a/api/src/main/java/com/alttd/chat/util/Utility.java b/api/src/main/java/com/alttd/chat/util/Utility.java index 0696f7c..f955f39 100755 --- a/api/src/main/java/com/alttd/chat/util/Utility.java +++ b/api/src/main/java/com/alttd/chat/util/Utility.java @@ -2,21 +2,25 @@ package com.alttd.chat.util; import com.alttd.chat.ChatAPI; import com.alttd.chat.config.Config; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +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.Collection; -import java.util.Comparator; +import java.awt.*; +import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; public class Utility { + public static String stringRegen = "\\{#[A-Fa-f0-9]{6}(<)?(>)?}"; public static HashMap colors; static { // this might be in minimessage already? - colors = new HashMap<>(); // todo map all colors to minimessage + colors = new HashMap<>(); colors.put("&0", ""); // and confirm these are correct colors.put("&1", ""); // could also add some default hex colors here? colors.put("&2", ""); @@ -33,7 +37,6 @@ public class Utility { colors.put("&d", ""); colors.put("&e", ""); colors.put("&f", ""); - colors.put("&g", ""); // is this a thing? } public static String parseColors(String message) { @@ -47,45 +50,123 @@ public class Utility { return message; } - public static String getPrefix(UUID uuid, boolean highest) { + public static Component getPrefix(UUID uuid, boolean single) { StringBuilder prefix = new StringBuilder(); LuckPerms luckPerms = ChatAPI.get().getLuckPerms(); User user = luckPerms.getUserManager().getUser(uuid); - 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("]"); - } - }); + if(user == null) return Component.empty(); + if(single) { + Group group = luckPerms.getGroupManager().getGroup(user.getPrimaryGroup()); + if(group != null) + prefix.append(group.getCachedData().getMetaData().getPrefix()); +// Collection inheritedGroups = user.getInheritedGroups(user.getQueryOptions()); +// inheritedGroups.stream() +// .sorted(Comparator.comparingInt(o -> o.getWeight().orElse(0))) +// .distinct() +// .forEach(group -> { +// if (Config.PREFIXGROUPS.contains(group.getName())) { +// prefix.append("[").append(group.getCachedData().getMetaData().getPrefix()).append("]"); +// } +// }); + } else { + prefix.append(user.getCachedData().getMetaData().getPrefix()); } - LegacyComponentSerializer.builder().character('&').hexColors(); - prefix.append("[").append(user.getCachedData().getMetaData().getPrefix()).append("]"); - return prefix.toString(); + return LegacyComponentSerializer.builder().character('&').hexColors().build().deserialize(prefix.toString()); } - // @teri you don't reference the plugin instance from the API instance, this creates a circular reference and breaks on compile and will never run - public static String getStaffPrefix(UUID uuid) { + public static Component getStaffPrefix(UUID uuid) { StringBuilder prefix = new StringBuilder(); LuckPerms luckPerms = ChatAPI.get().getLuckPerms(); User user = luckPerms.getUserManager().getUser(uuid); - if(user == null) return prefix.toString(); + if(user == null) return Component.empty(); if(user.getCachedData().getPermissionData().checkPermission("group." + Config.MINIMIUMSTAFFRANK).asBoolean()) { - prefix.append("[").append(user.getCachedData().getMetaData().getPrefix()).append("]"); + Group group = luckPerms.getGroupManager().getGroup(user.getPrimaryGroup()); + if(group != null) + prefix.append(group.getCachedData().getMetaData().getPrefix()); } - return prefix.toString(); + return LegacyComponentSerializer.builder().character('&').hexColors().build().deserialize(prefix.toString()); } public static String getDisplayName(UUID uuid) { - StringBuilder prefix = new StringBuilder(); LuckPerms luckPerms = ChatAPI.get().getLuckPerms(); User user = luckPerms.getUserManager().getUser(uuid); if(user == null) return ""; return user.getUsername(); } + public static Component applyColor(String message) { + String hexColor1 = ""; + String hexColor2 = ""; + StringBuilder stringBuilder = new StringBuilder(); + message = parseColors(message); + boolean startsWithColor = false; + boolean lastColorMatters = false; + + if (message.matches(".*" + stringRegen + ".*")) { + String[] split = message.split(stringRegen); + + ArrayList list = new ArrayList<>(); + int nextIndex = 0; + if (message.indexOf("}") <= 11) { + startsWithColor = true; + list.add(message.substring(0, message.indexOf("}") + 1)); + } + for (String s : split) { + nextIndex += s.length(); + int tmp = message.indexOf("}", nextIndex); + if (tmp < message.length() && tmp>=0) { + list.add(message.substring(nextIndex, tmp + 1)); + nextIndex = tmp + 1; + } + } + + int i; + boolean firstLoop = true; + if (startsWithColor) { + i = -1; + } else { + i = 0; + stringBuilder.append(split[i]); + } + + for (String s : list) { + boolean lesser = s.contains("<"); + boolean bigger = s.contains(">"); + + if (bigger && lesser) { + hexColor2 = s.substring(1, s.length() - 3); + } else if (bigger || lesser) { + hexColor2 = s.substring(1, s.length() - 2); + } else { + hexColor2 = s.substring(1, s.length() -1); + } + + if (firstLoop) { + lastColorMatters = bigger; + hexColor1 = hexColor2; + firstLoop = false; + i++; + continue; + } + + if (lesser && lastColorMatters) { + stringBuilder.append("").append(split[i]).append(""); + } else { + stringBuilder.append("<").append(hexColor1).append(">").append(split[i]); + } + + hexColor1 = hexColor2; + lastColorMatters = bigger; + i++; + } + if (split.length > i){ + stringBuilder.append("<").append(hexColor1).append(">").append(split[i]); + } + } + MiniMessage miniMessage = MiniMessage.get(); + return stringBuilder.length()==0 ? miniMessage.parse(message) + : miniMessage.parse(stringBuilder.toString()); + } + } diff --git a/galaxy/dependency-reduced-pom.xml b/galaxy/dependency-reduced-pom.xml index 53935c4..a1b6e49 100644 --- a/galaxy/dependency-reduced-pom.xml +++ b/galaxy/dependency-reduced-pom.xml @@ -51,6 +51,12 @@ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + com.alttd @@ -58,6 +64,18 @@ 1.17-R0.1-SNAPSHOT compile + + org.slf4j + slf4j-api + 1.7.30 + compile + + + me.clip + placeholderapi + 2.10.10 + provided + 11 diff --git a/galaxy/pom.xml b/galaxy/pom.xml index f2974f3..98eaba2 100755 --- a/galaxy/pom.xml +++ b/galaxy/pom.xml @@ -67,7 +67,10 @@ - + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -77,7 +80,7 @@ ${project.version} compile - + org.spongepowered configurate-yaml 3.7.1 @@ -87,5 +90,16 @@ galaxy-api 1.17-R0.1-SNAPSHOT + + org.slf4j + slf4j-api + 1.7.30 + + + me.clip + placeholderapi + 2.10.10 + provided + \ No newline at end of file diff --git a/galaxy/src/main/java/com/alttd/chat/commands/Message.java b/galaxy/src/main/java/com/alttd/chat/commands/Message.java index 36659ca..821cd56 100644 --- a/galaxy/src/main/java/com/alttd/chat/commands/Message.java +++ b/galaxy/src/main/java/com/alttd/chat/commands/Message.java @@ -22,5 +22,4 @@ public class Message implements CommandExecutor { return false; } - // Teri, is Tabcompleter needed here? we already have spigot setup to complete playernames on tab, doesn't work for crossserver stuff and offline players } diff --git a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java index b4cfb8b..5ade214 100755 --- a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java +++ b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java @@ -42,8 +42,6 @@ public class ChatHandler { if(!player.hasPermission("chat.format")) { message = miniMessage.stripTokens(message); - } else { - message = Utility.parseColors(message); } if(message.contains("[i]")) @@ -71,16 +69,14 @@ public class ChatHandler { return; } - Component senderName = player.displayName(); - String prefix = user.getPrefix(); + Component senderName = user.getDisplayName(); + Component prefix = user.getPrefix(); message = RegexManager.replaceText(message); // todo a better way for this if(message == null) return; // the message was blocked if(!player.hasPermission("chat.format")) { message = miniMessage.stripTokens(message); - } else { - message = Utility.parseColors(message); } if(message.contains("[i]")) diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java index 3afc65a..1db10b3 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java @@ -5,9 +5,9 @@ import com.alttd.chat.handler.ChatHandler; import com.alttd.chat.managers.ChatUserManager; import com.alttd.chat.managers.RegexManager; import com.alttd.chat.objects.ChatUser; -import com.alttd.chat.util.Utility; import io.papermc.paper.chat.ChatRenderer; import io.papermc.paper.event.player.AsyncChatEvent; +import me.clip.placeholderapi.PlaceholderAPI; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -24,25 +24,12 @@ import java.util.List; public class ChatListener implements Listener, ChatRenderer { @EventHandler(ignoreCancelled = true) - public void onPlayerChat(AsyncChatEvent event) { // this should also include a way to prevent a player from seeing chat - // @teri what about mutes? + public void onPlayerChat(AsyncChatEvent event) { Player player = event.getPlayer(); ChatUser user = ChatUserManager.getChatUser(player.getUniqueId()); - // tweak this to make this slightly better:/ event.viewers().removeIf(audience -> audience instanceof Player && user.getIgnoredPlayers().contains(((Player) audience).getUniqueId())); -/* Set viewers = event.viewers(); - Set ignores = new HashSet<>(); - for(Audience audience : viewers) { // I don't like this setup, might alter this API to expose players... - if(audience instanceof Player) { // the player option is removed in 1.17=/ bad paper devs - UUID uuid = ((Player) audience).getUniqueId(); - if(user.getIgnoredPlayers().contains(uuid)) { - ignores.add(audience); - } - } - } - event.viewers().removeAll(ignores);*/ Component input = event.message(); String message = PlainComponentSerializer.plain().serialize(input); @@ -53,8 +40,6 @@ public class ChatListener implements Listener, ChatRenderer { MiniMessage miniMessage = MiniMessage.get(); if(!player.hasPermission("chat.format")) { message = miniMessage.stripTokens(message); - } else { - message = Utility.parseColors(message); } if(message.contains("[i]")) diff --git a/galaxy/src/main/resources/plugin.yml b/galaxy/src/main/resources/plugin.yml index b19ad49..94dacfa 100755 --- a/galaxy/src/main/resources/plugin.yml +++ b/galaxy/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ version: ${project.version} main: com.alttd.chat.ChatPlugin api-version: 1.16 authors: [Destro, Teriuihi] -depend: [LuckPerms] +depend: [LuckPerms, PlaceholderAPI] commands: globalchat: permission: command.globalchat diff --git a/pom.xml b/pom.xml index 45a1261..58cd1d8 100755 --- a/pom.xml +++ b/pom.xml @@ -71,12 +71,7 @@ Alttd-Nexus - http://leo:8081/snapshots/ - - - dv8tion - m2-dv8tion - https://m2.dv8tion.net/releases + http://leo:8081/ diff --git a/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java b/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java index 544cbbe..30b17bd 100755 --- a/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java +++ b/velocity/src/main/java/com/alttd/chat/commands/GlobalAdminChat.java @@ -16,7 +16,7 @@ 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? + .requires(ctx -> ctx.hasPermission("command.proxy.globaladminchat")) .then(RequiredArgumentBuilder .argument("message", StringArgumentType.greedyString()) .executes(context -> { diff --git a/velocity/src/main/java/com/alttd/chat/commands/Message.java b/velocity/src/main/java/com/alttd/chat/commands/Message.java index 2f85c81..3c98c5b 100755 --- a/velocity/src/main/java/com/alttd/chat/commands/Message.java +++ b/velocity/src/main/java/com/alttd/chat/commands/Message.java @@ -24,7 +24,7 @@ public class Message { /*public Message(ProxyServer proxyServer) { LiteralCommandNode command = LiteralArgumentBuilder .literal("message") - .requires(ctx -> ctx.hasPermission("command.proxy.message"))// TODO permission system? load permissions from config? + .requires(ctx -> ctx.hasPermission("command.proxy.message")) .then(RequiredArgumentBuilder .argument("player", StringArgumentType.word()) .suggests((context, builder) -> { diff --git a/velocity/src/main/java/com/alttd/chat/commands/SendMail.java b/velocity/src/main/java/com/alttd/chat/commands/SendMail.java index 06e1e41..ba3ab4f 100755 --- a/velocity/src/main/java/com/alttd/chat/commands/SendMail.java +++ b/velocity/src/main/java/com/alttd/chat/commands/SendMail.java @@ -42,7 +42,7 @@ public class SendMail { LiteralCommandNode command = LiteralArgumentBuilder .literal("mail") - .requires(ctx -> ctx.hasPermission("command.proxy.mail"))// TODO permission + .requires(ctx -> ctx.hasPermission("command.proxy.mail")) .then(LiteralArgumentBuilder.literal("send") .then(playerNode .then(RequiredArgumentBuilder diff --git a/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java b/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java index 183b8a5..614b5f6 100755 --- a/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java +++ b/velocity/src/main/java/com/alttd/chat/handlers/ChatHandler.java @@ -53,26 +53,24 @@ public class ChatHandler { } public void globalAdminChat(CommandSource commandSource, String message) { - String senderName = Config.CONSOLENAME; + Component senderName = Component.text(Config.CONSOLENAME); String serverName = "Altitude"; if (commandSource instanceof Player) { Player sender = (Player) commandSource; - senderName = sender.getUsername(); + ChatUser user = ChatUserManager.getChatUser(sender.getUniqueId()); + if(user == null) return; + senderName = user.getDisplayName(); serverName = sender.getCurrentServer().isPresent() ? sender.getCurrentServer().get().getServerInfo().getName() : "Altitude"; } MiniMessage miniMessage = MiniMessage.get(); - message = Utility.parseColors(message); + List