Finished stat-results in hover-text (#92, #52), moved random name colors to PrideComponentFactory, improved formatting

This commit is contained in:
Artemis-the-gr8 2022-07-18 17:36:28 +02:00
parent 8ae089f222
commit 1307196295
10 changed files with 121 additions and 116 deletions

View File

@ -113,7 +113,7 @@ public final class ShareManager {
puts the current time in the shareTimeStamp (ConcurrentHashMap),
puts the shareCode (UUID) in the sharedResults (ArrayBlockingQueue),
and returns the statResult. If no statResult was found, returns null.*/
public @Nullable TextComponent getStatResult(String playerName, UUID shareCode) {
public @Nullable StatResult getStatResult(String playerName, UUID shareCode) {
if (statResultQueue.containsKey(shareCode)) {
shareTimeStamp.put(playerName, Instant.now());
@ -132,8 +132,7 @@ public final class ShareManager {
}
sharedResults.offer(shareCode);
}
StatResult result = statResultQueue.remove(shareCode);
return result.statResult();
return statResultQueue.remove(shareCode);
}
else {
return null;

View File

@ -2,9 +2,9 @@ package com.gmail.artemis.the.gr8.playerstats.commands;
import com.gmail.artemis.the.gr8.playerstats.ShareManager;
import com.gmail.artemis.the.gr8.playerstats.enums.StandardMessage;
import com.gmail.artemis.the.gr8.playerstats.models.StatResult;
import com.gmail.artemis.the.gr8.playerstats.msg.OutputManager;
import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -39,11 +39,11 @@ public class ShareCommand implements CommandExecutor {
outputManager.sendFeedbackMsg(sender, StandardMessage.STILL_ON_SHARE_COOLDOWN);
}
else {
TextComponent result = shareManager.getStatResult(sender.getName(), shareCode);
StatResult 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
outputManager.sendFeedbackMsg(sender, StandardMessage.STAT_RESULTS_TOO_OLD);
} else {
outputManager.shareStatResults(sender, result);
outputManager.shareStatResults(result.statResult());
}
}
}

View File

@ -31,9 +31,8 @@ public enum PluginColor {
NAME_3 (TextColor.fromHexString("#55AAFF")), //same as medium_blue
NAME_4 (TextColor.fromHexString("#D65DB1")), //magenta-purple
NAME_5 (TextColor.fromHexString("#EE8A19")), //dark orange
NAME_6 (NamedTextColor.GOLD), //same as gold
NAME_7 (TextColor.fromHexString("#01C1A7")), //aqua-cyan-green-ish
NAME_8 (TextColor.fromHexString("46D858")); //light green
NAME_6 (TextColor.fromHexString("#01C1A7")), //aqua-cyan-green-ish
NAME_7 (TextColor.fromHexString("#46D858")); //light green
private final TextColor color;
@ -56,14 +55,13 @@ public enum PluginColor {
public static TextColor getRandomNameColor(boolean isConsole) {
Random randomizer = new Random();
PluginColor color = switch (randomizer.nextInt(8)) {
PluginColor color = switch (randomizer.nextInt(7)) {
case 0 -> NAME_1;
case 2 -> NAME_3;
case 3 -> NAME_4;
case 4 -> NAME_5;
case 5 -> NAME_6;
case 6 -> NAME_7;
case 7 -> NAME_8;
default -> NAME_2;
};
return getCorrespondingColor(color, isConsole);

View File

@ -1,7 +1,6 @@
package com.gmail.artemis.the.gr8.playerstats.models;
import com.gmail.artemis.the.gr8.playerstats.enums.Target;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
@ -37,10 +36,6 @@ public final class StatRequest {
return sender instanceof ConsoleCommandSender;
}
public boolean isBukkitConsoleSender() {
return sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit");
}
public void setStatistic(Statistic statistic) {
this.statistic = statistic;
}

View File

@ -28,7 +28,7 @@ public class BukkitConsoleComponentFactory extends ComponentFactory {
}
@Override
public TextColor getRandomNameColor() {
return PluginColor.getRandomNameColor(true);
public TextColor getSharerNameColor() {
return PluginColor.NAME_5.getConsoleColor();
}
}

View File

@ -65,8 +65,8 @@ public class ComponentFactory {
HOVER_ACCENT = PluginColor.LIGHT_GOLD.getColor();
}
public TextColor getRandomNameColor() {
return PluginColor.getRandomNameColor();
public TextColor getSharerNameColor() {
return PluginColor.NAME_5.getColor();
}
public TextColor prefix() {
@ -309,16 +309,13 @@ public class ComponentFactory {
.color(HOVER_ACCENT))));
}
public TextComponent messageSharedComponent() {
public TextComponent hoveringStatResultComponent(TextComponent statResult) {
return surroundingBracketComponent(
text("Shared!")
.color(CLICKED_MSG));
}
public TextComponent messageSharedComponent(String playerName) {
return messageSharedComponent(
text(playerName)
.color(getRandomNameColor()));
text().append(text("Hover Here")
.color(CLICKED_MSG)
.decorate(TextDecoration.ITALIC)
.hoverEvent(HoverEvent.showText(statResult)))
.build());
}
public TextComponent messageSharedComponent(Component playerName) {
@ -328,10 +325,14 @@ public class ComponentFactory {
.decorate(TextDecoration.ITALIC))
.append(space())
.append(playerName)
.append(text("!"))
.build());
}
public TextComponent sharerNameComponent(String sharerName) {
return text(sharerName)
.color(getSharerNameColor());
}
private TextComponent surroundingBracketComponent(TextComponent component) {
return getComponent(null, BRACKETS, null)
.append(text("["))

View File

@ -11,14 +11,15 @@ import com.gmail.artemis.the.gr8.playerstats.utils.EnumHandler;
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.event.HoverEvent;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.time.LocalDate;
import java.time.Month;
import java.util.*;
import java.util.function.Function;
import java.util.function.BiFunction;
import static net.kyori.adventure.text.Component.*;
@ -155,29 +156,22 @@ public class MessageWriter {
config.getTopListMaxSize());
}
public Function<UUID, TextComponent> formattedPlayerStatFunction(int stat, @NotNull StatRequest request) {
TextComponent.Builder playerStat = Component.text()
public BiFunction<UUID, CommandSender, TextComponent> formattedPlayerStatFunction(int stat, @NotNull StatRequest request) {
TextComponent playerStat = Component.text()
.append(componentFactory.playerNameBuilder(request.getPlayerName(), Target.PLAYER)
.append(text(":"))
.append(space()))
.append(getStatNumberComponent(request.getStatistic(), stat, Target.PLAYER, request.isConsoleSender()))
.append(space())
.append(getStatNameComponent(request))
.append(getStatUnitComponent(request.getStatistic(), request.getSelection(), request.isConsoleSender())); //space is provided by statUnitComponent
.append(getStatUnitComponent(request.getStatistic(), request.getSelection(), request.isConsoleSender())) //space is provided by statUnitComponent
.build();
return shareCode -> {
TextComponent.Builder playerBuilder = text().append(playerStat);
//if we're adding a share-button
if (shareCode != null) {
playerBuilder.append(space())
.append(componentFactory.shareButtonComponent(shareCode));
}
return playerBuilder.build();
};
return getFormattingFunction(playerStat);
}
public Function<UUID,TextComponent> formattedServerStatFunction(long stat, @NotNull StatRequest request) {
TextComponent.Builder serverStat = text()
public BiFunction<UUID, CommandSender, TextComponent> formattedServerStatFunction(long stat, @NotNull StatRequest request) {
TextComponent serverStat = text()
.append(componentFactory.titleComponent(config.getServerTitle(), Target.SERVER))
.append(space())
.append(componentFactory.serverNameComponent(config.getServerName()))
@ -185,57 +179,77 @@ public class MessageWriter {
.append(getStatNumberComponent(request.getStatistic(), stat, Target.SERVER, request.isConsoleSender()))
.append(space())
.append(getStatNameComponent(request))
.append(getStatUnitComponent(request.getStatistic(), request.getSelection(), request.isConsoleSender())); //space is provided by statUnit
.append(getStatUnitComponent(request.getStatistic(), request.getSelection(), request.isConsoleSender())) //space is provided by statUnit
.build();
return shareCode -> {
TextComponent.Builder serverBuilder = text().append(serverStat);
//if we're adding a share-button
if (shareCode != null) {
serverBuilder.append(space())
.append(componentFactory.shareButtonComponent(shareCode));
}
return serverBuilder.build();
};
return getFormattingFunction(serverStat);
}
public Function<UUID, TextComponent> formattedTopStatFunction(@NotNull LinkedHashMap<String, Integer> topStats, @NotNull StatRequest request) {
public BiFunction<UUID, CommandSender, TextComponent> formattedTopStatFunction(@NotNull LinkedHashMap<String, Integer> topStats, @NotNull StatRequest request) {
TextComponent title = getTopStatsTitle(request, topStats.size());
TextComponent shortTitle = getTopStatsTitleShort(request, topStats.size());
TextComponent list = getTopStatList(topStats, request);
return shareCode -> {
TextComponent.Builder topBuilder = text();
return (shareCode, sender) -> {
TextComponent.Builder topBuilder = text().append(newline());
//if we're adding a share-button
if (shareCode != null) {
TextComponent newLineTitle = newline().append(title);
topBuilder
.append(newLineTitle)
.append(space())
.append(componentFactory.shareButtonComponent(shareCode));
} else {
topBuilder.append(title);
topBuilder.append(title)
.append(space())
.append(componentFactory.shareButtonComponent(shareCode))
.append(list);
}
//if we're not adding a share-button or a "shared by" component
else if (sender == null) {
topBuilder.append(title)
.append(list);
}
//if we're adding a "shared by" component
else {
topBuilder.append(shortTitle)
.append(space())
.append(componentFactory.hoveringStatResultComponent(text()
.append(title)
.append(list)
.build()))
.append(newline())
.append(componentFactory.messageSharedComponent(
getSharerNameComponent(sender)));
}
topBuilder.append(list);
return topBuilder.build();
};
}
//TODO add fancy hover-text with sharedResults
public TextComponent messageShared(TextComponent statResults) {
return componentFactory.messageSharedComponent()
.hoverEvent(HoverEvent.showText(statResults));
private BiFunction<UUID, CommandSender, TextComponent> getFormattingFunction(@NotNull TextComponent statResult) {
return (shareCode, sender) -> {
TextComponent.Builder statBuilder = text().append(newline());
//if we're adding a share-button
if (shareCode != null) {
statBuilder.append(statResult)
.append(space())
.append(componentFactory.shareButtonComponent(shareCode));
}
//if we're adding a "shared by" component
else if (sender != null) {
statBuilder.append(statResult)
.append(newline())
.append(componentFactory.messageSharedComponent(
getSharerNameComponent(sender)));
}
return statBuilder.build();
};
}
public TextComponent addSharedSignature(TextComponent statResults, String playerName) {
return statResults.append(newline())
.append(componentFactory.messageSharedComponent(playerName));
}
public TextComponent addSharedSignature(TextComponent statResults, Component playerName) {
return statResults.append(newline())
.append(componentFactory.messageSharedComponent(playerName));
}
public TextComponent startWithNewLine(TextComponent component) {
return newline().append(component);
private Component getSharerNameComponent(CommandSender sender) {
if (sender instanceof Player player) {
Component senderName = EasterEggProvider.getPlayerName(player);
if (senderName != null) {
return senderName;
}
}
return componentFactory.sharerNameComponent(sender.getName());
}
private TextComponent getTopStatsTitle(StatRequest request, int statListSize) {
@ -248,6 +262,14 @@ public class MessageWriter {
.build();
}
private TextComponent getTopStatsTitleShort(StatRequest request, int statListSize) {
return Component.text()
.append(componentFactory.titleComponent(config.getTopStatsTitle(), Target.TOP)).append(space())
.append(componentFactory.titleNumberComponent(statListSize)).append(space())
.append(getStatNameComponent(request)) //space is provided by statUnitComponent
.build();
}
private TextComponent getTopStatList(LinkedHashMap<String, Integer> topStats, StatRequest request) {
TextComponent.Builder topList = Component.text();
boolean useDots = config.useDots();

View File

@ -5,20 +5,17 @@ import com.gmail.artemis.the.gr8.playerstats.ShareManager;
import com.gmail.artemis.the.gr8.playerstats.config.ConfigHandler;
import com.gmail.artemis.the.gr8.playerstats.enums.StandardMessage;
import com.gmail.artemis.the.gr8.playerstats.models.StatRequest;
import com.gmail.artemis.the.gr8.playerstats.msg.msgutils.EasterEggProvider;
import net.kyori.adventure.identity.Identity;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.UUID;
import java.util.function.BiFunction;
import java.util.function.Function;
import static com.gmail.artemis.the.gr8.playerstats.enums.StandardMessage.*;
@ -78,59 +75,46 @@ public class OutputManager {
adventure.sender(sender).sendMessage(getWriter(sender).helpMsg());
}
public void shareStatResults(CommandSender sender, @NotNull TextComponent statResult) {
if (sender instanceof Player player) {
TextComponent totalResult;
public void shareStatResults(@NotNull TextComponent statResult) {
adventure.players()
// .filterAudience(onlinePlayer -> !onlinePlayer.get(Identity.NAME)
// .orElse("").equalsIgnoreCase(sender.getName()))
.sendMessage(statResult);
Component playerName = EasterEggProvider.getPlayerName(player);
if (playerName == null) {
totalResult = msg.addSharedSignature(statResult, sender.getName());
} else {
totalResult = msg.addSharedSignature(statResult, playerName);
}
totalResult = msg.startWithNewLine(totalResult);
adventure.players()
// .filterAudience(onlinePlayer -> !onlinePlayer.get(Identity.NAME)
// .orElse("").equalsIgnoreCase(sender.getName()))
.sendMessage(totalResult);
adventure.sender(sender).sendMessage(msg.messageShared(statResult));
}
}
public void sendPlayerStat(StatRequest request, int playerStat) {
public void sendPlayerStat(@NotNull StatRequest request, int playerStat) {
CommandSender sender = request.getCommandSender();
Function<UUID, TextComponent> buildFunction =
BiFunction<UUID, CommandSender, TextComponent> buildFunction =
getWriter(sender).formattedPlayerStatFunction(playerStat, request);
processAndSend(sender, buildFunction);
}
public void sendServerStat(StatRequest request, long serverStat) {
public void sendServerStat(@NotNull StatRequest request, long serverStat) {
CommandSender sender = request.getCommandSender();
Function<UUID, TextComponent> buildFunction =
BiFunction<UUID, CommandSender, TextComponent> buildFunction =
getWriter(sender).formattedServerStatFunction(serverStat, request);
processAndSend(sender, buildFunction);
}
public void sendTopStat(StatRequest request, LinkedHashMap<String, Integer> topStats) {
public void sendTopStat(@NotNull StatRequest request, LinkedHashMap<String, Integer> topStats) {
CommandSender sender = request.getCommandSender();
Function<UUID, TextComponent> buildFunction =
BiFunction<UUID, CommandSender, TextComponent> buildFunction =
getWriter(sender).formattedTopStatFunction(topStats, request);
processAndSend(sender, buildFunction);
}
private void processAndSend(CommandSender sender, Function<UUID, TextComponent> buildFunction) {
private void processAndSend(CommandSender sender, BiFunction<UUID, CommandSender, TextComponent> buildFunction) {
if (shareManager.isEnabled() && shareManager.senderHasPermission(sender)) {
UUID shareCode = shareManager.saveStatResult(sender.getName(), buildFunction.apply(null));
adventure.sender(sender).sendMessage(buildFunction.apply(shareCode));
UUID shareCode = shareManager.saveStatResult(sender.getName(), buildFunction.apply(null, sender));
adventure.sender(sender).sendMessage(buildFunction.apply(shareCode, null));
}
else {
adventure.sender(sender).sendMessage(buildFunction.apply(null));
adventure.sender(sender).sendMessage(buildFunction.apply(null, null));
}
}

View File

@ -6,6 +6,7 @@ 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.format.TextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import static net.kyori.adventure.text.Component.*;
@ -33,6 +34,11 @@ public class PrideComponentFactory extends ComponentFactory {
HOVER_ACCENT = PluginColor.LIGHT_GOLD.getColor();
}
@Override
public TextColor getSharerNameColor() {
return PluginColor.getRandomNameColor();
}
@Override
public TextComponent prefixTitleComponent() {
String title = "<rainbow:16>____________ [PlayerStats] ____________</rainbow>"; //12 underscores

View File

@ -46,7 +46,7 @@ public class ExampleMessage implements TextComponent {
.append(text("deaths ").color(componentFactory.msgAccent())
.append(text("player ").color(componentFactory.msgAccent2())
.append(text("Artemis_the_gr8")
.color(componentFactory.getRandomNameColor()))))));
.color(componentFactory.getSharerNameColor()))))));
}
@Override