158 lines
6.4 KiB
C#
158 lines
6.4 KiB
C#
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<MailReceiverComponent>(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<MailReceiverComponent>(recipientUid))
|
|
{
|
|
shell.WriteLine(Loc.GetString("cmd-mailto-no-mailreceiver", ("requiredComponent", nameof(MailReceiverComponent))));
|
|
return;
|
|
}
|
|
|
|
if (!_prototype.HasIndex<EntityPrototype>(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<TransformComponent>(containerUid).Coordinates);
|
|
var mailContents = _container.EnsureContainer<Container>(mailUid, MailContainer);
|
|
|
|
if (!EntityManager.TryGetComponent<MailComponent>(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<Container>((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<MailTeleporterComponent>();
|
|
while (query.MoveNext(out var uid, out var mailTeleporter))
|
|
{
|
|
_mail.DeliverNow((uid, mailTeleporter));
|
|
}
|
|
|
|
shell.WriteLine(Loc.GetString("cmd-mailnow-success"));
|
|
}
|
|
}
|