using System; 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.Containers.ItemSlots; using Content.Shared.Interaction; 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!; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(IdCardConsoleUiKey.Key); [ViewVariables] private bool Powered => !IoCManager.Resolve().TryGetComponent(Owner.Uid, 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 == null) { return; } switch (obj.Message) { case IdButtonPressedMessage msg: switch (msg.Button) { case UiButton.PrivilegedId: HandleIdButton(obj.Session.AttachedEntity, PrivilegedIdSlot); break; case UiButton.TargetId: HandleIdButton(obj.Session.AttachedEntity, 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 (!IoCManager.Resolve().TryGetComponent(Owner.Uid, out AccessReader? reader)) { return true; } var privilegedIdEntity = PrivilegedIdSlot.Item; var accessSystem = EntitySystem.Get(); return privilegedIdEntity != null && accessSystem.IsAllowed(reader, privilegedIdEntity.Uid); } /// /// 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) { var targetIdEntity = TargetIdSlot.Item; if (targetIdEntity == null || !PrivilegedIdIsAuthorized()) return; var cardSystem = EntitySystem.Get(); cardSystem.TryChangeFullName(targetIdEntity.Uid, newFullName); cardSystem.TryChangeJobTitle(targetIdEntity.Uid, newJobTitle); if (!newAccessList.TrueForAll(x => _prototypeManager.HasIndex(x))) { Logger.Warning("Tried to write unknown access tag."); return; } var accessSystem = EntitySystem.Get(); accessSystem.TrySetTags(targetIdEntity.Uid, newAccessList); } /// /// Called when one of the insert/remove ID buttons gets pressed. /// private void HandleIdButton(IEntity user, ItemSlot slot) { if (slot.HasItem) EntitySystem.Get().TryEjectToHands(OwnerUid, slot, user.Uid); else EntitySystem.Get().TryInsertFromHand(OwnerUid, slot, user.Uid); } public void UpdateUserInterface() { var targetIdEntity = TargetIdSlot.Item; IdCardConsoleBoundUserInterfaceState newState; // this could be prettier if (targetIdEntity == null) { IEntity? tempQualifier = PrivilegedIdSlot.Item; newState = new IdCardConsoleBoundUserInterfaceState( PrivilegedIdSlot.HasItem, PrivilegedIdIsAuthorized(), false, null, null, null, (tempQualifier != null ? IoCManager.Resolve().GetComponent(tempQualifier.Uid).EntityName : null) ?? string.Empty, string.Empty); } else { var targetIdComponent = IoCManager.Resolve().GetComponent(targetIdEntity.Uid); var targetAccessComponent = IoCManager.Resolve().GetComponent(targetIdEntity.Uid); var name = string.Empty; if(PrivilegedIdSlot.Item != null) name = IoCManager.Resolve().GetComponent(PrivilegedIdSlot.Item.Uid).EntityName; newState = new IdCardConsoleBoundUserInterfaceState( PrivilegedIdSlot.HasItem, PrivilegedIdIsAuthorized(), true, targetIdComponent.FullName, targetIdComponent.JobTitle, targetAccessComponent.Tags.ToArray(), name, IoCManager.Resolve().GetComponent(targetIdEntity.Uid).EntityName); } UserInterface?.SetState(newState); } } }