@page "/" @inject TwitchArchive.Core.Workers.StreamWorkerManager WorkerManager @inject TwitchArchive.Web.Services.SessionCacheService SessionCache

Dashboard

@foreach (var s in streamers) {
@s @(WorkerManager.IsRunning(s) ? "Live" : "Offline")
Last session: @(lastStarts.ContainsKey(s) ? lastStarts[s].ToLocalTime().ToString() : "-")
}
@code { private List streamers = new(); private Dictionary lastStarts = new(); private void OnCacheUpdatedHandler() { _ = InvokeAsync(() => { lastStarts = SessionCache.GetSnapshot(); StateHasChanged(); }); } protected override async Task OnInitializedAsync() { LoadStreamers(); lastStarts = SessionCache.GetSnapshot(); SessionCache.Updated += OnCacheUpdatedHandler; } private void LoadStreamers() { var cfgDir = Path.Combine(Environment.CurrentDirectory, "config", "streamers"); if (Directory.Exists(cfgDir)) { streamers = Directory.GetFiles(cfgDir, "*.json").Select(f => Path.GetFileNameWithoutExtension(f)).ToList(); } } // Index reads from the singleton SessionCacheService; updates are pushed via the Updated event. private void Start(string u) { WorkerManager.StartWorker(u); } private async Task Stop(string u) { await WorkerManager.StopWorkerAsync(u); } public async ValueTask DisposeAsync() { SessionCache.Updated -= OnCacheUpdatedHandler; await Task.CompletedTask; } }