Better retrieval mechanism; also caching for promise
parent
0cfd65b919
commit
3d6c78afac
|
|
@ -7,4 +7,4 @@ Crypto-Coins Infos with the help of the Coinmarketcap API
|
||||||
Martin Zwigl
|
Martin Zwigl
|
||||||
|
|
||||||
## Reminder for last working
|
## Reminder for last working
|
||||||
- ef6c04b1cca90125d3e41381be4a70231c076412
|
- 0cfd65b919157356d46ccbbeb2416d794312e13a
|
||||||
|
|
@ -1,67 +1,93 @@
|
||||||
(function() {
|
(function() {
|
||||||
const COIN_ICON = atob("MDCBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAA//8AAAAB///AAAAB8A/gAAAAgAH4AAAwAAB8AAB4AAA+AADwA4APAADgA4APAAHgA4AHgADAf/ADwAAAf/gBwAAAf/wB4AAAcB4A4AAAcA4A4AAAcA4A4AYAcA4AcA8AcB4AcB+Af/wDdj/Af/4D/n/Af/8D/n/AcAcB/A4AcAOA+A4AcAOAcAcAcAOAAAcAcAAAAAcAcAAAAAeAf/AAAAOAf/AAAAPAf/ADAAHgA4AHgADwA4AHAADwA4APAAB8AAA+AAA+AAB8AAAfgAH4AAAH8A/gAAAD///AAAAA//8AAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); // (full base64 string here)
|
const COIN_ICON = atob("MDCBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAA//8AAAAB///AAAAB8A/gAAAAgAH4AAAwAAB8AAB4AAA+AADwA4APAADgA4APAAHgA4AHgADAf/ADwAAAf/gBwAAAf/wB4AAAcB4A4AAAcA4A4AAAcA4A4AYAcA4AcA8AcB4AcB+Af/wDdj/Af/4D/n/Af/8D/n/AcAcB/A4AcAOA+A4AcAOAcAcAcAOAAAcAcAAAAAcAcAAAAAeAf/AAAAOAf/AAAAPAf/ADAAHgA4AHgADwA4AHAADwA4APAAB8AAA+AAA+AAB8AAAfgAH4AAAH8A/gAAAD///AAAAA//8AAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); // (full base64 string here)
|
||||||
|
|
||||||
const settings = require("Storage").readJSON("coin_info.settings.json",1)||{};
|
const settings = require("Storage").readJSON("coin_info.settings.json", 1) || {};
|
||||||
const db = require("Storage").readJSON("coin_info.cmc_key.json",1)||{};
|
const db = require("Storage").readJSON("coin_info.cmc_key.json", 1) || {};
|
||||||
const logFile = require("Storage").open("log.txt", "a");
|
const logFile = require("Storage").open("log.txt", "a");
|
||||||
|
|
||||||
if (!(settings.tokenSelected instanceof Array))
|
// Ensure tokenSelected is an array
|
||||||
settings.tokenSelected = [];
|
if (!(settings.tokenSelected instanceof Array)) settings.tokenSelected = [];
|
||||||
|
|
||||||
|
// Cache for storing results
|
||||||
|
let cache = {};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: "CoinInfo",
|
name: "CoinInfo",
|
||||||
items: settings.tokenSelected.map(token => {
|
items: settings.tokenSelected.map(token => {
|
||||||
return { name : token,
|
return {
|
||||||
get : function()
|
name: token,
|
||||||
{
|
get: function() {
|
||||||
// const url = `https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest?slug=${token}`;
|
// Return cached data if available
|
||||||
// const url = `https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest?slug=bitcoin`;
|
if (cache[token]) {
|
||||||
const url = `https://api.binance.com/api/v3/ticker/24hr?symbol=BTCUSDT`;
|
return cache[token];
|
||||||
return Bangle
|
}
|
||||||
.http(url, {
|
|
||||||
method: 'GET'
|
// Return placeholder while fetching data
|
||||||
// ,headers: {
|
return {
|
||||||
// 'CMC_PRO_API_KEY': db.apikey
|
text: "Load...",
|
||||||
// }
|
img: COIN_ICON
|
||||||
})
|
};
|
||||||
|
},
|
||||||
|
show: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// Fetch data when shown
|
||||||
|
const url = `https://api.binance.com/api/v3/ticker/24hr?symbol=${token.toUpperCase()}`;
|
||||||
|
Bangle.http(url, { method: 'GET' })
|
||||||
.then(cmcResult => {
|
.then(cmcResult => {
|
||||||
// text: JSON.parse(cmcResult.resp).data["1"].symbol, // Fixed data path
|
|
||||||
logFile.write("HTTP resp:" + JSON.stringify(cmcResult));
|
logFile.write("HTTP resp:" + JSON.stringify(cmcResult));
|
||||||
const apiData = JSON.parse(cmcResult.resp); // Correctly declare variable
|
const apiData = JSON.parse(cmcResult.resp);
|
||||||
logFile.write("data:" + JSON.stringify(apiData));
|
logFile.write("data:" + JSON.stringify(apiData));
|
||||||
return {
|
|
||||||
text: apiData.symbol,
|
// Update cache with fetched data
|
||||||
|
cache[token] = {
|
||||||
|
// text: `${apiData.symbol}\n${apiData.lastPrice} USD`,
|
||||||
|
text: `${apiData.symbol}`,
|
||||||
img: COIN_ICON
|
img: COIN_ICON
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Trigger a redraw of this item
|
||||||
|
self.emit("redraw");
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
logFile.write("API Error: " + JSON.stringify(err));
|
logFile.write("API Error: " + JSON.stringify(err));
|
||||||
return {
|
cache[token] = {
|
||||||
text: err.toString(),
|
text: "Error",
|
||||||
img: COIN_ICON
|
img: COIN_ICON
|
||||||
}
|
};
|
||||||
});
|
|
||||||
},
|
|
||||||
show : function() {
|
|
||||||
var self = this;
|
|
||||||
// Set timeout to align to the next minute
|
|
||||||
self.interval = setTimeout(function timerTimeout() {
|
|
||||||
self.emit("redraw");
|
|
||||||
// Continue updating every hour
|
|
||||||
self.interval = setInterval(function intervalCallback() {
|
|
||||||
self.emit("redraw");
|
self.emit("redraw");
|
||||||
}, 3600000);
|
});
|
||||||
}, 3600000 - (Date.now() % 3600000));
|
|
||||||
|
// Set interval to refresh data every hour
|
||||||
|
self.interval = setInterval(() => {
|
||||||
|
Bangle.http(url, { method: 'GET' })
|
||||||
|
.then(cmcResult => {
|
||||||
|
const apiData = JSON.parse(cmcResult.resp);
|
||||||
|
cache[token] = {
|
||||||
|
// text: `${apiData.symbol}\n${apiData.lastPrice} USD`,
|
||||||
|
text: `${apiData.symbol}`,
|
||||||
|
img: COIN_ICON
|
||||||
|
};
|
||||||
|
self.emit("redraw");
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
logFile.write("API Error: " + JSON.stringify(err));
|
||||||
|
cache[token] = {
|
||||||
|
text: "Error",
|
||||||
|
img: COIN_ICON
|
||||||
|
};
|
||||||
|
self.emit("redraw");
|
||||||
|
});
|
||||||
|
}, 3600000); // Refresh every hour
|
||||||
},
|
},
|
||||||
hide : function() {
|
hide: function() {
|
||||||
if (this.interval) {
|
if (this.interval) {
|
||||||
clearInterval(this.interval);
|
clearInterval(this.interval);
|
||||||
this.interval = null;
|
this.interval = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ,run: function () {
|
};
|
||||||
// this.emit("redraw");
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
})
|
})();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{ "id": "coin_info",
|
{ "id": "coin_info",
|
||||||
"name": "Crypto-Coins Info",
|
"name": "Crypto-Coins Info",
|
||||||
"shortName":"Coins Info",
|
"shortName":"Coins Info",
|
||||||
"version": "0.04.24",
|
"version": "0.04.25",
|
||||||
"description": "Crypto-Coins Infos with the help of the Coinmarketcap API",
|
"description": "Crypto-Coins Infos with the help of the Coinmarketcap API",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "clkinfo",
|
"tags": "clkinfo",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue