@page "/Settings/Integrations/HQ" @using LANCommander.Server.Settings @using LANCommander.HQ.SDK @using Microsoft.Extensions.Options @implements IDisposable @inject IOptions Settings @inject SettingsProvider SettingsProvider @inject HQClient HqClient @inject NavigationManager NavigationManager @inject IMessageService MessageService @inject IJSRuntime JS @inject ILogger Logger @attribute [Authorize(Roles = RoleService.AdministratorRoleName)] @if (_connected) { @if (_isPremium) { Account } else { Your server is linked to a basic account. Upgrade your account to access the following features:
  • Access premium metadata providers
  • Curated/enhanced metadata
  • Support future LANCommander development!
Upgrade
} } else { Connect your server to LANCommander HQ for access to expanded metadata providers, faster lookups, and premium features. All through one account. Access more metadata providers Faster metadata lookups One-time authentication No additional server setup $5/mo Everything in Basic Premium metadata providers Curated & enhanced metadata Supports LANCommander development }
@code { bool _connected; bool _isPremium; bool _awaitingAuth; Timer? _pollTimer; protected override async Task OnInitializedAsync() { await CheckStatus(); } async Task CheckStatus() { _connected = false; _isPremium = false; var hqSettings = SettingsProvider.CurrentValue.Server.HQ; if (!hqSettings.IsAuthenticated) return; try { var client = new HQClient(new HQClientOptions { BaseAddress = new Uri(hqSettings.BaseUrl), Token = hqSettings.AccessToken, }); var profile = await client.Auth.GetCurrentUserAsync(); if (profile is not null) { _connected = true; _isPremium = profile.IsPremium; } } catch (Exception ex) { Logger.LogError(ex, "Failed to verify connection to LANCommander HQ."); } } async Task Connect() { var baseUrl = Settings.Value.Server.HQ.BaseUrl.TrimEnd('/'); var callbackUrl = NavigationManager.BaseUri.TrimEnd('/') + "/api/hq/callback"; var tokenRelayUrl = $"{baseUrl}/Auth/TokenRelay?returnUrl={Uri.EscapeDataString(callbackUrl)}"; var loginUrl = $"{baseUrl}/Auth/Login?returnUrl={Uri.EscapeDataString(tokenRelayUrl)}"; await JS.InvokeVoidAsync("open", loginUrl, "hq_auth", "width=600,height=700,menubar=no,toolbar=no"); _awaitingAuth = true; _pollTimer = new Timer(async _ => { if (SettingsProvider.CurrentValue.Server.HQ.IsAuthenticated) { await InvokeAsync(async () => { _awaitingAuth = false; StopPolling(); await CheckStatus(); if (_connected) MessageService.Success("Successfully connected to LANCommander HQ!"); else MessageService.Error("Connected to LANCommander HQ, but your account could not be verified. Check the server logs for details."); StateHasChanged(); }); } }, null, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(2)); } async Task Disconnect() { SettingsProvider.Update(s => { s.Server.HQ.AccessToken = string.Empty; s.Server.HQ.TokenExpiresAt = null; }); _connected = false; _isPremium = false; MessageService.Success("Disconnected from LANCommander HQ."); } void Save() { try { SettingsProvider.Update(s => { s.Server.HQ.BaseUrl = Settings.Value.Server.HQ.BaseUrl; }); MessageService.Success("Settings saved!"); } catch (Exception ex) { MessageService.Error("An unknown error occurred."); Logger.LogError(ex, "An unknown error occurred."); } } void StopPolling() { _pollTimer?.Dispose(); _pollTimer = null; } public void Dispose() { StopPolling(); } }