```
load("render.star", "render")
load("schema.star", "schema")
load("http.star", "http")
load("encoding/base64.star", "base64")
load("cache.star", "cache")
load("humanize.star", "humanize")
DEFAULT_TOKEN = "ethereum"
CG_PRICE_URL = "https://api.coingecko.com/api/v3/coins/{}"
def main(config):
user_defined_token = config.get("token") or DEFAULT_TOKEN
include_eth = config.get("include_eth")
include_btc = config.get("include_btc")
interval = int(config.get("interval","5")) * 1000
cg_price_query = CG_PRICE_URL.format(user_defined_token)
resp = http.get(cg_price_query)
TOKEN_ICON = resp.json()["image"]["thumb"]
thumbimage = http.get(TOKEN_ICON).body()
#Unfortunately need to encode/decode to avoid error
thumbimage_enc = base64.encode(thumbimage)
TOKEN_ICON = base64.decode(thumbimage_enc)
usd_rate_cached = cache.get(user_defined_token + "_usd_rate")
if usd_rate_cached != None:
print("Hit! Displaying cached data.")
print(usd_rate_cached)
usd_rate = usd_rate_cached
else:
print("Miss! Calling CoinGecko API.")
if resp.status_code != 200:
fail("CoinGecko request failed with status %d", resp.status_code)
usd_rate = resp.json()["market_data"]["current_price"]["usd"]
usd_rate = humanize.ftoa(usd_rate,4)
print(usd_rate)
cache.set(user_defined_token + "_usd_rate", usd_rate, ttl_seconds = 300)
eth_rate_cached = cache.get(user_defined_token + "_eth_rate")
if eth_rate_cached != None:
print("Hit! Displaying cached data.")
print(eth_rate_cached)
eth_rate = eth_rate_cached
else:
print("Miss! Calling CoinGecko API.")
if resp.status_code != 200:
fail("CoinGecko request failed with status %d", resp.status_code)
eth_rate = resp.json()["market_data"]["current_price"]["eth"]
eth_rate = humanize.ftoa(eth_rate,4)
print(eth_rate)
cache.set(user_defined_token + "_eth_rate", eth_rate, ttl_seconds = 300)
btc_rate_cached = cache.get(user_defined_token + "_btc_rate")
if btc_rate_cached != None:
print("Hit! Displaying cached data.")
print(btc_rate_cached)
btc_rate = btc_rate_cached
else:
print("Miss! Calling CoinGecko API.")
if resp.status_code != 200:
fail("CoinGecko request failed with status %d", resp.status_code)
btc_rate = resp.json()["market_data"]["current_price"]["btc"]
btc_rate = humanize.ftoa(btc_rate,4)
print(btc_rate)
cache.set(user_defined_token + "_btc_rate", btc_rate, ttl_seconds = 300)
#Build the Display based on User Toggles
vector = []
if include_eth and include_btc:
vector = [
render.Text("$%g" % float(usd_rate)),
render.Text("Ξ%g" % float(eth_rate)),
render.Text("B%g" % float(btc_rate))
]
elif include_eth:
vector = [
render.Text("$%g" % float(usd_rate)),
render.Text("Ξ%g" % float(eth_rate))
]
else:
vector = [
render.Text("$%g" % float(usd_rate))
]
return render.Root(
child = render.Box(
render.Row(
expanded = True,
main_align = "space_between",
cross_align = "center",
children = [
render.Image(src = TOKEN_ICON),
render.Animation(
children = vector
)
],
),
),delay=5000
)
def get_schema():
return schema.Schema(
version = "1",
fields = [
schema.Text(
id = "token",
name = "Token?",
desc = "Insert Token Name from CoinGecko (ex. governance-ohm)",
icon = "coin-vertical"
),
schema.Toggle(
id = "include_eth",
name = "Show ETH Price",
desc = "Display ETH Price",
icon = "ethereum",
default = False
),
schema.Toggle(
id = "include_btc",
name = "Show BTC Price",
desc = "Display BTC Price",
icon = "btc",
default = False
),
schema.Text(
id = "interval",
name = "Time Interval (sec)",
desc = "Price Rotation (default 5)",
icon = "timer"
)
]
)
```