BangleApps/apps/tinycmc/app.js

119 lines
3.5 KiB
JavaScript

let settings = require("Storage").readJSON("tinycmc.json", 1);
const apiKey = settings.apikey || null;
const cmcBase = 'https://pro-api.coinmarketcap.com/';
const version = ['v1', 'v2'];
const path = {
latest: '/cryptocurrency/listings/latest',
quote: '/cryptocurrency/quotes/latest'
};
let page = 0;
function displayLatest(offset) {
g.clear();
if (page === 0) {
E.showMessage('Getting Top 10');
} else {
E.showMessage(`Getting Top ${offset} to ${offset + 9}`);
}
const uri = offset ? `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10&start=${offset}` : `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10`;
Bangle.http(uri,
{
method: 'GET',
headers: {
"X-CMC_PRO_API_KEY": apiKey,
}
}).then(data=>{
const result = JSON.parse(data.resp).data;
let menu = {
"" : { title : "-- Select --" },
};
//FIXME: Menu can also take an array of items, this would be easier to compose using map
result.forEach(listing => {
menu[listing.name] = {
title: `${listing.cmc_rank}: ${listing.symbol} ${Number(listing.quote.EUR.percent_change_24h).toFixed(3)}`,
onchange: function() { E.showMenu(); displayQuote(listing.symbol);} };
});
menu.Next = function() {
E.showMenu();
g.clear();
page = page + 1;
displayLatest((page * 10) + 1);
}; // remove the menu
menu.Exit = function() {
E.showMenu();
g.clear();
Bangle.showClock();
}; // remove the menu
g.clear();
E.showMenu(menu);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
}).catch(error=>{
console.log('Error');
console.log(error);
E.showMessage(`${error}\nTo go back press BTN`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
});
}
function displayQuote(symb) {
g.clear();
E.showMessage(`Getting latest for ${symb}`);
Bangle.http(`${cmcBase}${version[1]}${path.quote}?symbol=${symb}&convert=EUR`,
{
method: 'GET',
headers: {
"X-CMC_PRO_API_KEY": apiKey,
}
}).then(data=>{
g.clear();
const result = JSON.parse(data.resp).data[symb][0];
E.showMessage(`#${result.cmc_rank}: ${result.symbol}\n${Number(result.quote.EUR.price).toFixed(2)}\n%24h:
${result.quote.EUR.percent_change_24h}`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
}).catch(error=>{
E.showMessage(`${error}\nTo go back press BTN`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
});
}
function displayMenu() {
if (!apiKey) {
E.showMessage("Please provide a Coinmarketcap API Key");
} else {
// Actually display the menu
E.showMenu({
"" : { title : "-- Select --" }, // options
"Latest": function() { E.showMenu(); displayLatest(); },
"BTC" : function() { E.showMenu(); displayQuote('BTC'); },
"ETH" : function() { E.showMenu(); displayQuote('ETH'); },
"XMR" : function() { E.showMenu(); displayQuote('XMR'); },
"ADA" : function() { E.showMenu(); displayQuote('ADA'); },
"DOGE" : function() { E.showMenu(); displayQuote('DOGE'); },
"LTC" : function() { E.showMenu(); displayQuote('LTC'); },
"Exit" : function() {
E.showMenu();
g.clear();
Bangle.showClock();
}, // remove the menu
});
}
}
function main () {
displayMenu();
}
main ();