Skip to content

Commit 10f5cbf

Browse files
authored
Host tools (#3764)
## Short description Host tools
2 parents 98ed414 + 118dd34 commit 10f5cbf

7 files changed

Lines changed: 209 additions & 0 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Content.Shared._Starlight.ServerTransfer;
2+
using Robust.Client;
3+
4+
namespace Content.Client._Starlight.ServerTransfer;
5+
6+
public sealed class ServerTransferSystem : EntitySystem
7+
{
8+
[Dependency] private readonly IGameController _gameController = default!;
9+
10+
private ISawmill _sawmill = default!;
11+
12+
public override void Initialize()
13+
{
14+
base.Initialize();
15+
_sawmill = Logger.GetSawmill("server-transfer");
16+
SubscribeNetworkEvent<ServerTransferEvent>(OnServerTransfer);
17+
}
18+
19+
private void OnServerTransfer(ServerTransferEvent ev)
20+
{
21+
if (string.IsNullOrEmpty(ev.Address))
22+
return;
23+
24+
_sawmill.Info($"Received server transfer request to {ev.Address}");
25+
26+
try
27+
{
28+
_gameController.Redial(ev.Address, "Server transfer at round end.");
29+
}
30+
catch (Exception ex)
31+
{
32+
_sawmill.Warning($"Failed to redial to {ev.Address}: {ex}");
33+
}
34+
}
35+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.IO;
2+
using Content.Server.Administration;
3+
using Content.Shared.Administration;
4+
using Content.Shared.Starlight.CCVar;
5+
using Robust.Shared.Configuration;
6+
using Robust.Shared.Console;
7+
8+
namespace Content.Server._Starlight.Commands;
9+
10+
[AdminCommand(AdminFlags.Host)]
11+
public sealed class ReloadConfigCommand : LocalizedCommands
12+
{
13+
[Dependency] private readonly IConfigurationManager _cfg = default!;
14+
public override string Command => "reloadconfig";
15+
public override string Description => "Reloading cvars from disk. Attention required Starlight watchdog or cvar setup config.file.";
16+
17+
public override void Execute(IConsoleShell shell, string argStr, string[] args)
18+
{
19+
if (args.Length > 0)
20+
{
21+
shell.WriteLine(Loc.GetString("shell-wrong-arguments-number"));
22+
return;
23+
}
24+
var path = _cfg.GetCVar(StarlightCCVars.ConfigFile);
25+
if (string.IsNullOrEmpty(path))
26+
{
27+
shell.WriteLine("Config file is not set.");
28+
return;
29+
}
30+
31+
if (!File.Exists(path))
32+
{
33+
shell.WriteLine("Config file does not exist.");
34+
return;
35+
}
36+
37+
using var file = File.OpenRead(path);
38+
_cfg.LoadFromTomlStream(file);
39+
shell.WriteLine("Config reloaded.");
40+
}
41+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Content.Server.Administration;
2+
using Content.Server._Starlight.ServerTransfer;
3+
using Content.Shared.Administration;
4+
using Robust.Shared.Console;
5+
6+
namespace Content.Server._Starlight.Commands;
7+
8+
[AdminCommand(AdminFlags.Host)]
9+
public sealed class ServerTransferClearCommand : LocalizedCommands
10+
{
11+
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
12+
13+
public override string Command => "servertransferclear";
14+
public override string Description => "Clears the server transfer target. Players will no longer be redirected at round end.";
15+
16+
public override void Execute(IConsoleShell shell, string argStr, string[] args)
17+
{
18+
var system = _entitySystemManager.GetEntitySystem<ServerTransferSystem>();
19+
var current = system.GetTargetAddress();
20+
21+
if (string.IsNullOrEmpty(current))
22+
{
23+
shell.WriteLine("No server transfer target is currently set.");
24+
return;
25+
}
26+
27+
system.ClearTargetAddress();
28+
shell.WriteLine($"Server transfer target cleared (was: {current}).");
29+
}
30+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Content.Server.Administration;
2+
using Content.Server._Starlight.ServerTransfer;
3+
using Content.Shared.Administration;
4+
using Robust.Shared.Console;
5+
6+
namespace Content.Server._Starlight.Commands;
7+
8+
[AdminCommand(AdminFlags.Host)]
9+
public sealed class ServerTransferCommand : LocalizedCommands
10+
{
11+
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
12+
13+
public override string Command => "servertransfer";
14+
public override string Description => "Sets a target server address (ss14://host:port) to redirect all players to at round end.";
15+
16+
public override void Execute(IConsoleShell shell, string argStr, string[] args)
17+
{
18+
if (args.Length != 1)
19+
{
20+
shell.WriteError("Usage: servertransfer ss14://host:port");
21+
return;
22+
}
23+
24+
var address = args[0];
25+
26+
if (!address.StartsWith("ss14://", StringComparison.OrdinalIgnoreCase))
27+
{
28+
shell.WriteError("Address must start with ss14://");
29+
return;
30+
}
31+
32+
if (!Uri.TryCreate(address, UriKind.Absolute, out _))
33+
{
34+
shell.WriteError("Invalid URI format.");
35+
return;
36+
}
37+
38+
var system = _entitySystemManager.GetEntitySystem<ServerTransferSystem>();
39+
system.SetTargetAddress(address);
40+
shell.WriteLine($"Server transfer target set to: {address}");
41+
}
42+
43+
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
44+
{
45+
switch (args.Length)
46+
{
47+
case 1:
48+
return CompletionResult.FromHint("ss14://host:port");
49+
}
50+
return CompletionResult.Empty;
51+
}
52+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Content.Server.GameTicking;
2+
using Content.Shared._Starlight.ServerTransfer;
3+
using Robust.Shared.Player;
4+
5+
namespace Content.Server._Starlight.ServerTransfer;
6+
7+
public sealed class ServerTransferSystem : EntitySystem
8+
{
9+
private string? _targetAddress;
10+
private ISawmill _sawmill = default!;
11+
12+
public override void Initialize()
13+
{
14+
base.Initialize();
15+
_sawmill = Logger.GetSawmill("server-transfer");
16+
SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRunLevelChanged);
17+
}
18+
19+
public void SetTargetAddress(string address) => _targetAddress = address;
20+
21+
public void ClearTargetAddress() => _targetAddress = null;
22+
23+
public string? GetTargetAddress() => _targetAddress;
24+
25+
private void OnRunLevelChanged(GameRunLevelChangedEvent ev)
26+
{
27+
if (ev.New != GameRunLevel.PreRoundLobby || ev.Old != GameRunLevel.PostRound)
28+
return;
29+
30+
if (string.IsNullOrEmpty(_targetAddress))
31+
return;
32+
33+
_sawmill.Info($"Round ended. Redirecting all players to {_targetAddress}");
34+
35+
var msg = new ServerTransferEvent { Address = _targetAddress };
36+
37+
RaiseNetworkEvent(msg, Filter.Broadcast());
38+
}
39+
}

Content.Shared/_Starlight/CCVar/StarlightCCVar.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,7 @@ public sealed partial class StarlightCCVars
4040
/// </summary>
4141
public static readonly CVarDef<float> RoundEndNoEorgPopupTime =
4242
CVarDef.Create("game.round_end_eorg_popup_time", 5f, CVar.SERVER | CVar.REPLICATED);
43+
44+
public static readonly CVarDef<string> ConfigFile =
45+
CVarDef.Create("config.file", "config.yml", CVar.SERVERONLY | CVar.CONFIDENTIAL);
4346
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Robust.Shared.Serialization;
2+
3+
namespace Content.Shared._Starlight.ServerTransfer;
4+
5+
[Serializable, NetSerializable]
6+
public sealed class ServerTransferEvent : EntityEventArgs
7+
{
8+
public string Address { get; set; } = string.Empty;
9+
}

0 commit comments

Comments
 (0)