Skip to content

Commit

Permalink
feat(fax): Fax machines print, copy, and send paper labels (space-wiz…
Browse files Browse the repository at this point in the history
…ards#25979)

* feat(fax): Client fax file-print parses and stores label

* feat(fax): Fax machines print, copy, and send paper labels

* style(Fax): Comments and formatting

* feat(fax): Make fax admin logging more consistent and clear

* refactor(fax): Replace ternary with a simpler null coalescing

* refactor(fax): Make FaxSystem Send method signature consistent with Copy, PrintFile

* refactor(fax): Read entire file and process later instead of peeking first

* refactor(fax): Remove local variables only used for style

* style(fax): Fix some nearby style errors

* fix(fax): Undo an inaccurate change to admin log formatting

* refactor(fax): Separate `firstLine` variable

* fix(fax): Use Environment.NewLine

* bienvenidos

---------

Co-authored-by: metalgearsloth <[email protected]>
  • Loading branch information
exincore and metalgearsloth authored Apr 28, 2024
1 parent 5c817dd commit faa7f34
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 17 deletions.
23 changes: 21 additions & 2 deletions Content.Client/Fax/UI/FaxBoundUi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private async void OnFileButtonPressed()
{
if (_dialogIsOpen)
return;

_dialogIsOpen = true;
var filters = new FileDialogFilters(new FileDialogFilters.Group("txt"));
await using var file = await _fileDialogManager.OpenFile(filters);
Expand All @@ -52,8 +52,27 @@ private async void OnFileButtonPressed()
}

using var reader = new StreamReader(file);

var firstLine = await reader.ReadLineAsync();
string? label = null;
var content = await reader.ReadToEndAsync();
SendMessage(new FaxFileMessage(content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], _window.OfficePaper));

if (firstLine is { })
{
if (firstLine.StartsWith('#'))
{
label = firstLine[1..].Trim();
}
else
{
content = firstLine + "\n" + content;
}
}

SendMessage(new FaxFileMessage(
label?[..Math.Min(label.Length, FaxFileMessageValidation.MaxLabelSize)],
content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)],
_window.OfficePaper));
}

private void OnSendButtonPressed()
Expand Down
2 changes: 1 addition & 1 deletion Content.Server/Fax/AdminUI/AdminFaxEui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public override void HandleMessage(EuiMessageBase msg)
}
case AdminFaxEuiMsg.Send sendData:
{
var printout = new FaxPrintout(sendData.Content, sendData.Title, null, sendData.StampState,
var printout = new FaxPrintout(sendData.Content, sendData.Title, null, null, sendData.StampState,
new() { new StampDisplayInfo { StampedName = sendData.From, StampedColor = sendData.StampColor } });
_faxSystem.Receive(_entityManager.GetEntity(sendData.Target), printout);
break;
Expand Down
1 change: 1 addition & 0 deletions Content.Server/Fax/FaxConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public static class FaxConstants

public const string FaxNameData = "fax_data_name";
public const string FaxPaperNameData = "fax_data_title";
public const string FaxPaperLabelData = "fax_data_label";
public const string FaxPaperPrototypeData = "fax_data_prototype";
public const string FaxPaperContentData = "fax_data_content";
public const string FaxPaperStampStateData = "fax_data_stamp_state";
Expand Down
51 changes: 39 additions & 12 deletions Content.Server/Fax/FaxSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Content.Server.DeviceNetwork;
using Content.Server.DeviceNetwork.Components;
using Content.Server.DeviceNetwork.Systems;
using Content.Server.Labels;
using Content.Server.Paper;
using Content.Server.Popups;
using Content.Server.Power.Components;
Expand All @@ -19,6 +20,7 @@
using Content.Shared.Fax.Systems;
using Content.Shared.Fax.Components;
using Content.Shared.Interaction;
using Content.Shared.Labels.Components;
using Content.Shared.Mobs.Components;
using Content.Shared.Paper;
using Robust.Server.GameObjects;
Expand All @@ -39,6 +41,7 @@ public sealed class FaxSystem : EntitySystem
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!;
[Dependency] private readonly PaperSystem _paperSystem = default!;
[Dependency] private readonly LabelSystem _labelSystem = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
[Dependency] private readonly ToolSystem _toolSystem = default!;
[Dependency] private readonly QuickDialogSystem _quickDialog = default!;
Expand Down Expand Up @@ -240,7 +243,7 @@ private void OnInteractUsing(EntityUid uid, FaxMachineComponent component, Inter
}
_adminLogger.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(args.User):user} renamed {ToPrettyString(uid)} from \"{component.FaxName}\" to \"{newName}\"");
$"{ToPrettyString(args.User):user} renamed {ToPrettyString(uid):tool} from \"{component.FaxName}\" to \"{newName}\"");
component.FaxName = newName;
_popupSystem.PopupEntity(Loc.GetString("fax-machine-popup-name-set"), uid);
UpdateUserInterface(uid, component);
Expand Down Expand Up @@ -292,11 +295,12 @@ private void OnPacketReceived(EntityUid uid, FaxMachineComponent component, Devi
!args.Data.TryGetValue(FaxConstants.FaxPaperContentData, out string? content))
return;

args.Data.TryGetValue(FaxConstants.FaxPaperLabelData, out string? label);
args.Data.TryGetValue(FaxConstants.FaxPaperStampStateData, out string? stampState);
args.Data.TryGetValue(FaxConstants.FaxPaperStampedByData, out List<StampDisplayInfo>? stampedBy);
args.Data.TryGetValue(FaxConstants.FaxPaperPrototypeData, out string? prototypeId);

var printout = new FaxPrintout(content, name, prototypeId, stampState, stampedBy);
var printout = new FaxPrintout(content, name, label, prototypeId, stampState, stampedBy);
Receive(uid, printout, args.SenderAddress);

break;
Expand All @@ -311,6 +315,7 @@ private void OnToggleInterface(EntityUid uid, FaxMachineComponent component, Aft

private void OnFileButtonPressed(EntityUid uid, FaxMachineComponent component, FaxFileMessage args)
{
args.Label = args.Label?[..Math.Min(args.Label.Length, FaxFileMessageValidation.MaxLabelSize)];
args.Content = args.Content[..Math.Min(args.Content.Length, FaxFileMessageValidation.MaxContentSize)];
PrintFile(uid, component, args);
}
Expand All @@ -328,7 +333,7 @@ private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, F
if (HasComp<MobStateComponent>(component.PaperSlot.Item))
_faxecute.Faxecute(uid, component); /// when button pressed it will hurt the mob.
else
Send(uid, component, args.Actor);
Send(uid, component, args);
}

private void OnRefreshButtonPressed(EntityUid uid, FaxMachineComponent component, FaxRefreshMessage args)
Expand Down Expand Up @@ -425,16 +430,20 @@ public void PrintFile(EntityUid uid, FaxMachineComponent component, FaxFileMessa
else
prototype = DefaultPaperPrototypeId;

var name = Loc.GetString("fax-machine-printed-paper-name");
var name = Loc.GetString("fax-machine-printed-paper-name");

var printout = new FaxPrintout(args.Content, name, prototype);
var printout = new FaxPrintout(args.Content, name, args.Label, prototype);
component.PrintingQueue.Enqueue(printout);
component.SendTimeoutRemaining += component.SendTimeout;

UpdateUserInterface(uid, component);

// Unfortunately, since a paper entity does not yet exist, we have to emulate what LabelSystem will do.
var nameWithLabel = (args.Label is { } label) ? $"{name} ({label})" : name;
_adminLogger.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(args.Actor):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}");
$"{ToPrettyString(args.Actor):actor} " +
$"added print job to \"{component.FaxName}\" {ToPrettyString(uid):tool} " +
$"of {nameWithLabel}: {args.Content}");
}

/// <summary>
Expand All @@ -454,9 +463,12 @@ public void Copy(EntityUid uid, FaxMachineComponent? component, FaxCopyMessage a
!TryComp<PaperComponent>(sendEntity, out var paper))
return;

TryComp<LabelComponent>(sendEntity, out var labelComponent);

// TODO: See comment in 'Send()' about not being able to copy whole entities
var printout = new FaxPrintout(paper.Content,
metadata.EntityName,
labelComponent?.OriginalName ?? metadata.EntityName,
labelComponent?.CurrentLabel,
metadata.EntityPrototype?.ID ?? DefaultPaperPrototypeId,
paper.StampState,
paper.StampedBy);
Expand All @@ -470,14 +482,16 @@ public void Copy(EntityUid uid, FaxMachineComponent? component, FaxCopyMessage a
UpdateUserInterface(uid, component);

_adminLogger.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(args.Actor):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}");
$"{ToPrettyString(args.Actor):actor} " +
$"added copy job to \"{component.FaxName}\" {ToPrettyString(uid):tool} " +
$"of {ToPrettyString(sendEntity):subject}: {printout.Content}");
}

/// <summary>
/// Sends message to addressee if paper is set and a known fax is selected
/// A timeout is set after sending, which is shared by the copy button.
/// </summary>
public void Send(EntityUid uid, FaxMachineComponent? component = null, EntityUid? sender = null)
public void Send(EntityUid uid, FaxMachineComponent? component, FaxSendMessage args)
{
if (!Resolve(uid, ref component))
return;
Expand All @@ -496,10 +510,13 @@ public void Send(EntityUid uid, FaxMachineComponent? component = null, EntityUid
!TryComp<PaperComponent>(sendEntity, out var paper))
return;

TryComp<LabelComponent>(sendEntity, out var labelComponent);

var payload = new NetworkPayload()
{
{ DeviceNetworkConstants.Command, FaxConstants.FaxPrintCommand },
{ FaxConstants.FaxPaperNameData, metadata.EntityName },
{ FaxConstants.FaxPaperNameData, labelComponent?.OriginalName ?? metadata.EntityName },
{ FaxConstants.FaxPaperLabelData, labelComponent?.CurrentLabel },
{ FaxConstants.FaxPaperContentData, paper.Content },
};

Expand All @@ -520,7 +537,11 @@ public void Send(EntityUid uid, FaxMachineComponent? component = null, EntityUid

_deviceNetworkSystem.QueuePacket(uid, component.DestinationFaxAddress, payload);

_adminLogger.Add(LogType.Action, LogImpact.Low, $"{(sender != null ? ToPrettyString(sender.Value) : "Unknown"):user} sent fax from \"{component.FaxName}\" {ToPrettyString(uid)} to {faxName} ({component.DestinationFaxAddress}): {paper.Content}");
_adminLogger.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(args.Actor):actor} " +
$"sent fax from \"{component.FaxName}\" {ToPrettyString(uid):tool} " +
$"to \"{faxName}\" ({component.DestinationFaxAddress}) " +
$"of {ToPrettyString(sendEntity):subject}: {paper.Content}");

component.SendTimeoutRemaining += component.SendTimeout;

Expand Down Expand Up @@ -576,7 +597,13 @@ private void SpawnPaperFromQueue(EntityUid uid, FaxMachineComponent? component =
}

_metaData.SetEntityName(printed, printout.Name);
_adminLogger.Add(LogType.Action, LogImpact.Low, $"\"{component.FaxName}\" {ToPrettyString(uid)} printed {ToPrettyString(printed)}: {printout.Content}");

if (printout.Label is { } label)
{
_labelSystem.Label(printed, label);
}

_adminLogger.Add(LogType.Action, LogImpact.Low, $"\"{component.FaxName}\" {ToPrettyString(uid):tool} printed {ToPrettyString(printed):subject}: {printout.Content}");
}

private void NotifyAdmins(string faxName)
Expand Down
1 change: 1 addition & 0 deletions Content.Server/Nuke/NukeCodePaperSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public bool SendNukeCodes(EntityUid station)
paperContent,
Loc.GetString("nuke-codes-fax-paper-name"),
null,
null,
"paper_stamp-centcom",
new List<StampDisplayInfo>
{
Expand Down
6 changes: 5 additions & 1 deletion Content.Shared/Fax/Components/FaxMachineComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ public sealed partial class FaxPrintout
[DataField(required: true)]
public string Name { get; private set; } = default!;

[DataField]
public string? Label { get; private set; }

[DataField(required: true)]
public string Content { get; private set; } = default!;

Expand All @@ -151,10 +154,11 @@ private FaxPrintout()
{
}

public FaxPrintout(string content, string name, string? prototypeId = null, string? stampState = null, List<StampDisplayInfo>? stampedBy = null)
public FaxPrintout(string content, string name, string? label = null, string? prototypeId = null, string? stampState = null, List<StampDisplayInfo>? stampedBy = null)
{
Content = content;
Name = name;
Label = label;
PrototypeId = prototypeId ?? "";
StampState = stampState;
StampedBy = stampedBy ?? new List<StampDisplayInfo>();
Expand Down
5 changes: 4 additions & 1 deletion Content.Shared/Fax/SharedFax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,21 @@ public FaxUiState(string deviceName,
[Serializable, NetSerializable]
public sealed class FaxFileMessage : BoundUserInterfaceMessage
{
public string? Label;
public string Content;
public bool OfficePaper;

public FaxFileMessage(string content, bool officePaper)
public FaxFileMessage(string? label, string content, bool officePaper)
{
Label = label;
Content = content;
OfficePaper = officePaper;
}
}

public static class FaxFileMessageValidation
{
public const int MaxLabelSize = 50; // parity with Content.Server.Labels.Components.HandLabelerComponent.MaxLabelChars
public const int MaxContentSize = 10000;
}

Expand Down

0 comments on commit faa7f34

Please sign in to comment.