Skip to content

Commit

Permalink
Mod restart cooldown
Browse files Browse the repository at this point in the history
  • Loading branch information
Equinox- committed Jun 23, 2024
1 parent 226f48c commit 13c0365
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions Meds.Watchdog/ModUpdateTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public class SingleModData

public class ModUpdateTracker : BackgroundService
{
private static readonly TimeSpan CheckInterval = TimeSpan.FromMinutes(15);

private readonly ILogger<ModUpdateTracker> _log;
private readonly LifecycleController _lifecycle;
private readonly DiscordMessageBridge _discord;
Expand All @@ -58,9 +60,11 @@ public class ModUpdateTracker : BackgroundService
private readonly Updater _updater;

private readonly Refreshable<TimeSpan?> _restartAfterUpdate;
private readonly Refreshable<TimeSpan> _readinessDelay;
private readonly Refreshable<bool> _sendModChangesOnline;
private readonly Refreshable<bool> _sendModChangesOffline;

private DateTime? _restartCooldownEndsAt;
private CancellationTokenSource _modCheckDelayInterrupt;

public ModUpdateTracker(ILogger<ModUpdateTracker> log, Refreshable<Configuration> cfg,
Expand All @@ -75,6 +79,7 @@ public ModUpdateTracker(ILogger<ModUpdateTracker> log, Refreshable<Configuration
_data = data;

_restartAfterUpdate = cfg.Map(x => x.RestartAfterModUpdate >= 0 ? (TimeSpan?)TimeSpan.FromSeconds(x.RestartAfterModUpdate) : null);
_readinessDelay = cfg.Map(x => TimeSpan.FromSeconds(x.ReadinessTimeout + x.LivenessTimeout));
_sendModChangesOnline = discord.IsOutputChannelConfigured(DiscordMessageBridge.ModUpdatedServerOnline);
_sendModChangesOffline = discord.IsOutputChannelConfigured(DiscordMessageBridge.ModUpdatedServerOffline);
}
Expand All @@ -96,7 +101,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
_modCheckDelayInterrupt = new CancellationTokenSource();
try
{
await Task.Delay(TimeSpan.FromMinutes(5),
await Task.Delay(CheckInterval,
CancellationTokenSource.CreateLinkedTokenSource(_modCheckDelayInterrupt.Token, stoppingToken).Token);
}
catch
Expand All @@ -122,14 +127,18 @@ private async Task ReportModUpdates()
if (mods.Count == 0) return;

var updatedGameMods = mods.Where(x => x.Details.time_updated > x.GameTimeUpdated).ToList();
if (serverRunning && restartAfterUpdate != null && updatedGameMods.Count > 0)
if (serverRunning && restartAfterUpdate != null && updatedGameMods.Count > 0
&& (_restartCooldownEndsAt == null || DateTime.UtcNow >= _restartCooldownEndsAt))
{
var restartAtUtc = DateTime.UtcNow + restartAfterUpdate.Value;
var curr = _lifecycle.Request;
if (curr == null || curr.Value.ActivateAtUtc > restartAtUtc)
{
_lifecycle.Request = new LifecycleStateRequest(restartAtUtc, new LifecycleState(
LifecycleStateCase.Restarting,
$"Mod Update{(updatedGameMods.Count > 1 ? "s" : "")}: {string.Join(", ", updatedGameMods.Take(4).Select(x => x.Details.title))}"));
_restartCooldownEndsAt = DateTime.UtcNow + restartAfterUpdate.Value + CheckInterval + _readinessDelay.Current;
}
}

if (!sendDiscord) return;
Expand Down

0 comments on commit 13c0365

Please sign in to comment.