Massive overhaul of message-system (made MessageSender to put all the message-sending in one place, created different componentFactories for different themes

This commit is contained in:
Artemis-the-gr8 2022-07-14 02:55:26 +02:00
parent b91d16aec8
commit d36cb3a574
18 changed files with 573 additions and 269 deletions

View File

@ -6,7 +6,7 @@ import com.gmail.artemis.the.gr8.playerstats.commands.StatCommand;
import com.gmail.artemis.the.gr8.playerstats.commands.TabCompleter;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.listeners.JoinListener;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.Bukkit;
@ -32,22 +32,22 @@ public class Main extends JavaPlugin {
//first get an instance of all the classes that need to be initialized or passed along to different classes
ConfigHandler config = new ConfigHandler(this);
MessageWriter messageWriter = new MessageWriter(config);
MessageSender sender = new MessageSender(config);
OfflinePlayerHandler offlinePlayerHandler = new OfflinePlayerHandler();
ThreadManager threadManager = ThreadManager.getInstance(config, messageWriter, offlinePlayerHandler);
ThreadManager threadManager = ThreadManager.getInstance(config, sender, offlinePlayerHandler);
ShareManager shareManager = ShareManager.getInstance(config);
//register all commands and the tabCompleter
PluginCommand statcmd = this.getCommand("statistic");
if (statcmd != null) {
statcmd.setExecutor(new StatCommand(messageWriter, threadManager, offlinePlayerHandler));
statcmd.setExecutor(new StatCommand(sender, threadManager, offlinePlayerHandler));
statcmd.setTabCompleter(new TabCompleter(offlinePlayerHandler));
}
PluginCommand reloadcmd = this.getCommand("statisticreload");
if (reloadcmd != null) reloadcmd.setExecutor(new ReloadCommand(threadManager));
PluginCommand sharecmd = this.getCommand("statisticshare");
if (sharecmd != null) sharecmd.setExecutor(new ShareCommand(shareManager, messageWriter));
if (sharecmd != null) sharecmd.setExecutor(new ShareCommand(shareManager, sender));
//register the listener
Bukkit.getPluginManager().registerEvents(new JoinListener(threadManager), this);

View File

@ -1,13 +1,13 @@
package com.gmail.artemis.the.gr8.playerstats;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.reload.ReloadThread;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.statistic.StatThread;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.command.CommandSender;
import java.util.HashMap;
@ -20,9 +20,8 @@ public final class ThreadManager {
private int statThreadID;
private int reloadThreadID;
private static BukkitAudiences adventure;
private static ConfigHandler config;
private static MessageWriter messageWriter;
private static MessageSender messageSender;
private final OfflinePlayerHandler offlinePlayerHandler;
private ReloadThread lastActiveReloadThread;
@ -30,10 +29,9 @@ public final class ThreadManager {
private final HashMap<String, Thread> statThreads;
private static long lastRecordedCalcTime;
private ThreadManager(ConfigHandler c, MessageWriter m, OfflinePlayerHandler o) {
adventure = Main.adventure();
private ThreadManager(ConfigHandler c, MessageSender m, OfflinePlayerHandler o) {
config = c;
messageWriter = m;
messageSender = m;
offlinePlayerHandler = o;
statThreads = new HashMap<>();
@ -44,14 +42,14 @@ public final class ThreadManager {
startReloadThread(null);
}
public static ThreadManager getInstance(ConfigHandler config, MessageWriter messageWriter, OfflinePlayerHandler offlinePlayerHandler) {
public static ThreadManager getInstance(ConfigHandler config, MessageSender messageSender, OfflinePlayerHandler offlinePlayerHandler) {
ThreadManager threadManager = instance;
if (threadManager != null) {
return threadManager;
}
synchronized (ThreadManager.class) {
if (instance == null) {
instance = new ThreadManager(config, messageWriter, offlinePlayerHandler);
instance = new ThreadManager(config, messageSender, offlinePlayerHandler);
}
return instance;
}
@ -65,7 +63,7 @@ public final class ThreadManager {
if (lastActiveReloadThread == null || !lastActiveReloadThread.isAlive()) {
reloadThreadID += 1;
lastActiveReloadThread = new ReloadThread(config, messageWriter, offlinePlayerHandler, reloadThreadID, lastActiveStatThread, sender);
lastActiveReloadThread = new ReloadThread(config, messageSender, offlinePlayerHandler, reloadThreadID, lastActiveStatThread, sender);
lastActiveReloadThread.start();
}
else {
@ -80,7 +78,7 @@ public final class ThreadManager {
if (config.limitStatRequests() && statThreads.containsKey(cmdSender)) {
Thread runningThread = statThreads.get(cmdSender);
if (runningThread.isAlive()) {
adventure.sender(request.getCommandSender()).sendMessage(messageWriter.requestAlreadyRunning(request.isBukkitConsoleSender()));
messageSender.send(request.getCommandSender(), PluginMessage.REQUEST_ALREADY_RUNNING);
} else {
startNewStatThread(request);
}
@ -102,7 +100,7 @@ public final class ThreadManager {
}
private void startNewStatThread(StatRequest request) {
lastActiveStatThread = new StatThread(config, messageWriter, offlinePlayerHandler, statThreadID, request, lastActiveReloadThread);
lastActiveStatThread = new StatThread(config, messageSender, offlinePlayerHandler, statThreadID, request, lastActiveReloadThread);
statThreads.put(request.getCommandSender().getName(), lastActiveStatThread);
lastActiveStatThread.start();
}

View File

@ -2,7 +2,8 @@ package com.gmail.artemis.the.gr8.playerstats.commands;
import com.gmail.artemis.the.gr8.playerstats.Main;
import com.gmail.artemis.the.gr8.playerstats.ShareManager;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.TextComponent;
@ -17,12 +18,12 @@ public class ShareCommand implements CommandExecutor {
private static BukkitAudiences adventure;
private static ShareManager shareManager;
private final MessageWriter messageWriter;
private static MessageSender messageSender;
public ShareCommand(ShareManager s, MessageWriter m) {
public ShareCommand(ShareManager s, MessageSender m) {
adventure = Main.adventure();
shareManager = s;
messageWriter = m;
messageSender = m;
}
@Override
@ -36,16 +37,17 @@ public class ShareCommand implements CommandExecutor {
return false;
}
if (shareManager.requestAlreadyShared(shareCode)) {
adventure.sender(sender).sendMessage(messageWriter.resultsAlreadyShared());
messageSender.send(sender, PluginMessage.RESULTS_ALREADY_SHARED);
}
else if (shareManager.isOnCoolDown(sender.getName())) {
adventure.sender(sender).sendMessage(messageWriter.stillOnShareCoolDown());
messageSender.send(sender, PluginMessage.STILL_ON_SHARE_COOLDOWN);
}
else {
TextComponent result = shareManager.getStatResult(sender.getName(), shareCode);
if (result == null) { //at this point the only possible cause of statResult being null is the request being older than 25 player-requests ago
adventure.sender(sender).sendMessage(messageWriter.statResultsTooOld());
messageSender.send(sender, PluginMessage.STAT_RESULTS_TOO_OLD);
} else {
//TODO add shared-by signature
adventure.all().sendMessage(result);
}
}

View File

@ -1,15 +1,12 @@
package com.gmail.artemis.the.gr8.playerstats.commands;
import com.gmail.artemis.the.gr8.playerstats.Main;
import com.gmail.artemis.the.gr8.playerstats.ThreadManager;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.enums.Target;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.utils.EnumHandler;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.command.Command;
@ -19,41 +16,34 @@ import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class StatCommand implements CommandExecutor {
private static BukkitAudiences adventure;
private static ThreadManager threadManager;
private final MessageWriter messageWriter;
private static MessageSender messageSender;
private final OfflinePlayerHandler offlinePlayerHandler;
public StatCommand(MessageWriter m, ThreadManager t, OfflinePlayerHandler o) {
adventure = Main.adventure();
public StatCommand(MessageSender m, ThreadManager t, OfflinePlayerHandler o) {
threadManager = t;
messageWriter = m;
messageSender = m;
offlinePlayerHandler = o;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
boolean isBukkitConsole = sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit");
if (args.length == 0 || args[0].equalsIgnoreCase("help")) { //in case of less than 1 argument or "help", display the help message
adventure.sender(sender).sendMessage(messageWriter.helpMsg(sender instanceof ConsoleCommandSender));
messageSender.send(sender, PluginMessage.HELP_MSG);
}
else if (args[0].equalsIgnoreCase("examples") ||
args[0].equalsIgnoreCase("example")) { //in case of "statistic examples", show examples
adventure.sender(sender).sendMessage(messageWriter.usageExamples(isBukkitConsole));
messageSender.send(sender, PluginMessage.USAGE_EXAMPLES);
}
else {
StatRequest request = generateRequest(sender, args);
TextComponent issues = checkRequest(request, isBukkitConsole);
if (issues == null) {
if (requestIsValid(request)) {
threadManager.startStatThread(request);
}
else {
adventure.sender(sender).sendMessage(issues);
} else {
return false;
}
}
@ -139,28 +129,32 @@ public class StatCommand implements CommandExecutor {
}
}
/** This method validates the StatRequest and returns feedback in the form of a TextComponent.
/** This method validates the StatRequest and returns feedback to the player if it returns false.
It checks the following:
<p>1. Is a Statistic set?</p>
<p>2. Is a subStat needed, and is a subStat Enum Constant present? (block/entity/item)</p>
<p>3. If the target is PLAYER, is a valid PlayerName provided? </p>
@return null if the Request is valid, and an explanation message otherwise. */
private @Nullable TextComponent checkRequest(StatRequest request, boolean isBukkitConsole) {
@return true if the Request is valid, and false + an explanation message otherwise. */
private boolean requestIsValid(StatRequest request) {
if (request.getStatistic() == null) {
return messageWriter.missingStatName(isBukkitConsole);
messageSender.send(request.getCommandSender(), PluginMessage.MISSING_STAT_NAME);
return false;
}
Statistic.Type type = request.getStatistic().getType();
if (request.getSubStatEntry() == null && type != Statistic.Type.UNTYPED) {
return messageWriter.missingSubStatName(type, isBukkitConsole);
messageSender.send(request.getCommandSender(), PluginMessage.MISSING_SUB_STAT_NAME, type);
return false;
}
else if (!matchingSubStat(request)) {
return messageWriter.wrongSubStatType(type, request.getSubStatEntry(), isBukkitConsole);
messageSender.send(request.getCommandSender(), PluginMessage.WRONG_SUB_STAT_TYPE, type);
return false;
}
else if (request.getSelection() == Target.PLAYER && request.getPlayerName() == null) {
return messageWriter.missingPlayerName(isBukkitConsole);
messageSender.send(request.getCommandSender(), PluginMessage.MISSING_PLAYER_NAME);
return false;
}
else {
return null;
return true;
}
}

View File

@ -0,0 +1,21 @@
package com.gmail.artemis.the.gr8.playerstats.enums;
public enum PluginMessage {
RELOADED_CONFIG,
STILL_RELOADING,
WAIT_A_MOMENT, //param: long
MISSING_STAT_NAME,
MISSING_SUB_STAT_NAME, //param: Statistic.Type
MISSING_PLAYER_NAME,
WRONG_SUB_STAT_TYPE, //param: Statistic.Type, String
REQUEST_ALREADY_RUNNING,
STILL_ON_SHARE_COOLDOWN,
RESULTS_ALREADY_SHARED,
STAT_RESULTS_TOO_OLD,
UNKNOWN_ERROR,
USAGE_EXAMPLES,
HELP_MSG,
FORMAT_PLAYER_STAT,
FORMAT_SERVER_STAT,
FORMAT_TOP_STAT
}

View File

@ -0,0 +1,46 @@
package com.gmail.artemis.the.gr8.playerstats.models.datamodel;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.Statistic;
import java.util.LinkedHashMap;
import java.util.function.BiFunction;
/** Represents a bunch of BiFunctions that most of the time will have a MessageWriter as its first argument*/
public abstract class BiFunctionType<M, O, T> implements Type {
public abstract TextComponent apply(MessageWriter messageWriter, Object o);
public record MsgBoolean<M, B, T>(BiFunction<MessageWriter, Boolean, TextComponent> biFunction) implements Type {
public TextComponent apply(MessageWriter messageWriter, boolean longWait) {
return biFunction.apply(messageWriter, longWait);
}
}
public record MsgStatType<M, S, T>(BiFunction<MessageWriter, Statistic.Type, TextComponent> biFunction) implements Type {
public TextComponent apply(MessageWriter messageWriter, Statistic.Type statType) {
return biFunction.apply(messageWriter, statType);
}
}
public record StatRequestInt<S, I, T>(BiFunction<StatRequest, Integer, TextComponent> biFunction) implements Type {
public TextComponent apply(StatRequest request, Integer playerStat) {
return biFunction.apply(request, playerStat);
}
}
public record StatRequestLong<S, L, T>(BiFunction<StatRequest, Long, TextComponent> biFunction) implements Type {
public TextComponent apply(StatRequest request, Long serverStat) {
return biFunction.apply(request, serverStat);
}
}
public record StatRequestMap<S, M, T>(BiFunction<StatRequest, LinkedHashMap<String, Integer>, TextComponent> biFunction) implements Type {
public TextComponent apply(StatRequest request, LinkedHashMap<String, Integer> topStats) {
return biFunction.apply(request, topStats);
}
}
}

View File

@ -0,0 +1,13 @@
package com.gmail.artemis.the.gr8.playerstats.models.datamodel;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import net.kyori.adventure.text.TextComponent;
import java.util.function.Function;
public record FunctionType<M, T>(Function<MessageWriter, TextComponent> function) implements Type {
public TextComponent apply(MessageWriter messageWriter) {
return function.apply(messageWriter);
}
}

View File

@ -0,0 +1,5 @@
package com.gmail.artemis.the.gr8.playerstats.models.datamodel;
public interface Type {
}

View File

@ -0,0 +1,27 @@
package com.gmail.artemis.the.gr8.playerstats.msg;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.DebugLevel;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginColor;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
public class BukkitConsoleComponentFactory extends ComponentFactory {
public BukkitConsoleComponentFactory(ConfigHandler config) {
super(config);
MyLogger.logMsg("BukkitConsoleFactory created!", DebugLevel.MEDIUM);
}
@Override
protected void prepareColors() {
PREFIX = PluginColor.GOLD.getConsoleColor();
BRACKETS = PluginColor.GRAY.getConsoleColor();
UNDERSCORE = PluginColor.DARK_PURPLE.getConsoleColor();
MSG_MAIN = PluginColor.MEDIUM_BLUE.getConsoleColor();
MSG_MAIN_2 = PluginColor.GOLD.getConsoleColor();
MSG_ACCENT = PluginColor.MEDIUM_GOLD.getConsoleColor();
MSG_ACCENT_2 = PluginColor.LIGHT_YELLOW.getConsoleColor();
HOVER_MSG = PluginColor.LIGHT_BLUE.getConsoleColor();
HOVER_ACCENT = PluginColor.LIGHT_GOLD.getConsoleColor();
}
}

View File

@ -1,9 +1,11 @@
package com.gmail.artemis.the.gr8.playerstats.msg;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.DebugLevel;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginColor;
import com.gmail.artemis.the.gr8.playerstats.enums.Target;
import com.gmail.artemis.the.gr8.playerstats.enums.Unit;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
@ -17,6 +19,7 @@ import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.kyori.adventure.text.Component.*;
import static net.kyori.adventure.text.Component.text;
@ -27,43 +30,94 @@ public class ComponentFactory {
private static ConfigHandler config;
protected static TextColor PREFIX; //gold
protected static TextColor BRACKETS; //gray
protected static TextColor UNDERSCORE; //dark_purple
protected static TextColor MSG_MAIN; //blue
protected static TextColor MSG_MAIN_2; //gold
protected static TextColor MSG_ACCENT; //medium_gold
protected static TextColor MSG_ACCENT_2; //light_yellow
protected static TextColor HOVER_MSG; //light_blue
protected static TextColor HOVER_ACCENT; //light_gold
public ComponentFactory(ConfigHandler c) {
config = c;
prepareColors();
MyLogger.logMsg("Regular ComponentFactory created!", DebugLevel.MEDIUM);
}
protected void prepareColors() {
PREFIX = PluginColor.GOLD.getColor();
BRACKETS = PluginColor.GRAY.getColor();
UNDERSCORE = PluginColor.DARK_PURPLE.getColor();
MSG_MAIN = PluginColor.MEDIUM_BLUE.getColor();
MSG_MAIN_2 = PluginColor.GOLD.getColor();
MSG_ACCENT = PluginColor.MEDIUM_GOLD.getColor();
MSG_ACCENT_2 = PluginColor.LIGHT_YELLOW.getColor();
HOVER_MSG = PluginColor.LIGHT_BLUE.getColor();
HOVER_ACCENT = PluginColor.LIGHT_GOLD.getColor();
}
public TextColor prefix() {
return PREFIX;
}
public TextColor brackets() {
return BRACKETS;
}
public TextColor underscore() {
return UNDERSCORE;
}
public TextColor msgMain() {
return MSG_MAIN;
}
public TextColor msgMain2() {
return MSG_MAIN_2;
}
public TextColor msgAccent() {
return MSG_ACCENT;
}
public TextColor msgAccent2() {
return MSG_ACCENT_2;
}
public TextColor hoverMsg() {
return HOVER_MSG;
}
public TextColor hoverAccent() {
return HOVER_ACCENT;
}
/** Returns [PlayerStats]. */
public TextComponent pluginPrefixComponent(boolean isBukkitConsole) {
public TextComponent pluginPrefixComponent() {
return text("[")
.color(PluginColor.GRAY.getColor())
.append(text("PlayerStats").color(PluginColor.GOLD.getColor()))
.color(BRACKETS)
.append(text("PlayerStats").color(PREFIX))
.append(text("]"));
}
/** Returns [PlayerStats] surrounded by underscores on both sides. */
public TextComponent prefixTitleComponent(boolean isBukkitConsole) {
String underscores = "____________"; //12 underscores for both console and in-game
TextColor underscoreColor = isBukkitConsole ?
PluginColor.DARK_PURPLE.getConsoleColor() : PluginColor.DARK_PURPLE.getColor();
return text(underscores).color(underscoreColor)
public TextComponent prefixTitleComponent() {
//12 underscores for both console and in-game
return text("____________").color(UNDERSCORE)
.append(text(" ")) //4 spaces
.append(pluginPrefixComponent(isBukkitConsole))
.append(pluginPrefixComponent())
.append(text(" ")) //4 spaces
.append(text(underscores));
.append(text("____________"));
}
/** Returns a TextComponent with the input String as content, with color Gray and decoration Italic.*/
public TextComponent subTitleComponent(String content) {
return text(content).color(PluginColor.GRAY.getColor()).decorate(TextDecoration.ITALIC);
return text(content).color(BRACKETS).decorate(TextDecoration.ITALIC);
}
/** Returns a TextComponents in the style of a default plugin message, with color Medium_Blue. */
public TextComponent messageComponent() {
return text().color(PluginColor.MEDIUM_BLUE.getColor()).build();
return text().color(MSG_MAIN).build();
}
public TextComponent messageAccentComponent() {
return text().color(PluginColor.MEDIUM_GOLD.getColor()).build();
return text().color(MSG_ACCENT).build();
}
public TextComponent.Builder playerNameBuilder(String playerName, Target selection) {
@ -228,10 +282,10 @@ public class ComponentFactory {
if (config.useHoverText()) {
heartComponent.hoverEvent(HoverEvent.showText(
text(Unit.HEART.getLabel())
.color(PluginColor.LIGHT_GOLD.getColor())
.color(HOVER_ACCENT)
.decorate(TextDecoration.ITALIC)));
}
return Component.text().color(PluginColor.GRAY.getColor())
return Component.text().color(BRACKETS)
.append(text("["))
.append(heartComponent)
.append(text("]"))

View File

@ -0,0 +1,47 @@
package com.gmail.artemis.the.gr8.playerstats.msg;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.msg.msgutils.ExampleMessage;
import com.gmail.artemis.the.gr8.playerstats.msg.msgutils.HelpMessage;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.Bukkit;
public class ConsoleMessageWriter extends MessageWriter {
private final boolean isBukkit;
private static ComponentFactory componentFactory;
public ConsoleMessageWriter(ConfigHandler c) {
super(c);
isBukkit = Bukkit.getName().equalsIgnoreCase("CraftBukkit");
}
@Override
protected void getComponentFactory() {
if (isBukkit) {
componentFactory = new BukkitConsoleComponentFactory(config);
}
else if (config.enableFestiveFormatting() || config.enableRainbowMode()) {
//TODO Check for date
componentFactory = new PrideComponentFactory(config);
}
else {
componentFactory = new ComponentFactory(config);
}
}
@Override
public TextComponent usageExamples() {
return new ExampleMessage(componentFactory);
}
@Override
public TextComponent helpMsg() {
return new HelpMessage(componentFactory,
false,
config.getTopListMaxSize());
}
}

View File

@ -0,0 +1,128 @@
package com.gmail.artemis.the.gr8.playerstats.msg;
import com.gmail.artemis.the.gr8.playerstats.Main;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.models.datamodel.BiFunctionType;
import com.gmail.artemis.the.gr8.playerstats.models.datamodel.FunctionType;
import com.gmail.artemis.the.gr8.playerstats.models.datamodel.Type;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.jetbrains.annotations.NotNull;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import static com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage.*;
public class MessageSender {
private static BukkitAudiences adventure;
private static MessageWriter msg;
private static ConsoleMessageWriter consoleMsg;
private static EnumMap<PluginMessage, Type> pluginMessages;
public MessageSender(ConfigHandler conf) {
adventure = Main.adventure();
msg = new MessageWriter(conf);
consoleMsg = new ConsoleMessageWriter(conf);
pluginMessages = new EnumMap<>(PluginMessage.class);
prepareFunctions();
}
public void updateComponentFactories(ConfigHandler config) {
msg = new MessageWriter(config);
consoleMsg = new ConsoleMessageWriter(config);
}
/**
Takes a function out of a private EnumMap with functions, and executes it.
The functions all call a method in MessageWriter, either directly or through
a private method in this class.
*/
public void send(CommandSender sender, PluginMessage message) {
send(sender, message, null, null, null, 0, 0, null);
}
public void send(CommandSender sender, PluginMessage message, boolean longWait) {
send(sender, message, longWait, null, null, 0, 0, null);
}
public void send(CommandSender sender, PluginMessage message, Statistic.Type statType) {
send(sender, message, null, statType, null, 0, 0, null);
}
public void send(StatRequest request, int playerStat) {
send(request.getCommandSender(), FORMAT_PLAYER_STAT, null, null, null, playerStat, 0, null);
}
public void send(StatRequest request, long serverStat) {
send(request.getCommandSender(), FORMAT_SERVER_STAT, null, null, null, 0, serverStat, null);
}
public void send(StatRequest request, LinkedHashMap<String, Integer> topStats) {
send(request.getCommandSender(), FORMAT_TOP_STAT, null, null, request, 0, 0, topStats);
}
private void send(@NotNull CommandSender sender, @NotNull PluginMessage message, Boolean longWait, Statistic.Type statType,
StatRequest request, int playerStat, long serverStat, LinkedHashMap<String, Integer> topStats) {
Type customFunction = pluginMessages.get(message);
TextComponent result = null;
MessageWriter writer = messageWriter(sender instanceof ConsoleCommandSender);
if (customFunction instanceof FunctionType<?,?> function) {
result = function.apply(writer);
} else if (customFunction instanceof BiFunctionType.MsgBoolean<?,?,?> biFunction) {
if (longWait != null) result = biFunction.apply(writer, longWait);
} else if (customFunction instanceof BiFunctionType.MsgStatType<?,?,?> biFunction) {
if (statType != null) result = biFunction.apply(writer, statType);
} else if (request != null) {
if (customFunction instanceof BiFunctionType.StatRequestInt<?,?,?> biFunction) {
result = biFunction.apply(request, playerStat);
} else if (customFunction instanceof BiFunctionType.StatRequestLong<?,?,?> biFunction) {
result = biFunction.apply(request, serverStat);
} else if (customFunction instanceof BiFunctionType.StatRequestMap<?,?,?> biFunction) {
if (topStats != null) result = biFunction.apply(request, topStats);
}
}
if (result != null) {
adventure.sender(sender).sendMessage(result);
}
}
private void prepareFunctions() {
pluginMessages.put(RELOADED_CONFIG, new FunctionType<>(MessageWriter::reloadedConfig));
pluginMessages.put(STILL_RELOADING, new FunctionType<>(MessageWriter::stillReloading));
pluginMessages.put(WAIT_A_MOMENT, new BiFunctionType.MsgBoolean<>(MessageWriter::waitAMoment));
pluginMessages.put(MISSING_STAT_NAME, new FunctionType<>(MessageWriter::missingStatName));
pluginMessages.put(MISSING_SUB_STAT_NAME, new BiFunctionType.MsgStatType<>(MessageWriter::missingSubStatName));
pluginMessages.put(MISSING_PLAYER_NAME, new FunctionType<>(MessageWriter::missingPlayerName));
pluginMessages.put(WRONG_SUB_STAT_TYPE, new BiFunctionType.MsgStatType<>(MessageWriter::wrongSubStatType));
pluginMessages.put(REQUEST_ALREADY_RUNNING, new FunctionType<>(MessageWriter::requestAlreadyRunning));
pluginMessages.put(STILL_ON_SHARE_COOLDOWN, new FunctionType<>(MessageWriter::stillOnShareCoolDown));
pluginMessages.put(RESULTS_ALREADY_SHARED, new FunctionType<>(MessageWriter::resultsAlreadyShared));
pluginMessages.put(STAT_RESULTS_TOO_OLD, new FunctionType<>(MessageWriter::statResultsTooOld));
pluginMessages.put(UNKNOWN_ERROR, new FunctionType<>(MessageWriter::unknownError));
pluginMessages.put(USAGE_EXAMPLES, new FunctionType<>(MessageWriter::usageExamples));
pluginMessages.put(HELP_MSG, new FunctionType<>(MessageWriter::helpMsg));
pluginMessages.put(FORMAT_PLAYER_STAT, new BiFunctionType.StatRequestInt<>((StatRequest s, Integer i) -> messageWriter(s.isConsoleSender()).formatPlayerStat(i, s)));
pluginMessages.put(FORMAT_SERVER_STAT, new BiFunctionType.StatRequestLong<>((StatRequest s, Long l) -> messageWriter(s.isConsoleSender()).formatServerStat(l, s)));
pluginMessages.put(FORMAT_TOP_STAT, new BiFunctionType.StatRequestMap<>((StatRequest s, LinkedHashMap<String, Integer> l) -> messageWriter(s.isConsoleSender()).formatTopStats(l, s)));
}
private MessageWriter messageWriter(boolean isConsoleSender) {
return isConsoleSender ? consoleMsg : msg;
}
}

View File

@ -15,7 +15,6 @@ import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.Bukkit;
import org.bukkit.Statistic;
import org.jetbrains.annotations.NotNull;
@ -28,7 +27,8 @@ import static net.kyori.adventure.text.Component.*;
The component parts (with appropriate formatting) are supplied by a ComponentFactory.*/
public class MessageWriter {
private static ConfigHandler config;
protected static ConfigHandler config;
private static ComponentFactory componentFactory;
private final LanguageKeyHandler languageKeyHandler;
private final NumberFormatter formatter;
@ -40,12 +40,9 @@ public class MessageWriter {
getComponentFactory();
}
public static void updateComponentFactory() {
getComponentFactory();
}
private static void getComponentFactory() {
protected void getComponentFactory() {
if (config.enableFestiveFormatting() || config.enableRainbowMode()) {
//TODO check for date
componentFactory = new PrideComponentFactory(config);
}
else {
@ -53,57 +50,57 @@ public class MessageWriter {
}
}
public TextComponent reloadedConfig(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent reloadedConfig() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content("Config reloaded!"));
}
public TextComponent stillReloading(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent stillReloading() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"The plugin is (re)loading, your request will be processed when it is done!"));
}
public TextComponent waitAMoment(boolean longWait, boolean isBukkitConsole) {
public TextComponent waitAMoment(boolean longWait) {
String msg = longWait ? "Calculating statistics, this may take a minute..." :
"Calculating statistics, this may take a few moments...";
return componentFactory.pluginPrefixComponent(isBukkitConsole)
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(msg));
}
public TextComponent missingStatName(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent missingStatName() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"Please provide a valid statistic name!"));
}
public TextComponent missingSubStatName(Statistic.Type statType, boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent missingSubStatName(Statistic.Type statType) {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"Please add a valid " + EnumHandler.getSubStatTypeName(statType) + " to look up this statistic!"));
}
public TextComponent missingPlayerName(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent missingPlayerName() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"Please specify a valid player-name!"));
}
public TextComponent wrongSubStatType(Statistic.Type statType, String subStatEntry, boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent wrongSubStatType(Statistic.Type statType) {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"\"" + subStatEntry + "\" is not a valid " + EnumHandler.getSubStatTypeName(statType) + "!"));
"This is not a valid " + EnumHandler.getSubStatTypeName(statType) + "!"));
}
public TextComponent requestAlreadyRunning(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent requestAlreadyRunning() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"Please wait for your previous lookup to finish!"));
@ -111,7 +108,7 @@ public class MessageWriter {
//TODO Make this say amount of time left
public TextComponent stillOnShareCoolDown() {
return componentFactory.pluginPrefixComponent(false)
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content("You need to wait")
.append(space())
@ -123,20 +120,20 @@ public class MessageWriter {
}
public TextComponent resultsAlreadyShared() {
return componentFactory.pluginPrefixComponent(false)
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content("You already shared these results!"));
}
public TextComponent statResultsTooOld() {
return componentFactory.pluginPrefixComponent(false)
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"It has been too long since you looked up this statistic, please repeat the original look-up if you want to share it!"));
}
public TextComponent unknownError(boolean isBukkitConsole) {
return componentFactory.pluginPrefixComponent(isBukkitConsole)
public TextComponent unknownError() {
return componentFactory.pluginPrefixComponent()
.append(space())
.append(componentFactory.messageComponent().content(
"Something went wrong with your request, " +
@ -158,7 +155,7 @@ public class MessageWriter {
public TextComponent formatTopStats(@NotNull LinkedHashMap<String, Integer> topStats, @NotNull StatRequest request) {
TextComponent.Builder topList = Component.text()
.append(newline())
.append(componentFactory.pluginPrefixComponent(request.isBukkitConsoleSender())).append(space())
.append(componentFactory.pluginPrefixComponent()).append(space())
.append(componentFactory.titleComponent(config.getTopStatsTitle(), Target.TOP)).append(space())
.append(componentFactory.titleNumberComponent(topStats.size())).append(space())
.append(getStatNameComponent(request)) //space is provided by statUnitComponent
@ -211,14 +208,13 @@ public class MessageWriter {
.hoverEvent(HoverEvent.showText(text("CLICK ME").color(PluginColor.LIGHT_GOLD.getColor()))));
}
public TextComponent usageExamples(boolean isBukkitConsole) {
return new ExampleMessage(componentFactory, isBukkitConsole);
public TextComponent usageExamples() {
return new ExampleMessage(componentFactory);
}
public TextComponent helpMsg(boolean isConsoleSender) {
public TextComponent helpMsg() {
return new HelpMessage(componentFactory,
config.useHoverText() && !isConsoleSender,
isConsoleSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit"),
config.useHoverText(),
config.getTopListMaxSize());
}

View File

@ -2,43 +2,46 @@ package com.gmail.artemis.the.gr8.playerstats.msg;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.DebugLevel;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginColor;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage;
import java.time.LocalDate;
import java.time.Month;
import static net.kyori.adventure.text.Component.*;
public class PrideComponentFactory extends ComponentFactory {
private static ConfigHandler config;
public PrideComponentFactory(ConfigHandler c) {
super(c);
config = c;
}
@Override
public TextComponent prefixTitleComponent(boolean isBukkitConsole) {
if (cancelRainbow(isBukkitConsole)) {
return super.prefixTitleComponent(isBukkitConsole);
}
else {
String title = "<rainbow:16>____________ [PlayerStats] ____________</rainbow>"; //12 underscores
return text()
.append(MiniMessage.miniMessage().deserialize(title))
.build();
}
MyLogger.logMsg("PrideComponentFactory created!", DebugLevel.MEDIUM);
}
@Override
public TextComponent pluginPrefixComponent(boolean isConsoleSender) {
if (cancelRainbow(isConsoleSender)) {
return super.pluginPrefixComponent(isConsoleSender);
}
protected void prepareColors() {
PREFIX = PluginColor.GOLD.getColor();
BRACKETS = PluginColor.GRAY.getColor();
UNDERSCORE = PluginColor.DARK_PURPLE.getColor();
MSG_MAIN = PluginColor.MEDIUM_GOLD.getColor();
MSG_MAIN_2 = PluginColor.GOLD.getColor();
MSG_ACCENT = PluginColor.GOLD.getColor();
MSG_ACCENT_2 = PluginColor.LIGHT_YELLOW.getColor();
HOVER_MSG = PluginColor.LIGHT_BLUE.getColor();
HOVER_ACCENT = PluginColor.LIGHT_GOLD.getColor();
}
@Override
public TextComponent prefixTitleComponent() {
String title = "<rainbow:16>____________ [PlayerStats] ____________</rainbow>"; //12 underscores
return text()
.append(MiniMessage.miniMessage().deserialize(title))
.build();
}
@Override
public TextComponent pluginPrefixComponent() {
return text()
.append(MiniMessage.miniMessage()
.deserialize("<#f74040>[</#f74040>" +
@ -57,11 +60,22 @@ public class PrideComponentFactory extends ComponentFactory {
.build();
}
/** Don't use rainbow formatting if the rainbow Prefix is disabled,
if festive formatting is disabled or it is not pride month,
or the commandsender is a Bukkit or Spigot console.*/
private boolean cancelRainbow(boolean isBukkitConsole) {
return !(config.enableRainbowMode() || (config.enableFestiveFormatting() && LocalDate.now().getMonth().equals(Month.JUNE))) ||
(isBukkitConsole);
public TextComponent backwardsPluginPrefixComponents() {
return text()
.append(MiniMessage.miniMessage()
.deserialize("<#631ae6>[</#631ae6>" +
"<#3341E6>P</#3341E6>" +
"<#1F8BEB>l</#1F8BEB>" +
"<#01c1a7>a</#01c1a7>" +
"<#46D858>y</#46D858>" +
"<#84D937>e</#84D937>" +
"<#C1DA15>r</#C1DA15>" +
"<#F7C522>S</#F7C522>" +
"<#EEA019>t</#EEA019>" +
"<#ee8a19>a</#ee8a19>" +
"<#f67824>t</#f67824>" +
"<#f76540>s</#f76540>" +
"<#f74040>]</#f74040>"))
.build();
}
}

View File

@ -1,12 +1,11 @@
package com.gmail.artemis.the.gr8.playerstats.msg.msgutils;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginColor;
import com.gmail.artemis.the.gr8.playerstats.msg.BukkitConsoleComponentFactory;
import com.gmail.artemis.the.gr8.playerstats.msg.ComponentFactory;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Unmodifiable;
@ -19,36 +18,33 @@ public class ExampleMessage implements TextComponent {
private final TextComponent exampleMessage;
private final ComponentFactory componentFactory;
public ExampleMessage(ComponentFactory componentFactory, boolean isBukkitConsole) {
public ExampleMessage(ComponentFactory componentFactory) {
this.componentFactory = componentFactory;
exampleMessage = getExampleMessage(isBukkitConsole);
exampleMessage = getExampleMessage();
}
public TextComponent getExampleMessage(boolean isBukkitConsole) {
TextColor mainColor = isBukkitConsole ? PluginColor.GOLD.getConsoleColor() : PluginColor.GOLD.getColor();
TextColor accentColor1 = isBukkitConsole ? PluginColor.MEDIUM_GOLD.getConsoleColor() : PluginColor.MEDIUM_GOLD.getColor();
TextColor accentColor3 = isBukkitConsole ? PluginColor.LIGHT_YELLOW.getConsoleColor() : PluginColor.LIGHT_YELLOW.getColor();
String arrow = isBukkitConsole ? " -> " : ""; //4 spaces, alt + 26, 1 space
public TextComponent getExampleMessage() {
String arrow = componentFactory instanceof BukkitConsoleComponentFactory ? " -> " : ""; //4 spaces, alt + 26, 1 space
return Component.newline()
.append(componentFactory.prefixTitleComponent(isBukkitConsole))
.append(componentFactory.prefixTitleComponent())
.append(Component.newline())
.append(text("Examples: ").color(mainColor))
.append(text("Examples: ").color(componentFactory.msgMain2()))
.append(Component.newline())
.append(text(arrow).color(mainColor)
.append(text(arrow).color(componentFactory.msgMain2())
.append(text("/statistic ")
.append(text("animals_bred ").color(accentColor1)
.append(text("top").color(accentColor3)))))
.append(text("animals_bred ").color(componentFactory.msgAccent())
.append(text("top").color(componentFactory.msgAccent2())))))
.append(Component.newline())
.append(text(arrow).color(mainColor)
.append(text(arrow).color(componentFactory.msgMain2())
.append(text("/statistic ")
.append(text("mine_block diorite ").color(accentColor1)
.append(text("me").color(accentColor3)))))
.append(text("mine_block diorite ").color(componentFactory.msgAccent())
.append(text("me").color(componentFactory.msgAccent2())))))
.append(Component.newline())
.append(text(arrow).color(mainColor)
.append(text(arrow).color(componentFactory.msgMain2())
.append(text("/statistic ")
.append(text("deaths ").color(accentColor1)
.append(text("player ").color(accentColor3)
.append(text("deaths ").color(componentFactory.msgAccent())
.append(text("player ").color(componentFactory.msgAccent2())
.append(text("Artemis_the_gr8"))))));
}
@ -86,4 +82,4 @@ public class ExampleMessage implements TextComponent {
public @NotNull TextComponent style(@NotNull Style style) {
return exampleMessage.style(style);
}
}
}

View File

@ -1,14 +1,12 @@
package com.gmail.artemis.the.gr8.playerstats.msg.msgutils;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginColor;
import com.gmail.artemis.the.gr8.playerstats.msg.BukkitConsoleComponentFactory;
import com.gmail.artemis.the.gr8.playerstats.msg.ComponentFactory;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Unmodifiable;
@ -21,145 +19,122 @@ public class HelpMessage implements TextComponent {
private final ComponentFactory componentFactory;
private final TextComponent helpMessage;
boolean isBukkitConsole;
TextColor GRAY;
TextColor DARK_PURPLE;
TextColor GOLD;
TextColor MEDIUM_GOLD;
TextColor LIGHT_GOLD;
TextColor LIGHT_BLUE;
public HelpMessage(ComponentFactory componentFactory, boolean useHover, boolean isBukkitConsole, int listSize) {
public HelpMessage(ComponentFactory componentFactory, boolean useHover, int listSize) {
this.componentFactory = componentFactory;
this.isBukkitConsole = isBukkitConsole;
getPluginColors(isBukkitConsole);
if (!useHover || isBukkitConsole) {
helpMessage = getPlainHelpMsg(isBukkitConsole, listSize);
if (!useHover) {
helpMessage = getPlainHelpMsg(listSize);
} else {
helpMessage = helpMsgHover(listSize);
}
}
private TextComponent getPlainHelpMsg(boolean isBukkitConsole, int listSize) {
String arrowSymbol = isBukkitConsole ? "->" : ""; //alt + 26
String bulletSymbol = isBukkitConsole ? "*" : ""; //alt + 7
private TextComponent getPlainHelpMsg(int listSize) {
String arrowSymbol = ""; //alt + 26
String bulletSymbol = ""; //alt + 7
if (componentFactory instanceof BukkitConsoleComponentFactory) {
arrowSymbol = "->";
bulletSymbol = "*";
}
TextComponent spaces = text(" "); //4 spaces
TextComponent arrow = text(arrowSymbol).color(NamedTextColor.GOLD);
TextComponent bullet = text(bulletSymbol).color(NamedTextColor.GOLD);
TextComponent arrow = text(arrowSymbol).color(componentFactory.msgMain2());
TextComponent bullet = text(bulletSymbol).color(componentFactory.msgMain2());
return Component.newline()
.append(componentFactory.prefixTitleComponent(isBukkitConsole))
.append(componentFactory.prefixTitleComponent())
.append(newline())
.append(text("Type \"/statistic examples\" to see examples!").color(GRAY).decorate(TextDecoration.ITALIC))
.append(text("Type \"/statistic examples\" to see examples!").color(componentFactory.brackets()).decorate(TextDecoration.ITALIC))
.append(newline())
.append(text("Usage:").color(GOLD)).append(space())
.append(text("/statistic").color(LIGHT_GOLD))
.append(text("Usage:").color(componentFactory.msgMain2())).append(space())
.append(text("/statistic").color(componentFactory.hoverAccent()))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("name").color(LIGHT_GOLD))
.append(text("name").color(componentFactory.hoverAccent()))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("{sub-statistic}").color(LIGHT_GOLD)).append(space())
.append(text("(a block, item or entity)").color(GRAY))
.append(text("{sub-statistic}").color(componentFactory.hoverAccent())).append(space())
.append(text("(a block, item or entity)").color(componentFactory.brackets()))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("me | player | server | top").color(LIGHT_GOLD))
.append(text("me | player | server | top").color(componentFactory.hoverAccent()))
.append(newline())
.append(spaces).append(spaces).append(bullet).append(space())
.append(text("me:").color(MEDIUM_GOLD)).append(space())
.append(text("your own statistic").color(GRAY))
.append(text("me:").color(componentFactory.msgAccent())).append(space())
.append(text("your own statistic").color(componentFactory.brackets()))
.append(newline())
.append(spaces).append(spaces).append(bullet).append(space())
.append(text("player:").color(MEDIUM_GOLD)).append(space())
.append(text("choose a player").color(GRAY))
.append(text("player:").color(componentFactory.msgAccent())).append(space())
.append(text("choose a player").color(componentFactory.brackets()))
.append(newline())
.append(spaces).append(spaces).append(bullet).append(space())
.append(text("server:").color(MEDIUM_GOLD)).append(space())
.append(text("everyone on the server combined").color(GRAY))
.append(text("server:").color(componentFactory.msgAccent())).append(space())
.append(text("everyone on the server combined").color(componentFactory.brackets()))
.append(newline())
.append(spaces).append(spaces).append(bullet).append(space())
.append(text("top:").color(MEDIUM_GOLD)).append(space())
.append(text("the top").color(GRAY).append(space()).append(text(listSize)))
.append(text("top:").color(componentFactory.msgAccent())).append(space())
.append(text("the top").color(componentFactory.brackets()).append(space()).append(text(listSize)))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("{player-name}").color(LIGHT_GOLD));
.append(text("{player-name}").color(componentFactory.hoverAccent()));
}
private TextComponent helpMsgHover(int listSize) {
TextComponent spaces = text(" ");
TextComponent arrow = text("").color(GOLD);
TextComponent arrow = text("").color(componentFactory.msgMain2());
return Component.newline()
.append(componentFactory.prefixTitleComponent(false))
.append(componentFactory.prefixTitleComponent())
.append(newline())
.append(componentFactory.subTitleComponent("Hover over the arguments for more information!"))
.append(newline())
.append(text("Usage:").color(GOLD)).append(space())
.append(text("/statistic").color(LIGHT_GOLD))
.append(text("Usage:").color(componentFactory.msgMain2())).append(space())
.append(text("/statistic").color(componentFactory.hoverAccent()))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("name").color(LIGHT_GOLD)
.hoverEvent(HoverEvent.showText(text("The name that describes the statistic").color(LIGHT_BLUE)
.append(text("name").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(text("The name that describes the statistic").color(componentFactory.hoverMsg())
.append(newline())
.append(text("Example: ").color(GOLD))
.append(text("\"animals_bred\"").color(LIGHT_GOLD)))))
.append(text("Example: ").color(componentFactory.msgMain2()))
.append(text("\"animals_bred\"").color(componentFactory.hoverAccent())))))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("sub-statistic").color(LIGHT_GOLD)
.append(text("sub-statistic").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("Some statistics need an item, block or entity as extra input").color(LIGHT_BLUE)
text("Some statistics need an item, block or entity as extra input").color(componentFactory.hoverMsg())
.append(newline())
.append(text("Example: ").color(GOLD)
.append(text("\"mine_block diorite\"").color(LIGHT_GOLD))))))
.append(text("Example: ").color(componentFactory.msgMain2())
.append(text("\"mine_block diorite\"").color(componentFactory.hoverAccent()))))))
.append(newline())
.append(spaces).append(arrow
.hoverEvent(HoverEvent.showText(
text("Choose one").color(DARK_PURPLE)))).append(space())
.append(text("me").color(LIGHT_GOLD)
text("Choose one").color(componentFactory.underscore())))).append(space())
.append(text("me").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("See your own statistic").color(LIGHT_BLUE))))
.append(text(" | ").color(LIGHT_GOLD))
.append(text("player").color(LIGHT_GOLD)
text("See your own statistic").color(componentFactory.hoverMsg()))))
.append(text(" | ").color(componentFactory.hoverAccent()))
.append(text("player").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("Choose any player that has played on your server").color(LIGHT_BLUE))))
.append(text(" | ").color(LIGHT_GOLD))
.append(text("server").color(LIGHT_GOLD)
text("Choose any player that has played on your server").color(componentFactory.hoverMsg()))))
.append(text(" | ").color(componentFactory.hoverAccent()))
.append(text("server").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("See the combined total for everyone on your server").color(LIGHT_BLUE))))
.append(text(" | ").color(LIGHT_GOLD))
.append(text("top").color(LIGHT_GOLD)
text("See the combined total for everyone on your server").color(componentFactory.hoverMsg()))))
.append(text(" | ").color(componentFactory.hoverAccent()))
.append(text("top").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("See the top").color(LIGHT_BLUE).append(space())
text("See the top").color(componentFactory.hoverMsg()).append(space())
.append(text(listSize)))))
.append(newline())
.append(spaces).append(arrow).append(space())
.append(text("player-name").color(LIGHT_GOLD)
.append(text("player-name").color(componentFactory.hoverAccent())
.hoverEvent(HoverEvent.showText(
text("In case you typed").color(LIGHT_BLUE).append(space())
.append(text("\"player\"").color(LIGHT_GOLD))
text("In case you typed").color(componentFactory.hoverMsg()).append(space())
.append(text("\"player\"").color(componentFactory.hoverAccent()))
.append(text(", add the player's name")))));
}
private void getPluginColors(boolean isBukkitConsole) {
if (isBukkitConsole) {
GRAY = PluginColor.GRAY.getConsoleColor();
DARK_PURPLE = PluginColor.DARK_PURPLE.getConsoleColor();
GOLD = PluginColor.GOLD.getConsoleColor();
MEDIUM_GOLD = PluginColor.MEDIUM_GOLD.getConsoleColor();
LIGHT_GOLD = PluginColor.LIGHT_GOLD.getConsoleColor();
LIGHT_BLUE = PluginColor.LIGHT_BLUE.getConsoleColor();
} else {
GRAY = PluginColor.GRAY.getColor();
DARK_PURPLE = PluginColor.DARK_PURPLE.getColor();
GOLD = PluginColor.GOLD.getColor();
MEDIUM_GOLD = PluginColor.MEDIUM_GOLD.getColor();
LIGHT_GOLD = PluginColor.LIGHT_GOLD.getColor();
LIGHT_BLUE = PluginColor.LIGHT_BLUE.getColor();
}
}
@Override
public @NotNull String content() {
return helpMessage.content();

View File

@ -1,19 +1,17 @@
package com.gmail.artemis.the.gr8.playerstats.reload;
import com.gmail.artemis.the.gr8.playerstats.Main;
import com.gmail.artemis.the.gr8.playerstats.ShareManager;
import com.gmail.artemis.the.gr8.playerstats.ThreadManager;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.DebugLevel;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.statistic.StatThread;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Set;
@ -25,10 +23,9 @@ import java.util.function.Predicate;
public class ReloadThread extends Thread {
private static ConfigHandler config;
private final MessageWriter messageWriter;
private static MessageSender messageSender;
private final OfflinePlayerHandler offlinePlayerHandler;
private static BukkitAudiences adventure;
private static ShareManager shareManager;
private final int reloadThreadID;
@ -37,12 +34,11 @@ public class ReloadThread extends Thread {
private final CommandSender sender;
public ReloadThread(ConfigHandler c, MessageWriter m, OfflinePlayerHandler o, int ID, @Nullable StatThread s, @Nullable CommandSender se) {
public ReloadThread(ConfigHandler c, MessageSender m, OfflinePlayerHandler o, int ID, @Nullable StatThread s, @Nullable CommandSender se) {
config = c;
messageWriter = m;
messageSender = m;
offlinePlayerHandler = o;
adventure = Main.adventure();
shareManager = ShareManager.getInstance(c);
reloadThreadID = ID;
@ -72,10 +68,8 @@ public class ReloadThread extends Thread {
MyLogger.logMsg("Reloading!", false);
reloadEverything();
boolean isBukkitConsole = sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit");
if (sender != null) {
adventure.sender(sender).sendMessage(
messageWriter.reloadedConfig(isBukkitConsole));
messageSender.send(sender, PluginMessage.RELOADED_CONFIG);
}
}
else { //during first start-up
@ -87,7 +81,7 @@ public class ReloadThread extends Thread {
private void reloadEverything() {
MyLogger.setDebugLevel(config.getDebugLevel());
MessageWriter.updateComponentFactory();
messageSender.updateComponentFactories(config);
offlinePlayerHandler.updateOfflinePlayerList(loadOfflinePlayers());
shareManager.updateSettings(config);
}

View File

@ -1,17 +1,16 @@
package com.gmail.artemis.the.gr8.playerstats.statistic;
import com.gmail.artemis.the.gr8.playerstats.Main;
import com.gmail.artemis.the.gr8.playerstats.ShareManager;
import com.gmail.artemis.the.gr8.playerstats.enums.PluginMessage;
import com.gmail.artemis.the.gr8.playerstats.enums.Target;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageWriter;
import com.gmail.artemis.the.gr8.playerstats.msg.MessageSender;
import com.gmail.artemis.the.gr8.playerstats.reload.ReloadThread;
import com.gmail.artemis.the.gr8.playerstats.ThreadManager;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler;
import com.google.common.collect.ImmutableList;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
@ -25,25 +24,23 @@ import java.util.stream.Collectors;
public class StatThread extends Thread {
private static ConfigHandler config;
private final MessageWriter messageWriter;
private final MessageSender messageSender;
private final OfflinePlayerHandler offlinePlayerHandler;
private final ReloadThread reloadThread;
private final StatRequest request;
private static ShareManager shareManager;
private static BukkitAudiences adventure;
public StatThread(ConfigHandler c, MessageWriter m, OfflinePlayerHandler o, int ID, StatRequest s, @Nullable ReloadThread r) {
public StatThread(ConfigHandler c, MessageSender m, OfflinePlayerHandler o, int ID, StatRequest s, @Nullable ReloadThread r) {
config = c;
messageWriter = m;
messageSender = m;
offlinePlayerHandler = o;
reloadThread = r;
request = s;
adventure = Main.adventure();
shareManager = ShareManager.getInstance(config);
this.setName("StatThread-" + request.getCommandSender().getName() + "-" + ID);
@ -60,8 +57,7 @@ public class StatThread extends Thread {
if (reloadThread != null && reloadThread.isAlive()) {
try {
MyLogger.waitingForOtherThread(this.getName(), reloadThread.getName());
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.stillReloading(request.isBukkitConsoleSender()));
messageSender.send(request.getCommandSender(), PluginMessage.STILL_RELOADING);
reloadThread.join();
} catch (InterruptedException e) {
@ -72,29 +68,27 @@ public class StatThread extends Thread {
long lastCalc = ThreadManager.getLastRecordedCalcTime();
if (lastCalc > 2000) {
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.waitAMoment(lastCalc > 20000, request.isBukkitConsoleSender()));
messageSender.send(request.getCommandSender(), PluginMessage.WAIT_A_MOMENT, lastCalc > 20000);
}
Target selection = request.getSelection();
TextComponent statResult;
try {
statResult = switch (selection) {
case PLAYER -> messageWriter.formatPlayerStat(getIndividualStat(), request);
case TOP -> messageWriter.formatTopStats(getTopStats(), request);
case SERVER -> messageWriter.formatServerStat(getServerTotal(), request);
switch (selection) {
case PLAYER -> messageSender.send(request, getIndividualStat());
case TOP -> messageSender.send(request, getTopStats());
case SERVER -> messageSender.send(request, getServerTotal());
};
if (shareManager.isEnabled() && request.getCommandSender().hasPermission("playerstats.share")) {
UUID shareCode = shareManager.saveStatResult(request.getCommandSender().getName(), statResult);
statResult = messageWriter.addShareButton(statResult, shareCode, request.getSelection());
//UUID shareCode = shareManager.saveStatResult(request.getCommandSender().getName(), statResult);
//statResult = messageWriter.addShareButton(statResult, shareCode, request.getSelection());
}
adventure.sender(request.getCommandSender()).sendMessage(statResult);
//adventure.sender(request.getCommandSender()).sendMessage(statResult);
}
catch (ConcurrentModificationException e) {
if (!request.isConsoleSender()) {
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.unknownError(false));
messageSender.send(request.getCommandSender(), PluginMessage.UNKNOWN_ERROR);
}
}
}