-using Content.Shared.Communications;
-using Robust.Client.GameObjects;
+using Content.Shared.CCVar;
+using Content.Shared.Chat;
+using Content.Shared.Communications;
+using Robust.Shared.Configuration;
using Robust.Shared.Timing;
namespace Content.Client.Communications.UI
public sealed class CommunicationsConsoleBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
[ViewVariables]
private CommunicationsConsoleMenu? _menu;
public void AnnounceButtonPressed(string message)
{
- var msg = (message.Length <= 256 ? message.Trim() : $"{message.Trim().Substring(0, 256)}...").ToCharArray();
-
- // No more than 2 newlines, other replaced to spaces
- var newlines = 0;
- for (var i = 0; i < msg.Length; i++)
- {
- if (msg[i] != '\n')
- continue;
-
- if (newlines >= 2)
- msg[i] = ' ';
-
- newlines++;
- }
-
- SendMessage(new CommunicationsConsoleAnnounceMessage(new string(msg)));
+ var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
+ var msg = SharedChatSystem.SanitizeAnnouncement(message, maxLength);
+ SendMessage(new CommunicationsConsoleAnnounceMessage(msg));
}
public void CallShuttle()
var loc = IoCManager.Resolve<ILocalizationManager>();
MessageInput.Placeholder = new Rope.Leaf(loc.GetString("comms-console-menu-announcement-placeholder"));
- AnnounceButton.OnPressed += (_) => Owner.AnnounceButtonPressed(Rope.Collapse(MessageInput.TextRope).Trim());
+ AnnounceButton.OnPressed += (_) => Owner.AnnounceButtonPressed(Rope.Collapse(MessageInput.TextRope));
AnnounceButton.Disabled = !owner.CanAnnounce;
AlertLevelButton.OnItemSelected += args =>
-using Content.Shared.NukeOps;
+using Content.Shared.CCVar;
+using Content.Shared.Chat;
+using Content.Shared.NukeOps;
using JetBrains.Annotations;
-using Robust.Client.GameObjects;
-using Robust.Shared.Timing;
+using Robust.Shared.Configuration;
namespace Content.Client.NukeOps;
[UsedImplicitly]
public sealed class WarDeclaratorBoundUserInterface : BoundUserInterface
{
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
+
[ViewVariables]
private WarDeclaratorWindow? _window;
private void OnWarDeclaratorActivated(string message)
{
- SendMessage(new WarDeclaratorActivateMessage(message));
+ var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
+ var msg = SharedChatSystem.SanitizeAnnouncement(message, maxLength);
+ SendMessage(new WarDeclaratorActivateMessage(msg));
}
}
using Content.Shared.NukeOps;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
-using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
_gameTiming = IoCManager.Resolve<IGameTiming>();
- WarButton.OnPressed += ActivateWarDeclarator;
+ WarButton.OnPressed += (_) => OnActivated?.Invoke(Rope.Collapse(MessageEdit.TextRope));
var loc = IoCManager.Resolve<ILocalizationManager>();
MessageEdit.Placeholder = new Rope.Leaf(loc.GetString("war-declarator-message-placeholder"));
return;
}
}
-
- private void ActivateWarDeclarator(BaseButton.ButtonEventArgs obj)
- {
- var message = Rope.Collapse(MessageEdit.TextRope);
- OnActivated?.Invoke(message);
- }
}
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.CCVar;
+using Content.Shared.Chat;
using Content.Shared.Communications;
using Content.Shared.Database;
using Content.Shared.Emag.Components;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
- private const int MaxMessageLength = 256;
- private const int MaxMessageNewlines = 2;
private const float UIUpdateInterval = 5.0f;
public override void Initialize()
private void OnAnnounceMessage(EntityUid uid, CommunicationsConsoleComponent comp,
CommunicationsConsoleAnnounceMessage message)
{
- var msgWords = message.Message.Trim();
- var msgChars = (msgWords.Length <= MaxMessageLength ? msgWords : $"{msgWords[0..MaxMessageLength]}...").ToCharArray();
-
- var newlines = 0;
- for (var i = 0; i < msgChars.Length; i++)
- {
- if (msgChars[i] != '\n')
- continue;
-
- if (newlines >= MaxMessageNewlines)
- msgChars[i] = ' ';
-
- newlines++;
- }
-
- var msg = new string(msgChars);
+ var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
+ var msg = SharedChatSystem.SanitizeAnnouncement(message.Message, maxLength);
var author = Loc.GetString("comms-console-announcement-unknown-sender");
if (message.Session.AttachedEntity is { Valid: true } mob)
{
[DataField]
public bool AllowEditingMessage = true;
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField]
- public int MaxMessageLength = 512;
-
/// <summary>
/// War declarement text color
/// </summary>
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Popups;
using Content.Server.UserInterface;
+using Content.Shared.CCVar;
+using Content.Shared.Chat;
using Content.Shared.Database;
using Content.Shared.NukeOps;
using Robust.Server.GameObjects;
+using Robust.Shared.Configuration;
namespace Content.Server.NukeOps;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly NukeopsRuleSystem _nukeopsRuleSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
public override void Initialize()
{
return;
}
- var text = (args.Message.Length <= component.MaxMessageLength ? args.Message.Trim() : $"{args.Message.Trim().Substring(0, 256)}...").ToCharArray();
-
- // No more than 2 newlines, other replaced to spaces
- var newlines = 0;
- for (var i = 0; i < text.Length; i++)
- {
- if (text[i] != '\n')
- continue;
-
- if (newlines >= 2)
- text[i] = ' ';
-
- newlines++;
- }
-
- string message = new string(text);
+ var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
+ var message = SharedChatSystem.SanitizeAnnouncement(args.Message, maxLength);
if (component.AllowEditingMessage && message != string.Empty)
{
component.Message = message;
public static readonly CVarDef<int> ChatMaxMessageLength =
CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED);
+ public static readonly CVarDef<int> ChatMaxAnnouncementLength =
+ CVarDef.Create("chat.max_announcement_length", 256, CVar.SERVER | CVar.REPLICATED);
+
public static readonly CVarDef<bool> ChatSanitizerEnabled =
CVarDef.Create("chat.chat_sanitizer_enabled", true, CVar.SERVERONLY);
return message;
}
+
+ public static string SanitizeAnnouncement(string message, int maxLength = 0, int maxNewlines = 2)
+ {
+ var trimmed = message.Trim();
+ if (maxLength > 0 && trimmed.Length > maxLength)
+ {
+ trimmed = $"{message[..maxLength]}...";
+ }
+
+ // No more than max newlines, other replaced to spaces
+ if (maxNewlines > 0)
+ {
+ var chars = trimmed.ToCharArray();
+ var newlines = 0;
+ for (var i = 0; i < chars.Length; i++)
+ {
+ if (chars[i] != '\n')
+ continue;
+
+ if (newlines >= maxNewlines)
+ chars[i] = ' ';
+
+ newlines++;
+ }
+
+ return new string(chars);
+ }
+
+ return trimmed;
+ }
}