diff --git a/src/nostrMiddleware.ts b/src/nostrMiddleware.ts index fe81f84b..c17e2d01 100644 --- a/src/nostrMiddleware.ts +++ b/src/nostrMiddleware.ts @@ -80,7 +80,10 @@ export default (serverMethods: Types.ServerMethods, mainHandler: Main, nostrSett }, event.startAtNano, event.startAtMs) }) - return { Stop: () => nostr.Stop, Send: (...args) => nostr.Send(...args), Ping: () => nostr.Ping() } + // Mark nostr connected/ready after initial subscription tick + mainHandler.adminManager.setNostrConnected(true) + + return { Stop: () => { mainHandler.adminManager.setNostrConnected(false); return nostr.Stop }, Send: (...args) => nostr.Send(...args), Ping: () => nostr.Ping() } } diff --git a/src/services/main/adminManager.ts b/src/services/main/adminManager.ts index 6deec53a..c3927f87 100644 --- a/src/services/main/adminManager.ts +++ b/src/services/main/adminManager.ts @@ -22,6 +22,7 @@ export class AdminManager { interval: NodeJS.Timer appNprofile: string lnd: LND + nostrConnected: boolean = false constructor(mainSettings: MainSettings, storage: Storage) { this.storage = storage this.dataDir = mainSettings.storageSettings.dataDir @@ -42,6 +43,14 @@ export class AdminManager { this.lnd = lnd } + setNostrConnected = (connected: boolean) => { + this.nostrConnected = connected + } + + GetNostrConnected = () => { + return this.nostrConnected + } + setAppNprofile = (nprofile: string) => { this.appNprofile = nprofile const enrollToken = this.ReadAdminEnrollToken() diff --git a/src/services/wizard/index.ts b/src/services/wizard/index.ts index 7ea31c8b..ed394c2c 100644 --- a/src/services/wizard/index.ts +++ b/src/services/wizard/index.ts @@ -46,15 +46,27 @@ export class Wizard { const relays = this.settings.nostrRelaySettings ? this.settings.nostrRelaySettings.relays : []; const relayUrl = (relays && relays.length > 0) ? relays[0] : ''; const defaultApp = apps.find(a => a.name === this.settings.defaultAppName) || apps[0] + // Determine LND state and watchdog + let lndState: WizardTypes.LndState = WizardTypes.LndState.OFFLINE + let watchdogOk = false + try { + const info = await this.adminManager.LndGetInfo() + const online = info.synced_to_chain && info.synced_to_graph + lndState = online ? WizardTypes.LndState.ONLINE : WizardTypes.LndState.SYNCING + watchdogOk = !info.watchdog_barking + } catch { + lndState = WizardTypes.LndState.OFFLINE + watchdogOk = false + } return { admin_npub: this.adminManager.GetAdminNpub(), http_url: this.settings.serviceUrl, - lnd_state: WizardTypes.LndState.OFFLINE, + lnd_state: lndState, nprofile: this.nprofile, provider_name: appNamesList, - relay_connected: false, + relay_connected: this.adminManager.GetNostrConnected(), relays: this.relays, - watchdog_ok: false, + watchdog_ok: watchdogOk, source_name: this.settings.defaultAppName || appNamesList, relay_url: relayUrl, automate_liquidity: this.settings.liquiditySettings.liquidityProviderPub !== 'null', @@ -83,6 +95,8 @@ export class Wizard { } } } + + WizardState = async (): Promise => { return { config_sent: this.pendingConfig !== null, diff --git a/static/js/status.js b/static/js/status.js index 46e3b702..ff754058 100644 --- a/static/js/status.js +++ b/static/js/status.js @@ -34,6 +34,11 @@ $(() => { $("#reset-box").show(); $('.continue-button').attr('id', 'set-show-nostr'); }); + $("#show-avatar").click(() => { + $('.show-avatar').show() + $('#show-avatar-text').hide() + $('input[name="show-avatar"]').focus(); + }); $("#show-nodey").click(() => { $('.show-nodey').show() $('#show-nodey-text').hide() @@ -73,6 +78,21 @@ $(() => { $('#show-nostr-text').show() }) }) + $("#save-show-avatar").click(() => { + var targetInputVal = $('input[name="show-avatar"]').val() + postConfig({ avatar_url: targetInputVal }).then(ok => { + if (ok) { + $('#show-avatar-text').text(targetInputVal || '—') + if (targetInputVal) { $('#avatarImg').attr('src', targetInputVal) } + } + $('.show-avatar').hide() + $('#show-avatar-text').show() + }) + }) + $("#cancel-show-avatar").click(() => { + $('.show-avatar').hide() + $('#show-avatar-text').show() + }) $("#cancel-show-nostr").click(() => { $('.show-nostr').hide() $('#show-nostr-text').show() diff --git a/static/status.html b/static/status.html index 5fd8836e..59fe1c44 100644 --- a/static/status.html +++ b/static/status.html @@ -69,6 +69,27 @@ +
+
Avatar:
+
+ +
+ avatar +
+
+ +
+
+
+
Administrator:
@@ -165,8 +186,11 @@ const lndText = lndStateNum === 2 ? 'ONLINE' : (lndStateNum === 1 ? 'SYNCING' : 'OFFLINE') const lndDot = lndStateNum === 2 ? 'green-dot' : (lndStateNum === 1 ? 'yellow-dot' : 'red-dot') const relayConnected = !!relayUrl + const avatar = j.avatar_url || (j.app_id ? `https://robohash.org/${encodeURIComponent(j.app_id)}.png?size=128x128&set=set3` : '') document.getElementById("show-nodey-text").innerHTML = name document.getElementById("show-nostr-text").innerHTML = relayUrl || '—' + document.getElementById("show-avatar-text").innerHTML = avatar || '—' + if (avatar) { document.getElementById("avatarImg").src = avatar } document.getElementById("adminNpub").innerText = admin document.getElementById("relayStatus").innerHTML = ` ${relayConnected ? 'Connected' : 'Disconnected'}` document.getElementById("lndStatus").innerHTML = ` ${lndText}`