using System.Collections.Generic; using System.Linq; using Content.Server.Access.Systems; using Content.Server.Power.Components; using Content.Server.UserInterface; using Content.Shared.Access; using Content.Shared.Access.Components; using Content.Shared.Containers.ItemSlots; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Prototypes; using Robust.Shared.ViewVariables; namespace Content.Server.Access.Components { [RegisterComponent] [ComponentReference(typeof(SharedIdCardConsoleComponent))] public sealed class IdCardConsoleComponent : SharedIdCardConsoleComponent { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entities = default!; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(IdCardConsoleUiKey.Key); [ViewVariables] private bool Powered => !_entities.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver) || receiver.Powered; protected override void Initialize() { base.Initialize(); Owner.EnsureComponentWarn(); Owner.EnsureComponentWarn(); if (UserInterface != null) { UserInterface.OnReceiveMessage += OnUiReceiveMessage; } } private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) { if (obj.Session.AttachedEntity is not {Valid: true} player) { return; } switch (obj.Message) { case IdButtonPressedMessage msg: switch (msg.Button) { case UiButton.PrivilegedId: HandleIdButton(player, PrivilegedIdSlot); break; case UiButton.TargetId: HandleIdButton(player, TargetIdSlot); break; } break; case WriteToTargetIdMessage msg: TryWriteToTargetId(msg.FullName, msg.JobTitle, msg.AccessList); UpdateUserInterface(); break; } } /// /// Returns true if there is an ID in and said ID satisfies the requirements of . /// private bool PrivilegedIdIsAuthorized() { if (!_entities.TryGetComponent(Owner, out AccessReader? reader)) { return true; } var privilegedIdEntity = PrivilegedIdSlot.Item; var accessSystem = EntitySystem.Get(); return privilegedIdEntity != null && accessSystem.IsAllowed(reader, privilegedIdEntity.Value); } /// /// Called when the "Submit" button in the UI gets pressed. /// Writes data passed from the UI into the ID stored in , if present. /// private void TryWriteToTargetId(string newFullName, string newJobTitle, List newAccessList) { if (TargetIdSlot.Item is not {Valid: true} targetIdEntity || !PrivilegedIdIsAuthorized()) return; var cardSystem = EntitySystem.Get(); cardSystem.TryChangeFullName(targetIdEntity, newFullName); cardSystem.TryChangeJobTitle(targetIdEntity, newJobTitle); if (!newAccessList.TrueForAll(x => _prototypeManager.HasIndex(x))) { Logger.Warning("Tried to write unknown access tag."); return; } var accessSystem = EntitySystem.Get(); accessSystem.TrySetTags(targetIdEntity, newAccessList); } /// /// Called when one of the insert/remove ID buttons gets pressed. /// private void HandleIdButton(EntityUid user, ItemSlot slot) { if (slot.HasItem) EntitySystem.Get().TryEjectToHands(Owner, slot, user); else EntitySystem.Get().TryInsertFromHand(Owner, slot, user); } public void UpdateUserInterface() { if (!Initialized) return; IdCardConsoleBoundUserInterfaceState newState; // this could be prettier if (TargetIdSlot.Item is not {Valid: true} targetIdEntity) { var privilegedIdName = string.Empty; if (PrivilegedIdSlot.Item is {Valid: true} item) { privilegedIdName = _entities.GetComponent(item).EntityName; } newState = new IdCardConsoleBoundUserInterfaceState( PrivilegedIdSlot.HasItem, PrivilegedIdIsAuthorized(), false, null, null, null, privilegedIdName, string.Empty); } else { var targetIdComponent = _entities.GetComponent(targetIdEntity); var targetAccessComponent = _entities.GetComponent(targetIdEntity); var name = string.Empty; if (PrivilegedIdSlot.Item is {Valid: true} item) name = _entities.GetComponent(item).EntityName; newState = new IdCardConsoleBoundUserInterfaceState( PrivilegedIdSlot.HasItem, PrivilegedIdIsAuthorized(), true, targetIdComponent.FullName, targetIdComponent.JobTitle, targetAccessComponent.Tags.ToArray(), name, _entities.GetComponent(targetIdEntity).EntityName); } UserInterface?.SetState(newState); } } }