""" PagerMaid Plugin Coin by Pentacene """ # ______ _ # | ___ \ | | # | |_/ /__ _ __ | |_ __ _ ___ ___ _ __ ___ # | __/ _ \ '_ \| __/ _` |/ __/ _ \ '_ \ / _ \ # | | | __/ | | | || (_| | (_| __/ | | | __/ # \_| \___|_| |_|\__\__,_|\___\___|_| |_|\___| # from asyncio import sleep 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("xmltodict") from binance.client import Client 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""" 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 @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") return else: prices = binanceclient.get_all_tickers() try: number = float(action[0]) except ValueError: await message.edit("输入错误.\n-bc 数量 币种1 币种2") 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"{front_text}{text}{rear_text}")