Pass through the messages and clean them up

This commit is contained in:
2026-05-19 17:59:35 -04:00
parent 73c4449cb3
commit 3da6b2972e
20 changed files with 291 additions and 137 deletions
@@ -105,7 +105,7 @@ public abstract class PlexCommand extends Command
catch (PlayerNotFoundException | CommandFailException | ConsoleOnlyException | catch (PlayerNotFoundException | CommandFailException | ConsoleOnlyException |
ConsoleMustDefinePlayerException | PlayerNotBannedException | NumberFormatException ex) ConsoleMustDefinePlayerException | PlayerNotBannedException | NumberFormatException ex)
{ {
send(sender, mmString(ex.getMessage())); send(sender, exceptionComponent(ex));
} }
return true; return true;
} }
@@ -192,12 +192,33 @@ public abstract class PlexCommand extends Command
protected Component usage() protected Component usage()
{ {
return Component.text("Correct Usage: ").color(NamedTextColor.YELLOW).append(componentFromString(getUsage()).color(NamedTextColor.GRAY)); return messageComponent("correctUsagePrefix").append(componentFromString(getUsage()).color(NamedTextColor.GRAY));
} }
protected Component usage(String s) protected Component usage(String s)
{ {
return Component.text("Correct Usage: ").color(NamedTextColor.YELLOW).append(componentFromString(s).color(NamedTextColor.GRAY)); return messageComponent("correctUsagePrefix").append(componentFromString(s).color(NamedTextColor.GRAY));
}
private Component exceptionComponent(RuntimeException ex)
{
if (ex instanceof PlayerNotFoundException && "PlayerNotFoundException".equals(ex.getMessage()))
{
return messageComponent("playerNotFound");
}
if (ex instanceof PlayerNotBannedException && "PlayerNotBannedException".equals(ex.getMessage()))
{
return messageComponent("playerNotBanned");
}
if (ex instanceof ConsoleOnlyException && "ConsoleOnlyException".equals(ex.getMessage()))
{
return messageComponent("consoleOnly");
}
if (ex instanceof ConsoleMustDefinePlayerException && "ConsoleMustDefinePlayerException".equals(ex.getMessage()))
{
return messageComponent("consoleMustDefinePlayer");
}
return mmString(ex.getMessage());
} }
protected Player getNonNullPlayer(String name) protected Player getNonNullPlayer(String name)
@@ -170,7 +170,7 @@ public abstract class ServerCommand extends Command implements PluginIdentifiabl
catch (PlayerNotFoundException | CommandFailException | ConsoleOnlyException | catch (PlayerNotFoundException | CommandFailException | ConsoleOnlyException |
ConsoleMustDefinePlayerException | PlayerNotBannedException | NumberFormatException ex) ConsoleMustDefinePlayerException | PlayerNotBannedException | NumberFormatException ex)
{ {
send(sender, PlexUtils.mmDeserialize(ex.getMessage())); send(sender, exceptionComponent(ex));
} }
return true; return true;
} }
@@ -385,7 +385,7 @@ public abstract class ServerCommand extends Command implements PluginIdentifiabl
*/ */
protected Component usage() protected Component usage()
{ {
return Component.text("Correct Usage: ").color(NamedTextColor.YELLOW).append(componentFromString(this.getUsage()).color(NamedTextColor.GRAY)); return messageComponent("correctUsagePrefix").append(componentFromString(this.getUsage()).color(NamedTextColor.GRAY));
} }
/** /**
@@ -397,7 +397,28 @@ public abstract class ServerCommand extends Command implements PluginIdentifiabl
*/ */
protected Component usage(String s) protected Component usage(String s)
{ {
return Component.text("Correct Usage: ").color(NamedTextColor.YELLOW).append(componentFromString(s).color(NamedTextColor.GRAY)); return messageComponent("correctUsagePrefix").append(componentFromString(s).color(NamedTextColor.GRAY));
}
private Component exceptionComponent(RuntimeException ex)
{
if (ex instanceof PlayerNotFoundException && "PlayerNotFoundException".equals(ex.getMessage()))
{
return messageComponent("playerNotFound");
}
if (ex instanceof PlayerNotBannedException && "PlayerNotBannedException".equals(ex.getMessage()))
{
return messageComponent("playerNotBanned");
}
if (ex instanceof ConsoleOnlyException && "ConsoleOnlyException".equals(ex.getMessage()))
{
return messageComponent("consoleOnly");
}
if (ex instanceof ConsoleMustDefinePlayerException && "ConsoleMustDefinePlayerException".equals(ex.getMessage()))
{
return messageComponent("consoleMustDefinePlayer");
}
return PlexUtils.mmDeserialize(ex.getMessage());
} }
protected Player getNonNullPlayer(String name) protected Player getNonNullPlayer(String name)
@@ -16,7 +16,6 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -37,7 +36,7 @@ public class AdminChatCMD extends ServerCommand
{ {
player = plugin.getPlayerCache().getPlexPlayer(playerSender.getUniqueId()); player = plugin.getPlayerCache().getPlexPlayer(playerSender.getUniqueId());
player.setStaffChat(!player.isStaffChat()); player.setStaffChat(!player.isStaffChat());
return messageComponent("adminChatToggled", BooleanUtils.toStringOnOff(player.isStaffChat())); return messageComponent("adminChatToggled", messageString(player.isStaffChat() ? "stateOn" : "stateOff"));
} }
return usage(); return usage();
} }
@@ -27,7 +27,7 @@ public class BanListCommand extends ServerCommand
{ {
plugin.getPunishmentManager().getActiveBans().whenComplete((punishments, throwable) -> plugin.getPunishmentManager().getActiveBans().whenComplete((punishments, throwable) ->
{ {
send(sender, mmString("<gold>Active Bans (" + punishments.size() + "): <yellow>" + StringUtils.join(punishments.stream().map(Punishment::getPunishedUsername).collect(Collectors.toList()), ", "))); send(sender, messageComponent("activeBansList", punishments.size(), StringUtils.join(punishments.stream().map(Punishment::getPunishedUsername).collect(Collectors.toList()), ", ")));
}); });
return null; return null;
} }
@@ -47,7 +47,7 @@ public class BanListCommand extends ServerCommand
plugin.getPunishmentManager().getActiveBans().whenComplete((punishments, throwable) -> plugin.getPunishmentManager().getActiveBans().whenComplete((punishments, throwable) ->
{ {
punishments.forEach(plugin.getPunishmentManager()::unban); punishments.forEach(plugin.getPunishmentManager()::unban);
send(sender, mmString("<gold>Unbanned " + punishments.size() + " players.")); send(sender, messageComponent("unbannedPlayers", punishments.size()));
}); });
} }
return null; return null;
@@ -46,7 +46,7 @@ public class BcastLoginMessageCMD extends ServerCommand
} }
else else
{ {
return mmString("<red>This player does not have a login message."); return messageComponent("playerHasNoLoginMessage");
} }
return null; return null;
@@ -39,18 +39,18 @@ public class BlockEditCMD extends ServerCommand
int count = 0; int count = 0;
for (String player : bl.blockedPlayers.stream().toList()) for (String player : bl.blockedPlayers.stream().toList())
{ {
send(sender, "- " + player); send(sender, messageComponent("blockeditListEntry", player));
++count; ++count;
} }
if (count == 0) if (count == 0)
{ {
send(sender, "- none"); send(sender, messageComponent("blockeditListNone"));
} }
return null; return null;
} }
else if (args[0].equalsIgnoreCase("purge")) else if (args[0].equalsIgnoreCase("purge"))
{ {
PlexUtils.broadcast(messageComponent("unblockingEdits", sender.getName(), "all players")); PlexUtils.broadcast(messageComponent("unblockingEdits", sender.getName(), messageString("blockeditAllPlayers")));
int count = 0; int count = 0;
for (String player : bl.blockedPlayers.stream().toList()) for (String player : bl.blockedPlayers.stream().toList())
{ {
@@ -60,11 +60,11 @@ public class BlockEditCMD extends ServerCommand
++count; ++count;
} }
} }
return messageComponent("blockeditSize", "Unblocked", count); return messageComponent("blockeditSize", messageString("blockeditUnblockedAction"), count);
} }
else if (args[0].equalsIgnoreCase("all")) else if (args[0].equalsIgnoreCase("all"))
{ {
PlexUtils.broadcast(messageComponent("blockingEdits", sender.getName(), "all non-admins")); PlexUtils.broadcast(messageComponent("blockingEdits", sender.getName(), messageString("blockeditAllNonAdmins")));
int count = 0; int count = 0;
for (final Player player : Bukkit.getOnlinePlayers()) for (final Player player : Bukkit.getOnlinePlayers())
{ {
@@ -75,7 +75,7 @@ public class BlockEditCMD extends ServerCommand
} }
} }
return messageComponent("blockeditSize", "Blocked", count); return messageComponent("blockeditSize", messageString("blockeditBlockedAction"), count);
} }
final Player player = getNonNullPlayer(args[0]); final Player player = getNonNullPlayer(args[0]);
@@ -88,14 +88,14 @@ public class BlockEditCMD extends ServerCommand
} }
PlexUtils.broadcast(messageComponent("blockingEdits", sender.getName(), player.getName())); PlexUtils.broadcast(messageComponent("blockingEdits", sender.getName(), player.getName()));
bl.blockedPlayers.add(player.getName()); bl.blockedPlayers.add(player.getName());
send(player, messageComponent("editsModified", "blocked")); send(player, messageComponent("editsModified", messageString("blockeditBlockedState")));
send(sender, messageComponent("editsBlocked", player.getName())); send(sender, messageComponent("editsBlocked", player.getName()));
} }
else else
{ {
PlexUtils.broadcast(messageComponent("unblockingEdits", sender.getName(), player.getName())); PlexUtils.broadcast(messageComponent("unblockingEdits", sender.getName(), player.getName()));
bl.blockedPlayers.remove(player.getName()); bl.blockedPlayers.remove(player.getName());
send(player, messageComponent("editsModified", "unblocked")); send(player, messageComponent("editsModified", messageString("blockeditUnblockedState")));
send(sender, messageComponent("editsUnblocked", player.getName())); send(sender, messageComponent("editsUnblocked", player.getName()));
} }
return null; return null;
@@ -35,7 +35,7 @@ public class MobLimitCMD extends ServerCommand
.filter(entity -> entity instanceof LivingEntity && !(entity instanceof Player)) .filter(entity -> entity instanceof LivingEntity && !(entity instanceof Player))
.count(); .count();
String status = plugin.config.getBoolean("entity_limit.mob_limit_enabled") ? "<green>Enabled" : "<red>Disabled"; String status = PlexUtils.messageString(plugin.config.getBoolean("entity_limit.mob_limit_enabled") ? "mobLimitEnabled" : "mobLimitDisabled");
return PlexUtils.messageComponent("mobLimitStatus", status, currentMobCount, currentLimit, chunk.getX(), chunk.getZ()); return PlexUtils.messageComponent("mobLimitStatus", status, currentMobCount, currentLimit, chunk.getX(), chunk.getZ());
} }
@@ -44,11 +44,11 @@ public class MobLimitCMD extends ServerCommand
case "on": case "on":
plugin.config.set("entity_limit.mob_limit_enabled", true); plugin.config.set("entity_limit.mob_limit_enabled", true);
plugin.config.save(); plugin.config.save();
return PlexUtils.messageComponent("mobLimitToggle", "enabled"); return PlexUtils.messageComponent("mobLimitToggle", PlexUtils.messageString("stateEnabled"));
case "off": case "off":
plugin.config.set("entity_limit.mob_limit_enabled", false); plugin.config.set("entity_limit.mob_limit_enabled", false);
plugin.config.save(); plugin.config.save();
return PlexUtils.messageComponent("mobLimitToggle", "disabled"); return PlexUtils.messageComponent("mobLimitToggle", PlexUtils.messageString("stateDisabled"));
case "setmax": case "setmax":
try try
{ {
@@ -71,7 +71,7 @@ public class MobPurgeCMD extends ServerCommand
PlexUtils.broadcast(messageComponent("removedMobs", sender.getName(), count)); PlexUtils.broadcast(messageComponent("removedMobs", sender.getName(), count));
PlexLog.debug("All " + count + " valid mobs were removed"); PlexLog.debug("All " + count + " valid mobs were removed");
} }
sender.sendMessage(messageComponent("amountOfMobsRemoved", count, (type != null ? mobName : "mob") + multipleS(count))); sender.sendMessage(messageComponent("amountOfMobsRemoved", count, type != null ? mobName + multipleS(count) : messageString(count == 1 ? "mobSingular" : "mobPlural")));
return null; return null;
} }
@@ -97,7 +97,7 @@ public class PlexCMD extends ServerCommand
{ {
if (!hasUpdateAccess(playerSender, sender)) if (!hasUpdateAccess(playerSender, sender))
{ {
return messageComponent("noPermissionRank", "a Developer"); return mmString("<red>You must be a Developer to use this command.");
} }
for (PlexModule module : plugin.getModuleManager().getModules()) for (PlexModule module : plugin.getModuleManager().getModules())
{ {
@@ -111,7 +111,7 @@ public class PlexCMD extends ServerCommand
{ {
if (!hasUpdateAccess(playerSender, sender)) if (!hasUpdateAccess(playerSender, sender))
{ {
return messageComponent("noPermissionRank", "a Developer"); return mmString("<red>You must be a Developer to use this command.");
} }
if (!plugin.getUpdateChecker().getUpdateStatusMessage(sender, false, 0)) if (!plugin.getUpdateChecker().getUpdateStatusMessage(sender, false, 0))
{ {
@@ -11,7 +11,6 @@ import dev.plex.util.PlexUtils;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -28,13 +27,13 @@ public class ToggleCMD extends ServerCommand
{ {
if (args.length == 0) if (args.length == 0)
{ {
sender.sendMessage(PlexUtils.mmDeserialize("<gray>Available toggles:")); sender.sendMessage(messageComponent("toggleAvailable"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Explosions" + status("explosions"))); sender.sendMessage(toggleListItem("toggleExplosions", "explosions"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Fluidspread" + status("fluidspread"))); sender.sendMessage(toggleListItem("toggleFluidSpread", "fluidspread"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Drops" + status("drops"))); sender.sendMessage(toggleListItem("toggleDrops", "drops"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Redstone" + status("redstone"))); sender.sendMessage(toggleListItem("toggleRedstone", "redstone"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - PVP" + status("pvp"))); sender.sendMessage(toggleListItem("togglePvp", "pvp"));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Chat" + status("chat"))); sender.sendMessage(toggleListItem("toggleChat", "chat"));
return null; return null;
} }
switch (args[0].toLowerCase()) switch (args[0].toLowerCase())
@@ -61,7 +60,7 @@ public class ToggleCMD extends ServerCommand
} }
case "chat" -> case "chat" ->
{ {
PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", sender.getName(), plugin.toggles.getBoolean("chat") ? "off" : "on")); PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", sender.getName(), messageString(plugin.toggles.getBoolean("chat") ? "stateOff" : "stateOn")));
return toggle("chat"); return toggle("chat");
} }
default -> default ->
@@ -80,14 +79,33 @@ public class ToggleCMD extends ServerCommand
return args.length == 1 && silentCheckPermission(sender, this.getPermission()) ? PlexUtils.getPlayerNameList() : ImmutableList.of(); return args.length == 1 && silentCheckPermission(sender, this.getPermission()) ? PlexUtils.getPlayerNameList() : ImmutableList.of();
} }
private String status(String toggle) private Component toggleListItem(String nameKey, String toggle)
{ {
return plugin.toggles.getBoolean(toggle) ? " (enabled)" : " (disabled)"; return messageComponent("toggleListItem", messageString(nameKey), status(toggle));
} }
private Component toggle(String toggle) private Component toggle(String toggle)
{ {
plugin.toggles.set(toggle, !plugin.getToggles().getBoolean(toggle)); plugin.toggles.set(toggle, !plugin.getToggles().getBoolean(toggle));
return Component.text("Toggled " + toggle + status(toggle)).color(NamedTextColor.GRAY); return messageComponent("toggleCommandResult", messageString(toggleNameKey(toggle)), status(toggle));
}
private String status(String toggle)
{
return messageString(plugin.toggles.getBoolean(toggle) ? "stateEnabled" : "stateDisabled");
}
private String toggleNameKey(String toggle)
{
return switch (toggle)
{
case "explosions" -> "toggleExplosions";
case "fluidspread" -> "toggleFluidSpread";
case "drops" -> "toggleDrops";
case "redstone" -> "toggleRedstone";
case "pvp" -> "togglePvp";
case "chat" -> "toggleChat";
default -> toggle;
};
} }
} }
@@ -5,7 +5,6 @@ import com.google.common.collect.ImmutableList;
import dev.plex.command.ServerCommand; import dev.plex.command.ServerCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.PlayerNotBannedException;
import dev.plex.command.exception.PlayerNotFoundException; import dev.plex.command.exception.PlayerNotFoundException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
@@ -45,7 +44,7 @@ public class UnbanCMD extends ServerCommand
{ {
if (!aBoolean) if (!aBoolean)
{ {
send(sender, PlexUtils.mmDeserialize(new PlayerNotBannedException().getMessage())); send(sender, messageComponent("playerNotBanned"));
return; return;
} }
plugin.getPunishmentManager().unban(target.getUuid()); plugin.getPunishmentManager().unban(target.getUuid());
@@ -2,8 +2,7 @@ package dev.plex.listener.impl;
import dev.plex.listener.ServerListenerBase; import dev.plex.listener.ServerListenerBase;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import net.kyori.adventure.text.Component; import dev.plex.util.PlexUtils;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -25,7 +24,7 @@ public class CommandListener extends ServerListenerBase
String command = event.getMessage(); String command = event.getMessage();
if (!pl.getUniqueId().equals(player.getUniqueId())) if (!pl.getUniqueId().equals(player.getUniqueId()))
{ {
pl.sendMessage(Component.text(player.getName() + ": " + command).color(NamedTextColor.GRAY)); pl.sendMessage(PlexUtils.messageComponent("commandSpyFormat", player.getName(), command));
} }
}); });
} }
@@ -42,21 +42,21 @@ public class MenuListener extends ServerListenerBase
final ItemMeta meta = event.getCurrentItem().getItemMeta(); final ItemMeta meta = event.getCurrentItem().getItemMeta();
if (meta != null && meta.displayName() != null) if (meta != null && meta.displayName() != null)
{ {
if (meta.displayName().equals(PageableMenu.PREVIOUS.getItemMeta().displayName())) if (meta.displayName().equals(PageableMenu.previousItem().getItemMeta().displayName()))
{ {
page.parent().currentPage(page.parent().currentPage() - 1); page.parent().currentPage(page.parent().currentPage() - 1);
page.parent().open(player, page.parent().currentPage()); page.parent().open(player, page.parent().currentPage());
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
else if (meta.displayName().equals(PageableMenu.NEXT.getItemMeta().displayName())) else if (meta.displayName().equals(PageableMenu.nextItem().getItemMeta().displayName()))
{ {
page.parent().currentPage(page.parent().currentPage() + 1); page.parent().currentPage(page.parent().currentPage() + 1);
page.parent().open(player, page.parent().currentPage()); page.parent().open(player, page.parent().currentPage());
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
else if (meta.displayName().equals(PageableMenu.CLOSE.getItemMeta().displayName())) else if (meta.displayName().equals(PageableMenu.closeItem().getItemMeta().displayName()))
{ {
player.closeInventory(); player.closeInventory();
event.setCancelled(true); event.setCancelled(true);
@@ -5,6 +5,7 @@ import dev.plex.menu.pagination.PageableMenu;
import dev.plex.player.PlayerService; import dev.plex.player.PlayerService;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.punishment.Punishment; import dev.plex.punishment.Punishment;
import dev.plex.util.PlexUtils;
import dev.plex.util.TimeUtils; import dev.plex.util.TimeUtils;
import dev.plex.util.item.ItemBuilder; import dev.plex.util.item.ItemBuilder;
@@ -20,7 +21,7 @@ public class PunishedPlayerMenu extends PageableMenu<Punishment>
public PunishedPlayerMenu(PlexPlayer player, PlayerService playerService) public PunishedPlayerMenu(PlexPlayer player, PlayerService playerService)
{ {
super("<red><bold>Punishments - " + player.getName(), AbstractMenu.Rows.SIX); super(PlexUtils.messageComponent("punishedPlayerMenuTitle", player.getName()), AbstractMenu.Rows.SIX);
this.punishedPlayer = player; this.punishedPlayer = player;
this.playerService = playerService; this.playerService = playerService;
onClick((inventoryView, itemStacks, player1, itemStack) -> true); onClick((inventoryView, itemStacks, player1, itemStack) -> true);
@@ -30,7 +31,13 @@ public class PunishedPlayerMenu extends PageableMenu<Punishment>
@Override @Override
protected ItemStack toItem(Punishment object) protected ItemStack toItem(Punishment object)
{ {
return new ItemBuilder(Material.PAPER).displayName("<!italic><red>" + object.getType().name()).lore("<!italic><red>By: <gold>" + (object.getPunisher() == null ? "CONSOLE" : playerService.getNameByUUID(object.getPunisher())), "<!italic><red>Issued: <gold>" + TimeUtils.useTimezone(object.getIssueDate()), "<!italic><red>Expire(d/s): <gold>" + TimeUtils.useTimezone(object.getEndDate()), "<!italic><red>Reason: <gold>" + object.getReason()).build(); return new ItemBuilder(Material.PAPER)
.displayName(PlexUtils.messageComponent("punishmentItemTitle", object.getType().name()))
.lore(PlexUtils.messageComponent("punishmentItemPunisher", object.getPunisher() == null ? "CONSOLE" : playerService.getNameByUUID(object.getPunisher())),
PlexUtils.messageComponent("punishmentItemIssued", TimeUtils.useTimezone(object.getIssueDate())),
PlexUtils.messageComponent("punishmentItemExpires", TimeUtils.useTimezone(object.getEndDate())),
PlexUtils.messageComponent("punishmentItemReason", object.getReason()))
.build();
} }
@Override @Override
@@ -5,12 +5,11 @@ import dev.plex.menu.pagination.PageableMenu;
import dev.plex.player.PlayerService; import dev.plex.player.PlayerService;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils;
import dev.plex.util.item.ItemBuilder; import dev.plex.util.item.ItemBuilder;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@@ -24,7 +23,7 @@ public class PunishmentMenu extends PageableMenu<Player>
public PunishmentMenu(PlayerService playerService) public PunishmentMenu(PlayerService playerService)
{ {
super("<aqua><bold>Punishments", AbstractMenu.Rows.SIX); super(PlexUtils.messageComponent("punishmentMenuTitle"), AbstractMenu.Rows.SIX);
this.playerService = playerService; this.playerService = playerService;
PlexLog.debug("list: {0}", list().size()); PlexLog.debug("list: {0}", list().size());
onClick((inventoryView, itemStacks, player, itemStack) -> onClick((inventoryView, itemStacks, player, itemStack) ->
@@ -41,7 +40,7 @@ public class PunishmentMenu extends PageableMenu<Player>
PlexPlayer punishedPlayer = playerService.getPlayer(meta.getOwningPlayer().getUniqueId()); PlexPlayer punishedPlayer = playerService.getPlayer(meta.getOwningPlayer().getUniqueId());
if (punishedPlayer == null) if (punishedPlayer == null)
{ {
player.sendMessage(Component.text("This player does not exist. Try doing /punishments <player> instead.").color(NamedTextColor.RED)); player.sendMessage(PlexUtils.messageComponent("punishmentPlayerNotFound"));
player.closeInventory(); player.closeInventory();
return true; return true;
} }
@@ -55,7 +54,7 @@ public class PunishmentMenu extends PageableMenu<Player>
@Override @Override
protected ItemStack toItem(Player object) protected ItemStack toItem(Player object)
{ {
return new ItemBuilder(Material.PLAYER_HEAD).owner(object).displayName("<!italic><yellow>" + object.getName()).build(); return new ItemBuilder(Material.PLAYER_HEAD).owner(object).displayName(PlexUtils.messageComponent("punishmentPlayerItem", object.getName())).build();
} }
@Override @Override
@@ -20,7 +20,7 @@ public class ToggleMenu extends AbstractMenu
public ToggleMenu(Plex plugin) public ToggleMenu(Plex plugin)
{ {
super("<green><bold>Toggles", Rows.ONE); super(PlexUtils.messageComponent("toggleMenuTitle"), Rows.ONE);
this.plugin = plugin; this.plugin = plugin;
resetExplosionItem(this.inventory()); resetExplosionItem(this.inventory());
resetFluidspreadItem(this.inventory()); resetFluidspreadItem(this.inventory());
@@ -34,8 +34,8 @@ public class ToggleMenu extends AbstractMenu
{ {
ItemStack explosions = new ItemStack(Material.TNT); ItemStack explosions = new ItemStack(Material.TNT);
ItemMeta explosionsItemMeta = explosions.getItemMeta(); ItemMeta explosionsItemMeta = explosions.getItemMeta();
explosionsItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>Toggle explosions")); explosionsItemMeta.displayName(PlexUtils.messageComponent("toggleMenuExplosionsName"));
explosionsItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>Explosions are " + (plugin.toggles.getBoolean("explosions") ? "<red>enabled" : "<green>disabled")))); explosionsItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuExplosionsLore", status("explosions", true))));
explosions.setItemMeta(explosionsItemMeta); explosions.setItemMeta(explosionsItemMeta);
inventory.setItem(0, explosions); inventory.setItem(0, explosions);
} }
@@ -44,8 +44,8 @@ public class ToggleMenu extends AbstractMenu
{ {
ItemStack water = new ItemStack(Material.WATER_BUCKET); ItemStack water = new ItemStack(Material.WATER_BUCKET);
ItemMeta waterItemMeta = water.getItemMeta(); ItemMeta waterItemMeta = water.getItemMeta();
waterItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>Toggle fluid spread")); waterItemMeta.displayName(PlexUtils.messageComponent("toggleMenuFluidSpreadName"));
waterItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>Fluid spread is " + (plugin.toggles.getBoolean("fluidspread") ? "<green>enabled" : "<red>disabled")))); waterItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuFluidSpreadLore", status("fluidspread", false))));
water.setItemMeta(waterItemMeta); water.setItemMeta(waterItemMeta);
inventory.setItem(1, water); inventory.setItem(1, water);
} }
@@ -54,8 +54,8 @@ public class ToggleMenu extends AbstractMenu
{ {
ItemStack feather = new ItemStack(Material.FEATHER); ItemStack feather = new ItemStack(Material.FEATHER);
ItemMeta featherItemMeta = feather.getItemMeta(); ItemMeta featherItemMeta = feather.getItemMeta();
featherItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>Toggle drops")); featherItemMeta.displayName(PlexUtils.messageComponent("toggleMenuDropsName"));
featherItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>Drops are " + (plugin.toggles.getBoolean("drops") ? "<green>enabled" : "<red>disabled")))); featherItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuDropsLore", status("drops", false))));
feather.setItemMeta(featherItemMeta); feather.setItemMeta(featherItemMeta);
inventory.setItem(2, feather); inventory.setItem(2, feather);
} }
@@ -64,8 +64,8 @@ public class ToggleMenu extends AbstractMenu
{ {
ItemStack redstone = new ItemStack(Material.REDSTONE); ItemStack redstone = new ItemStack(Material.REDSTONE);
ItemMeta redstoneItemMeta = redstone.getItemMeta(); ItemMeta redstoneItemMeta = redstone.getItemMeta();
redstoneItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>Redstone")); redstoneItemMeta.displayName(PlexUtils.messageComponent("toggleMenuRedstoneName"));
redstoneItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>Redstone is " + (plugin.toggles.getBoolean("redstone") ? "<green>enabled" : "<red>disabled")))); redstoneItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuRedstoneLore", status("redstone", false))));
redstone.setItemMeta(redstoneItemMeta); redstone.setItemMeta(redstoneItemMeta);
inventory.setItem(3, redstone); inventory.setItem(3, redstone);
} }
@@ -75,8 +75,8 @@ public class ToggleMenu extends AbstractMenu
ItemStack pvp = new ItemStack(Material.IRON_SWORD); ItemStack pvp = new ItemStack(Material.IRON_SWORD);
ItemMeta pvpItemMeta = pvp.getItemMeta(); ItemMeta pvpItemMeta = pvp.getItemMeta();
pvpItemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); pvpItemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
pvpItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>PVP")); pvpItemMeta.displayName(PlexUtils.messageComponent("toggleMenuPvpName"));
pvpItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>PVP is " + (plugin.toggles.getBoolean("pvp") ? "<green>enabled" : "<red>disabled")))); pvpItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuPvpLore", status("pvp", false))));
pvp.setItemMeta(pvpItemMeta); pvp.setItemMeta(pvpItemMeta);
inventory.setItem(4, pvp); inventory.setItem(4, pvp);
} }
@@ -85,8 +85,8 @@ public class ToggleMenu extends AbstractMenu
{ {
ItemStack chat = new ItemStack(Material.OAK_SIGN); ItemStack chat = new ItemStack(Material.OAK_SIGN);
ItemMeta chatItemMeta = chat.getItemMeta(); ItemMeta chatItemMeta = chat.getItemMeta();
chatItemMeta.displayName(PlexUtils.mmDeserialize("<!italic><light_purple>Toggle chat")); chatItemMeta.displayName(PlexUtils.messageComponent("toggleMenuChatName"));
chatItemMeta.lore(List.of(PlexUtils.mmDeserialize("<!italic><yellow>Chat is currently " + (plugin.toggles.getBoolean("chat") ? "<green>on" : "<red>off")))); chatItemMeta.lore(List.of(PlexUtils.messageComponent("toggleMenuChatLore", PlexUtils.messageString(plugin.toggles.getBoolean("chat") ? "stateOn" : "stateOff"))));
chat.setItemMeta(chatItemMeta); chat.setItemMeta(chatItemMeta);
inventory.setItem(5, chat); inventory.setItem(5, chat);
} }
@@ -102,39 +102,48 @@ public class ToggleMenu extends AbstractMenu
{ {
plugin.toggles.set("explosions", !plugin.toggles.getBoolean("explosions")); plugin.toggles.set("explosions", !plugin.toggles.getBoolean("explosions"));
resetExplosionItem(inventory); resetExplosionItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled explosions.")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("toggleExplosionsLower")));
} }
if (clicked.getType() == Material.WATER_BUCKET) if (clicked.getType() == Material.WATER_BUCKET)
{ {
plugin.toggles.set("fluidspread", !plugin.toggles.getBoolean("fluidspread")); plugin.toggles.set("fluidspread", !plugin.toggles.getBoolean("fluidspread"));
resetFluidspreadItem(inventory); resetFluidspreadItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled fluid spread.")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("toggleFluidSpreadLower")));
} }
if (clicked.getType() == Material.FEATHER) if (clicked.getType() == Material.FEATHER)
{ {
plugin.toggles.set("drops", !plugin.toggles.getBoolean("drops")); plugin.toggles.set("drops", !plugin.toggles.getBoolean("drops"));
resetDropsItem(inventory); resetDropsItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled drops.")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("toggleDropsLower")));
} }
if (clicked.getType() == Material.REDSTONE) if (clicked.getType() == Material.REDSTONE)
{ {
plugin.toggles.set("redstone", !plugin.toggles.getBoolean("redstone")); plugin.toggles.set("redstone", !plugin.toggles.getBoolean("redstone"));
resetRedstoneItem(inventory); resetRedstoneItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled redstone.")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("toggleRedstoneLower")));
} }
if (clicked.getType() == Material.IRON_SWORD) if (clicked.getType() == Material.IRON_SWORD)
{ {
plugin.toggles.set("pvp", !plugin.toggles.getBoolean("pvp")); plugin.toggles.set("pvp", !plugin.toggles.getBoolean("pvp"));
resetPVPItem(inventory); resetPVPItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled PVP")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("togglePvpLower")));
} }
if (clicked.getType() == Material.OAK_SIGN) if (clicked.getType() == Material.OAK_SIGN)
{ {
plugin.toggles.set("chat", !plugin.toggles.getBoolean("chat")); plugin.toggles.set("chat", !plugin.toggles.getBoolean("chat"));
PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", player.getName(), plugin.toggles.getBoolean("chat") ? "on" : "off")); PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", player.getName(), PlexUtils.messageString(plugin.toggles.getBoolean("chat") ? "stateOn" : "stateOff")));
resetChatItem(inventory); resetChatItem(inventory);
player.sendMessage(PlexUtils.mmDeserialize("<gray>Toggled chat.")); player.sendMessage(PlexUtils.messageComponent("toggleToggled", PlexUtils.messageString("toggleChatLower")));
} }
return true; return true;
} }
private String status(String toggle, boolean enabledIsUnsafe)
{
if (enabledIsUnsafe)
{
return PlexUtils.messageString(plugin.toggles.getBoolean(toggle) ? "stateEnabledUnsafe" : "stateDisabledSafe");
}
return PlexUtils.messageString(plugin.toggles.getBoolean(toggle) ? "stateEnabled" : "stateDisabled");
}
} }
@@ -15,7 +15,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -28,9 +27,6 @@ import org.bukkit.inventory.ItemStack;
@Accessors(fluent = true) @Accessors(fluent = true)
public abstract class PageableMenu<T> public abstract class PageableMenu<T>
{ {
public static final ItemStack NEXT = new ItemBuilder(Material.FEATHER).displayName("<light_purple>Next Page").build();
public static final ItemStack PREVIOUS = new ItemBuilder(Material.FEATHER).displayName("<light_purple>Previous Page").build();
public static final ItemStack CLOSE = new ItemBuilder(Material.BARRIER).displayName("<red>Close").build();
protected final Map<Integer, Page> pages = Maps.newHashMap(); protected final Map<Integer, Page> pages = Maps.newHashMap();
private final Component name; private final Component name;
private final AbstractMenu.Rows rows; private final AbstractMenu.Rows rows;
@@ -61,7 +57,7 @@ public abstract class PageableMenu<T>
{ {
final Page page = new Page(name.append(Component.space()).append(PlexUtils.mmDeserialize("(1)")), rows); final Page page = new Page(name.append(Component.space()).append(PlexUtils.mmDeserialize("(1)")), rows);
page.parent = this; page.parent = this;
page.inventory().setItem(rows.slots() - 5, CLOSE); page.inventory().setItem(rows.slots() - 5, closeItem());
this.pages.put(0, page); this.pages.put(0, page);
} }
else else
@@ -72,12 +68,12 @@ public abstract class PageableMenu<T>
page.parent = this; page.parent = this;
if (i > 0) // If not first page set previous page button if (i > 0) // If not first page set previous page button
{ {
page.inventory().setItem(rows.slots() - 6, PREVIOUS); page.inventory().setItem(rows.slots() - 6, previousItem());
} }
page.inventory().setItem(rows.slots() - 5, CLOSE); page.inventory().setItem(rows.slots() - 5, closeItem());
if (i < (list().size() / (rows.slots() - 9)) - 1) // If not last page set next page button if (i < (list().size() / (rows.slots() - 9)) - 1) // If not last page set next page button
{ {
page.inventory().setItem(rows.slots() - 4, NEXT); page.inventory().setItem(rows.slots() - 4, nextItem());
} }
this.pages.put(i, page); this.pages.put(i, page);
} }
@@ -126,13 +122,13 @@ public abstract class PageableMenu<T>
{ {
if (!this.initialized) if (!this.initialized)
{ {
player.sendMessage(Component.text("Looks like this inventory was not initialized! Please contact a developer to report this.").color(NamedTextColor.RED)); player.sendMessage(PlexUtils.messageComponent("pageableNotInitialized"));
return; return;
} }
final Page page = this.pages.get(pageNum); final Page page = this.pages.get(pageNum);
if (page == null) if (page == null)
{ {
player.sendMessage(Component.text("Could not find a page to open").color(NamedTextColor.RED)); player.sendMessage(PlexUtils.messageComponent("pageNotFound"));
return; return;
} }
player.openInventory(page.inventory()); player.openInventory(page.inventory());
@@ -144,6 +140,21 @@ public abstract class PageableMenu<T>
this.pages.forEach((integer, page) -> page.onClick(this.onClick)); this.pages.forEach((integer, page) -> page.onClick(this.onClick));
} }
public static ItemStack nextItem()
{
return new ItemBuilder(Material.FEATHER).displayName(PlexUtils.messageComponent("pageNext")).build();
}
public static ItemStack previousItem()
{
return new ItemBuilder(Material.FEATHER).displayName(PlexUtils.messageComponent("pagePrevious")).build();
}
public static ItemStack closeItem()
{
return new ItemBuilder(Material.BARRIER).displayName(PlexUtils.messageComponent("pageClose")).build();
}
@Getter @Getter
@Setter @Setter
@@ -7,6 +7,7 @@ import dev.plex.punishment.Punishment;
import dev.plex.punishment.PunishmentType; import dev.plex.punishment.PunishmentType;
import dev.plex.services.AbstractService; import dev.plex.services.AbstractService;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils;
import dev.plex.util.TimeUtils; import dev.plex.util.TimeUtils;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
@@ -51,7 +52,7 @@ public class TimingService extends AbstractService
Player player = Bukkit.getPlayer(map.getKey()); Player player = Bukkit.getPlayer(map.getKey());
PlexPlayer plexPlayer = plugin.getPlayerService().getPlayer(map.getKey()); PlexPlayer plexPlayer = plugin.getPlayerService().getPlayer(map.getKey());
punishment.setType(PunishmentType.TEMPBAN); punishment.setType(PunishmentType.TEMPBAN);
punishment.setReason("You are temporarily banned for five minutes for using a Nuker."); punishment.setReason(PlexUtils.messageString("nukerTempbanReason"));
if (player != null) if (player != null)
{ {
punishment.setPunishedUsername(player.getName()); punishment.setPunishedUsername(player.getName());
@@ -19,7 +19,6 @@ import java.security.NoSuchAlgorithmException;
import java.util.HexFormat; import java.util.HexFormat;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -54,15 +53,15 @@ public class UpdateChecker
{ {
if (verbosity == 2) if (verbosity == 2)
{ {
sendMessage(sender, Component.text("Plex is up to date on the " + channel.id() + " channel.").color(NamedTextColor.GREEN)); sendMessage(sender, PlexUtils.messageComponent("updateUpToDate", channel.id()));
} }
return false; return false;
} }
if (verbosity >= 1) if (verbosity >= 1)
{ {
sendMessage(sender, Component.text("Plex " + metadata.version() + " is available on the " + channel.id() + " channel.", NamedTextColor.RED)); sendMessage(sender, PlexUtils.messageComponent("updateAvailable", metadata.version(), channel.id()));
sendMessage(sender, Component.text("Run: /plex update").color(NamedTextColor.RED)); sendMessage(sender, PlexUtils.messageComponent("updateRunCommand"));
} }
return true; return true;
} }
@@ -70,7 +69,7 @@ public class UpdateChecker
{ {
if (verbosity == 2 || (verbosity >= 1 && !e.notFound())) if (verbosity == 2 || (verbosity >= 1 && !e.notFound()))
{ {
sendMessage(sender, Component.text(updateMetadataErrorMessage(e)).color(NamedTextColor.RED)); sendMessage(sender, updateMetadataErrorComponent(e));
} }
if (!e.notFound()) if (!e.notFound())
{ {
@@ -94,7 +93,7 @@ public class UpdateChecker
if (!module && metadata.matchesCurrentBuild(plugin.getPluginMeta().getVersion(), BuildInfo.getNumber(), BuildInfo.getCommit())) if (!module && metadata.matchesCurrentBuild(plugin.getPluginMeta().getVersion(), BuildInfo.getNumber(), BuildInfo.getCommit()))
{ {
sendMessage(sender, PlexUtils.mmDeserialize("<red>Plex is already up to date on the " + channel.id() + " channel.")); sendMessage(sender, PlexUtils.messageComponent("updateAlreadyUpToDate", channel.id()));
return; return;
} }
@@ -102,12 +101,12 @@ public class UpdateChecker
? new File(plugin.getModulesFolder(), metadata.fileName()) ? new File(plugin.getModulesFolder(), metadata.fileName())
: new File(Bukkit.getUpdateFolderFile(), metadata.fileName()); : new File(Bukkit.getUpdateFolderFile(), metadata.fileName());
sendMessage(sender, PlexUtils.mmDeserialize("<green>Downloading latest JAR file: " + metadata.fileName())); sendMessage(sender, PlexUtils.messageComponent("updateDownloading", metadata.fileName()));
plugin.getApi().scheduler().runAsync(() -> downloadAndInstall(sender, metadata, copyTo)); plugin.getApi().scheduler().runAsync(() -> downloadAndInstall(sender, metadata, copyTo));
} }
catch (UpdateMetadataClient.MetadataException e) catch (UpdateMetadataClient.MetadataException e)
{ {
sendMessage(sender, PlexUtils.mmDeserialize("<red>" + updateMetadataErrorMessage(e))); sendMessage(sender, updateMetadataErrorComponent(e));
if (!e.notFound()) if (!e.notFound())
{ {
PlexLog.error("Unable to update {0}: {1}", name, e.getMessage()); PlexLog.error("Unable to update {0}: {1}", name, e.getMessage());
@@ -161,7 +160,7 @@ public class UpdateChecker
File parent = copyTo.getParentFile(); File parent = copyTo.getParentFile();
if (parent != null && !parent.exists() && !parent.mkdirs()) if (parent != null && !parent.exists() && !parent.mkdirs())
{ {
sendMessage(sender, PlexUtils.mmDeserialize("<red>Unable to create update directory: " + parent.getAbsolutePath())); sendMessage(sender, PlexUtils.messageComponent("updateDirectoryFailed", parent.getAbsolutePath()));
return; return;
} }
@@ -171,11 +170,11 @@ public class UpdateChecker
download(metadata.downloadUrl(), temporaryFile); download(metadata.downloadUrl(), temporaryFile);
validateDownloadedFile(metadata, temporaryFile); validateDownloadedFile(metadata, temporaryFile);
Files.move(temporaryFile.toPath(), copyTo.toPath(), StandardCopyOption.REPLACE_EXISTING); Files.move(temporaryFile.toPath(), copyTo.toPath(), StandardCopyOption.REPLACE_EXISTING);
sendMessage(sender, PlexUtils.mmDeserialize("<green>New JAR file downloaded and verified successfully.")); sendMessage(sender, PlexUtils.messageComponent("updateDownloaded"));
} }
catch (IOException e) catch (IOException e)
{ {
sendMessage(sender, PlexUtils.mmDeserialize("<red>Something went wrong while downloading " + metadata.name() + ". Please check the log for more information.")); sendMessage(sender, PlexUtils.messageComponent("updateDownloadFailed", metadata.name()));
PlexLog.error("Unable to download update {0}: {1}", metadata.name(), e.getMessage()); PlexLog.error("Unable to download update {0}: {1}", metadata.name(), e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
@@ -243,13 +242,13 @@ public class UpdateChecker
return HexFormat.of().formatHex(digest.digest()); return HexFormat.of().formatHex(digest.digest());
} }
private String updateMetadataErrorMessage(UpdateMetadataClient.MetadataException e) private Component updateMetadataErrorComponent(UpdateMetadataClient.MetadataException e)
{ {
if (e.notFound()) if (e.notFound())
{ {
return "No compatible update is available on the " + channel.id() + " channel."; return PlexUtils.messageComponent("updateMetadataNotFound", channel.id());
} }
return "There was an error checking update metadata: " + e.getMessage(); return PlexUtils.messageComponent("updateMetadataError", e.getMessage());
} }
private void sendMessage(CommandSender sender, Component message) private void sendMessage(CommandSender sender, Component message)
+108 -37
View File
@@ -27,6 +27,7 @@ indefBanMessageReason: "<red>Your {0} is indefinitely banned! You may appeal at
playerNotFound: "<red>Player not found!" playerNotFound: "<red>Player not found!"
specifyPlayer: "<red>You must specify a player!" specifyPlayer: "<red>You must specify a player!"
worldNotFound: "<red>World not found!" worldNotFound: "<red>World not found!"
correctUsagePrefix: "<yellow>Correct Usage: "
# This will always be used for punishments where the sanctioning administrator has not provided a reason. Will ignore MiniMessage tags. # This will always be used for punishments where the sanctioning administrator has not provided a reason. Will ignore MiniMessage tags.
noReasonProvided: "No reason provided." noReasonProvided: "No reason provided."
# 0 - The world you have been teleported to # 0 - The world you have been teleported to
@@ -60,12 +61,6 @@ unlockedPlayer: "<aqua>{0} - Unlocking {1}"
noPermissionNode: "<red>You must have the permission: {0} <red>to use this command!" noPermissionNode: "<red>You must have the permission: {0} <red>to use this command!"
noPermissionInGame: "<red>You must be in console to use this command!" noPermissionInGame: "<red>You must be in console to use this command!"
noPermissionConsole: "<red>You must be in-game to use this command!" noPermissionConsole: "<red>You must be in-game to use this command!"
# 0 - The username of the name history
nameHistoryTitle: "<gold>Name History of {0}"
nameHistorySeparator: "<gold><strikethrough>-----------------------------"
# 0 - The name
# 1 - The date and time of the name change
nameHistoryBody: "<gold>{0} <dark_gray>- <gold>{1}"
# 0 - The gamemode # 0 - The gamemode
gameModeSetTo: "<gray>Your gamemode has been set to {0}." gameModeSetTo: "<gray>Your gamemode has been set to {0}."
# 0 - The player's name # 0 - The player's name
@@ -78,33 +73,10 @@ playerSetOtherGameMode: "<gray>{0} set your gamemode to {1}."
# 1 - The gamemode # 1 - The gamemode
setEveryoneGameMode: "<aqua>{0} - Changing everyone's gamemode to {1}" setEveryoneGameMode: "<aqua>{0} - Changing everyone's gamemode to {1}"
consoleMustDefinePlayer: "<red>You must define a player since you are running this command from console." consoleMustDefinePlayer: "<red>You must define a player since you are running this command from console."
# 0 - The command sender
# 1 - The player
newAdminAdded: "<aqua>{0} - Adding {1} to the admin list"
# 0 - The command sender
# 1 - The player
# 2 - The rank name
adminReadded: "<aqua>{0} - Re-adding {1} to the admin list as rank: {2}"
# 0 - The command sender
# 1 - The player
adminRemoved: "<red>{0} - Removing {1} from the admin list"
# 0 - The command sender
# 1 - The player
# 2 - The rank
adminSetRank: "<aqua>{0} - Setting {1}'s rank to {2}"
# 0 - The world name # 0 - The world name
teleportedToWorld: "<aqua>You have been teleported to the {0}." teleportedToWorld: "<aqua>You have been teleported to the {0}."
higherRankThanYou: "<red>This player is an admin or a higher rank than you." higherRankThanYou: "<red>This player is an admin or a higher rank than you."
playerNotAdmin: "<red>That player is not an admin."
playerIsAdmin: "<red>That player is already an admin."
rankNotFound: "<red>The rank you entered was not found."
rankMustBeHigherThanAdmin: "<red>The rank you entered must be higher than Admin."
consoleOnly: "<red>This command can only be executed by the console." consoleOnly: "<red>This command can only be executed by the console."
# 0 - Rank
yourRank: "<aqua>Your rank is: {0}"
# 0 - Player name
# 1 - Rank
otherRank: "<aqua>{0}'s rank is: {1}"
# 0 - The command sender # 0 - The command sender
# 1 - The player # 1 - The player
banningPlayer: "<red>{0} - Banning {1}" banningPlayer: "<red>{0} - Banning {1}"
@@ -117,7 +89,6 @@ playerNotMuted: "<red>That player is not muted!"
playerBanned: "<red>That player is already banned!" playerBanned: "<red>That player is already banned!"
playerFrozen: "<red>That player is already frozen!" playerFrozen: "<red>That player is already frozen!"
playerMuted: "<red>That player is already muted!" playerMuted: "<red>That player is already muted!"
playerLockedUp: "<red>That player is already locked up!"
muted: "<red>You are currently muted - STFU!" muted: "<red>You are currently muted - STFU!"
pvpDisabled: "<red>PVP has been disabled!" pvpDisabled: "<red>PVP has been disabled!"
chatIsOff: "<red>Chat is currently toggled off!" chatIsOff: "<red>Chat is currently toggled off!"
@@ -131,12 +102,21 @@ teleportedToWorldSpawn: "<aqua>Teleporting to the local spawn"
toggleCommandSpy: "<gray>CommandSpy has been" toggleCommandSpy: "<gray>CommandSpy has been"
enabled: "<gray>enabled." enabled: "<gray>enabled."
disabled: "<gray>disabled." disabled: "<gray>disabled."
# 0 - The player
# 1 - The command
commandSpyFormat: "<gray>{0}: {1}"
# 0 - The admin / staff member # 0 - The admin / staff member
# 1 - The player's group's prefix if any # 1 - The player's group's prefix if any
# 2 - The message # 2 - The message
adminChatFormat: '<dark_gray>[<blue>AdminChat<dark_gray>] <dark_red>{0} {1} <gray>» <gold>{2}' adminChatFormat: '<dark_gray>[<blue>AdminChat<dark_gray>] <dark_red>{0} {1} <gray>» <gold>{2}'
# 0 - Whether it was toggled on or off # 0 - Whether it was toggled on or off
adminChatToggled: '<gray>AdminChat was toggled {0}' adminChatToggled: '<gray>AdminChat was toggled {0}'
stateEnabled: "<green>enabled"
stateDisabled: "<red>disabled"
stateEnabledUnsafe: "<red>enabled"
stateDisabledSafe: "<green>disabled"
stateOn: "<green>on"
stateOff: "<red>off"
# 0 - Maximum length, configured in config.yml # 0 - Maximum length, configured in config.yml
maximumPrefixLength: "<red>The maximum length for a tag may only be {0}." maximumPrefixLength: "<red>The maximum length for a tag may only be {0}."
prefixCleared: "<aqua>Your prefix has been cleared." prefixCleared: "<aqua>Your prefix has been cleared."
@@ -147,6 +127,14 @@ prefixSetTo: "<aqua>Your prefix has been set to {0}"
# 0 - The action (blocked / unblocked) # 0 - The action (blocked / unblocked)
# 1 - The amount of players # 1 - The amount of players
blockeditSize: "<gray>{0} all block modification abilities for {1} players." blockeditSize: "<gray>{0} all block modification abilities for {1} players."
blockeditListEntry: "<gray>- {0}"
blockeditListNone: "<gray>- none"
blockeditAllPlayers: "all players"
blockeditAllNonAdmins: "all non-admins"
blockeditBlockedAction: "Blocked"
blockeditUnblockedAction: "Unblocked"
blockeditBlockedState: "blocked"
blockeditUnblockedState: "unblocked"
# The action (blocked or restored) # The action (blocked or restored)
editsModified: "<gray>Your block modification abilities have been {0}." editsModified: "<gray>Your block modification abilities have been {0}."
listOfPlayersBlocked: "<gray>The following have block modification abilities restricted:" listOfPlayersBlocked: "<gray>The following have block modification abilities restricted:"
@@ -167,22 +155,19 @@ removedEntities: "<red>{0} - Removed {1} entities"
# 1 - Number of entities removed # 1 - Number of entities removed
# 2 - Entity type(s) removed # 2 - Entity type(s) removed
removedEntitiesOfTypes: "<red>{0} - Removed {1} entities of type(s) {2}" removedEntitiesOfTypes: "<red>{0} - Removed {1} entities of type(s) {2}"
# 0 - The command sender
# 1 - Number of entities removed
# 2 - Entity type removed
removedEntitiesOfType: "<gray>Removed {1} {2}"
# 0 - Entity type that is invalid # 0 - Entity type that is invalid
invalidEntityType: "<gray>Notice: Entity type {0} is invalid!" invalidEntityType: "<gray>Notice: Entity type {0} is invalid!"
noRemovedEntities: "<gray>No entities were removed." noRemovedEntities: "<gray>No entities were removed."
# 0 - Number of mobs removed # 0 - Number of mobs removed
# 1 - Type of mob removed # 1 - Type of mob removed
amountOfMobsRemoved: "<gray>{0} {1} removed." amountOfMobsRemoved: "<gray>{0} {1} removed."
mobSingular: "mob"
mobPlural: "mobs"
notAValidMob: "<red>That is not a valid mob." notAValidMob: "<red>That is not a valid mob."
notAValidMobButValidEntity: "<red>That is a valid entity, but is not a valid mob." notAValidMobButValidEntity: "<red>That is a valid entity, but is not a valid mob."
# 0 - The command sender # 0 - The command sender
# 1 - Number of mobs removed # 1 - Number of mobs removed
removedMobs: "<red>{0} - Removed {1} mobs" removedMobs: "<red>{0} - Removed {1} mobs"
autoWipeDisabled: "<gray>Item wiping is currently disabled in the config!"
# 0 - The boolean for whether the limit is enabled or disabled # 0 - The boolean for whether the limit is enabled or disabled
mobLimitToggle: "<gray>The mob limit has been {0}" mobLimitToggle: "<gray>The mob limit has been {0}"
# 0 - The amount that the mob limit has been set to # 0 - The amount that the mob limit has been set to
@@ -195,7 +180,8 @@ mobLimitSet: "<gray>The mob limit has been set to: <em><white>{0}"
mobLimitStatus: "<gray>({0}<gray>) <em><white>{1} <reset><gray>/ <em><white>{2} <reset><gray>per chunk (<em><white>Chunk<gray>: <reset>{3}, {4}<gray>)" mobLimitStatus: "<gray>({0}<gray>) <em><white>{1} <reset><gray>/ <em><white>{2} <reset><gray>per chunk (<em><white>Chunk<gray>: <reset>{3}, {4}<gray>)"
# 0 - The max set limit in config # 0 - The max set limit in config
mobLimitCeiling: "<gray>The limit you have entered is too high. Defaulting to the ceiling value from config" mobLimitCeiling: "<gray>The limit you have entered is too high. Defaulting to the ceiling value from config"
commandBlocked: "<gray>That command is blocked." mobLimitEnabled: "<green>Enabled"
mobLimitDisabled: "<red>Disabled"
# 0 - The command sender # 0 - The command sender
# 1 - The message being said # 1 - The message being said
sayMessage: "<blue>[Server: {0}] {1}" sayMessage: "<blue>[Server: {0}] {1}"
@@ -212,6 +198,46 @@ removedNote: "<green>Removed note with ID: {0}"
# 0 - The number of notes cleared # 0 - The number of notes cleared
clearedNotes: "<green>Cleared {0} notes." clearedNotes: "<green>Cleared {0} notes."
invalidToggle: "<red>That is not a valid toggle." invalidToggle: "<red>That is not a valid toggle."
toggleAvailable: "<gray>Available toggles:"
# 0 - The toggle name
# 1 - The toggle status
toggleListItem: "<gray> - {0}<gray> ({1}<gray>)"
# 0 - The toggle name
# 1 - The toggle status
toggleCommandResult: "<gray>Toggled {0}<gray> ({1}<gray>)"
# 0 - The toggle name
toggleToggled: "<gray>Toggled {0}."
toggleMenuTitle: "<green><bold>Toggles"
toggleExplosions: "Explosions"
toggleExplosionsLower: "explosions"
toggleFluidSpread: "Fluid spread"
toggleFluidSpreadLower: "fluid spread"
toggleDrops: "Drops"
toggleDropsLower: "drops"
toggleRedstone: "Redstone"
toggleRedstoneLower: "redstone"
togglePvp: "PVP"
togglePvpLower: "PVP"
toggleChat: "Chat"
toggleChatLower: "chat"
toggleMenuExplosionsName: "<!italic><light_purple>Toggle explosions"
# 0 - The toggle status
toggleMenuExplosionsLore: "<!italic><yellow>Explosions are {0}"
toggleMenuFluidSpreadName: "<!italic><light_purple>Toggle fluid spread"
# 0 - The toggle status
toggleMenuFluidSpreadLore: "<!italic><yellow>Fluid spread is {0}"
toggleMenuDropsName: "<!italic><light_purple>Toggle drops"
# 0 - The toggle status
toggleMenuDropsLore: "<!italic><yellow>Drops are {0}"
toggleMenuRedstoneName: "<!italic><light_purple>Redstone"
# 0 - The toggle status
toggleMenuRedstoneLore: "<!italic><yellow>Redstone is {0}"
toggleMenuPvpName: "<!italic><light_purple>PVP"
# 0 - The toggle status
toggleMenuPvpLore: "<!italic><yellow>PVP is {0}"
toggleMenuChatName: "<!italic><light_purple>Toggle chat"
# 0 - The toggle status
toggleMenuChatLore: "<!italic><yellow>Chat is currently {0}"
specifyLoginMessage: "<red>Please specify a login message." specifyLoginMessage: "<red>Please specify a login message."
# 0 - The login message # 0 - The login message
setOwnLoginMessage: "<gray>Your login message is now:<newline><gray>> <reset>{0}" setOwnLoginMessage: "<gray>Your login message is now:<newline><gray>> <reset>{0}"
@@ -222,7 +248,7 @@ removedOwnLoginMessage: "<gray>Your login message has been removed."
# 0 - The player # 0 - The player
removedOtherLoginMessage: "<gray>You removed {0}'s login message." removedOtherLoginMessage: "<gray>You removed {0}'s login message."
nameRequired: "<red>Policy requires that you must state your player name in your login message. You can either do this by inserting your name or %player%." nameRequired: "<red>Policy requires that you must state your player name in your login message. You can either do this by inserting your name or %player%."
rankRequired: "<red>Policy requires that you must state your rank in your login message. You can do this by using %rank% in your login message." playerHasNoLoginMessage: "<red>This player does not have a login message."
# 0 - The material name # 0 - The material name
# 1 - The players who have the material in their inventory # 1 - The players who have the material in their inventory
playersWithMaterial: "<gray>Players with {0} in their inventory: {1}" playersWithMaterial: "<gray>Players with {0} in their inventory: {1}"
@@ -269,6 +295,7 @@ smittenQuietly: "<gray>Smitten {0} quietly."
# 0 - The reason for being smitten # 0 - The reason for being smitten
smitten: "<red>You've been smitten. Reason: <yellow>{0}" smitten: "<red>You've been smitten. Reason: <yellow>{0}"
nukerKickMessage: "Please turn off your nuker!" nukerKickMessage: "Please turn off your nuker!"
nukerTempbanReason: "You are temporarily banned for five minutes for using a Nuker."
antiSpamMessage: "<gray>Please refrain from spamming messages." antiSpamMessage: "<gray>Please refrain from spamming messages."
# 0 - The player # 0 - The player
banExpiredBroadcast: "Plex - Automatically unbanning {0}" banExpiredBroadcast: "Plex - Automatically unbanning {0}"
@@ -285,3 +312,47 @@ prismRollbackMessage: "<gray>Rolled back {0} activities"
# 0 - Error message returned from Prism # 0 - Error message returned from Prism
prismRollbackError: "<red>Rollback failed: {0}" prismRollbackError: "<red>Rollback failed: {0}"
prismNoResult: "<gray>No activities have been rolled back" prismNoResult: "<gray>No activities have been rolled back"
pageNext: "<light_purple>Next Page"
pagePrevious: "<light_purple>Previous Page"
pageClose: "<red>Close"
pageableNotInitialized: "<red>Looks like this inventory was not initialized! Please contact a developer to report this."
pageNotFound: "<red>Could not find a page to open"
punishmentMenuTitle: "<aqua><bold>Punishments"
# 0 - The player
punishmentPlayerItem: "<!italic><yellow>{0}"
# 0 - The player
punishedPlayerMenuTitle: "<red><bold>Punishments - {0}"
punishmentPlayerNotFound: '<red>This player does not exist. Try doing /punishments \<player> instead.'
# 0 - The punishment type
punishmentItemTitle: "<!italic><red>{0}"
# 0 - The punisher
punishmentItemPunisher: "<!italic><red>By: <gold>{0}"
# 0 - The issue date
punishmentItemIssued: "<!italic><red>Issued: <gold>{0}"
# 0 - The expiration date
punishmentItemExpires: "<!italic><red>Expire(d/s): <gold>{0}"
# 0 - The reason
punishmentItemReason: "<!italic><red>Reason: <gold>{0}"
# 0 - The amount of active bans
# 1 - The active ban list
activeBansList: "<gold>Active Bans ({0}): <yellow>{1}"
# 0 - The amount of players unbanned
unbannedPlayers: "<gold>Unbanned {0} players."
updateUpToDate: "<green>Plex is up to date on the {0} channel."
# 0 - The version
# 1 - The channel
updateAvailable: "<red>Plex {0} is available on the {1} channel."
updateRunCommand: "<red>Run: /plex update"
# 0 - The channel
updateAlreadyUpToDate: "<red>Plex is already up to date on the {0} channel."
# 0 - The file name
updateDownloading: "<green>Downloading latest JAR file: {0}"
updateDownloaded: "<green>New JAR file downloaded and verified successfully."
# 0 - The directory path
updateDirectoryFailed: "<red>Unable to create update directory: {0}"
# 0 - The artifact name
updateDownloadFailed: "<red>Something went wrong while downloading {0}. Please check the log for more information."
# 0 - The channel
updateMetadataNotFound: "<red>No compatible update is available on the {0} channel."
# 0 - The error message
updateMetadataError: "<red>There was an error checking update metadata: {0}"