From 09699ccabb1e5beccb7b3071444336ac618f55df Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Tue, 20 Jun 2023 09:24:28 -0500 Subject: [PATCH] AdminChat --- .../java/me/totalfreedom/corvo/Corvo.java | 18 +-- .../java/me/totalfreedom/datura/Datura.java | 26 ++-- .../datura/cmd/AdminChatCommand.java | 31 +++++ .../datura/perms/FreedomGroup.java | 4 +- .../datura/perms/FreedomUser.java | 22 ++-- .../totalfreedom/datura/punishment/Cager.java | 4 +- .../datura/punishment/Locker.java | 10 +- .../me/totalfreedom/datura/sql/MySQL.java | 50 ++++---- .../datura/user/SimpleUserData.java | 45 +++++-- .../java/me/totalfreedom/fossil/Fossil.java | 6 +- .../fossil/bouncypads/PadHolder.java | 4 +- .../base/{CommonsBase.java => Patchwork.java} | 6 +- .../me/totalfreedom/base/Registration.java | 2 +- .../java/me/totalfreedom/base/Shortcuts.java | 2 +- .../display/adminchat/ACFormatBuilder.java | 119 ++++++++++++++++++ .../display/adminchat/AdminChatDisplay.java | 97 ++++++++++++++ .../display/adminchat/AdminChatFormat.java | 97 ++++++++++++++ .../java/me/totalfreedom/event/EventBus.java | 8 +- .../java/me/totalfreedom/security/Groups.java | 30 +++++ .../totalfreedom/service/FreedomExecutor.java | 6 +- .../me/totalfreedom/shop/ReactionTask.java | 12 +- .../java/me/totalfreedom/user/UserData.java | 7 ++ .../utils/kyori/KyoriConstants.java | 4 +- 23 files changed, 507 insertions(+), 103 deletions(-) create mode 100644 Datura/src/main/java/me/totalfreedom/datura/cmd/AdminChatCommand.java rename Patchwork/src/main/java/me/totalfreedom/base/{CommonsBase.java => Patchwork.java} (94%) create mode 100644 Patchwork/src/main/java/me/totalfreedom/display/adminchat/ACFormatBuilder.java create mode 100644 Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatDisplay.java create mode 100644 Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatFormat.java create mode 100644 Patchwork/src/main/java/me/totalfreedom/security/Groups.java diff --git a/Corvo/src/main/java/me/totalfreedom/corvo/Corvo.java b/Corvo/src/main/java/me/totalfreedom/corvo/Corvo.java index ba1670b..e698dc5 100644 --- a/Corvo/src/main/java/me/totalfreedom/corvo/Corvo.java +++ b/Corvo/src/main/java/me/totalfreedom/corvo/Corvo.java @@ -1,6 +1,6 @@ package me.totalfreedom.corvo; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import org.bukkit.plugin.java.JavaPlugin; public class Corvo extends JavaPlugin @@ -8,18 +8,18 @@ public class Corvo extends JavaPlugin @Override public void onDisable() { - CommonsBase.getInstance() - .getRegistrations() - .getModuleRegistry() - .removeModule(this); + Patchwork.getInstance() + .getRegistrations() + .getModuleRegistry() + .removeModule(this); } @Override public void onEnable() { - CommonsBase.getInstance() - .getRegistrations() - .getModuleRegistry() - .addModule(this); + Patchwork.getInstance() + .getRegistrations() + .getModuleRegistry() + .addModule(this); } } diff --git a/Datura/src/main/java/me/totalfreedom/datura/Datura.java b/Datura/src/main/java/me/totalfreedom/datura/Datura.java index da40da4..4680a03 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/Datura.java +++ b/Datura/src/main/java/me/totalfreedom/datura/Datura.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.datura.punishment.Cager; import me.totalfreedom.datura.punishment.Halter; import me.totalfreedom.datura.punishment.Locker; @@ -20,19 +20,19 @@ public class Datura extends JavaPlugin @Override public void onEnable() { - CommonsBase.getInstance() - .getRegistrations() - .getModuleRegistry() - .addModule(this); + Patchwork.getInstance() + .getRegistrations() + .getModuleRegistry() + .addModule(this); - CommonsBase.getInstance() - .getRegistrations() - .getServiceTaskRegistry() - .registerService(SubscriptionProvider.syncService(this, locker)); - CommonsBase.getInstance() - .getRegistrations() - .getServiceTaskRegistry() - .registerService(SubscriptionProvider.syncService(this, cager)); + Patchwork.getInstance() + .getRegistrations() + .getServiceTaskRegistry() + .registerService(SubscriptionProvider.syncService(this, locker)); + Patchwork.getInstance() + .getRegistrations() + .getServiceTaskRegistry() + .registerService(SubscriptionProvider.syncService(this, cager)); Bukkit.getPluginManager() .registerEvents(halter, this); diff --git a/Datura/src/main/java/me/totalfreedom/datura/cmd/AdminChatCommand.java b/Datura/src/main/java/me/totalfreedom/datura/cmd/AdminChatCommand.java new file mode 100644 index 0000000..966d2bd --- /dev/null +++ b/Datura/src/main/java/me/totalfreedom/datura/cmd/AdminChatCommand.java @@ -0,0 +1,31 @@ +package me.totalfreedom.datura.cmd; + +import me.totalfreedom.command.Commander; +import me.totalfreedom.command.annotation.Base; +import org.bukkit.command.CommandSender; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class AdminChatCommand extends Commander +{ + + /** + * Initializes this command object. The provided {@link JavaPlugin} should be the plugin which contains the + * command. + *

+ * This constructor will automatically register all subcommands and completions for this command. It will also + * automatically infer all required information from the provided {@link Info} and {@link Permissive} annotations. + * + * @param plugin The plugin which contains this command. + */ + protected AdminChatCommand(@NotNull final JavaPlugin plugin) + { + super(plugin); + } + + @Base + public void onAdminChat(final CommandSender sender) { + + } +} diff --git a/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomGroup.java b/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomGroup.java index a2ccc5d..affa495 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomGroup.java +++ b/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomGroup.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura.perms; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.security.Group; import me.totalfreedom.security.Node; import net.kyori.adventure.text.Component; @@ -41,7 +41,7 @@ public class FreedomGroup implements Group this.isDefault = isDefault; this.isHidden = isHidden; this.permissions = new HashSet<>(); - this.attachment = new PermissionAttachment(CommonsBase.getInstance(), this); + this.attachment = new PermissionAttachment(Patchwork.getInstance(), this); } @Override diff --git a/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomUser.java b/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomUser.java index 3f1510f..a055351 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomUser.java +++ b/Datura/src/main/java/me/totalfreedom/datura/perms/FreedomUser.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura.perms; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.datura.Datura; import me.totalfreedom.datura.user.SimpleUserData; import me.totalfreedom.security.Node; @@ -42,11 +42,11 @@ public class FreedomUser implements User this.permissions = new HashSet<>(); this.displayName = player.displayName(); - final Datura datura = CommonsBase.getInstance() - .getRegistrations() - .getModuleRegistry() - .getProvider(Datura.class) - .getModule(); + final Datura datura = Patchwork.getInstance() + .getRegistrations() + .getModuleRegistry() + .getProvider(Datura.class) + .getModule(); UserData data = SimpleUserData.fromSQL(datura.getSQL(), uuid.toString()); @@ -57,10 +57,10 @@ public class FreedomUser implements User this.userData = data; - CommonsBase.getInstance() - .getRegistrations() - .getUserRegistry() - .registerUserData(this, userData); + Patchwork.getInstance() + .getRegistrations() + .getUserRegistry() + .registerUserData(this, userData); } @Override @@ -96,7 +96,7 @@ public class FreedomUser implements User @Override public boolean addPermission(final Node node) { - final PermissionAttachment attachment = addAttachment(CommonsBase.getInstance(), node.key(), node.value()); + final PermissionAttachment attachment = addAttachment(Patchwork.getInstance(), node.key(), node.value()); bukkitAttachments.put(node, attachment); return permissions().add(node); } diff --git a/Datura/src/main/java/me/totalfreedom/datura/punishment/Cager.java b/Datura/src/main/java/me/totalfreedom/datura/punishment/Cager.java index 52920aa..5b3ef49 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/punishment/Cager.java +++ b/Datura/src/main/java/me/totalfreedom/datura/punishment/Cager.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura.punishment; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.service.Service; import me.totalfreedom.utils.ShapeUtils; import org.bukkit.Bukkit; @@ -32,7 +32,7 @@ public class Cager extends Service this.cagedPlayers = new HashSet<>(); this.cageLocations = new HashMap<>(); Bukkit.getPluginManager() - .registerEvents(new CageListener(), CommonsBase.getInstance()); + .registerEvents(new CageListener(), Patchwork.getInstance()); } /** diff --git a/Datura/src/main/java/me/totalfreedom/datura/punishment/Locker.java b/Datura/src/main/java/me/totalfreedom/datura/punishment/Locker.java index 9e1e027..c459037 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/punishment/Locker.java +++ b/Datura/src/main/java/me/totalfreedom/datura/punishment/Locker.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura.punishment; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.service.Service; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -35,10 +35,10 @@ public class Locker extends Service @Override public void tick() { - lockedPlayers.removeIf(uuid -> !CommonsBase.getInstance() - .getServer() - .getOfflinePlayer(uuid) - .isOnline()); + lockedPlayers.removeIf(uuid -> !Patchwork.getInstance() + .getServer() + .getOfflinePlayer(uuid) + .isOnline()); for (final UUID uuid : lockedPlayers) { diff --git a/Datura/src/main/java/me/totalfreedom/datura/sql/MySQL.java b/Datura/src/main/java/me/totalfreedom/datura/sql/MySQL.java index 9446e08..ae2debf 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/sql/MySQL.java +++ b/Datura/src/main/java/me/totalfreedom/datura/sql/MySQL.java @@ -1,6 +1,6 @@ package me.totalfreedom.datura.sql; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.sql.SQL; import me.totalfreedom.utils.container.Identity; @@ -75,9 +75,9 @@ public class MySQL implements SQL throw new CompletionException("Failed to prepare statement: " + query + "\n", ex); } - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } private CompletableFuture getConnection() @@ -92,9 +92,9 @@ public class MySQL implements SQL throw new CompletionException("Failed to connect to the database: " + url.toString() + "\n", ex); } - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } @Override @@ -112,9 +112,9 @@ public class MySQL implements SQL "Failed to retrieve a result set from query: " + query + "\n", ex); } - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } @Override @@ -131,9 +131,9 @@ public class MySQL implements SQL throw new CompletionException("Failed to execute update: " + query + "\n", ex); } - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } @Override @@ -150,9 +150,9 @@ public class MySQL implements SQL throw new CompletionException("Failed to execute statement: " + query + "\n", ex); } - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } @Override @@ -194,26 +194,26 @@ public class MySQL implements SQL ex); } return null; - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + }, Patchwork.getInstance() + .getExecutor() + .getAsync()); } public CompletableFuture updateColumn(final String table, final String column, final Object value, final String key, final Identity identity) { return executeUpdate("UPDATE ? SET ? = ? WHERE ? = ?", table, column, value, key, identity.getId()) - .thenApplyAsync(result -> result > 0, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + .thenApplyAsync(result -> result > 0, Patchwork.getInstance() + .getExecutor() + .getAsync()); } public CompletableFuture deleteRow(final String table, final String key, final Identity identity) { return executeUpdate("DELETE FROM ? WHERE ? = ?", table, key, identity.getId()) - .thenApplyAsync(result -> result > 0, CommonsBase.getInstance() - .getExecutor() - .getAsync()); + .thenApplyAsync(result -> result > 0, Patchwork.getInstance() + .getExecutor() + .getAsync()); } public CompletableFuture insertRow(final String table, final Object... values) diff --git a/Datura/src/main/java/me/totalfreedom/datura/user/SimpleUserData.java b/Datura/src/main/java/me/totalfreedom/datura/user/SimpleUserData.java index 014876c..4a391c6 100644 --- a/Datura/src/main/java/me/totalfreedom/datura/user/SimpleUserData.java +++ b/Datura/src/main/java/me/totalfreedom/datura/user/SimpleUserData.java @@ -1,8 +1,9 @@ package me.totalfreedom.datura.user; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.datura.event.UserDataUpdateEvent; import me.totalfreedom.datura.perms.FreedomUser; +import me.totalfreedom.display.adminchat.AdminChatFormat; import me.totalfreedom.security.Group; import me.totalfreedom.sql.SQL; import me.totalfreedom.user.User; @@ -29,6 +30,8 @@ public class SimpleUserData implements UserData private boolean canInteract; private AtomicLong balance; private boolean transactionsFrozen; + private boolean hasCustomACFormat = false; + private String customACFormat; public SimpleUserData(final Player player) { @@ -36,9 +39,9 @@ public class SimpleUserData implements UserData this.username = player.getName(); this.user = new FreedomUser(player); - CommonsBase.getInstance() - .getEventBus() - .addEvent(event); + Patchwork.getInstance() + .getEventBus() + .addEvent(event); } private SimpleUserData( @@ -59,6 +62,7 @@ public class SimpleUserData implements UserData this.canInteract = canInteract; this.balance = new AtomicLong(balance); this.transactionsFrozen = transactionsFrozen; + this.customACFormat = AdminChatFormat.DEFAULT.serialize(); } public static SimpleUserData fromSQL(final SQL sql, final String uuid) @@ -81,10 +85,10 @@ public class SimpleUserData implements UserData throw new IllegalStateException("Player should be online but they are not!"); final User user = new FreedomUser(player); - final Group group = CommonsBase.getInstance() - .getRegistrations() - .getGroupRegistry() - .getGroup(g); + final Group group = Patchwork.getInstance() + .getRegistrations() + .getGroupRegistry() + .getGroup(g); final long playtime = result.getLong("playtime"); final boolean canInteract = result.getBoolean("canInteract"); @@ -113,9 +117,9 @@ public class SimpleUserData implements UserData if (player == null) throw new IllegalStateException("Player should be online but they are not!"); return new SimpleUserData(player); - }, CommonsBase.getInstance() - .getExecutor() - .getAsync()) + }, Patchwork.getInstance() + .getExecutor() + .getAsync()) .join(); } @@ -219,4 +223,23 @@ public class SimpleUserData implements UserData { return balance.addAndGet(-amount); } + + @Override + public boolean hasCustomACFormat() + { + return hasCustomACFormat; + } + + @Override + public void setCustomACFormat(final String format) + { + this.hasCustomACFormat = format.equals(AdminChatFormat.DEFAULT.serialize()); + this.customACFormat = format; + } + + @Override + public AdminChatFormat getCustomACFormat() + { + return AdminChatFormat.deserialize(customACFormat); + } } diff --git a/Fossil/src/main/java/me/totalfreedom/fossil/Fossil.java b/Fossil/src/main/java/me/totalfreedom/fossil/Fossil.java index 18dc7fb..a4eda38 100644 --- a/Fossil/src/main/java/me/totalfreedom/fossil/Fossil.java +++ b/Fossil/src/main/java/me/totalfreedom/fossil/Fossil.java @@ -1,6 +1,6 @@ package me.totalfreedom.fossil; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.base.Registration; import me.totalfreedom.fossil.trail.Trailer; import me.totalfreedom.service.SubscriptionProvider; @@ -9,8 +9,8 @@ import org.bukkit.plugin.java.JavaPlugin; public class Fossil extends JavaPlugin { private final Trailer trailer = new Trailer(); - private final Registration registration = CommonsBase.getInstance() - .getRegistrations(); + private final Registration registration = Patchwork.getInstance() + .getRegistrations(); @Override public void onEnable() diff --git a/Fossil/src/main/java/me/totalfreedom/fossil/bouncypads/PadHolder.java b/Fossil/src/main/java/me/totalfreedom/fossil/bouncypads/PadHolder.java index cd4842e..7af351b 100644 --- a/Fossil/src/main/java/me/totalfreedom/fossil/bouncypads/PadHolder.java +++ b/Fossil/src/main/java/me/totalfreedom/fossil/bouncypads/PadHolder.java @@ -1,6 +1,6 @@ package me.totalfreedom.fossil.bouncypads; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.fossil.Fossil; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -33,7 +33,7 @@ public class PadHolder implements Listener public PadHolder() { Bukkit.getPluginManager() - .registerEvents(this, CommonsBase + .registerEvents(this, Patchwork .getInstance() .getRegistrations() .getModuleRegistry() diff --git a/Patchwork/src/main/java/me/totalfreedom/base/CommonsBase.java b/Patchwork/src/main/java/me/totalfreedom/base/Patchwork.java similarity index 94% rename from Patchwork/src/main/java/me/totalfreedom/base/CommonsBase.java rename to Patchwork/src/main/java/me/totalfreedom/base/Patchwork.java index 69bade0..2ee663b 100644 --- a/Patchwork/src/main/java/me/totalfreedom/base/CommonsBase.java +++ b/Patchwork/src/main/java/me/totalfreedom/base/Patchwork.java @@ -9,7 +9,7 @@ import org.bukkit.plugin.java.JavaPlugin; /** * The base class for Patchwork. */ -public class CommonsBase extends JavaPlugin +public class Patchwork extends JavaPlugin { /** * The {@link EventBus} for this plugin. @@ -30,9 +30,9 @@ public class CommonsBase extends JavaPlugin * * @return the plugin instance */ - public static CommonsBase getInstance() + public static Patchwork getInstance() { - return JavaPlugin.getPlugin(CommonsBase.class); + return JavaPlugin.getPlugin(Patchwork.class); } @Override diff --git a/Patchwork/src/main/java/me/totalfreedom/base/Registration.java b/Patchwork/src/main/java/me/totalfreedom/base/Registration.java index e697fe9..db58a4f 100644 --- a/Patchwork/src/main/java/me/totalfreedom/base/Registration.java +++ b/Patchwork/src/main/java/me/totalfreedom/base/Registration.java @@ -12,7 +12,7 @@ import me.totalfreedom.data.UserRegistry; *
* Registries such as {@link ModuleRegistry} and {@link ServiceTaskRegistry} can be found as final objects in this * class. These registries should only ever be accessed through the single Registration object in CommonsBase using - * {@link CommonsBase#getRegistrations()} + * {@link Patchwork#getRegistrations()} */ public class Registration { diff --git a/Patchwork/src/main/java/me/totalfreedom/base/Shortcuts.java b/Patchwork/src/main/java/me/totalfreedom/base/Shortcuts.java index 2194026..d3d7bf7 100644 --- a/Patchwork/src/main/java/me/totalfreedom/base/Shortcuts.java +++ b/Patchwork/src/main/java/me/totalfreedom/base/Shortcuts.java @@ -10,6 +10,6 @@ public final class Shortcuts } public static ModuleProvider provideModule(final Class pluginClass) { - return CommonsBase.getInstance().getRegistrations().getModuleRegistry().getProvider(pluginClass); + return Patchwork.getInstance().getRegistrations().getModuleRegistry().getProvider(pluginClass); } } diff --git a/Patchwork/src/main/java/me/totalfreedom/display/adminchat/ACFormatBuilder.java b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/ACFormatBuilder.java new file mode 100644 index 0000000..b676936 --- /dev/null +++ b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/ACFormatBuilder.java @@ -0,0 +1,119 @@ +package me.totalfreedom.display.adminchat; + +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; + +public class ACFormatBuilder +{ + private char openTag = '['; + private char closeTag = ']'; + private TextColor prefixColor = NamedTextColor.DARK_RED; + private TextColor bracketColor = NamedTextColor.WHITE; + private TextColor nameColor = NamedTextColor.AQUA; + private TextColor rankColor = NamedTextColor.GOLD; + private String prefix = "Admin"; + private String chatSplitter = ">>"; + + private ACFormatBuilder() + { + + } + + public static ACFormatBuilder format() + { + return new ACFormatBuilder(); + } + + public ACFormatBuilder openBracket(final char openTag) + { + this.openTag = openTag; + return this; + } + + public ACFormatBuilder closeBracket(final char closeTag) + { + this.closeTag = closeTag; + return this; + } + + public ACFormatBuilder prefixColor(final TextColor prefixColor) + { + this.prefixColor = prefixColor; + return this; + } + + public ACFormatBuilder bracketColor(final TextColor bracketColor) + { + this.bracketColor = bracketColor; + return this; + } + + public ACFormatBuilder prefix(final String prefix) + { + this.prefix = prefix; + return this; + } + + public ACFormatBuilder chatSplitter(final String chatSplitter) + { + this.chatSplitter = chatSplitter; + return this; + } + + public ACFormatBuilder nameColor(final TextColor nameColor) + { + this.nameColor = nameColor; + return this; + } + + public ACFormatBuilder rankColor(final TextColor rankColor) + { + this.rankColor = rankColor; + return this; + } + + String openBracket() + { + return String.valueOf(openTag); + } + + String closeBracket() + { + return String.valueOf(closeTag); + } + + TextColor prefixColor() + { + return prefixColor; + } + + TextColor bracketColor() + { + return bracketColor; + } + + TextColor nameColor() + { + return nameColor; + } + + TextColor rankColor() + { + return rankColor; + } + + String prefix() + { + return prefix; + } + + String chatSplitter() + { + return chatSplitter; + } + + public AdminChatFormat build() + { + return new AdminChatFormat(this); + } +} diff --git a/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatDisplay.java b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatDisplay.java new file mode 100644 index 0000000..06ec6d9 --- /dev/null +++ b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatDisplay.java @@ -0,0 +1,97 @@ +package me.totalfreedom.display.adminchat; + +import io.papermc.paper.event.player.AsyncChatEvent; +import me.totalfreedom.base.Patchwork; +import me.totalfreedom.base.Shortcuts; +import me.totalfreedom.data.UserRegistry; +import me.totalfreedom.user.UserData; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +public class AdminChatDisplay +{ + private final Map adminChatFormat = new HashMap<>(); + private final Set toggledChat = new HashSet<>(); + + public AdminChatDisplay() { + new ACListener(this); + } + + public void addPlayer(final Player player, final AdminChatFormat format) + { + adminChatFormat.put(player.getUniqueId(), format); + } + + public void removePlayer(final Player player) + { + adminChatFormat.remove(player.getUniqueId()); + } + + public boolean hasPlayer(final Player player) + { + return adminChatFormat.containsKey(player.getUniqueId()); + } + + public void updateFormat(final Player player, final AdminChatFormat newFormat) + { + adminChatFormat.put(player.getUniqueId(), newFormat); + } + + public AdminChatFormat getFormat(final Player player) + { + return adminChatFormat.get(player.getUniqueId()); + } + + public Set getPlayers() + { + return adminChatFormat.keySet(); + } + + public Map getAdminChatFormat() + { + return adminChatFormat; + } + + public static final class ACListener implements Listener + { + private final AdminChatDisplay display; + + public ACListener(final AdminChatDisplay display) + { + this.display = display; + Bukkit.getPluginManager() + .registerEvents(this, Shortcuts.provideModule(Patchwork.class) + .getModule()); + } + + @EventHandler + public void playerChat(final AsyncChatEvent event) { + if (display.getPlayers().contains(event.getPlayer().getUniqueId())) { + event.setCancelled(true); + + } + } + + @EventHandler + public void playerJoin(final PlayerJoinEvent event) { + final Player player = event.getPlayer(); + if (player.hasPermission("patchwork.adminchat")) { + final UserData data = Patchwork.getInstance().getRegistrations().getUserRegistry().fromPlayer(player); + if (data.hasCustomACFormat()) { + display.addPlayer(player, data.getCustomACFormat()); + } else { + display.addPlayer(player, AdminChatFormat.DEFAULT); + } + } + } + } +} diff --git a/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatFormat.java b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatFormat.java new file mode 100644 index 0000000..b8dd757 --- /dev/null +++ b/Patchwork/src/main/java/me/totalfreedom/display/adminchat/AdminChatFormat.java @@ -0,0 +1,97 @@ +package me.totalfreedom.display.adminchat; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public final class AdminChatFormat +{ + public static final AdminChatFormat DEFAULT = ACFormatBuilder.format() + .build(); + private final Component prefix; + private final Component userName; + private final Component rank; + private final Component chatSplitter; + private final Component fullFormat; + + + AdminChatFormat(final ACFormatBuilder builder) + { + this.prefix = Component.text(builder.openBracket(), builder.bracketColor()) + .append(Component.text(builder.prefix(), builder.prefixColor())) + .append(Component.text(builder.closeBracket(), builder.bracketColor())); + this.userName = Component.text("%name%", builder.nameColor()); + this.rank = Component.text(builder.openBracket(), builder.bracketColor()) + .append(Component.text("%rank%", builder.rankColor())) + .append(Component.text(builder.closeBracket(), builder.bracketColor())); + this.chatSplitter = Component.text(builder.chatSplitter(), NamedTextColor.WHITE); + + this.fullFormat = prefix.append(Component.space()) + .append(userName) + .append(Component.space()) + .append(rank) + .append(Component.space()) + .append(chatSplitter) + .append(Component.space()); + } + + public static AdminChatFormat deserialize(final String serialized) + { + final Component dez = LegacyComponentSerializer.legacyAmpersand() + .deserialize(serialized); + final Component prefix = dez.children() + .get(0); + final Component userName = dez.children() + .get(1); + final Component rank = dez.children() + .get(2); + final Component chatSplitter = dez.children() + .get(3); + + return ACFormatBuilder.format() + .prefix(((TextComponent) prefix).content()) + .prefixColor(prefix.color()) + .nameColor(userName.color()) + .rankColor(rank.color()) + .chatSplitter(((TextComponent) chatSplitter).content()) + .build(); + } + + public Component getPrefix() + { + return prefix; + } + + public Component getUserName() + { + return userName; + } + + public Component getRank() + { + return rank; + } + + public Component getFullFormat() + { + return fullFormat; + } + + public Component format(final String name, final String rank) + { + return fullFormat.replaceText(b -> + { + b.matchLiteral("%name%") + .replacement(name); + b.matchLiteral("%rank%") + .replacement(rank); + }); + } + + public String serialize() + { + return LegacyComponentSerializer.legacyAmpersand() + .serialize(fullFormat); + } +} diff --git a/Patchwork/src/main/java/me/totalfreedom/event/EventBus.java b/Patchwork/src/main/java/me/totalfreedom/event/EventBus.java index 67b8514..e012d6f 100644 --- a/Patchwork/src/main/java/me/totalfreedom/event/EventBus.java +++ b/Patchwork/src/main/java/me/totalfreedom/event/EventBus.java @@ -1,7 +1,7 @@ package me.totalfreedom.event; import me.totalfreedom.api.Context; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.service.Service; import java.util.HashSet; @@ -9,11 +9,11 @@ import java.util.Set; public class EventBus extends Service { - private final CommonsBase plugin; + private final Patchwork plugin; private final Set eventSet = new HashSet<>(); private final SubscriptionBox runningSubscriptions = new SubscriptionBox<>(); - public EventBus(final CommonsBase plugin) + public EventBus(final Patchwork plugin) { super("event_bus"); this.plugin = plugin; @@ -57,7 +57,7 @@ public class EventBus extends Service runningSubscriptions.removeSubscription(subscription); } - public CommonsBase getCommonsBase() + public Patchwork getCommonsBase() { return plugin; } diff --git a/Patchwork/src/main/java/me/totalfreedom/security/Groups.java b/Patchwork/src/main/java/me/totalfreedom/security/Groups.java new file mode 100644 index 0000000..2f92fa3 --- /dev/null +++ b/Patchwork/src/main/java/me/totalfreedom/security/Groups.java @@ -0,0 +1,30 @@ +package me.totalfreedom.security; + +public enum Groups +{ + NON_OP("patchwork.group.non-op"), + OP("patchwork.group.op"), + SUPER_ADMIN("patchwork.group.super"), + SENIOR_ADMIN("patchwork.group.senior"), + DEVELOPER("patchwork.group.dev"), + EXECUTIVE("patchwork.group.exec"), + OWNER("patchwork.group.owner"); + + private final String permission; + + Groups(final String permission) + { + this.permission = permission; + } + + public String getPermission() + { + return this.permission; + } + + @Override + public String toString() + { + return this.permission; + } +} diff --git a/Patchwork/src/main/java/me/totalfreedom/service/FreedomExecutor.java b/Patchwork/src/main/java/me/totalfreedom/service/FreedomExecutor.java index f090314..2b52f4e 100644 --- a/Patchwork/src/main/java/me/totalfreedom/service/FreedomExecutor.java +++ b/Patchwork/src/main/java/me/totalfreedom/service/FreedomExecutor.java @@ -1,6 +1,6 @@ package me.totalfreedom.service; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -29,9 +29,9 @@ public class FreedomExecutor public FreedomExecutor() { syncExecutor = r -> Bukkit.getScheduler() - .runTask(CommonsBase.getInstance(), r); + .runTask(Patchwork.getInstance(), r); asyncExecutor = r -> Bukkit.getScheduler() - .runTaskAsynchronously(CommonsBase.getInstance(), r); + .runTaskAsynchronously(Patchwork.getInstance(), r); } /** diff --git a/Patchwork/src/main/java/me/totalfreedom/shop/ReactionTask.java b/Patchwork/src/main/java/me/totalfreedom/shop/ReactionTask.java index cceb27e..f27f5c6 100644 --- a/Patchwork/src/main/java/me/totalfreedom/shop/ReactionTask.java +++ b/Patchwork/src/main/java/me/totalfreedom/shop/ReactionTask.java @@ -1,7 +1,7 @@ package me.totalfreedom.shop; import io.papermc.paper.event.player.AsyncChatEvent; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import me.totalfreedom.display.BossBarDisplay; import me.totalfreedom.display.BossBarTimer; import me.totalfreedom.economy.EconomicEntity; @@ -36,7 +36,7 @@ public class ReactionTask extends Task implements Listener } final BossBarTimer timer = new BossBarTimer(bossBarDisplay, reaction.getReactionDuration()); - timer.runTaskTimer(CommonsBase.getInstance(), 0L, timer.getInterval()); + timer.runTaskTimer(Patchwork.getInstance(), 0L, timer.getInterval()); } @EventHandler @@ -45,10 +45,10 @@ public class ReactionTask extends Task implements Listener if (event.message() .equals(reaction.getReactionMessage())) { - final EconomicEntity entity = CommonsBase.getInstance() - .getRegistrations() - .getUserRegistry() - .getUser(event.getPlayer()); + final EconomicEntity entity = Patchwork.getInstance() + .getRegistrations() + .getUserRegistry() + .getUser(event.getPlayer()); reaction.onReact(entity); } diff --git a/Patchwork/src/main/java/me/totalfreedom/user/UserData.java b/Patchwork/src/main/java/me/totalfreedom/user/UserData.java index 2cfb8d1..a2c4b4a 100644 --- a/Patchwork/src/main/java/me/totalfreedom/user/UserData.java +++ b/Patchwork/src/main/java/me/totalfreedom/user/UserData.java @@ -1,5 +1,6 @@ package me.totalfreedom.user; +import me.totalfreedom.display.adminchat.AdminChatFormat; import me.totalfreedom.economy.EconomicEntityData; import me.totalfreedom.security.Group; import org.jetbrains.annotations.NotNull; @@ -30,4 +31,10 @@ public interface UserData extends EconomicEntityData boolean canInteract(); void setInteractionState(boolean canInteract); + + boolean hasCustomACFormat(); + + void setCustomACFormat(final String customACFormat); + + AdminChatFormat getCustomACFormat(); } diff --git a/Patchwork/src/main/java/me/totalfreedom/utils/kyori/KyoriConstants.java b/Patchwork/src/main/java/me/totalfreedom/utils/kyori/KyoriConstants.java index 0ffbe29..aa33c59 100644 --- a/Patchwork/src/main/java/me/totalfreedom/utils/kyori/KyoriConstants.java +++ b/Patchwork/src/main/java/me/totalfreedom/utils/kyori/KyoriConstants.java @@ -1,6 +1,6 @@ package me.totalfreedom.utils.kyori; -import me.totalfreedom.base.CommonsBase; +import me.totalfreedom.base.Patchwork; import net.kyori.adventure.chat.ChatType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -24,7 +24,7 @@ public final class KyoriConstants /** * A singleton {@link ChatType.Bound} for the Patchwork plugin. */ - public static final ChatType.Bound PATCHWORK = fromPlugin(CommonsBase.class); + public static final ChatType.Bound PATCHWORK = fromPlugin(Patchwork.class); private KyoriConstants() {