From bf3feda8cc26424ac1fc968d755da6e4875d7bb2 Mon Sep 17 00:00:00 2001 From: Artemis-the-gr8 Date: Wed, 8 Jun 2022 17:21:42 +0200 Subject: [PATCH] Reworked usage-message to account for lack of hover text --- pom.xml | 2 +- .../gr8/playerstats/commands/StatCommand.java | 18 +- .../filehandlers/ConfigHandler.java | 20 +- .../gr8/playerstats/utils/MessageFactory.java | 197 +++++++++++++----- src/main/resources/config.yml | 13 +- src/main/resources/images/no_hover_usage.png | Bin 0 -> 24140 bytes 6 files changed, 178 insertions(+), 72 deletions(-) create mode 100644 src/main/resources/images/no_hover_usage.png diff --git a/pom.xml b/pom.xml index 281044e..5b242c2 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ - sonatype-oss-snapshots1 + sonatype-oss-snapshots1 https://s01.oss.sonatype.org/content/repositories/snapshots/ diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/commands/StatCommand.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/commands/StatCommand.java index adbb352..1988234 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/commands/StatCommand.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/commands/StatCommand.java @@ -12,6 +12,7 @@ import org.bukkit.Statistic; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -30,7 +31,17 @@ public class StatCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - if (args.length >= 1) { //part 1: collecting all relevant information from the args + if (args.length == 0) { //in case of less than 1 argument, display the help message + adventure.sender(sender).sendMessage(messageFactory.helpMsg(sender instanceof ConsoleCommandSender)); + return true; + } + + else if (args[0].equalsIgnoreCase("examples")) { //in case of "statistic examples", show examples + adventure.sender(sender).sendMessage(messageFactory.usageExamples(sender instanceof ConsoleCommandSender)); + return true; + } + + else { //part 1: collecting all relevant information from the args StatRequest request = generateRequest(sender, args); if (isValidStatRequest(request)) { //part 2: sending the information to the StatThread @@ -42,11 +53,6 @@ public class StatCommand implements CommandExecutor { return false; } } - - else { //in case of less than 1 argument, display the help message - adventure.sender(sender).sendMessage(messageFactory.helpMsg()); - return false; - } } //create a StatRequest Object with all the relevant information from the args diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java index fbdd3e5..73535e1 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java @@ -66,9 +66,9 @@ public class ConfigHandler { return config.getInt("number-of-days-since-last-joined", 0); } - /** Returns the config setting for top-list-max-size, or the default value of 10 if no value can be retrieved. */ - public int getTopListMaxSize() { - return config.getInt("top-list-max-size", 10); + + public boolean useHoverText() { + return config.getBoolean("enable-hover-text", true); } /** Returns the config setting for use-dots, or the default value "true" if no value can be retrieved. */ @@ -76,16 +76,20 @@ public class ConfigHandler { return config.getBoolean("use-dots", true); } + /** Returns the config setting for top-list-max-size, or the default value of 10 if no value can be retrieved. */ + public int getTopListMaxSize() { + return config.getInt("top-list-max-size", 10); + } + + public String getServerTitle() { + return config.getString("total-server-stat-title", "Total on"); + } + /** Returns the specified server name, or "this server" if no value can be retrieved. */ public String getServerName() { return config.getString("your-server-name", "this server"); } - - public String getServerTitle() { - return config.getString("total-server-stat-title", "In total on"); - } - /** Returns a String that represents either a Chat Color, hex color code, or Style. Default values are "none" for Style, and "green" or "gold" for Color (for top or individual color). */ public String getPlayerNameFormatting(Query selection, boolean isStyle) { diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java index 2c3c957..1d91a0a 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java @@ -23,10 +23,10 @@ public class MessageFactory { private static ConfigHandler config; - private static final TextColor msgColor = TextColor.fromHexString("#55AAFF"); - private static final TextColor hoverBaseColor = TextColor.fromHexString("#55C6FF"); - private static final TextColor hoverAccentColor1 = TextColor.fromHexString("#FFB80E"); - private static final TextColor hoverAccentColor2 = TextColor.fromHexString("#FFD52B"); + private static final TextColor msgColor = TextColor.fromHexString("#55AAFF"); //my favorite shade of light blue, somewhere between blue and aqua + private static final TextColor hoverBaseColor = TextColor.fromHexString("#55C6FF"); //light blue - one shade lighter than msgColor + private static final TextColor accentColor1 = TextColor.fromHexString("#FFB80E"); //gold - one shade lighter than standard gold + private static final TextColor accentColor2 = TextColor.fromHexString("#FFD52B"); //yellow - a few shades darker than standard yellow public MessageFactory(ConfigHandler c) { @@ -101,71 +101,50 @@ public class MessageFactory { .color(msgColor)); } - public TextComponent helpMsg() { - TextComponent spaces = text(" "); - TextComponent underscores = text("____________").color(TextColor.fromHexString("#6E3485")); - TextComponent arrow = text("→ ").color(NamedTextColor.GOLD); - TextColor arguments = NamedTextColor.YELLOW; + public TextComponent helpMsg(boolean isConsoleSender) { + if (!isConsoleSender) { + return config.useHoverText() ? helpMsgHover() : helpMsgPlain(false); + } + else { + return helpMsgPlain(true); + } + } + public TextComponent usageExamples(boolean isConsoleSender) { + TextComponent spaces = text(" "); //4 spaces + TextComponent underscores = text("_____________").color(TextColor.fromHexString("#6E3485")); + TextComponent arrow = text("→ ").color(NamedTextColor.GOLD); + TextColor accentColor = TextColor.fromHexString("#FFE339"); + + if (isConsoleSender) { + arrow = text("-> ").color(NamedTextColor.GOLD); + accentColor = NamedTextColor.YELLOW; + } return Component.newline() .append(underscores).append(spaces).append(pluginPrefix()).append(spaces).append(underscores) .append(newline()) - .append(text("Hover over the arguments for more information!").color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)) - .append(newline()) - .append(text("Usage: ").color(NamedTextColor.GOLD)).append(text("/statistic").color(arguments)) + .append(text("Examples: ").color(NamedTextColor.GOLD)) .append(newline()) .append(spaces).append(arrow) - .append(text("name").color(arguments) - .hoverEvent(HoverEvent.showText(text("The name that describes the statistic").color(hoverBaseColor) - .append(newline()) - .append(text("Example: ").color(hoverAccentColor1)) - .append(text("\"animals_bred\"").color(hoverAccentColor2))))) + .append(text("/statistic animals_bred top").color(accentColor)) .append(newline()) .append(spaces).append(arrow) - .append(text("sub-statistic").color(arguments) - .hoverEvent(HoverEvent.showText( - text("Some statistics need an item, block or entity as sub-statistic").color(hoverBaseColor) - .append(newline()) - .append(text("Example: ").color(hoverAccentColor1) - .append(text("\"mine_block diorite\"").color(hoverAccentColor2)))))) - .append(newline()) - .append(spaces) - .append(text("→").color(NamedTextColor.GOLD) - .hoverEvent(HoverEvent.showText( - text("Choose one").color(TextColor.fromHexString("#6E3485"))))) - .append(space()) - .append(text("me").color(arguments) - .hoverEvent(HoverEvent.showText( - text("See your own statistic").color(hoverBaseColor)))) - .append(text(" | ").color(arguments)) - .append(text("player").color(arguments) - .hoverEvent(HoverEvent.showText( - text("Choose any player that has played on your server").color(hoverBaseColor)))) - .append(text(" | ").color(arguments)) - .append(text("server").color(arguments) - .hoverEvent(HoverEvent.showText( - text("See the combined total for everyone on your server").color(hoverBaseColor)))) - .append(text(" | ").color(arguments)) - .append(text("top").color(arguments) - .hoverEvent(HoverEvent.showText( - text("See the top ").color(hoverBaseColor) - .append(text(config.getTopListMaxSize()).color(hoverBaseColor))))) + .append(text("/statistic mine_block diorite me").color(accentColor)) .append(newline()) .append(spaces).append(arrow) - .append(text("player-name").color(arguments) - .hoverEvent(HoverEvent.showText( - text("In case you typed ").color(hoverBaseColor) - .append(text("\"player\"").color(hoverAccentColor2) - .append(text(", add the player's name").color(hoverBaseColor)))))); + .append(text("/statistic deaths player Artemis_the_gr8").color(accentColor)) + .append(newline()); } public TextComponent formatPlayerStat(String playerName, String statName, String subStatEntryName, int stat) { TextComponent.Builder singleStat = Component.text(); singleStat.append(playerNameComponent(Query.PLAYER, playerName + ": ")) - .append(statNumberComponent(Query.PLAYER, stat)).append(space()) + .append(statNumberComponent(Query.PLAYER, stat)) + .append(space()) .append(statNameComponent(Query.PLAYER, statName)) + .append(space()) .append(subStatNameComponent(Query.PLAYER, subStatEntryName)); return singleStat.build(); @@ -344,4 +323,118 @@ public class MessageFactory { return styles.value(configString); } } -} + + //returns the usage-explanation with hovering text + private TextComponent helpMsgHover() { + TextComponent spaces = text(" "); //4 spaces + TextComponent underscores = text("____________").color(TextColor.fromHexString("#6E3485")); //12 underscores + TextComponent arrow = text("→ ").color(NamedTextColor.GOLD); //alt + 26 + TextColor arguments = NamedTextColor.YELLOW; + + return Component.newline() + .append(underscores).append(spaces).append(pluginPrefix()).append(spaces).append(underscores) + .append(newline()) + .append(text("Hover over the arguments for more information!").color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)) + .append(newline()) + .append(text("Usage: ").color(NamedTextColor.GOLD)).append(text("/statistic").color(arguments)) + .append(newline()) + .append(spaces).append(arrow) + .append(text("name").color(arguments) + .hoverEvent(HoverEvent.showText(text("The name that describes the statistic").color(hoverBaseColor) + .append(newline()) + .append(text("Example: ").color(accentColor1)) + .append(text("\"animals_bred\"").color(accentColor2))))) + .append(newline()) + .append(spaces).append(arrow) + .append(text("sub-statistic").color(arguments) + .hoverEvent(HoverEvent.showText( + text("Some statistics need an item, block or entity as extra input").color(hoverBaseColor) + .append(newline()) + .append(text("Example: ").color(accentColor1) + .append(text("\"mine_block diorite\"").color(accentColor2)))))) + .append(newline()) + .append(spaces) + .append(text("→").color(NamedTextColor.GOLD) + .hoverEvent(HoverEvent.showText( + text("Choose one").color(TextColor.fromHexString("#6E3485"))))) + .append(space()) + .append(text("me").color(arguments) + .hoverEvent(HoverEvent.showText( + text("See your own statistic").color(hoverBaseColor)))) + .append(text(" | ").color(arguments)) + .append(text("player").color(arguments) + .hoverEvent(HoverEvent.showText( + text("Choose any player that has played on your server").color(hoverBaseColor)))) + .append(text(" | ").color(arguments)) + .append(text("server").color(arguments) + .hoverEvent(HoverEvent.showText( + text("See the combined total for everyone on your server").color(hoverBaseColor)))) + .append(text(" | ").color(arguments)) + .append(text("top").color(arguments) + .hoverEvent(HoverEvent.showText( + text("See the top ").color(hoverBaseColor) + .append(text(config.getTopListMaxSize()).color(hoverBaseColor))))) + .append(newline()) + .append(spaces).append(arrow) + .append(text("player-name").color(arguments) + .hoverEvent(HoverEvent.showText( + text("In case you typed ").color(hoverBaseColor) + .append(text("\"player\"").color(accentColor2) + .append(text(", add the player's name").color(hoverBaseColor)))))); + } + + //returns the usage-explanation without any hovering text + private TextComponent helpMsgPlain(boolean isConsoleSender) { + TextComponent underscores = text("____________").color(TextColor.fromHexString("#6E3485")); //12 underscores + TextComponent spaces = text(" "); //4 spaces + TextComponent arrow = text("→ ").color(NamedTextColor.GOLD); //alt + 26; + TextComponent bullet = text("• ").color(NamedTextColor.GOLD); //alt + 7 + TextColor arguments = NamedTextColor.YELLOW; + TextColor accentColor = accentColor2; + + if (isConsoleSender) { + arrow = text("-> ").color(NamedTextColor.GOLD); + bullet = text("* ").color(NamedTextColor.GOLD); + accentColor = NamedTextColor.GOLD; + } + + return Component.newline() + .append(underscores).append(spaces).append(pluginPrefix()).append(spaces).append(underscores) + .append(newline()) + .append(text("Type \"/statistic examples\" to see examples!").color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)) + .append(newline()) + .append(text("Usage: ").color(NamedTextColor.GOLD)) + .append(text("/statistic").color(arguments)) + .append(newline()) + .append(spaces).append(arrow) + .append(text("name").color(arguments)) + .append(newline()) + .append(spaces).append(arrow) + .append(text("{sub-statistic}").color(arguments)) + .append(space()) + .append(text("(a block, item or entity)").color(NamedTextColor.GRAY)) + .append(newline()) + .append(spaces).append(arrow) + .append(text("me | player | server | top").color(arguments)) + .append(newline()) + .append(spaces).append(spaces).append(bullet) + .append(text("me:").color(accentColor)) + .append(space()).append(text("your own statistic").color(NamedTextColor.GRAY)) + .append(newline()) + .append(spaces).append(spaces).append(bullet) + .append(text("player:").color(accentColor)) + .append(space()).append(text("choose a player").color(NamedTextColor.GRAY)) + .append(newline()) + .append(spaces).append(spaces).append(bullet) + .append(text("server:").color(accentColor)) + .append(space()).append(text("everyone on the server combined").color(NamedTextColor.GRAY)) + .append(newline()) + .append(spaces).append(spaces).append(bullet) + .append(text("top:").color(accentColor)) + .append(space()).append(text("the top").color(NamedTextColor.GRAY) + .append(space()).append(text(config.getTopListMaxSize()))) + .append(newline()) + .append(spaces).append(arrow) + .append(text("{player-name}").color(arguments)); + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 306fc64..227b690 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,13 +1,13 @@ -# -------------------------------------------------------------------------------------------------------- # -# PlayerStats Configuration # -# -------------------------------------------------------------------------------------------------------- # +# ------------------------------------------------------------------------------------------------------ # +# PlayerStats Configuration # +# ------------------------------------------------------------------------------------------------------ # config-version: 2 # ------------------------------- # # General # # ------------------------------- # -# If true, OP players will receive a message when they join the server if the config version is outdated +# Send OP players a message if the config-version is outdated when they join the server outdated-config-notifications: true # Filtering options to control which players should be included in statistic calculations @@ -22,6 +22,9 @@ number-of-days-since-last-joined: 0 # ------------------------------- # # Format & Display # # ------------------------------- # +# Use hover-text for additional info in the usage explanation +enable-hover-text: false + # If true, the stat-numbers in the top list will be aligned with dots use-dots: true @@ -32,7 +35,7 @@ top-list-max-size: 10 top-list-title: 'Top [x]' # The text you want displayed for a total-on-this-server statistic -# This will be put on the same line ('In total on this server: [x] animals bred', for example) +# This will be put on the same line ('Total on this server: [x] animals bred', for example) total-server-stat-title: 'Total on' your-server-name: 'this server' diff --git a/src/main/resources/images/no_hover_usage.png b/src/main/resources/images/no_hover_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..1a528fbd73ead62ee9d0032acb2bc223239a2427 GIT binary patch literal 24140 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 JuFA$I`Ja-;j86an literal 0 HcmV?d00001