# @name Cryptocurrency Market # @desc Cryptocurrency price display # @author Avemer # @version 1.0 class CryptocurrencyMarket # USER VARIABLES var COIN_ID var TICKER var CURRENCY var TICKER_LETTERS var TICKER_COLOR var PRICE_COLOR_MODE var PRICE_COLOR var UPDATE_TICKS var GAP # INTERNAL VARIABLES var url var needle var result var oldPrice var previousPrice var ticks var color var displayTICKER var requestActive # ================ START OF USER SETTINGS ================ def init() # COIN ID # CoinGecko API ID of the cryptocurrency. # Examples: # bitcoin, ethereum, solana, dogecoin self.COIN_ID = "bitcoin" # TICKER # Cryptocurrency ticker displayed on the screen. # Examples: # BTC, ETH, SOL, DOGE self.TICKER = "BTC" # CURRENCY # Currency in which the cryptocurrency price is displayed. # Examples: # usd, eur, gbp, rub, cny self.CURRENCY = "usd" # NUMBER OF TICKER LETTERS DISPLAYED # 0 = hide ticker # 1 = first letter # 2 = first two letters # 3 = first three letters # 4 = first four letters # 5+ = full ticker self.TICKER_LETTERS = 3 # TICKER COLOR # Format: 0xRRGGBB # Examples: # 0xFFFFFF White # 0xFF0000 Red # 0x00FF00 Green # 0x0000FF Blue # 0xFFFF00 Yellow # 0x00FFFF Cyan # 0xFF00FF Magenta self.TICKER_COLOR = 0xF7931A # PRICE COLOR MODE # 0 = always white # 1 = custom PRICE_COLOR # 2 = automatic green/red comparison # Automatic mode compares the newest price # with the previously received price. self.PRICE_COLOR_MODE = 2 # CUSTOM PRICE COLOR # Used when PRICE_COLOR_MODE = 1. self.PRICE_COLOR = 0xFFFFFF # PRICE UPDATE INTERVAL # Number of loop ticks between requests. # loop() runs once per second. self.UPDATE_TICKS = 30 # DISTANCE BETWEEN TICKER AND PRICE self.GAP = 2 # ================ END OF USER SETTINGS ================ # API URL self.url = "https://api.coingecko.com/api/v3/simple/price?ids=" + self.COIN_ID + "&vs_currencies=" + self.CURRENCY # FIND CURRENCY self.needle = self.CURRENCY # INITIAL VALUES self.result = "..." self.oldPrice = 0 self.previousPrice = 0 self.ticks = 0 self.color = 0xFFFFFF self.displayTICKER = "" self.requestActive = false # CREATE DISPLAYED TICKER if self.TICKER_LETTERS <= 0 self.displayTICKER = "" elif self.TICKER_LETTERS == 1 self.displayTICKER = self.TICKER[0] elif self.TICKER_LETTERS == 2 self.displayTICKER = self.TICKER[0] + self.TICKER[1] elif self.TICKER_LETTERS == 3 self.displayTICKER = self.TICKER[0] + self.TICKER[1] + self.TICKER[2] elif self.TICKER_LETTERS == 4 self.displayTICKER = self.TICKER[0] + self.TICKER[1] + self.TICKER[2] + self.TICKER[3] else self.displayTICKER = self.TICKER end end # UPDATE COLOR def update_color() if self.PRICE_COLOR_MODE == 0 self.color = 0xFFFFFF return end if self.PRICE_COLOR_MODE == 1 self.color = self.PRICE_COLOR return end if self.PRICE_COLOR_MODE == 2 if self.previousPrice <= 0 self.color = 0xFFFFFF return end if self.oldPrice > self.previousPrice self.color = 0x00FF00 elif self.oldPrice < self.previousPrice self.color = 0xFF0000 else self.color = 0xFFFFFF end return end end # PROCESS RESPONSE def on_price(body, status) self.requestActive = false if body == nil return end var p = re.search( "[0-9][0-9.]*", body ) if p == nil return end var newPrice = num(p[0]) if newPrice == nil return end # SAVE PREVIOUS PRICE if self.oldPrice > 0 self.previousPrice = self.oldPrice end # SAVE CURRENT PRICE self.oldPrice = newPrice # DISPLAY PRICE self.result = str(newPrice) # UPDATE COLOR self.update_color() # START DELAY AFTER SUCCESSFUL RESPONSE self.ticks = self.UPDATE_TICKS end # MAIN LOOP def loop() # WAIT AFTER PREVIOUS REQUEST if self.ticks > 0 self.ticks -= 1 return end # DO NOT SEND ANOTHER REQUEST # WHILE CURRENT REQUEST IS ACTIVE if self.requestActive return end # SEND REQUEST self.requestActive = true http.get( self.url, / b, st -> self.on_price(b, st), {'find': self.needle, 'keep': 32} ) end # DRAW def draw() clear() var tickerWidth = text_ink_width(self.displayTICKER) var priceWidth = text_ink_width(self.result) var totalWidth = tickerWidth + self.GAP + priceWidth var x = int((width() - totalWidth) / 2) if self.TICKER_LETTERS > 0 text( x, 7, self.displayTICKER, self.TICKER_COLOR ) end text( x + tickerWidth + self.GAP, 7, self.result, self.color ) end def on_button(btn) end end return CryptocurrencyMarket()