using System.Linq; using Robust.Shared.Console; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Content.Shared.Administration; using Content.Server.Administration; using Content.Server._DV.Mail.EntitySystems; using Content.Shared._DV.Mail; using Robust.Shared.Timing; namespace Content.Server._DV.Mail; [AdminCommand(AdminFlags.Fun)] public sealed class MailToCommand : LocalizedEntityCommands { public override string Command => "mailto"; public override string Description => Loc.GetString("cmd-mailto-description", ("requiredComponent", nameof(MailReceiverComponent))); public override string Help => Loc.GetString("cmd-mailto-help", ("command", Command)); [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly MailSystem _mail = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedMailSystem _sharedMail = default!; private static readonly EntProtoId BlankMailPrototype = "MailAdminFun"; private static readonly EntProtoId BlankLargeMailPrototype = "MailLargeAdminFun"; private const string Container = "storagebase"; private const string MailContainer = "contents"; public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) { return args.Length switch { 1 => CompletionResult.FromHintOptions( CompletionHelper.Components(args[0], EntityManager), Loc.GetString("cmd-mailto-hint-recipient")), 2 => CompletionResult.FromHintOptions(CompletionHelper.NetEntities(args[1], EntityManager), Loc.GetString("cmd-mailto-hint-container")), 3 => CompletionResult.FromHintOptions(CompletionHelper.Booleans, Loc.GetString("cmd-mailto-hint-fragile")), 4 => CompletionResult.FromHintOptions(CompletionHelper.Booleans, Loc.GetString("cmd-mailto-hint-priority")), 5 => CompletionResult.FromHintOptions(CompletionHelper.Booleans, Loc.GetString("cmd-mailto-hint-large")), _ => CompletionResult.Empty }; } public override async void Execute(IConsoleShell shell, string argStr, string[] args) { if (args.Length < 4) { shell.WriteError(Loc.GetString("shell-wrong-arguments-number")); return; } if (!EntityUid.TryParse(args[0], out var recipientUid) || !EntityUid.TryParse(args[1], out var containerUid)) { shell.WriteError(Loc.GetString("shell-entity-uid-must-be-number")); return; } if (!bool.TryParse(args[2], out var isFragile) || !bool.TryParse(args[3], out var isPriority)) { shell.WriteError(Loc.GetString("shell-invalid-bool")); return; } var isLarge = false; if (args.Length > 4 && !bool.TryParse(args[4], out isLarge)) { shell.WriteError(Loc.GetString("shell-invalid-bool")); return; } var mailPrototype = isLarge ? BlankLargeMailPrototype : BlankMailPrototype; if (!EntityManager.HasComponent(recipientUid)) { shell.WriteLine(Loc.GetString("cmd-mailto-no-mailreceiver", ("requiredComponent", nameof(MailReceiverComponent)))); return; } if (!_prototype.HasIndex(mailPrototype)) { shell.WriteLine(Loc.GetString("cmd-mailto-no-blankmail", ("blankMail", mailPrototype))); return; } if (!_container.TryGetContainer(containerUid, Container, out var targetContainer)) { shell.WriteLine(Loc.GetString("cmd-mailto-invalid-container", ("requiredContainer", Container))); return; } if (!_sharedMail.TryGetMailRecipientForReceiver(recipientUid, out var recipient)) { shell.WriteLine(Loc.GetString("cmd-mailto-unable-to-receive")); return; } if (!_sharedMail.TryGetMailTeleporterForReceiver(recipientUid, out var teleporterComponent, out var teleporterUid)) { shell.WriteLine(Loc.GetString("cmd-mailto-no-teleporter-found")); return; } var mailUid = EntityManager.SpawnEntity(mailPrototype, EntityManager.GetComponent(containerUid).Coordinates); var mailContents = _container.EnsureContainer(mailUid, MailContainer); if (!EntityManager.TryGetComponent(mailUid, out var mailComponent)) { shell.WriteLine(Loc.GetString("cmd-mailto-bogus-mail", ("blankMail", mailPrototype), ("requiredMailComponent", nameof(MailComponent)))); return; } foreach (var entity in targetContainer.ContainedEntities.ToArray()) { _container.Insert(entity, mailContents); } _sharedMail.SetFragile((mailUid, mailComponent), isFragile); _sharedMail.SetPriority((mailUid, mailComponent), isPriority); _sharedMail.SetLarge((mailUid, mailComponent), isLarge); _mail.SetupMail(mailUid, teleporterComponent, recipient.Value); var teleporterQueue = _container.EnsureContainer((EntityUid)teleporterUid, "queued"); _container.Insert(mailUid, teleporterQueue); shell.WriteLine(Loc.GetString("cmd-mailto-success", ("timeToTeleport", teleporterComponent.NextDelivery - _timing.CurTime))); } } [AdminCommand(AdminFlags.Fun)] public sealed class MailNowCommand : LocalizedEntityCommands { public override string Command => "mailnow"; public override string Description => Loc.GetString("cmd-mailnow"); public override string Help => Loc.GetString("cmd-mailnow-help", ("command", Command)); [Dependency] private readonly MailSystem _mail = default!; public override async void Execute(IConsoleShell shell, string argStr, string[] args) { var query = EntityManager.EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var mailTeleporter)) { _mail.DeliverNow((uid, mailTeleporter)); } shell.WriteLine(Loc.GetString("cmd-mailnow-success")); } }