diff --git a/bc/main.py b/bc/main.py index a4e1cd69..d4a7f3c8 100644 --- a/bc/main.py +++ b/bc/main.py @@ -7,104 +7,107 @@ # \_| \___|_| |_|\__\__,_|\___\___|_| |_|\___| # -from asyncio import sleep +from datetime import datetime from sys import executable import urllib.request from pyrogram import Client from pagermaid.listener import listener from pagermaid.utils import Message, pip_install -pip_install("python-binance", alias="binance") +pip_install("binance-connector", alias="binance") pip_install("xmltodict") -from binance.client import Client +from binance.spot import Spot +from binance.error import ClientError import xmltodict - API = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" -CURRENCIES = [] -DATA = {} -BINANCE_API_KEY = "8PDfQ2lSIyHPWdNAHNIaIoNy3MiiMuvgwYADbmtsKo867B0xnIhIGjPULsOtvMRk" -BINANCE_API_SECRET = "tbUiyZ94l0zpYOlKs3eO1dvLNMOSbOb2T1T0eT0I1eogH9Fh8Htvli05eZ1iDvra" - -def init() -> None: - """INIT""" +def init() -> list: + """ INIT """ with urllib.request.urlopen(API) as response: result = response.read() - try: - global CURRENCIES, DATA - rate_data = xmltodict.parse(result) - rate_data = rate_data["gesmes:Envelope"]["Cube"]["Cube"]["Cube"] - for i in rate_data: - CURRENCIES.append(i["@currency"]) - DATA[i["@currency"]] = float(i["@rate"]) - CURRENCIES.sort() - except Exception as e: - raise e - + currencies = [] + data = {} + rate_data = xmltodict.parse(result) + rate_data = rate_data['gesmes:Envelope']['Cube']['Cube']['Cube'] + for i in rate_data: + currencies.append(i['@currency']) + data[i['@currency']] = float(i['@rate']) + currencies.sort() + return [currencies, data] @listener(command="bc", description="coins", parameters="[num] [coin1] [coin2]") async def coin(_: Client, message: Message) -> None: """coin change""" - init() - action = message.arguments.split() - binanceclient = Client(BINANCE_API_KEY, BINANCE_API_SECRET) - if len(action) < 3: - await message.edit("输入错误.\n-bc 数量 币种1 币种2") + currencies, data = init() + binanceclient = Spot() + nowtimestamp = binanceclient.time() + nowtime = datetime.fromtimestamp(float(nowtimestamp['serverTime'])/1000) + if len(message.parameter) == 0: + btc_usdt_data = binanceclient.klines("BTCUSDT", "1m")[:1][0] + eth_usdt_data = binanceclient.klines("ETHUSDT", "1m")[:1][0] + await message.edit(( + f'{nowtime.strftime("%Y-%m-%d %H:%M:%S")} UTC\n' + f'**1 BTC** = {btc_usdt_data[1]} USDT ' + f'\n' + f'**1 ETH** = {eth_usdt_data[1]} USDT ')) + return + if len(message.parameter) < 3: + await message.edit('输入错误.\nbc 数量 币种1 币种2') return - else: - prices = binanceclient.get_all_tickers() + try: + number = float(message.parameter[0]) + except ValueError: + await message.edit('输入错误.\nbc 数量 币种1 币种2') + return + _from = message.parameter[1].upper().strip() + _to = message.parameter[2].upper().strip() + + # both are real currency + if (currencies.count(_from) != 0) and (currencies.count(_to) != 0): + await message.edit(( + f'{message.parameter[0]} {message.parameter[1].upper().strip()} =' + f'{number * data[_to] / data[_from]:.2f} ' + f'{message.parameter[2].upper().strip()}')) + return + + # from real currency to crypto + if currencies.count(_from) != 0: + usd_number = number * data["USD"] / data[_from] try: - number = float(action[0]) - except ValueError: - await message.edit("输入错误.\n-bc 数量 币种1 币种2") + x_usdt_data = binanceclient.klines(f"{_to}USDT", "1m")[:1][0] + except ClientError: + await message.edit(f'Cannot find coinpair {_to}USDT') return - _from = action[1].upper().strip() - _to = action[2].upper().strip() - front_text = "" - text = "" - rear_text = "" - price = 0.0 - _to_USD_rate = 0.0 - - if (CURRENCIES.count(_from) != 0) and (CURRENCIES.count(_to) != 0): - # both are real currency - text = f"{action[0]} {action[1].upper().strip()} = {float(action[0])*DATA[_to]/DATA[_from]:.2f} {action[2].upper().strip()}" - - else: - if CURRENCIES.count(_from) != 0: - # from virtual currency to real currency - number = number * DATA["USD"] / DATA[_from] - _from = "USDT" - front_text = f"{action[0]} {action[1]} = \n" - - if CURRENCIES.count(_to) != 0: - # from real currency to virtual currency - _to_USD_rate = DATA[_to] / DATA["USD"] - _to = "USDT" - - for _a in prices: - if _a["symbol"] == str(f"{_from}{_to}"): - price = _a["price"] - if _to == "USDT": - if action[2].upper().strip() == "USDT": - rear_text = f'\n= {number * float(price) * DATA["CNY"]/DATA["USD"]:.2f} CNY' - else: - rear_text = f"\n= {number * float(price) * _to_USD_rate:.2f} {action[2].upper().strip()}" - if float(price) < 1: - text = f"{number} {_from} = {number * float(price):.8f} {_to}" - else: - text = f"{number} {_from} = {number * float(price):.2f} {_to}" - break - elif _a["symbol"] == str(f"{_to}{_from}"): - price = 1 / float(_a["price"]) - text = f"{number} {_from} = {number * float(price):.8f} {_to}" - break - else: - price = None - - if price is None: - text = f"Cannot find coinpair {action[1].upper().strip()}{action[2].upper().strip()} or {action[2].upper().strip()}{action[1].upper().strip()}" + await message.edit(( + f'{message.parameter[0]} **{_from}** = ' + f'{1 / float(x_usdt_data[1]) * usd_number:.8f} **{_to}**\n' + f'{message.parameter[0]} **{_from}** = ' + f'{usd_number:.2f} **USD**')) + return + + # from crypto to real currency + if currencies.count(_to) != 0: + usd_number = number * data[_to] / data["USD"] + try: + x_usdt_data = binanceclient.klines(f"{_from}USDT", "1m")[:1][0] + except ClientError: + await message.edit(f'Cannot find coinpair {_from}USDT') + return + await message.edit(( + f'{message.parameter[0]} **{_from}** = ' + f'{float(x_usdt_data[1]) * usd_number:.2f} **{_to}**\n' + f'{message.parameter[0]} **{_from}** = ' + f'{float(x_usdt_data[1]):.2f} **USD**')) + return - await message.edit(f"{front_text}{text}{rear_text}") + # both crypto + try: + from_to_data = binanceclient.klines(f"{_from}{_to}", "1m")[:1][0] + except ClientError: + await message.edit(f'Cannot find coinpair {_from}{_to}') + return + await message.edit(( + f'{message.parameter[0]} **{_from}** = ' + f'{float(from_to_data[1]) * number} **{_to}**\n')) diff --git a/list.json b/list.json index 0b48bade..3b6d3a32 100644 --- a/list.json +++ b/list.json @@ -82,10 +82,10 @@ }, { "name": "bc", - "version": "1.252", + "version": "1.3", "section": "chat", "maintainer": "Pentacene", - "size": "4.171 kb", + "size": "4.116 kb", "supported": true, "des_short": "查询含虚拟货币在内的货币价格", "des": "命令:bc 数量 货币1 货币2" @@ -1101,4 +1101,4 @@ "des": "" } ] -} \ No newline at end of file +}