using System.IO; using JetBrains.Annotations; using Lidgren.Network; using Robust.Shared.Network; using Robust.Shared.Serialization; using Robust.Shared.Utility; namespace Content.Shared.Chat { [Serializable, NetSerializable] public sealed class ChatMessage { public ChatChannel Channel; /// /// This is the text spoken by the entity, after accents and such were applied. /// This should have applied before using it in any rich text box. /// public string Message; /// /// This is the but with special characters escaped and wrapped in some rich text /// formatting tags. /// public string WrappedMessage; public NetEntity SenderEntity; /// /// Identifier sent when is /// if this was sent by a player to assign a key to the sender of this message. /// This is unique per sender. /// public int? SenderKey; public bool HideChat; public Color? MessageColorOverride; public string? AudioPath; public float AudioVolume; [NonSerialized] public bool Read; public ChatMessage(ChatChannel channel, string message, string wrappedMessage, NetEntity source, int? senderKey, bool hideChat = false, Color? colorOverride = null, string? audioPath = null, float audioVolume = 0) { Channel = channel; Message = message; WrappedMessage = wrappedMessage; SenderEntity = source; SenderKey = senderKey; HideChat = hideChat; MessageColorOverride = colorOverride; AudioPath = audioPath; AudioVolume = audioVolume; } } /// /// Sent from server to client to notify the client about a new chat message. /// [UsedImplicitly] public sealed class MsgChatMessage : NetMessage { public override MsgGroups MsgGroup => MsgGroups.Command; public ChatMessage Message = default!; public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer) { var length = buffer.ReadVariableInt32(); using var stream = new MemoryStream(length); buffer.ReadAlignedMemory(stream, length); serializer.DeserializeDirect(stream, out Message); } public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer) { var stream = new MemoryStream(); serializer.SerializeDirect(stream, Message); buffer.WriteVariableInt32((int) stream.Length); buffer.Write(stream.AsSpan()); } } }