Fix nicknames and prefixes

This commit is contained in:
destro174
2021-07-18 00:48:55 +02:00
parent 3f7084eeb7
commit 96dbdc6dd0
18 changed files with 178 additions and 109 deletions
+1 -1
View File
@@ -20,7 +20,7 @@
<packaging>jar</packaging>
<dependencies>
<dependency><!--TODO update to version 4.0.0-->
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>configurate-yaml</artifactId>
<version>3.7.1</version>
@@ -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
@@ -202,7 +202,7 @@ public final class Config {
}
// TODO prefixes need hovers, this hasn't been setup yet!
public static String CHATFORMAT = "<white><light_purple><prefixall></light_purple> <gray><sender>: </gray><message>"; // @teri help with the default formatting?
public static String CHATFORMAT = "<white><light_purple><prefixall> <gray><sender>: <message>";
private static void Chat() {
CHATFORMAT = getString("chat.format", CHATFORMAT);
}
@@ -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",
@@ -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;
}
@@ -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<String, String> colors;
static { // this might be in minimessage already?
colors = new HashMap<>(); // todo map all colors to minimessage
colors = new HashMap<>();
colors.put("&0", "<black>"); // and confirm these are correct
colors.put("&1", "<dark_blue>"); // could also add some default hex colors here?
colors.put("&2", "<dark_green>");
@@ -33,7 +37,6 @@ public class Utility {
colors.put("&d", "<light_purple>");
colors.put("&e", "<yellow>");
colors.put("&f", "<white>");
colors.put("&g", "<minecoin_gold>"); // 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<Group> 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("<white>[").append(group.getCachedData().getMetaData().getPrefix()).append("]</white>");
}
});
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<Group> 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("<white>[").append(user.getCachedData().getMetaData().getPrefix()).append("]</white>");
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("<white>[").append(user.getCachedData().getMetaData().getPrefix()).append("]</white>");
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<String> 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("<gradient:").append(hexColor1).append(":").append(hexColor2).append(">").append(split[i]).append("</gradient>");
} 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());
}
}