using Content.Server.CrewManifest;
using Content.Server.Station.Systems;
using Content.Shared.CartridgeLoader;
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
namespace Content.Server.CartridgeLoader.Cartridges;
public sealed class CrewManifestCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private readonly CrewManifestSystem _crewManifest = default!;
[Dependency] private readonly StationSystem _stationSystem = default!;
private static readonly EntProtoId CartridgePrototypeName = "CrewManifestCartridge";
///
/// Flag that shows that if crew manifest is allowed to be viewed from 'unsecure' entities,
/// which is the keys for the cartridge.
///
private bool _unsecureViewersAllowed = true;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnUiMessage);
SubscribeLocalEvent(OnUiReady);
SubscribeLocalEvent(OnInstallationAttempt);
Subs.CVar(_configManager, CCVars.CrewManifestUnsecure, OnCrewManifestUnsecureChanged, true);
}
///
/// The ui messages received here get wrapped by a CartridgeMessageEvent and are relayed from the
///
///
/// The cartridge specific ui message event needs to inherit from the CartridgeMessageEvent
///
private void OnUiMessage(EntityUid uid, CrewManifestCartridgeComponent component, CartridgeMessageEvent args)
{
UpdateUiState(uid, GetEntity(args.LoaderUid), component);
}
///
/// This gets called when the ui fragment needs to be updated for the first time after activating
///
private void OnUiReady(EntityUid uid, CrewManifestCartridgeComponent component, CartridgeUiReadyEvent args)
{
UpdateUiState(uid, args.Loader, component);
}
private void UpdateUiState(EntityUid uid, EntityUid loaderUid, CrewManifestCartridgeComponent? component)
{
if (!Resolve(uid, ref component))
return;
var owningStation = _stationSystem.GetOwningStation(uid);
if (owningStation is null)
return;
var (stationName, entries) = _crewManifest.GetCrewManifest(owningStation.Value);
var state = new CrewManifestUiState(stationName, entries);
_cartridgeLoader.UpdateCartridgeUiState(loaderUid, state);
}
private void OnInstallationAttempt(ref ProgramInstallationAttempt args)
{
if (args.Prototype == CartridgePrototypeName && !_unsecureViewersAllowed)
args.Cancelled = true;
}
private void OnCrewManifestUnsecureChanged(bool unsecureViewersAllowed)
{
_unsecureViewersAllowed = unsecureViewersAllowed;
var allCartridgeLoaders = AllEntityQuery();
while (allCartridgeLoaders.MoveNext(out var loaderUid, out var comp, out var cont))
{
if (_unsecureViewersAllowed)
{
_cartridgeLoader.InstallProgram(loaderUid, CartridgePrototypeName, false, comp);
return;
}
if (_cartridgeLoader.TryGetProgram(loaderUid, out var program, true, comp, cont))
_cartridgeLoader.UninstallProgram(loaderUid, program.Value, comp);
}
}
}