From a5992a9e4ebae9780ceeaf14c9519949d74a7686 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 17:44:52 +0200 Subject: [PATCH 1/6] add "/team info SW" command to display the serverteam --- .../steamwar/messages/BungeeCore.properties | 4 + .../messages/BungeeCore_de.properties | 4 + .../velocitycore/commands/TeamCommand.java | 76 ++++++++++++++----- 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index 6f0c2054..c9fd04eb 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -493,6 +493,10 @@ TEAM_INFO_TEAM = §7Team §e{0} §8[§{1}{2}§8] TEAM_INFO_LEADER = §7Leader ({0})§8: {1} TEAM_INFO_MEMBER = §7Member ({0})§8: {1} TEAM_INFO_EVENTS = §7Events ({0})§8: §e{1} +#Server Team +TEAM_INFO_SW_USAGE = §8/§7team info §8[§eSW§8|§eSteamWar§8] +TEAM_INFO_SW_HEADER = §eSteam§8War Server Team +TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} #Team List TEAM_LIST_NOT_PAGE = §cNo page number entered diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index 860d311b..d8320e66 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -465,6 +465,10 @@ TEAM_INFO_TEAM = §7Team §e{0} §8[§{1}{2}§8] TEAM_INFO_LEADER = §7Leader ({0})§8: {1} TEAM_INFO_MEMBER = §7Member ({0})§8: {1} TEAM_INFO_EVENTS = §7Events ({0})§8: §e{1} +#Server Team +TEAM_INFO_SW_USAGE = §8/§7team info §8[§eSW§8|§eSteamWar§8] +TEAM_INFO_SW_HEADER = §eSteam§8War Serverteam +TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} #Team List TEAM_LIST_NOT_PAGE = §cKeine Seitenzahl angegeben diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index c549eec3..face1b22 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -27,10 +27,7 @@ import de.steamwar.linkage.Linked; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.messages.PlayerChatter; -import de.steamwar.sql.Event; -import de.steamwar.sql.SteamwarUser; -import de.steamwar.sql.Team; -import de.steamwar.sql.TeamTeilnahme; +import de.steamwar.sql.*; import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.inventory.SWItem; @@ -324,26 +321,47 @@ public class TeamCommand extends SWCommand { } } - private String getMemberList(List users, boolean leaders) { - return users.stream() - .filter(user -> user.isLeader() == leaders) - .map(user -> { - StringBuilder st = new StringBuilder(); - if (VelocityCore.getProxy().getPlayer(user.getUUID()).isPresent()) { - if (!StreamingCommand.isNotStreaming(user)) { - st.append("§5"); - } else { - st.append("§a"); - } - } else { - st.append("§e"); + @Register(value = "info", description = "TEAM_INFO_SW_USAGE") + public void infoServerTeam(Chatter sender, @Mapper(value = "SW_TEAM", local = true) String teamName) { + sender.system("TEAM_INFO_SW_HEADER"); + + UserPerm.prefixes.keySet().stream() + .filter(rank -> rank != UserPerm.PREFIX_NONE && rank != UserPerm.PREFIX_YOUTUBER && rank != UserPerm.PREFIX_GUIDE) + .sorted(Comparator.reverseOrder()) + .forEach(rank -> { + List users = SteamwarUser.getUsersWithPerm(rank); + if (!users.isEmpty()) { + UserPerm.Prefix prefix = UserPerm.prefixes.get(rank); + String memberList = getMemberList(users); + sender.prefixless("TEAM_INFO_SW_RANK", + prefix.getColorCode() + prefix.getChatPrefix(), + users.size(), memberList); } - st.append(user.getUserName()); - return st.toString(); - }) + }); + } + + private static boolean isSWTeamName(String value) { + return value != null && (value.equalsIgnoreCase("sw") || value.equalsIgnoreCase("steamwar")); + } + + private String getMemberList(List users, boolean leaders) { + return getMemberList(users.stream().filter(u -> u.isLeader() == leaders).toList()); + } + + private String getMemberList(List users) { + return users.stream() + .map(user -> getUserColor(user) + user.getUserName()) .collect(Collectors.joining("§8,§r ")); } + private String getUserColor(SteamwarUser user) { + if (VelocityCore.getProxy().getPlayer(user.getUUID()).isPresent()) { + return StreamingCommand.isNotStreaming(user) ? /*Not Streaming*/ "§a" : /*Streaming*/ "§5"; + } + // Offline + return "§e"; + } + @Register("list") public void list(Chatter sender, @Min(intValue = 1) @OptionalValue("1") @ErrorMessage("TEAM_LIST_NOT_PAGE") int page) { final int TEAMS_PER_PAGE = 10; @@ -526,12 +544,30 @@ public class TeamCommand extends SWCommand { }; } + @Mapper(value = "SW_TEAM", local = true) + public TypeMapper swTeam() { + return new TypeMapper() { + @Override + public String map(Chatter sender, PreviousArguments previousArguments, String s) { + return isSWTeamName(s) ? s : null; + } + + @Override + public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { + return List.of("SW", "SteamWar"); + } + }; + } + @ClassMapper(Team.class) @Cached(global = true, cacheDuration = 60) public TypeMapper team() { return new TypeMapper() { @Override public Team map(Chatter sender, PreviousArguments previousArguments, String s) { + if (isSWTeamName(s)) { + return null; + } return Team.get(s); } From 24d8ec7301b978e0881c038ea2c6b960c9873bf0 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 18:34:10 +0200 Subject: [PATCH 2/6] add "/team prefix" command --- .../steamwar/messages/BungeeCore.properties | 7 ++++ .../messages/BungeeCore_de.properties | 7 ++++ .../velocitycore/commands/TeamCommand.java | 35 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index c9fd04eb..8ca4ed04 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -498,6 +498,13 @@ TEAM_INFO_SW_USAGE = §8/§7team info §8[§eSW§8|§eSteamWar§8] TEAM_INFO_SW_HEADER = §eSteam§8War Server Team TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} +#TEAM Prefix +TEAM_PREFIX_USAGE = §8/§7team prefix §8[§eteam§8|§eSW§8] +TEAM_PREFIX_CURRENT_TEAM = §7Current chat prefix§8: §eTeam +TEAM_PREFIX_CURRENT_SW = §7Current chat prefix§8: §eSteamWar +TEAM_PREFIX_SET_TEAM = §7Your chat prefix is now your §eteam prefix§7. +TEAM_PREFIX_SET_SW = §7Your chat prefix is now your §eSteamWar prefix§7. + #Team List TEAM_LIST_NOT_PAGE = §cNo page number entered TEAM_LIST_UNKNOWN_PAGE = §cInvalid page entered diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index d8320e66..026e19d9 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -470,6 +470,13 @@ TEAM_INFO_SW_USAGE = §8/§7team info §8[§eSW§8|§eSteamWar§8] TEAM_INFO_SW_HEADER = §eSteam§8War Serverteam TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} +#Team Prefix +TEAM_PREFIX_USAGE = §8/§7team prefix §8[§eteam§8|§eSW§8] +TEAM_PREFIX_CURRENT_TEAM = §7Aktueller Chatprefix§8: §eTeam +TEAM_PREFIX_CURRENT_SW = §7Aktueller Chatprefix§8: §eSteamWar +TEAM_PREFIX_SET_TEAM = §7Dein Chatprefix ist jetzt dein §eTeamprefix§7. +TEAM_PREFIX_SET_SW = §7Dein Chatprefix ist jetzt dein §eSteamWar-Prefix§7. + #Team List TEAM_LIST_NOT_PAGE = §cKeine Seitenzahl angegeben TEAM_LIST_UNKNOWN_PAGE = §cUngültige Seitenzahl angegeben diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index face1b22..406c0955 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -47,6 +47,8 @@ import static de.steamwar.persistent.Storage.teamInvitations; @Linked public class TeamCommand extends SWCommand { + private static final String PREFIX_MODE_CONFIG = "chatprefix"; + private static final String PREFIX_MODE_SW = "SW"; public TeamCommand() { super("team"); @@ -362,6 +364,39 @@ public class TeamCommand extends SWCommand { return "§e"; } + @Register(value = "prefix", description = "TEAM_PREFIX_USAGE") + public void prefix(@Validator("canUseTeamPrefix") Chatter sender){ + boolean swPrefix = PREFIX_MODE_SW.equals(UserConfig.getConfig(sender.user().getId(), PREFIX_MODE_CONFIG)); + sender.system(swPrefix ? "TEAM_PREFIX_CURRENT_SW" : "TEAM_PREFIX_CURRENT_TEAM"); + } + + @Register(value = "prefix", description = "TEAM_PREFIX_USAGE") + public void prefix(@Validator("canUseTeamPrefix") Chatter sender, PrefixMode mode) { + if (mode == PrefixMode.SW) { + UserConfig.updatePlayerConfig(sender.user().getId(), PREFIX_MODE_CONFIG, PREFIX_MODE_SW); + sender.system("TEAM_PREFIX_SET_SW"); + } else { + UserConfig.updatePlayerConfig(sender.user().getId(), PREFIX_MODE_CONFIG, null); + sender.system("TEAM_PREFIX_SET_TEAM"); + } + } + + @Validator("canUseTeamPrefix") + public TypeValidator canUseTeamPrefixValidator() { + return (sender, value, messageSender) -> { + SteamwarUser user = value.user(); + + return user.hasPerm(UserPerm.TEAM) + && user.getTeam() != 0 + && user.prefix() != UserPerm.emptyPrefix; + }; + } + + private enum PrefixMode { + TEAM, + SW + } + @Register("list") public void list(Chatter sender, @Min(intValue = 1) @OptionalValue("1") @ErrorMessage("TEAM_LIST_NOT_PAGE") int page) { final int TEAMS_PER_PAGE = 10; From 48fb6b5ed7da8dad022986cfd83d5092a8bf9b04 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 19:06:05 +0200 Subject: [PATCH 3/6] add parsing for chat prefix mode configuration --- .../SQL/src/de/steamwar/sql/SteamwarUser.kt | 3 ++ .../velocitycore/listeners/ChatListener.java | 45 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt b/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt index a5572bcc..7466a96d 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt @@ -175,6 +175,9 @@ class SteamwarUser(id: EntityID) : IntEntity(id) { leaderInternal = false } + fun hasTeam() = + team != 0 + private var leaderInternal by SteamwarUserTable.leader var leader: Boolean get() = leaderInternal diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java index 2e083b4d..8c6d2000 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java @@ -60,6 +60,9 @@ public class ChatListener extends BasicListener { private static final Set noLogCommands = Set.of("webpw", "webpassword", "web"); + private static final String PREFIX_MODE_CONFIG = "chatprefix"; + private static final String PREFIX_MODE_SW = "SW"; + @Subscribe(order = PostOrder.FIRST) public void fixCommands(CommandExecuteEvent e) { String command = e.getCommand(); @@ -241,18 +244,54 @@ public class ChatListener extends BasicListener { private static void chatToReciever(Chatter receiver, Chatter msgReceiver, SteamwarUser sender, String format, String message) { UserPerm.Prefix prefix = sender.prefix(); + boolean useSwPrefix = useSwPrefix(sender); + + String teamPrefix = ""; + String swPrefix = prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " "; + String nameColor = prefix == UserPerm.emptyPrefix ? "§f" : prefix.getColorCode(); + + if (sender.hasPerm(UserPerm.TEAM)) { + swPrefix = "§f"; + + if (useSwPrefix) { + swPrefix = "§eS§8W "; + } else if (sender.getTeam() != 0) { + Team team = Team.byId(sender.getTeam()); + teamPrefix = "§" + team.getTeamColor() + team.getTeamKuerzel() + " "; + } + } else if (sender.getTeam() != 0) { + Team team = Team.byId(sender.getTeam()); + teamPrefix = "§" + team.getTeamColor() + team.getTeamKuerzel() + " "; + } + String chatColorCode = sender.hasPerm(UserPerm.TEAM) ? "§f" : "§7"; receiver.prefixless(format, sender, msgReceiver == null ? receiver : msgReceiver, highlightMentions(message, chatColorCode, receiver), - sender.getTeam() == 0 ? "" : "§" + Team.byId(sender.getTeam()).getTeamColor() + Team.byId(sender.getTeam()).getTeamKuerzel() + " ", + teamPrefix, "", - prefix.getColorCode(), - prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " ", + nameColor, + swPrefix, chatColorCode); } + private static boolean useSwPrefix(SteamwarUser user) { + if (!user.hasPerm(UserPerm.TEAM)) { + return false; + } + + UserPerm.Prefix prefix = user.prefix(); + + boolean hasTeamPrefix = user.getTeam() != 0; + boolean hasSwPrefix = prefix != UserPerm.emptyPrefix; + + if (!hasSwPrefix) return false; + if (!hasTeamPrefix) return true; + + return PREFIX_MODE_SW.equals(UserConfig.getConfig(user.getId(), PREFIX_MODE_CONFIG)); + } + private static boolean filteredCommand(Chatter sender, String message) { String command = message.split(" ", 2)[0]; if (command.startsWith("/") && command.contains(":")) { From 53f98d4cd7cf868788338b995f85397b302d7f93 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 19:30:06 +0200 Subject: [PATCH 4/6] evaluate the config preference once per message --- .../steamwar/velocitycore/listeners/ChatListener.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java index 8c6d2000..6c5dc96e 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java @@ -179,19 +179,21 @@ public class ChatListener extends BasicListener { final String coloredMessage = user.hasPerm(UserPerm.COLOR_CHAT) ? message.replace('&', '§') : message; if (chatFilter(sender, coloredMessage)) return; + boolean useSwPrefix = useSwPrefix(user); + boolean noReceiver = true; for (Chatter player : receivers.getChatters()) { if (player.chatShown()) { - chatToReciever(player, msgReceiver, user, format, coloredMessage); + chatToReciever(player, msgReceiver, user, format, coloredMessage, useSwPrefix); if (sender.user().getId() != player.user().getId()) noReceiver = false; } } if (format.equals("CHAT_GLOBAL")) { - DiscordBot.withBot(bot -> chatToReciever(bot.getIngameChat(), msgReceiver, user, format, coloredMessage)); + DiscordBot.withBot(bot -> chatToReciever(bot.getIngameChat(), msgReceiver, user, format, coloredMessage, useSwPrefix)); } else if (format.equals("CHAT_SERVERTEAM")) { - DiscordBot.withBot(bot -> chatToReciever(bot.getServerTeamChat(), msgReceiver, user, "CHAT_GLOBAL", coloredMessage)); + DiscordBot.withBot(bot -> chatToReciever(bot.getServerTeamChat(), msgReceiver, user, "CHAT_GLOBAL", coloredMessage, useSwPrefix)); } else if (noReceiver) { sender.system("CHAT_NO_RECEIVER"); } @@ -242,9 +244,8 @@ public class ChatListener extends BasicListener { return false; } - private static void chatToReciever(Chatter receiver, Chatter msgReceiver, SteamwarUser sender, String format, String message) { + private static void chatToReciever(Chatter receiver, Chatter msgReceiver, SteamwarUser sender, String format, String message, boolean useSwPrefix) { UserPerm.Prefix prefix = sender.prefix(); - boolean useSwPrefix = useSwPrefix(sender); String teamPrefix = ""; String swPrefix = prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " "; From 5f5a98bcd67d1c0eabca5142a4923865aeb001d8 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 22:35:19 +0200 Subject: [PATCH 5/6] refactor team prefix handling and improve configuration parsing --- .../SQL/src/de/steamwar/sql/UserPerm.kt | 12 +-- .../steamwar/messages/BungeeCore.properties | 7 +- .../messages/BungeeCore_de.properties | 6 +- .../steamwar/velocitycore/VelocityCore.java | 2 + .../velocitycore/commands/TeamCommand.java | 88 ++++++------------- .../velocitycore/listeners/ChatListener.java | 24 ++--- .../velocitycore/util/SteamwarPrefix.java | 48 ++++++++++ 7 files changed, 96 insertions(+), 91 deletions(-) create mode 100644 VelocityCore/src/de/steamwar/velocitycore/util/SteamwarPrefix.java diff --git a/CommonCore/SQL/src/de/steamwar/sql/UserPerm.kt b/CommonCore/SQL/src/de/steamwar/sql/UserPerm.kt index e22126a9..43ba0696 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/UserPerm.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/UserPerm.kt @@ -63,11 +63,11 @@ enum class UserPerm { PREFIX_NONE to emptyPrefix, PREFIX_YOUTUBER to Prefix("§x§8§A§2§B§E§5", "CC"), // 8A2BE5 PREFIX_GUIDE to Prefix("§x§e§7§6§2§e§d", "Guide"), // E762ED - PREFIX_SUPPORTER to Prefix("§x§6§0§9§5§F§B", "Sup"), // 6095FB - PREFIX_MODERATOR to Prefix("§x§F§F§A§2§5§C", "Mod"), // FFA25C - PREFIX_BUILDER to Prefix("§x§6§0§F§F§6§A", "Arch"), // 60FF6A - PREFIX_DEVELOPER to Prefix("§x§0§B§B§C§B§3", "Dev"), // 0BBCB3 - PREFIX_ADMIN to Prefix("§x§F§F§2§B§2§4", "Admin"), // FF2B24 + PREFIX_SUPPORTER to Prefix("§x§6§0§9§5§F§B", "Sup", true), // 6095FB + PREFIX_MODERATOR to Prefix("§x§F§F§A§2§5§C", "Mod", true), // FFA25C + PREFIX_BUILDER to Prefix("§x§6§0§F§F§6§A", "Arch", true), // 60FF6A + PREFIX_DEVELOPER to Prefix("§x§0§B§B§C§B§3", "Dev", true), // 0BBCB3 + PREFIX_ADMIN to Prefix("§x§F§F§2§B§2§4", "Admin", true), // FF2B24 ) @JvmStatic @@ -94,5 +94,5 @@ enum class UserPerm { } } - data class Prefix(val colorCode: String, val chatPrefix: String) + data class Prefix(val colorCode: String, val chatPrefix: String, val teamPrefix: Boolean = false) } \ No newline at end of file diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index 8ca4ed04..900c7b64 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -500,10 +500,9 @@ TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} #TEAM Prefix TEAM_PREFIX_USAGE = §8/§7team prefix §8[§eteam§8|§eSW§8] -TEAM_PREFIX_CURRENT_TEAM = §7Current chat prefix§8: §eTeam -TEAM_PREFIX_CURRENT_SW = §7Current chat prefix§8: §eSteamWar -TEAM_PREFIX_SET_TEAM = §7Your chat prefix is now your §eteam prefix§7. -TEAM_PREFIX_SET_SW = §7Your chat prefix is now your §eSteamWar prefix§7. +TEAM_PREFIX_CURRENT = §7Current chat prefix§8: §e{0} +TEAM_PREFIX_SET = §7Your chat prefix is now your §e{0} prefix§7. +TEAM_PREFIX_TEAM = Team #Team List TEAM_LIST_NOT_PAGE = §cNo page number entered diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index 026e19d9..83970fd7 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -472,10 +472,8 @@ TEAM_INFO_SW_RANK = {0} §7({1})§8: {2} #Team Prefix TEAM_PREFIX_USAGE = §8/§7team prefix §8[§eteam§8|§eSW§8] -TEAM_PREFIX_CURRENT_TEAM = §7Aktueller Chatprefix§8: §eTeam -TEAM_PREFIX_CURRENT_SW = §7Aktueller Chatprefix§8: §eSteamWar -TEAM_PREFIX_SET_TEAM = §7Dein Chatprefix ist jetzt dein §eTeamprefix§7. -TEAM_PREFIX_SET_SW = §7Dein Chatprefix ist jetzt dein §eSteamWar-Prefix§7. +TEAM_PREFIX_CURRENT = §7Aktueller Chatprefix§8: §e{0} +TEAM_PREFIX_SET = §7Dein Chatprefix ist jetzt dein §e{0}prefix§7. #Team List TEAM_LIST_NOT_PAGE = §cKeine Seitenzahl angegeben diff --git a/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java b/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java index b658cb5c..31866c87 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java +++ b/VelocityCore/src/de/steamwar/velocitycore/VelocityCore.java @@ -45,6 +45,7 @@ import de.steamwar.velocitycore.commands.TeamCommand; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.discord.DiscordConfig; import de.steamwar.velocitycore.listeners.BasicListener; +import de.steamwar.velocitycore.util.SteamwarPrefix; import lombok.Getter; import lombok.NonNull; @@ -185,6 +186,7 @@ public class VelocityCore implements ReloadablePlugin { schedule(() -> { SteamwarUser.clear(); Team.clear(); + SteamwarPrefix.clearCache(); }).repeat(1, TimeUnit.HOURS).schedule(); DiscordConfig discordConfig = DiscordConfig.load(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index 406c0955..e7056759 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -32,6 +32,7 @@ import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.inventory.SWItem; import de.steamwar.velocitycore.inventory.SWListInv; +import de.steamwar.velocitycore.util.SteamwarPrefix; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -47,8 +48,9 @@ import static de.steamwar.persistent.Storage.teamInvitations; @Linked public class TeamCommand extends SWCommand { - private static final String PREFIX_MODE_CONFIG = "chatprefix"; - private static final String PREFIX_MODE_SW = "SW"; + + public static final String STEAM_WAR = "SteamWar"; + public static final String SW = "SW"; public TeamCommand() { super("team"); @@ -324,64 +326,52 @@ public class TeamCommand extends SWCommand { } @Register(value = "info", description = "TEAM_INFO_SW_USAGE") - public void infoServerTeam(Chatter sender, @Mapper(value = "SW_TEAM", local = true) String teamName) { + public void infoServerTeam(Chatter sender, @StaticValue({SW, STEAM_WAR}) String __) { sender.system("TEAM_INFO_SW_HEADER"); - UserPerm.prefixes.keySet().stream() - .filter(rank -> rank != UserPerm.PREFIX_NONE && rank != UserPerm.PREFIX_YOUTUBER && rank != UserPerm.PREFIX_GUIDE) - .sorted(Comparator.reverseOrder()) - .forEach(rank -> { - List users = SteamwarUser.getUsersWithPerm(rank); - if (!users.isEmpty()) { - UserPerm.Prefix prefix = UserPerm.prefixes.get(rank); - String memberList = getMemberList(users); - sender.prefixless("TEAM_INFO_SW_RANK", - prefix.getColorCode() + prefix.getChatPrefix(), - users.size(), memberList); - } + UserPerm.prefixes.entrySet().stream() + .filter(entry -> entry.getValue().getTeamPrefix()) + .sorted(Map.Entry.comparingByKey().reversed()) + .map(entry -> Map.entry(SteamwarUser.getUsersWithPerm(entry.getKey()), entry.getValue())) + .filter(entry -> !entry.getKey().isEmpty()) + .forEach(entry -> { + UserPerm.Prefix prefix = entry.getValue(); + String memberList = getMemberList(entry.getKey().stream()); + sender.prefixless("TEAM_INFO_SW_RANK", + prefix.getColorCode() + prefix.getChatPrefix(), + entry.getKey().size(), memberList); }); } - private static boolean isSWTeamName(String value) { - return value != null && (value.equalsIgnoreCase("sw") || value.equalsIgnoreCase("steamwar")); - } - private String getMemberList(List users, boolean leaders) { - return getMemberList(users.stream().filter(u -> u.isLeader() == leaders).toList()); + return getMemberList(users.stream().filter(u -> u.isLeader() == leaders)); } - private String getMemberList(List users) { - return users.stream() - .map(user -> getUserColor(user) + user.getUserName()) + private String getMemberList(Stream users) { + return users.map(user -> getUserColor(user) + user.getUserName()) .collect(Collectors.joining("§8,§r ")); } private String getUserColor(SteamwarUser user) { if (VelocityCore.getProxy().getPlayer(user.getUUID()).isPresent()) { - return StreamingCommand.isNotStreaming(user) ? /*Not Streaming*/ "§a" : /*Streaming*/ "§5"; + return StreamingCommand.isNotStreaming(user) ? /* Not Streaming */ "§a" : /* Streaming */ "§5"; } - // Offline - return "§e"; + return "§e"; // Offline } @Register(value = "prefix", description = "TEAM_PREFIX_USAGE") - public void prefix(@Validator("canUseTeamPrefix") Chatter sender){ - boolean swPrefix = PREFIX_MODE_SW.equals(UserConfig.getConfig(sender.user().getId(), PREFIX_MODE_CONFIG)); - sender.system(swPrefix ? "TEAM_PREFIX_CURRENT_SW" : "TEAM_PREFIX_CURRENT_TEAM"); + public void prefix(@Validator("canUseTeamPrefix") Chatter sender) { + boolean swPrefix = SteamwarPrefix.usesSWPrefix(sender.user()); + sender.system("TEAM_PREFIX_CURRENT", swPrefix ? STEAM_WAR : sender.parse("TEAM_PREFIX_TEAM")); } @Register(value = "prefix", description = "TEAM_PREFIX_USAGE") - public void prefix(@Validator("canUseTeamPrefix") Chatter sender, PrefixMode mode) { - if (mode == PrefixMode.SW) { - UserConfig.updatePlayerConfig(sender.user().getId(), PREFIX_MODE_CONFIG, PREFIX_MODE_SW); - sender.system("TEAM_PREFIX_SET_SW"); - } else { - UserConfig.updatePlayerConfig(sender.user().getId(), PREFIX_MODE_CONFIG, null); - sender.system("TEAM_PREFIX_SET_TEAM"); - } + public void prefix(@Validator("canUseTeamPrefix") Chatter sender, @StaticValue(value = {SW, STEAM_WAR, "Team"}, falseValues = {2}) boolean useSWTeamTag) { + SteamwarPrefix.setSWPrefix(sender.user(), useSWTeamTag); + sender.system("TEAM_PREFIX_SET", useSWTeamTag ? STEAM_WAR : sender.parse("TEAM_PREFIX_TEAM")); } - @Validator("canUseTeamPrefix") + @Validator(value = "canUseTeamPrefix", local = true) public TypeValidator canUseTeamPrefixValidator() { return (sender, value, messageSender) -> { SteamwarUser user = value.user(); @@ -392,11 +382,6 @@ public class TeamCommand extends SWCommand { }; } - private enum PrefixMode { - TEAM, - SW - } - @Register("list") public void list(Chatter sender, @Min(intValue = 1) @OptionalValue("1") @ErrorMessage("TEAM_LIST_NOT_PAGE") int page) { final int TEAMS_PER_PAGE = 10; @@ -579,28 +564,13 @@ public class TeamCommand extends SWCommand { }; } - @Mapper(value = "SW_TEAM", local = true) - public TypeMapper swTeam() { - return new TypeMapper() { - @Override - public String map(Chatter sender, PreviousArguments previousArguments, String s) { - return isSWTeamName(s) ? s : null; - } - - @Override - public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { - return List.of("SW", "SteamWar"); - } - }; - } - @ClassMapper(Team.class) @Cached(global = true, cacheDuration = 60) public TypeMapper team() { return new TypeMapper() { @Override public Team map(Chatter sender, PreviousArguments previousArguments, String s) { - if (isSWTeamName(s)) { + if ((s.equalsIgnoreCase("sw") || s.equalsIgnoreCase("steamwar"))) { return null; } return Team.get(s); diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java index 6c5dc96e..ad522fee 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/ChatListener.java @@ -42,6 +42,7 @@ import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.commands.PunishmentCommand; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.network.NetworkSender; +import de.steamwar.velocitycore.util.SteamwarPrefix; import java.util.Arrays; import java.util.List; @@ -60,9 +61,6 @@ public class ChatListener extends BasicListener { private static final Set noLogCommands = Set.of("webpw", "webpassword", "web"); - private static final String PREFIX_MODE_CONFIG = "chatprefix"; - private static final String PREFIX_MODE_SW = "SW"; - @Subscribe(order = PostOrder.FIRST) public void fixCommands(CommandExecuteEvent e) { String command = e.getCommand(); @@ -248,18 +246,8 @@ public class ChatListener extends BasicListener { UserPerm.Prefix prefix = sender.prefix(); String teamPrefix = ""; - String swPrefix = prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " "; - String nameColor = prefix == UserPerm.emptyPrefix ? "§f" : prefix.getColorCode(); - - if (sender.hasPerm(UserPerm.TEAM)) { - swPrefix = "§f"; - - if (useSwPrefix) { - swPrefix = "§eS§8W "; - } else if (sender.getTeam() != 0) { - Team team = Team.byId(sender.getTeam()); - teamPrefix = "§" + team.getTeamColor() + team.getTeamKuerzel() + " "; - } + if (sender.hasPerm(UserPerm.TEAM) && useSwPrefix) { + teamPrefix = "§eS§8W "; } else if (sender.getTeam() != 0) { Team team = Team.byId(sender.getTeam()); teamPrefix = "§" + team.getTeamColor() + team.getTeamKuerzel() + " "; @@ -272,8 +260,8 @@ public class ChatListener extends BasicListener { highlightMentions(message, chatColorCode, receiver), teamPrefix, "", - nameColor, - swPrefix, + prefix == UserPerm.emptyPrefix ? "§f" : prefix.getColorCode(), + prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " ", chatColorCode); } @@ -290,7 +278,7 @@ public class ChatListener extends BasicListener { if (!hasSwPrefix) return false; if (!hasTeamPrefix) return true; - return PREFIX_MODE_SW.equals(UserConfig.getConfig(user.getId(), PREFIX_MODE_CONFIG)); + return SteamwarPrefix.usesSWPrefix(user); } private static boolean filteredCommand(Chatter sender, String message) { diff --git a/VelocityCore/src/de/steamwar/velocitycore/util/SteamwarPrefix.java b/VelocityCore/src/de/steamwar/velocitycore/util/SteamwarPrefix.java new file mode 100644 index 00000000..77596c5a --- /dev/null +++ b/VelocityCore/src/de/steamwar/velocitycore/util/SteamwarPrefix.java @@ -0,0 +1,48 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.velocitycore.util; + +import de.steamwar.sql.SteamwarUser; +import de.steamwar.sql.UserConfig; +import lombok.experimental.UtilityClass; + +import java.util.HashMap; +import java.util.Map; + +@UtilityClass +public class SteamwarPrefix { + private static final String PREFIX_MODE_CONFIG = "chatprefix"; + private static final String PREFIX_MODE_SW = "SW"; + + private static final Map usesSwPrefix = new HashMap<>(); + + public static boolean usesSWPrefix(SteamwarUser user) { + return usesSwPrefix.computeIfAbsent(user, u -> PREFIX_MODE_SW.equals(UserConfig.getConfig(u.getId(), PREFIX_MODE_CONFIG))); + } + + public static void setSWPrefix(SteamwarUser user, boolean preferSW) { + UserConfig.updatePlayerConfig(user.getId(), PREFIX_MODE_CONFIG, preferSW ? PREFIX_MODE_SW : null); + usesSwPrefix.put(user, preferSW); + } + + public static void clearCache() { + usesSwPrefix.clear(); + } +} From 4a458f0e92c9b578377c342770c13764e6098a16 Mon Sep 17 00:00:00 2001 From: Jakob Schulz <55949993+Lordikak@users.noreply.github.com> Date: Wed, 20 May 2026 22:38:23 +0200 Subject: [PATCH 6/6] fix: update team name checks to use constants for better readability --- .../src/de/steamwar/velocitycore/commands/TeamCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index e7056759..ef46d9b0 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -570,7 +570,7 @@ public class TeamCommand extends SWCommand { return new TypeMapper() { @Override public Team map(Chatter sender, PreviousArguments previousArguments, String s) { - if ((s.equalsIgnoreCase("sw") || s.equalsIgnoreCase("steamwar"))) { + if ((s.equalsIgnoreCase(SW) || s.equalsIgnoreCase(STEAM_WAR))) { return null; } return Team.get(s);