diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index b617fd32f..744541237 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -574,16 +574,32 @@ CHAT_BC_USAGE = §8/§7bc §8[§emessage§8] CHAT_NO_RECEIVER = §cNobody receives your message CHAT_EMPTY = §cDon\'t write meaningless empty messages. -CHAT_SERVERTEAM = §e{0}§8» §f{2} -CHAT_GLOBAL = {3}{4}{5}{6}{0}§8» {7}{2} -CHAT_LOCAL = {3}{4}{5}{6}{0}§8» {7}{2} -CHAT_TEAM = §e{0}§8» §f{2} -CHAT_MSG = §e{0}§8»§e{1} §7{2} +CHAT_SERVERTEAM_SENDER = §e{0} +CHAT_SERVERTEAM = §8» §f{2} +CHAT_GLOBAL_SENDER = {3}{4}{5}{6}{0} +CHAT_GLOBAL = §8» {7}{2} +CHAT_LOCAL_SENDER = {3}{4}{5}{6}{0} +CHAT_LOCAL = §8» {7}{2} +CHAT_TEAM_SENDER = §e{0} +CHAT_TEAM = §8» §f{2} +CHAT_MSG_SENDER = §e{0} +CHAT_MSG = §8»§e{1} §7{2} +CHAT_SPECIAL_ALERT = §e{0}§8»§e{1} §7{2} CHAT_FIGHT_PARTICIPANT = {0} {1}§8» §7{2} CHAT_FIGHT_SPECTATOR = §7{0}§8» §7{1} CHAT_FIGHT_REFEREE = §e{0}§8» §e{1} CHAT_FIGHT_TEAM = {0} {1}§8» §f{2} -CHAT_TAGGED = §8{0} §r{1} +CHAT_ICON = {0}{1} +CHAT_HOVER_TEAM = §7Team: §e{0}\n§7Prefix: §r{1}{2} +CHAT_ICON_GLOBAL = 🌍 +CHAT_ICON_LOCAL = ⌂ +CHAT_ICON_FIGHT = ⚔ +CHAT_ICON_FIGHT_FOREIGN = ⚔ §8{0} +CHAT_ICON_FIGHT_TEAM = {0}⚑ +CHAT_ICON_FIGHT_TEAM_FOREIGN = {0}⚑ §8{1} +CHAT_ICON_TEAM = 👥 +CHAT_ICON_SERVERTEAM = ⚙ +CHAT_ICON_MSG = ✉ CHAT_CHANNEL_GLOBAL = §eGlobal CHAT_CHANNEL_ARENA = §e{0} CHAT_CHANNEL_FIGHT_TEAM = §e{0} {1} diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index e253ce72f..437a53667 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -539,16 +539,32 @@ CHAT_BC_USAGE = §8/§7bc §8[§eNachricht§8] CHAT_NO_RECEIVER = §cNiemand empfängt deine Nachricht CHAT_EMPTY = §cSchreibe keine inhaltslosen Nachrichten. -CHAT_SERVERTEAM = §e{0}§8» §f{2} -CHAT_GLOBAL = {3}{4}{5}{6}{0}§8» {7}{2} -CHAT_LOCAL = {3}{4}{5}{6}{0}§8» {7}{2} -CHAT_TEAM = §e{0}§8» §f{2} -CHAT_MSG = §e{0}§8»§e{1} §7{2} +CHAT_SERVERTEAM_SENDER = §e{0} +CHAT_SERVERTEAM = §8» §f{2} +CHAT_GLOBAL_SENDER = {3}{4}{5}{6}{0} +CHAT_GLOBAL = §8» {7}{2} +CHAT_LOCAL_SENDER = {3}{4}{5}{6}{0} +CHAT_LOCAL = §8» {7}{2} +CHAT_TEAM_SENDER = §e{0} +CHAT_TEAM = §8» §f{2} +CHAT_MSG_SENDER = §e{0} +CHAT_MSG = §8»§e{1} §7{2} +CHAT_SPECIAL_ALERT = §e{0}§8»§e{1} §7{2} CHAT_FIGHT_PARTICIPANT = {0} {1}§8» §7{2} CHAT_FIGHT_SPECTATOR = §7{0}§8» §7{1} CHAT_FIGHT_REFEREE = §e{0}§8» §e{1} CHAT_FIGHT_TEAM = {0} {1}§8» §f{2} -CHAT_TAGGED = §8{0} §r{1} +CHAT_ICON = {0}{1} +CHAT_HOVER_TEAM = §7Team: §e{0}\n§7Kürzel: §r{1}{2} +CHAT_ICON_GLOBAL = 🌍 +CHAT_ICON_LOCAL = ⌂ +CHAT_ICON_FIGHT = ⚔ +CHAT_ICON_FIGHT_FOREIGN = ⚔ §8{0} +CHAT_ICON_FIGHT_TEAM = {0}⚑ +CHAT_ICON_FIGHT_TEAM_FOREIGN = {0}⚑ §8{1} +CHAT_ICON_TEAM = 👥 +CHAT_ICON_SERVERTEAM = ⚙ +CHAT_ICON_MSG = ✉ CHAT_CHANNEL_GLOBAL = §eGlobal CHAT_CHANNEL_ARENA = §e{0} CHAT_CHANNEL_FIGHT_TEAM = §e{0} {1} diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/AlertChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/AlertChannel.java index 2c194f888..a86964fb0 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/AlertChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/AlertChannel.java @@ -23,6 +23,7 @@ package de.steamwar.velocitycore.chat; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.sql.UserPerm; +import net.kyori.adventure.text.Component; import java.util.Arrays; import java.util.stream.Stream; @@ -54,8 +55,8 @@ public class AlertChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { - return new Message("ALERT", message.replace('&', '§')); + protected Component format(Chatter receiver, Chatter sender, String message) { + return receiver.parse(true, new Message("ALERT", message.replace('&', '§'))); } /** @@ -65,6 +66,6 @@ public class AlertChannel extends ChatChannel { public void send(Chatter sender, String message, boolean mirror) { if (!canWrite(sender)) return; - readers().forEach(reader -> reader.send(true, null, null, format(reader, sender, message))); + readers().forEach(reader -> reader.sendMessage(format(reader, sender, message))); } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java index 8d25acb19..9e8e5861f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatChannel.java @@ -24,6 +24,8 @@ import de.steamwar.messages.Message; import de.steamwar.sql.AuditLog; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; import java.util.LinkedHashMap; import java.util.Map; @@ -43,15 +45,16 @@ public abstract class ChatChannel { } /** - * @return the channel name shown in front of messages of this channel if it is not the default channel of the receiver + * @return the channel name shown in channel related system messages */ public abstract Message tag(Chatter receiver); /** - * @return false if the message format already shows the channel, so no tag is put in front + * @return the icon always shown in front of messages of this channel, null if the message format already shows the channel. + * The icon is highlighted if this is the default channel of the receiver. */ - protected boolean tagged() { - return true; + protected Message icon(Chatter receiver) { + return null; } public abstract Stream readers(); @@ -61,7 +64,7 @@ public abstract class ChatChannel { */ public abstract boolean canWrite(Chatter sender); - protected abstract Message format(Chatter receiver, Chatter sender, String message); + protected abstract Component format(Chatter receiver, Chatter sender, String message); /** * Called after a message was delivered to all readers. @@ -96,11 +99,14 @@ public abstract class ChatChannel { for (Chatter receiver : receivers.values()) { if (!receiver.chatShown()) continue; - Message msg = format(receiver, sender, coloredMessage); - if (tagged() && ChatManager.getDefault(receiver) != this) { - msg = new Message("CHAT_TAGGED", receiver.parseToPlain(tag(receiver)), msg); + Component msg = format(receiver, sender, coloredMessage); + Message icon = icon(receiver); + if (icon != null) { + Component iconComponent = receiver.parse(new Message("CHAT_ICON", ChatManager.getDefault(receiver) == this ? "§e" : "§7", icon)) + .hoverEvent(HoverEvent.showText(receiver.parse(tag(receiver)))); + msg = Component.text().append(iconComponent).append(Component.text(" ")).append(msg).build(); } - receiver.send(false, null, null, msg); + receiver.sendMessage(msg); if (receiver.user().getId() != user.getId()) noReceiver = false; } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFilter.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFilter.java index efe8ebb2f..51c2841c1 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFilter.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFilter.java @@ -70,7 +70,7 @@ public class ChatFilter { sender.system("CHAT_LIXFEL_ACTION_BAR"); for (int i = 0; i < delay.length; i++) { int finalI = i; - VelocityCore.schedule(() -> sender.prefixless("CHAT_MSG", name, sender.user(), new Message(baseMessage + (finalI + 1)))).delay(delay[i], TimeUnit.SECONDS).schedule(); + VelocityCore.schedule(() -> sender.prefixless("CHAT_SPECIAL_ALERT", name, sender.user(), new Message(baseMessage + (finalI + 1)))).delay(delay[i], TimeUnit.SECONDS).schedule(); } } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFormat.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFormat.java index 28a114f29..aeb8064e9 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFormat.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ChatFormat.java @@ -28,6 +28,8 @@ import de.steamwar.sql.Team; import de.steamwar.sql.UserPerm; import de.steamwar.velocitycore.network.NetworkSender; import de.steamwar.velocitycore.util.SteamwarPrefix; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; import java.util.Arrays; import java.util.stream.Collectors; @@ -37,9 +39,10 @@ public class ChatFormat { private ChatFormat() {} /** - * Formats a message with the rank and team prefixes of the sender. + * Formats a message with the rank and team prefixes of the sender. The sender part ({@code _SENDER}) + * shows the team of the sender on hover. */ - public static Message player(String format, Chatter receiver, Chatter sender, Chatter msgReceiver, String message) { + public static Component player(String format, Chatter receiver, Chatter sender, Chatter msgReceiver, String message) { SteamwarUser user = sender.user(); UserPerm.Prefix prefix = user.prefix(); @@ -52,7 +55,7 @@ public class ChatFormat { } String chatColorCode = user.hasPerm(UserPerm.TEAM) ? "§f" : "§7"; - return new Message(format, + Object[] params = { user, msgReceiver == null ? receiver : msgReceiver, highlightMentions(message, chatColorCode, receiver), @@ -60,7 +63,14 @@ public class ChatFormat { "", prefix == UserPerm.emptyPrefix ? "§f" : prefix.getColorCode(), prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " ", - chatColorCode); + chatColorCode}; + + Component senderPart = receiver.parse(new Message(format + "_SENDER", params)); + if (user.getTeam() != 0) { + Team team = Team.byId(user.getTeam()); + senderPart = senderPart.hoverEvent(HoverEvent.showText(receiver.parse(new Message("CHAT_HOVER_TEAM", team.getTeamName(), "§" + team.getTeamColor(), team.getTeamKuerzel())))); + } + return Component.text().append(senderPart).append(receiver.parse(new Message(format, params))).build(); } private static boolean useSwPrefix(SteamwarUser user) { diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java index 0871357b5..3695c7015 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/DirectChannel.java @@ -27,6 +27,7 @@ import de.steamwar.sql.AuditLog; import de.steamwar.sql.IgnoreSystem; import de.steamwar.sql.SteamwarUser; import de.steamwar.velocitycore.VelocityCore; +import net.kyori.adventure.text.Component; import java.util.UUID; import java.util.stream.Stream; @@ -60,8 +61,8 @@ public class DirectChannel extends ChatChannel { } @Override - protected boolean tagged() { - return false; + protected Message icon(Chatter receiver) { + return new Message("CHAT_ICON_MSG"); } @Override @@ -88,7 +89,7 @@ public class DirectChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { + protected Component format(Chatter receiver, Chatter sender, String message) { return ChatFormat.player("CHAT_MSG", receiver, sender, Chatter.of(partner(sender.user().getUUID())), message); } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java index 93b80e600..3768fa75c 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/FightTeamChannel.java @@ -27,6 +27,7 @@ import de.steamwar.network.packets.common.FightInfoPacket; import de.steamwar.sql.AuditLog; import de.steamwar.sql.SteamwarUser; import lombok.Getter; +import net.kyori.adventure.text.Component; import java.util.Collections; import java.util.List; @@ -72,6 +73,16 @@ public class FightTeamChannel extends ChatChannel { return new Message("CHAT_CHANNEL_FIGHT_TEAM", server.getServerInfo().getName(), teamName()); } + @Override + protected Message icon(Chatter receiver) { + String teamName = teamName(); + String color = teamName.length() >= 2 && teamName.charAt(0) == '§' ? teamName.substring(0, 2) : "§7"; + if (receiver.getPlayer() != null && server.getPlayersConnected().contains(receiver.getPlayer())) { + return new Message("CHAT_ICON_FIGHT_TEAM", color); + } + return new Message("CHAT_ICON_FIGHT_TEAM_FOREIGN", color, server.getServerInfo().getName()); + } + @Override public Stream readers() { List members = members(); @@ -90,8 +101,8 @@ public class FightTeamChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { - return new Message("CHAT_FIGHT_TEAM", teamName(), sender.user(), ChatFormat.highlightMentions(message, "§f", receiver)); + protected Component format(Chatter receiver, Chatter sender, String message) { + return receiver.parse(new Message("CHAT_FIGHT_TEAM", teamName(), sender.user(), ChatFormat.highlightMentions(message, "§f", receiver))); } @Override diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java index a4146c1d2..cc2219cdb 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/GlobalChannel.java @@ -23,6 +23,7 @@ package de.steamwar.velocitycore.chat; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.velocitycore.discord.DiscordBot; +import net.kyori.adventure.text.Component; import java.util.stream.Stream; @@ -38,6 +39,11 @@ public class GlobalChannel extends ChatChannel { return new Message("CHAT_CHANNEL_GLOBAL"); } + @Override + protected Message icon(Chatter receiver) { + return new Message("CHAT_ICON_GLOBAL"); + } + @Override public Stream readers() { return Stream.concat(Stream.of(Chatter.console()), Chatter.allPlayers().filter(ChatManager::readsGlobal).map(Chatter::of).filter(chatter -> ChatManager.reads(chatter, persistId()))); @@ -49,14 +55,14 @@ public class GlobalChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { + protected Component format(Chatter receiver, Chatter sender, String message) { return ChatFormat.player("CHAT_GLOBAL", receiver, sender, null, message); } @Override protected boolean delivered(Chatter sender, String message, boolean mirror) { if (mirror) { - DiscordBot.withBot(bot -> bot.getIngameChat().send(false, null, null, format(bot.getIngameChat(), sender, message))); + DiscordBot.withBot(bot -> bot.getIngameChat().sendMessage(format(bot.getIngameChat(), sender, message))); } return true; } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java index 5eaf90aa9..27f7b6363 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/LocalChannel.java @@ -30,6 +30,7 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.velocitycore.network.NetworkSender; import lombok.Getter; +import net.kyori.adventure.text.Component; import java.util.stream.Stream; @@ -62,6 +63,17 @@ public class LocalChannel extends ChatChannel { return new Message("CHAT_CHANNEL_LOCAL"); } + @Override + protected Message icon(Chatter receiver) { + if (!isArena()) return new Message("CHAT_ICON_LOCAL"); + + // Moderators reading an arena they are not on need to know which arena it is + if (receiver.getPlayer() != null && server.getPlayersConnected().contains(receiver.getPlayer())) { + return new Message("CHAT_ICON_FIGHT"); + } + return new Message("CHAT_ICON_FIGHT_FOREIGN", server.getServerInfo().getName()); + } + @Override public Stream readers() { Stream players = server.getPlayersConnected().stream().map(Chatter::of).filter(chatter -> ChatManager.reads(chatter, persistId())).map(Chatter.class::cast); @@ -83,7 +95,7 @@ public class LocalChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { + protected Component format(Chatter receiver, Chatter sender, String message) { if (!isArena()) { return ChatFormat.player("CHAT_LOCAL", receiver, sender, null, message); } @@ -92,13 +104,13 @@ public class LocalChannel extends ChatChannel { FightInfoPacket info = ChatManager.getFightInfo(server); int id = sender.user().getId(); if (info != null && info.getBluePlayers().contains(id)) { - return new Message("CHAT_FIGHT_PARTICIPANT", info.getBlueName(), sender.user(), highlighted); + return receiver.parse(new Message("CHAT_FIGHT_PARTICIPANT", info.getBlueName(), sender.user(), highlighted)); } else if (info != null && info.getRedPlayers().contains(id)) { - return new Message("CHAT_FIGHT_PARTICIPANT", info.getRedName(), sender.user(), highlighted); + return receiver.parse(new Message("CHAT_FIGHT_PARTICIPANT", info.getRedName(), sender.user(), highlighted)); } else if (ChatManager.isReferee(server, id)) { - return new Message("CHAT_FIGHT_REFEREE", sender.user(), highlighted); + return receiver.parse(new Message("CHAT_FIGHT_REFEREE", sender.user(), highlighted)); } - return new Message("CHAT_FIGHT_SPECTATOR", sender.user(), highlighted); + return receiver.parse(new Message("CHAT_FIGHT_SPECTATOR", sender.user(), highlighted)); } @Override diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java index 46950b1cb..1860633d2 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/ServerTeamChannel.java @@ -26,6 +26,7 @@ import de.steamwar.sql.AuditLog; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.velocitycore.discord.DiscordBot; +import net.kyori.adventure.text.Component; import java.util.Arrays; import java.util.stream.Stream; @@ -42,6 +43,11 @@ public class ServerTeamChannel extends ChatChannel { return new Message("CHAT_CHANNEL_SERVERTEAM"); } + @Override + protected Message icon(Chatter receiver) { + return new Message("CHAT_ICON_SERVERTEAM"); + } + @Override public Stream readers() { return Arrays.stream(Chatter.serverteam().getChatters()).filter(chatter -> ChatManager.reads(chatter, persistId())); @@ -57,14 +63,14 @@ public class ServerTeamChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { + protected Component format(Chatter receiver, Chatter sender, String message) { return ChatFormat.player("CHAT_SERVERTEAM", receiver, sender, null, message); } @Override protected boolean delivered(Chatter sender, String message, boolean mirror) { if (mirror) { - DiscordBot.withBot(bot -> bot.getServerTeamChat().send(false, null, null, ChatFormat.player("CHAT_GLOBAL", bot.getServerTeamChat(), sender, null, message))); + DiscordBot.withBot(bot -> bot.getServerTeamChat().sendMessage(ChatFormat.player("CHAT_GLOBAL", bot.getServerTeamChat(), sender, null, message))); } return true; } diff --git a/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java b/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java index f29a80f4d..f362099b3 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java +++ b/VelocityCore/src/de/steamwar/velocitycore/chat/TeamChannel.java @@ -26,6 +26,7 @@ import de.steamwar.sql.AuditLog; import de.steamwar.sql.SteamwarUser; import de.steamwar.velocitycore.commands.StreamingCommand; import lombok.Getter; +import net.kyori.adventure.text.Component; import java.util.stream.Stream; @@ -48,6 +49,11 @@ public class TeamChannel extends ChatChannel { return new Message("CHAT_CHANNEL_TEAM"); } + @Override + protected Message icon(Chatter receiver) { + return new Message("CHAT_ICON_TEAM"); + } + @Override public Stream readers() { return Chatter.allPlayers() @@ -68,7 +74,7 @@ public class TeamChannel extends ChatChannel { } @Override - protected Message format(Chatter receiver, Chatter sender, String message) { + protected Component format(Chatter receiver, Chatter sender, String message) { return ChatFormat.player("CHAT_TEAM", receiver, sender, null, message); }