From e677c52e37b9f5e49d0adcaf47c5d0f9ad7039ed Mon Sep 17 00:00:00 2001 From: 23RoAGX Date: Sat, 1 Apr 2023 16:47:54 +0200 Subject: [PATCH] New App: tinyCMC coinmarketcap client --- apps/tinycmc/ChangeLog | 2 + apps/tinycmc/README.md | 7 +++ apps/tinycmc/app-icon.js | 1 + apps/tinycmc/app.js | 118 ++++++++++++++++++++++++++++++++++++ apps/tinycmc/icon.png | Bin 0 -> 2687 bytes apps/tinycmc/interface.html | 63 +++++++++++++++++++ apps/tinycmc/metadata.json | 30 +++++++++ 7 files changed, 221 insertions(+) create mode 100644 apps/tinycmc/ChangeLog create mode 100644 apps/tinycmc/README.md create mode 100644 apps/tinycmc/app-icon.js create mode 100644 apps/tinycmc/app.js create mode 100644 apps/tinycmc/icon.png create mode 100644 apps/tinycmc/interface.html create mode 100644 apps/tinycmc/metadata.json diff --git a/apps/tinycmc/ChangeLog b/apps/tinycmc/ChangeLog new file mode 100644 index 000000000..46fdd1b1e --- /dev/null +++ b/apps/tinycmc/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App +0.02: Set API Key through Apploader \ No newline at end of file diff --git a/apps/tinycmc/README.md b/apps/tinycmc/README.md new file mode 100644 index 000000000..42cbdf203 --- /dev/null +++ b/apps/tinycmc/README.md @@ -0,0 +1,7 @@ +# Tiny Coinmarketcap +A simple app using Gadgedtbridge internet access to fetch current crypto prices from Coinmarketcap. +I'm providing a "free-tier" API Key. + +TO-DOs: +- [X] Add own API Key option +- [ ] Add settings for Currency conversion \ No newline at end of file diff --git a/apps/tinycmc/app-icon.js b/apps/tinycmc/app-icon.js new file mode 100644 index 000000000..0c8a0226b --- /dev/null +++ b/apps/tinycmc/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4kA/4ACBIP/o8242462/k8/gtytlz1s+r2/gv/q9Zpv/m+02pj/AH4AqgMRBhURAAQWGqPxqPwA4UoloABkoLCAIQhIiMQgUo29mtfr6WIBogxDFwNBAIeKwd8x2Mud8lUhBolQLoYABrERjurs/S7F329rs+i+I+EC4JRFxl+lUmvmGAIWKkJhGJ4lI01y2+3s4BB1s7s+o+MVMAhPEll7kd+uYBCvgBB7khyIRCL4cZiMS7YuCAAxnBSAsBJoWKl0sLYYBFluBL4iPCiuNsRdEAIlr3GBR4iQBJoMs7pdEAIjDBkK/ESAUY665BABNn7AvFkWBlEsXYoBFMAMlkPwC4UYRwOru5ZDMY+iitBF4MoPAOBxsjXoktAYMoYYcowOBwEokAXBiq+BL4eywWH2WHA4VrYAMViECgEgYAOIxhXDlF8k0oM4eDxrABkReBkEIj/y1ZVCsRjB2UnL4tYimCO4UBoOdlhdCveDAYMuYId8kq/DGIOI/Hyw6MDAA9t7FI/HwJAUBqOBll7X5WK+PxqK/DgMRimNsS7HAINm3DuBd4hfB+ONxhZEAIl8lVBL4YXCjLwB7eyLxFn7AvHJ4PxlS7BLo2OvmBqJfHAANC02yLotrs+iiMYB4IWCL4QgByMsvlzXYlz7UhLoIBBC4cADwMViNS7drFQNnAYXSFwZeDAAJPCyPxlEsFgIuClouBBoPxRwZgEGAMYwWI81n9sikA9CFwwwCKIWRyOFlEtlANEoAWGMIYyDisVCBAAHKYRjBqOAC6AyECqQA/AH4AJA==")) \ No newline at end of file diff --git a/apps/tinycmc/app.js b/apps/tinycmc/app.js new file mode 100644 index 000000000..07a56e494 --- /dev/null +++ b/apps/tinycmc/app.js @@ -0,0 +1,118 @@ +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 (); diff --git a/apps/tinycmc/icon.png b/apps/tinycmc/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2038315e018e2db7313ee6c8bceed9d273047fc4 GIT binary patch literal 2687 zcmV-_3V`*AP)uHXsT{MS(^@821%HQ4p6HMHImeL_k?&-&Yl+6j z-l929o|1VkUIp`sw+PbaczdM}qCERzv`eA8F9O^3NPFt-uu{zc=1`{N#+;nVV%+Nu^j?(#e4} zF71L|S|xNNA3`^}a2OFLDC7<#M-epn9MhPBtG@XP`ay~XjKY(d@Hx~LQ5cpGA68=IX@S(ChUkTsRPOMF9fgq^? zCM8{1`A`n~kaSod^FwG-YX6C+XX5VTN1Bw`JIaiRz>%@Qr{vv-#lh3C4a?@7a{ieJ z%yYXA{W#gUzz?1T$=17y{_pXPFe&PQ`Q19$2d6@~+Z!d%pP;h#IXb&rG-3gy9}Xix zVQTfz7kYZzkaYk4pyRf+ll?lm!S-?jR!N$%=t>&q9lQpE*f#^uD+y#$bSmE^7Q_Bp z0#@(w8Wk``M8OuGDAfKbP5R%!ONtH|E=I%*+Wnc32y8rc73*Uk!XT#>Go8F)5YzPY z!4I5DiWJL>l$zY>0vJ41g3q#mV*!nCvy>pMH=0p(zgbliGEx& zOp3c2VG=k$Eu4s==Hc=iVy#0Wr*0l7d=D zQK>LLa1t--tN01@DgVPufHLb}$c$dqHPsFaXS>e?!0voF)?`$0j=SjM{dYpZAfbiw zNiS?~<-*=C3_)>;gE$5-F*7F*{sS)oHi8q9%cqDOa4sy8OD;co710whKcyI`GEg7p`pAll){VK^Ha35F>qJDU-x(FmT6$Ir?SoxX7kt;!~5 zYpANLrgVRVJ60At7hcL97m&rF70|m~Gx`}h{^Bsr$<8RR1C|+;av2Os+2qO;oJ zb0*eqNB>dRSj+jr)9Omxee@89&hD@a&4e+Xz#{(~t-y7I%Q0Q-iP^jSFw^BEX1Jb) zUPLVic=n!4nC^HCivlGY=L=FAVU{Q52$;HhaJD~G%B!9QF`QFG_O4U~AMZZ}OP3Fc zQT$hCVoQ4PMMZ7pE0zfhpOhlIKmvi|A&9ByGNsx@kg3od3S*nG@WMUlSZ{}ZloYx* z%AvE?l_RylHw%-Nt;a&YT&)Taq&2}Jx0)lcV!J1ok%x+JSY#%{I>X53gF!Q5-4mTc z1v$z-B4L=CpZ6;5K|W%#vJsk?3O$GY{XRg6#xO_8zd336pJrnG%PV5kGp6}TD{RR5 z8^<&~L8gq0cD7d&vE0=i498H}d+u@}!>VIp`|*!H;NUPtBwqeHl-7SR5W3`Tjd)R8 zg*Cg6L3}lds~n9AIyG)S|71LLL!ONK|2LN((FtUZ?K`oo+-}8p2}Q8;kA%mi>wH-_ zydSsyiZ4ZC@q488XH(3`kA@ zaAx$i=M^jpc<@%i>y!44OS?Jq*%O(Kp1wAI0xCtR)0Btx@6}^TLMdjuocQ@=1%Vf2G;uxhh8PK)0wZzwQjoS%I#nwHwOX;3z4*ND1>&hD zXZ^s-rh1M*-s2)_YA7pHh+A3M%H2B5A`*JxRX+*59+edgJi8EBlU@Ob%Q46;E=Dgk zGprk9ai7P8&TA#m1LdTVlh|Sdr@&0fc&j@$Q>0)GJ-a@cf94Jhl3L#Yyo{2blvkp!Q!z>x6bvDm}>K@yRkuat8sF39LYHn@N)XXHj3r%^lsX{DYJnkTSHoPYGz;4Y-&soW z-a5Gy*4_bF?&5)}m(~5DyIYQ3KLk)0DC5z-V$GP~*&vp`V$Qs!h_rXMph+%8b$!h+GDD^0+0&Gz_TFE7W480txk6{n{p`COtdZ_j zD>smKGKh?tj|>a9%=ws!$yysJnlvivo23VwkKg=dKx-Q8cLDZ`4VSf53P0`_7PTVj tM@eSMhSgN;y + + + + +

Set Coinmarketcap API key

+

+ +

Where to get your personal API key?

+

Go to https://coinmarketcap.com/api/ and sign up for a free account.
+ After registration you can login and obtain your personal API key.

+ + + + + + + diff --git a/apps/tinycmc/metadata.json b/apps/tinycmc/metadata.json new file mode 100644 index 000000000..14963e610 --- /dev/null +++ b/apps/tinycmc/metadata.json @@ -0,0 +1,30 @@ +{ + "id": "tinycmc", + "name": "Tiny CMC", + "shortName":"tinycmc", + "icon": "icon.png", + "version": "0.02", + "description": "TinyCMC is a bangle.js Coinmarketcap API client", + "type": "app", + "tags": "tools", + "supports": [ + "BANGLEJS2" + ], + "allow_emulator": false, + "interface": "interface.html", + "readme": "README.md", + "data": [ + {"name":"tinycmc.json"} + ], + "storage": [ + { + "name": "tinycmc.app.js", + "url": "app.js" + }, + { + "name": "tinycmc.img", + "url": "app-icon.js", + "evaluate": true + } + ] +} \ No newline at end of file