SharedHandLabelerSystem.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using Content.Shared.Administration.Logs;
  2. using Content.Shared.Database;
  3. using Content.Shared.Interaction;
  4. using Content.Shared.Labels.Components;
  5. using Content.Shared.Popups;
  6. using Content.Shared.Verbs;
  7. using Content.Shared.Whitelist;
  8. using Robust.Shared.GameStates;
  9. using Robust.Shared.Network;
  10. namespace Content.Shared.Labels.EntitySystems;
  11. public abstract class SharedHandLabelerSystem : EntitySystem
  12. {
  13. [Dependency] protected readonly SharedUserInterfaceSystem UserInterfaceSystem = default!;
  14. [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
  15. [Dependency] private readonly SharedLabelSystem _labelSystem = default!;
  16. [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
  17. [Dependency] private readonly INetManager _netManager = default!;
  18. [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. SubscribeLocalEvent<HandLabelerComponent, AfterInteractEvent>(AfterInteractOn);
  23. SubscribeLocalEvent<HandLabelerComponent, GetVerbsEvent<UtilityVerb>>(OnUtilityVerb);
  24. // Bound UI subscriptions
  25. SubscribeLocalEvent<HandLabelerComponent, HandLabelerLabelChangedMessage>(OnHandLabelerLabelChanged);
  26. SubscribeLocalEvent<HandLabelerComponent, ComponentGetState>(OnGetState);
  27. SubscribeLocalEvent<HandLabelerComponent, ComponentHandleState>(OnHandleState);
  28. }
  29. private void OnGetState(Entity<HandLabelerComponent> ent, ref ComponentGetState args)
  30. {
  31. args.State = new HandLabelerComponentState(ent.Comp.AssignedLabel)
  32. {
  33. MaxLabelChars = ent.Comp.MaxLabelChars,
  34. };
  35. }
  36. private void OnHandleState(Entity<HandLabelerComponent> ent, ref ComponentHandleState args)
  37. {
  38. if (args.Current is not HandLabelerComponentState state)
  39. return;
  40. ent.Comp.MaxLabelChars = state.MaxLabelChars;
  41. if (ent.Comp.AssignedLabel == state.AssignedLabel)
  42. return;
  43. ent.Comp.AssignedLabel = state.AssignedLabel;
  44. UpdateUI(ent);
  45. }
  46. protected virtual void UpdateUI(Entity<HandLabelerComponent> ent)
  47. {
  48. }
  49. private void AddLabelTo(EntityUid uid, HandLabelerComponent? handLabeler, EntityUid target, out string? result)
  50. {
  51. if (!Resolve(uid, ref handLabeler))
  52. {
  53. result = null;
  54. return;
  55. }
  56. if (handLabeler.AssignedLabel == string.Empty)
  57. {
  58. if (_netManager.IsServer)
  59. _labelSystem.Label(target, null);
  60. result = Loc.GetString("hand-labeler-successfully-removed");
  61. return;
  62. }
  63. if (_netManager.IsServer)
  64. _labelSystem.Label(target, handLabeler.AssignedLabel);
  65. result = Loc.GetString("hand-labeler-successfully-applied");
  66. }
  67. private void OnUtilityVerb(EntityUid uid, HandLabelerComponent handLabeler, GetVerbsEvent<UtilityVerb> args)
  68. {
  69. if (args.Target is not { Valid: true } target || _whitelistSystem.IsWhitelistFail(handLabeler.Whitelist, target) || !args.CanAccess)
  70. return;
  71. var labelerText = handLabeler.AssignedLabel == string.Empty ? Loc.GetString("hand-labeler-remove-label-text") : Loc.GetString("hand-labeler-add-label-text");
  72. var verb = new UtilityVerb()
  73. {
  74. Act = () =>
  75. {
  76. Labeling(uid, target, args.User, handLabeler);
  77. },
  78. Text = labelerText
  79. };
  80. args.Verbs.Add(verb);
  81. }
  82. private void AfterInteractOn(EntityUid uid, HandLabelerComponent handLabeler, AfterInteractEvent args)
  83. {
  84. if (args.Target is not { Valid: true } target || _whitelistSystem.IsWhitelistFail(handLabeler.Whitelist, target) || !args.CanReach)
  85. return;
  86. Labeling(uid, target, args.User, handLabeler);
  87. }
  88. private void Labeling(EntityUid uid, EntityUid target, EntityUid User, HandLabelerComponent handLabeler)
  89. {
  90. AddLabelTo(uid, handLabeler, target, out var result);
  91. if (result == null)
  92. return;
  93. _popupSystem.PopupClient(result, User, User);
  94. // Log labeling
  95. _adminLogger.Add(LogType.Action, LogImpact.Low,
  96. $"{ToPrettyString(User):user} labeled {ToPrettyString(target):target} with {ToPrettyString(uid):labeler}");
  97. }
  98. private void OnHandLabelerLabelChanged(EntityUid uid, HandLabelerComponent handLabeler, HandLabelerLabelChangedMessage args)
  99. {
  100. var label = args.Label.Trim();
  101. handLabeler.AssignedLabel = label[..Math.Min(handLabeler.MaxLabelChars, label.Length)];
  102. UpdateUI((uid, handLabeler));
  103. Dirty(uid, handLabeler);
  104. // Log label change
  105. _adminLogger.Add(LogType.Action, LogImpact.Low,
  106. $"{ToPrettyString(args.Actor):user} set {ToPrettyString(uid):labeler} to apply label \"{handLabeler.AssignedLabel}\"");
  107. }
  108. }