PagerMaid_Plugins_Pyro/bc/main.py

113 lines
4.1 KiB
Python

""" 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}')