using System.Diagnostics.CodeAnalysis; using Content.Shared.Forensics.Components; using Content.Shared.Inventory; using Content.Shared.Popups; using JetBrains.Annotations; namespace Content.Shared.FingerprintReader; // TODO: This has a lot of overlap with the AccessReaderSystem, maybe merge them in the future? public sealed class FingerprintReaderSystem : EntitySystem { [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; /// /// Checks if the given user has fingerprint access to the target entity. /// /// The target entity. /// User trying to gain access. /// True if access was granted, otherwise false. [PublicAPI] public bool IsAllowed(Entity target, EntityUid user) { if (!Resolve(target, ref target.Comp, false)) return true; if (target.Comp.AllowedFingerprints.Count == 0) return true; // Check for gloves first if (!target.Comp.IgnoreGloves && TryGetBlockingGloves(user, out var gloves)) { if (target.Comp.FailGlovesPopup != null) _popup.PopupPredicted(Loc.GetString(target.Comp.FailGlovesPopup, ("blocker", gloves)), target, user); return false; } // Check fingerprint match if (!TryComp(user, out var fingerprint) || fingerprint.Fingerprint == null || !target.Comp.AllowedFingerprints.Contains(fingerprint.Fingerprint)) { if (target.Comp.FailPopup != null) _popup.PopupPredicted(Loc.GetString(target.Comp.FailPopup), target, user); return false; } return true; } /// /// Gets the blocking gloves of a user. Gloves count as blocking if they hide fingerprints. /// /// Entity wearing the gloves. /// The returned gloves, if they exist. /// True if blocking gloves were found, otherwise False. [PublicAPI] public bool TryGetBlockingGloves(EntityUid user, [NotNullWhen(true)] out EntityUid? blocker) { blocker = null; if (_inventory.TryGetSlotEntity(user, "gloves", out var gloves) && HasComp(gloves)) { blocker = gloves; return true; } return false; } /// /// Sets the allowed fingerprints for a fingerprint reader /// [PublicAPI] public void SetAllowedFingerprints(Entity target, HashSet fingerprints) { target.Comp.AllowedFingerprints = fingerprints; Dirty(target); } /// /// Adds an allowed fingerprint to a fingerprint reader /// [PublicAPI] public void AddAllowedFingerprint(Entity target, string fingerprint) { target.Comp.AllowedFingerprints.Add(fingerprint); Dirty(target); } /// /// Removes an allowed fingerprint from a fingerprint reader /// [PublicAPI] public void RemoveAllowedFingerprint(Entity target, string fingerprint) { target.Comp.AllowedFingerprints.Remove(fingerprint); Dirty(target); } }