diff --git a/qortal-ui-plugins/plugins/core/puzzles/puzzles.src.js b/qortal-ui-plugins/plugins/core/puzzles/puzzles.src.js index 3ace6f1e..6614348b 100644 --- a/qortal-ui-plugins/plugins/core/puzzles/puzzles.src.js +++ b/qortal-ui-plugins/plugins/core/puzzles/puzzles.src.js @@ -63,7 +63,7 @@ class Puzzles extends LitElement { } .clue { - font-family: monospaced; + font-family: "Lucida Console", "Courier New", monospace; font-size: smaller; } ` @@ -88,19 +88,21 @@ class Puzzles extends LitElement {

Puzzles

- - { + + { if (data.item.isSolved) { - render(html`SOLVED by ${data.item.winner}`, root) + render(html`SOLVED by
${data.item.winner}
`, root) } else { render(html`${data.item.reward} QORT`, root) } }}>
- - - - { + + + { + render(html`${data.item.clue}`, root) + }}> + { if (data.item.isSolved) { render(html``, root) } else { @@ -121,11 +123,11 @@ class Puzzles extends LitElement {
- Claiming your reward...   + Checking your guess...   + alt="Checking puzzle guess"> @@ -250,7 +252,7 @@ class Puzzles extends LitElement { isSolved: _isSolved } - if (!_isSolved && _nameData.clue) + if (_nameData.clue) _puzzle.clue = _nameData.clue; if (_isSolved) { diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 591ad812..de4fcbb7 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1355,14 +1355,14 @@ class TradePortal extends LitElement { initSocket() { let _relatedCoin = "" let presenceTxns = null + let tradePresenceTxns = null let offeringTrades = null - let filteredOffers = [] self.addEventListener('message', function (event) { switch (event.data.type) { case 'open_orders': offeringTrades = event.data.content - handleOfferingTrades() + processOffersWithPresence() break case 'set_coin': _relatedCoin = event.data.content @@ -1378,36 +1378,44 @@ class TradePortal extends LitElement { return timestamp > thirtyMinsAgo } + const filterOffersUsingEitherPresence = (offeringTrade) => { + return lessThanThirtyMinsAgo(offeringTrade.lastSeen) || offeringTrade.tradePresenceExpiry > Date.now(); + } + const processOffersWithPresence = () => { + if (offeringTrades === null) return + const waitFor = (ms) => new Promise((r) => setTimeout(r, ms)) async function asyncForEach(array, callback) { for (let index = 0; index < array.length; index++) { await callback(array[index], index, array) } } + const startOfferPresenceMapping = async () => { - await asyncForEach(presenceTxns, async (presence) => { - await waitFor(5) - let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === presence.address) - offerIndex !== -1 ? (offeringTrades[offerIndex].lastSeen = presence.timestamp) : null - }) - filteredOffers = offeringTrades.filter((offeringTrade) => lessThanThirtyMinsAgo(offeringTrade.lastSeen)) + if (presenceTxns !== null) { + await asyncForEach(presenceTxns, async (presence) => { + await waitFor(5) + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === presence.address) + offerIndex !== -1 ? (offeringTrades[offerIndex].lastSeen = presence.timestamp) : null + }) + } + + if (tradePresenceTxns !== null) { + await asyncForEach(tradePresenceTxns, async (tradePresence) => { + await waitFor(5) + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) + offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null + }) + } + + let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingEitherPresence(offeringTrade)) self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) - filteredOffers = [] } + startOfferPresenceMapping() } - const handleOfferingTrades = () => { - if (presenceTxns === null) return - processOffersWithPresence() - } - - const handlePresence = () => { - if (offeringTrades === null) return - processOffersWithPresence() - } - const initTradeOffersWebSocket = (restarted = false) => { let tradeOffersSocketCounter = 0 let socketTimeout @@ -1480,6 +1488,37 @@ class TradePortal extends LitElement { } } + const initTradePresenceWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` + const socket = new WebSocket(socketLink) + // Open Connection + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + // Message Event + socket.onmessage = (e) => { + tradePresenceTxns = JSON.parse(e.data) + processOffersWithPresence() + restarted = false + } + // Closed Event + socket.onclose = () => { + clearTimeout(socketTimeout) + // Restart Socket Connection + restartTradePresenceWebSocket() + } + // Error Event + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + // Will be removed in future - being replaced by tradepresence above const initPresenceWebSocket = (restarted = false) => { let socketTimeout let socketLink = `ws://NODEURL/websockets/presence?presenceType=TRADE_BOT` @@ -1491,7 +1530,7 @@ class TradePortal extends LitElement { // Message Event socket.onmessage = (e) => { presenceTxns = JSON.parse(e.data) - handlePresence() + processOffersWithPresence() restarted = false } // Closed Event @@ -1514,6 +1553,10 @@ class TradePortal extends LitElement { setTimeout(() => initPresenceWebSocket(true), 3000) } + const restartTradePresenceWebSocket = () => { + setTimeout(() => initTradePresenceWebSocket(true), 3000) + } + const restartTradeOffersWebSocket = () => { setTimeout(() => initTradeOffersWebSocket(true), 3000) } @@ -1528,6 +1571,9 @@ class TradePortal extends LitElement { // Start PresenceWebSocket initPresenceWebSocket() + // Start TradePresenceWebSocket + initTradePresenceWebSocket() + // Start TradeBotWebSocket initTradeBotWebSocket() }