def test_str_to_float(self): from formatting_helpers import string_to_float self.assertEqual(string_to_float('0.89'), 0.89) self.assertEqual(string_to_float('1000.5'), 1000.5) self.assertEqual(string_to_float('0,89'), 0.89) self.assertEqual(string_to_float('1,000.5'), 1000.5) self.assertEqual(string_to_float('0.00000012345'), 0.00000012345) self.assertEqual(string_to_float('0.00012345'), 0.00012345) self.assertEqual(string_to_float('1234567'), 1234567)
async def cmd_income(command_str, discord_message, apis): if apis.token.difficulty is None: return "not sure yet... waiting on my APIs :sob:" try: command, hashrate = command_str.split(maxsplit=1) except: return "Bad hashrate; try `!income 5`, `!income 300mh`, or `!income 2.8gh`" multipliers = ( ('k', 1e3), ('m', 1e6), ('g', 1e9), ('t', 1e12), ('p', 1e15), ('e', 1e18), ('z', 1e21), ('y', 1e24)) selected_multiplier = 1e9 for char, mult in multipliers: if char in hashrate: selected_multiplier = mult match = re.match("([<\d.,]+)", hashrate) if not match: return "Bad hashrate; try `!income 5`, `!income 300mh`, or `!income 2.8gh`" try: hashrate = string_to_float(match.group(1)) * selected_multiplier except ValueError: return "Bad hashrate; try `!income 5`, `!income 300mh`, or `!income 2.8gh`" if hashrate == 0: return "Bad hashrate; try `!income 5`, `!income 300mh`, or `!income 2.8gh`" tokens_per_day = 0.8 * 86400 * apis.token.reward * hashrate / ((2**22) * apis.token.difficulty) seconds_per_block = 1.2 * ((2**22) * apis.token.difficulty) / hashrate if tokens_per_day > 1: tokens_over_time_str = "**{}** tokens/day".format(prettify_decimals(tokens_per_day)) else: tokens_over_time_str = "**{}** tokens/week".format(prettify_decimals(tokens_per_day*7)) fmt_str = "Income for {}: {}; **{}** per block solo" return fmt_str.format(to_readable_thousands(hashrate, unit_type='hashrate'), tokens_over_time_str, seconds_to_time(seconds_per_block))
def convert(amount, src, dest, apis): src = src.lower() dest = dest.lower() amount = string_to_float(amount) usd_value, result = None, None token_price_usd = apis.exchanges.price_eth(config.TOKEN_SYMBOL) * apis.exchanges.eth_price_usd() if config.TOKEN_SYMBOL != "0xBTC": logging.warning("unknown currency {}; !convert command assumes 0xBTC".format(config.TOKEN_SYMBOL)) if src in ['0xbtc', '0xbitcoins', '0xbitcoin']: usd_value = token_price_usd * amount elif src in ['m0xbtc', 'milli0xbtc', 'milli0xbitcoin', 'milli0xbitcoins']: usd_value = token_price_usd * amount / 1000.0 elif src in ['0xsatoshis', '0xsatoshi', 'satoastis', 'satoasti', 'crumbs', 'crumb']: usd_value = token_price_usd * amount / 10**8 elif src in ['eth', 'ethereum', 'ether']: usd_value = apis.exchanges.eth_price_usd() * amount elif src == 'wei': usd_value = apis.exchanges.eth_price_usd() * amount / 10**18 elif src in ['btc', 'bitcoins', 'bitcoin']: usd_value = apis.exchanges.btc_price_usd() * amount elif src in ['mbtc', 'millibtc', 'millibitcoins', 'millibitcoin']: usd_value = apis.exchanges.btc_price_usd() * amount / 1000.0 elif src in ['satoshis', 'satoshi']: usd_value = apis.exchanges.btc_price_usd() * amount / 10**8 elif src in ['usd', 'dollars', 'dollar', 'ddollar', 'bucks', 'buck']: usd_value = amount elif src in ['cents', 'cent']: usd_value = amount / 100.0 else: for price, names in config.EXPENSIVE_STUFF: if util.string_contains_any(src, names, exhaustive_search=True, require_cmd_char=False): src = names[0] # replace name with the non-typo'd version usd_value = amount * price break if usd_value == None: return "Bad currency ({}). 0xbtc, 0xsatoshis, eth, wei, btc, mbtc, satoshis, and usd are supported.".format(src) if dest in ['0xbtc', '0xbitcoins', '0xbitcoin']: result = usd_value / token_price_usd elif dest in ['m0xbtc', 'milli0xbtc', 'milli0xbitcoin', 'milli0xbitcoins']: result = 1000.0 * usd_value / token_price_usd elif dest in ['0xsatoshis', '0xsatoshi', 'satoastis', 'satoasti', 'crumbs', 'crumb']: result = 10**8 * usd_value / token_price_usd elif dest in ['eth', 'ethereum', 'ether']: result = usd_value / apis.exchanges.eth_price_usd() elif dest == 'wei': result = 10**18 * usd_value / apis.exchanges.eth_price_usd() elif dest in ['btc', 'bitcoins', 'bitcoin']: result = usd_value / apis.exchanges.btc_price_usd() elif dest in ['mbtc', 'millibtc', 'millibitcoins', 'millibitcoin']: result = usd_value * 1000.0 / apis.exchanges.btc_price_usd() elif dest in ['satoshis', 'satoshi']: result = 10**8 * usd_value / apis.exchanges.btc_price_usd() elif dest in ['usd', 'dollars', 'dollar', 'ddollar', 'bucks', 'buck']: result = usd_value elif dest in ['cents', 'cent']: result = usd_value * 100.0 else: for price, names in config.EXPENSIVE_STUFF: if util.string_contains_any(dest, names, exhaustive_search=True, require_cmd_char=False): dest = names[0] # replaces provided name with the non-typo'd version result = usd_value / price break if result == None: return "Bad currency ({}). 0xbtc, 0xsatoshis, eth, wei, btc, mbtc, satoshis, and usd are supported.".format(dest) amount = prettify_decimals(amount) result = prettify_decimals(result) return "{} {} = **{}** {}".format(amount, src, result, dest)