#!/usr/bin/env python3 """ Currency conversions. BTC is handled separately from country currencies. Other crypto coins to be added someday. """ import requests import config from module import commands, example CUR_URI = "https://v3.exchangerate-api.com/bulk/{API_KEY}/{CUR_FROM}" BTC_URI = "https://api.coindesk.com/v1/bpi/currentprice/{CUR_TO}.json" @commands('cur', 'currency', 'exchange') @example('.cur 20 EUR to USD') def exchange(bot, trigger): """ Show the exchange rate between two currencies. Supported currencies: https://www.exchangerate-api.com/supported-currencies """ amount = trigger.group(3) cur_from = trigger.group(4) cur_to = trigger.group(5) if cur_to == "to": cur_to = trigger.group(6) if not all((amount, cur_to, cur_from)): return bot.reply("I didn't understand that. Try: .cur 20 EUR to USD") try: amount = float(amount) except ValueError: return bot.reply("Invalid amount. Must be number.") cur_to = cur_to.upper() cur_from = cur_from.upper() api_key = config.exchangerate_api_key url = CUR_URI.format(**{"API_KEY": api_key, "CUR_FROM": cur_from}) res = requests.get(url, verify=True) res.raise_for_status() data = res.json() if data["result"] == "error": return bot.msg("Error: " + data["error"]) rate = data["rates"].get(cur_to) if not rate: return bot.msg("Invalid output currency. Must be ISO 4217 compliant.") new_amount = round(rate*amount, 2) msg = f"\x0310{amount} {cur_from}\x03 = \x0312{new_amount} {cur_to}" bot.msg(msg) @commands('btc', 'bitcoin') @example('.btc EUR') def bitcoin(bot, trigger): """ Show the current bitcoin value in USD. Optional parameter allows non-USD conversion. """ cur_to = trigger.group(3) if not cur_to: cur_to = "USD" cur_to = cur_to.upper() url = BTC_URI.format(**{"CUR_TO": cur_to}) res = requests.get(url, verify=True) if res.text.startswith("Sorry"): return bot.reply("Invalid currency type. Must be ISO 4217 compliant.") data = res.json() rate = data["bpi"][cur_to]["rate_float"] msg = f"\x03101 BTC\x03 = \x0312{rate} {cur_to}" bot.msg(msg)