Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add button to print logprobe logs #32255

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions Content.Client/CartridgeLoader/Cartridges/LogProbeUi.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Content.Client.UserInterface.Fragments;
using Content.Shared.CartridgeLoader;
using Content.Shared.CartridgeLoader.Cartridges;
using Robust.Client.UserInterface;

Expand All @@ -13,16 +14,23 @@ public override Control GetUIFragmentRoot()
return _fragment!;
}

public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner)
public override void Setup(BoundUserInterface ui, EntityUid? fragmentOwner)
{
_fragment = new LogProbeUiFragment();

_fragment.OnPrintPressed += () =>
{
var ev = new LogProbePrintMessage();
var message = new CartridgeUiMessage(ev);
ui.SendMessage(message);
};
}

public override void UpdateState(BoundUserInterfaceState state)
{
if (state is not LogProbeUiState logProbeUiState)
if (state is not LogProbeUiState cast)
return;

_fragment?.UpdateState(logProbeUiState.PulledLogs);
_fragment?.UpdateState(cast.EntityName, cast.PulledLogs);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,9 @@
<ScrollContainer VerticalExpand="True" HScrollEnabled="True">
<BoxContainer Orientation="Vertical" Name="ProbedDeviceContainer"/>
</ScrollContainer>
<BoxContainer Orientation="Horizontal" Margin="4 8">
<Button Name="PrintButton" HorizontalAlignment="Left" Text="{Loc 'log-probe-print-button'}" Disabled="True"/>
<BoxContainer HorizontalExpand="True"/>
<Label Name="EntityName" Align="Right"/>
</BoxContainer>
</cartridges:LogProbeUiFragment>
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,24 @@ namespace Content.Client.CartridgeLoader.Cartridges;
[GenerateTypedNameReferences]
public sealed partial class LogProbeUiFragment : BoxContainer
{
/// <summary>
/// Action invoked when the print button gets pressed.
/// </summary>
public Action? OnPrintPressed;

public LogProbeUiFragment()
{
RobustXamlLoader.Load(this);

PrintButton.OnPressed += _ => OnPrintPressed?.Invoke();
}

public void UpdateState(List<PulledAccessLog> logs)
public void UpdateState(string name, List<PulledAccessLog> logs)
{
ProbedDeviceContainer.RemoveAllChildren();
EntityName.Text = name;
PrintButton.Disabled = string.IsNullOrEmpty(name);

//Reverse the list so the oldest entries appear at the bottom
logs.Reverse();
ProbedDeviceContainer.RemoveAllChildren();

var count = 1;
foreach (var log in logs)
Expand Down
1 change: 1 addition & 0 deletions Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ private void OnLoaderUiMessage(EntityUid loaderUid, CartridgeLoaderComponent com
private void OnUiMessage(EntityUid uid, CartridgeLoaderComponent component, CartridgeUiMessage args)
{
var cartridgeEvent = args.MessageEvent;
cartridgeEvent.User = args.Actor;
cartridgeEvent.LoaderUid = GetNetEntity(uid);

RelayEvent(component, cartridgeEvent, true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.Paper;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;

namespace Content.Server.CartridgeLoader.Cartridges;

[RegisterComponent]
[Access(typeof(LogProbeCartridgeSystem))]
[RegisterComponent, Access(typeof(LogProbeCartridgeSystem))]
[AutoGenerateComponentPause]
public sealed partial class LogProbeCartridgeComponent : Component
{
/// <summary>
/// The name of the scanned entity, sent to clients when they open the UI.
/// </summary>
[DataField]
public string EntityName = string.Empty;

/// <summary>
/// The list of pulled access logs
/// </summary>
Expand All @@ -18,4 +27,25 @@ public sealed partial class LogProbeCartridgeComponent : Component
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public SoundSpecifier SoundScan = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg");

/// <summary>
/// Paper to spawn when printing logs.
/// </summary>
[DataField]
public EntProtoId<PaperComponent> PaperPrototype = "PaperAccessLogs";

[DataField]
public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/diagnoser_printing.ogg");

/// <summary>
/// How long you have to wait before printing logs again.
/// </summary>
[DataField]
public TimeSpan PrintCooldown = TimeSpan.FromSeconds(5);

/// <summary>
/// When anyone is allowed to spawn another printout.
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
public TimeSpan NextPrintAllowed = TimeSpan.Zero;
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
using Content.Shared.Access.Components;
using Content.Shared.Administration.Logs;
using Content.Shared.Audio;
using Content.Shared.CartridgeLoader;
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.Database;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Labels.EntitySystems;
using Content.Shared.Paper;
using Content.Shared.Popups;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using System.Text;

namespace Content.Server.CartridgeLoader.Cartridges;

public sealed class LogProbeCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem _cartridge = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly CartridgeLoaderSystem? _cartridgeLoaderSystem = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedLabelSystem _label = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly PaperSystem _paper = default!;

public override void Initialize()
{
base.Initialize();

SubscribeLocalEvent<LogProbeCartridgeComponent, CartridgeUiReadyEvent>(OnUiReady);
SubscribeLocalEvent<LogProbeCartridgeComponent, CartridgeAfterInteractEvent>(AfterInteract);
SubscribeLocalEvent<LogProbeCartridgeComponent, CartridgeMessageEvent>(OnMessage);
}

/// <summary>
Expand All @@ -37,9 +52,10 @@ private void AfterInteract(Entity<LogProbeCartridgeComponent> ent, ref Cartridge
return;

//Play scanning sound with slightly randomized pitch
_audioSystem.PlayEntity(ent.Comp.SoundScan, args.InteractEvent.User, target, AudioHelpers.WithVariation(0.25f, _random));
_popupSystem.PopupCursor(Loc.GetString("log-probe-scan", ("device", target)), args.InteractEvent.User);
_audio.PlayEntity(ent.Comp.SoundScan, args.InteractEvent.User, target, AudioHelpers.WithVariation(0.25f, _random));
_popup.PopupCursor(Loc.GetString("log-probe-scan", ("device", target)), args.InteractEvent.User);

ent.Comp.EntityName = Name(target);
ent.Comp.PulledAccessLogs.Clear();

foreach (var accessRecord in accessReaderComponent.AccessLog)
Expand All @@ -52,6 +68,9 @@ private void AfterInteract(Entity<LogProbeCartridgeComponent> ent, ref Cartridge
ent.Comp.PulledAccessLogs.Add(log);
}

// Reverse the list so the oldest is at the bottom
ent.Comp.PulledAccessLogs.Reverse();

UpdateUiState(ent, args.Loader);
}

Expand All @@ -63,9 +82,49 @@ private void OnUiReady(Entity<LogProbeCartridgeComponent> ent, ref CartridgeUiRe
UpdateUiState(ent, args.Loader);
}

private void OnMessage(Entity<LogProbeCartridgeComponent> ent, ref CartridgeMessageEvent args)
{
if (args is LogProbePrintMessage cast)
PrintLogs(ent, cast.User);
}

private void PrintLogs(Entity<LogProbeCartridgeComponent> ent, EntityUid user)
{
if (string.IsNullOrEmpty(ent.Comp.EntityName))
return;

if (_timing.CurTime < ent.Comp.NextPrintAllowed)
return;

ent.Comp.NextPrintAllowed = _timing.CurTime + ent.Comp.PrintCooldown;

var paper = Spawn(ent.Comp.PaperPrototype, _transform.GetMapCoordinates(user));
_label.Label(paper, ent.Comp.EntityName); // label it for easy identification

_audio.PlayEntity(ent.Comp.PrintSound, user, paper);
_hands.PickupOrDrop(user, paper, checkActionBlocker: false);

// generate the actual printout text
var builder = new StringBuilder();
builder.AppendLine(Loc.GetString("log-probe-printout-device", ("name", ent.Comp.EntityName)));
builder.AppendLine(Loc.GetString("log-probe-printout-header"));
var number = 1;
foreach (var log in ent.Comp.PulledAccessLogs)
{
var time = TimeSpan.FromSeconds(Math.Truncate(log.Time.TotalSeconds)).ToString();
builder.AppendLine(Loc.GetString("log-probe-printout-entry", ("number", number), ("time", time), ("accessor", log.Accessor)));
number++;
}

var paperComp = Comp<PaperComponent>(paper);
_paper.SetContent((paper, paperComp), builder.ToString());

_adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(user):user} printed out LogProbe logs ({paper}) of {ent.Comp.EntityName}");
}

private void UpdateUiState(Entity<LogProbeCartridgeComponent> ent, EntityUid loaderUid)
{
var state = new LogProbeUiState(ent.Comp.PulledAccessLogs);
_cartridgeLoaderSystem?.UpdateCartridgeUiState(loaderUid, state);
var state = new LogProbeUiState(ent.Comp.EntityName, ent.Comp.PulledAccessLogs);
_cartridge.UpdateCartridgeUiState(loaderUid, state);
}
}
2 changes: 2 additions & 0 deletions Content.Shared/CartridgeLoader/CartridgeUiMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ public CartridgeUiMessage(CartridgeMessageEvent messageEvent)
[Serializable, NetSerializable]
public abstract class CartridgeMessageEvent : EntityEventArgs
{
[NonSerialized]
public EntityUid User;
public NetEntity LoaderUid;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
using Robust.Shared.Serialization;

namespace Content.Shared.CartridgeLoader.Cartridges;

[Serializable, NetSerializable]
public sealed class LogProbePrintMessage : CartridgeMessageEvent;
8 changes: 7 additions & 1 deletion Content.Shared/CartridgeLoader/Cartridges/LogProbeUiState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,19 @@ namespace Content.Shared.CartridgeLoader.Cartridges;
[Serializable, NetSerializable]
public sealed class LogProbeUiState : BoundUserInterfaceState
{
/// <summary>
/// The name of the scanned entity.
/// </summary>
public string EntityName;

/// <summary>
/// The list of probed network devices
/// </summary>
public List<PulledAccessLog> PulledLogs;

public LogProbeUiState(List<PulledAccessLog> pulledLogs)
public LogProbeUiState(string entityName, List<PulledAccessLog> pulledLogs)
{
EntityName = entityName;
PulledLogs = pulledLogs;
}
}
Expand Down
4 changes: 4 additions & 0 deletions Resources/Locale/en-US/cartridge-loader/cartridges.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ log-probe-scan = Downloaded logs from {$device}!
log-probe-label-time = Time
log-probe-label-accessor = Accessed by
log-probe-label-number = #
log-probe-print-button = Print Logs
log-probe-printout-device = Scanned Device: {$name}
log-probe-printout-header = Latest logs:
log-probe-printout-entry = #{$number} / {$time} / {$accessor}

# Wanted list cartridge
wanted-list-program-name = Wanted list
Expand Down
10 changes: 10 additions & 0 deletions Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,13 @@
- type: GuideHelp
guides:
- Forensics

- type: entity
parent: ForensicReportPaper
id: PaperAccessLogs
name: access logs
description: A printout from the detective's trusty LogProbe.
components:
- type: PaperVisuals
headerImagePath: null
headerMargin: 0.0, 0.0, 0.0, 0.0
Loading