From c3ac15017f70067d464bebe46ada87a44e088811 Mon Sep 17 00:00:00 2001 From: Pentacene <101155162+Pentacene-cyou@users.noreply.github.com> Date: Fri, 15 Mar 2024 20:26:32 +0800 Subject: [PATCH] bc: Update plugin bc v1.3 (#21) --- bc.py | 166 +++++++++++++++++++++++++++--------------------------- list.json | 4 +- 2 files changed, 86 insertions(+), 84 deletions(-) diff --git a/bc.py b/bc.py index 75db387..4d6cbb3 100644 --- a/bc.py +++ b/bc.py @@ -7,107 +7,109 @@ # \_| \___|_| |_|\__\__,_|\___\___|_| |_|\___| # -from asyncio import sleep +from datetime import datetime from sys import executable import urllib.request -from telethon.tl.custom.message import Message -from pagermaid import version +from pyrogram import Client from pagermaid.listener import listener -from pagermaid.utils import execute, alias_command, pip_install +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: +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(is_plugin=True, outgoing=True, command=alias_command("bc"), description="coins", parameters=" ") async def coin(context: Message) -> None: - """ coin change """ - init() - action = context.arguments.split() - binanceclient = Client(BINANCE_API_KEY, BINANCE_API_SECRET) - if len(action) < 3: - await context.edit('输入错误.\n-bc 数量 币种1 币种2') + """coin change""" + currencies, data = init() + binanceclient = Spot() + nowtimestamp = binanceclient.time() + nowtime = datetime.fromtimestamp(float(nowtimestamp['serverTime'])/1000) + if len(context.parameter) == 0: + btc_usdt_data = binanceclient.klines("BTCUSDT", "1m")[:1][0] + eth_usdt_data = binanceclient.klines("ETHUSDT", "1m")[:1][0] + await context.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 - else: - prices = binanceclient.get_all_tickers() + if len(context.parameter) < 3: + await context.edit('输入错误.\nbc 数量 币种1 币种2') + return + try: + number = float(context.parameter[0]) + except ValueError: + await context.edit('输入错误.\nbc 数量 币种1 币种2') + return + _from = context.parameter[1].upper().strip() + _to = context.parameter[2].upper().strip() + + # both are real currency + if (currencies.count(_from) != 0) and (currencies.count(_to) != 0): + await context.edit(( + f'{context.parameter[0]} {context.parameter[1].upper().strip()} =' + f'{number * data[_to] / data[_from]:.2f} ' + f'{context.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 context.edit('输入错误.\n-bc 数量 币种1 币种2') + x_usdt_data = binanceclient.klines(f"{_to}USDT", "1m")[:1][0] + except ClientError: + await context.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 + await context.edit(( + f'{context.parameter[0]} **{_from}** = ' + f'{1 / float(x_usdt_data[1]) * usd_number:.8f} **{_to}**\n' + f'{context.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 context.edit(f'Cannot find coinpair {_from}USDT') + return + await context.edit(( + f'{context.parameter[0]} **{_from}** = ' + f'{float(x_usdt_data[1]) * usd_number:.2f} **{_to}**\n' + f'{context.parameter[0]} **{_from}** = ' + f'{float(x_usdt_data[1]):.2f} **USD**')) + return - 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 context.edit(f'{front_text}{text}{rear_text}') + # both crypto + try: + from_to_data = binanceclient.klines(f"{_from}{_to}", "1m")[:1][0] + except ClientError: + await context.edit(f'Cannot find coinpair {_from}{_to}') + return + await context.edit(( + f'{context.parameter[0]} **{_from}** = ' + f'{float(from_to_data[1]) * number} **{_to}**\n')) diff --git a/list.json b/list.json index 394003a..65d2178 100644 --- a/list.json +++ b/list.json @@ -432,10 +432,10 @@ }, { "name": "bc", - "version": "1.232", + "version": "1.3", "section": "chat", "maintainer": "Pentacene", - "size": "8.0 kb", + "size": "4.14 kb", "supported": true, "des-short": "查询含虚拟货币在内的货币价格", "des": "命令:bc 数量 货币1 货币2"