bc Update plugin bc v1.3 (#178)

This commit is contained in:
Pentacene 2024-03-15 20:28:49 +08:00 committed by GitHub
parent 373c05d70e
commit 2f4b23f84f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 85 additions and 82 deletions

View File

@ -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:
def init() -> list:
""" INIT """
with urllib.request.urlopen(API) as response:
result = response.read()
try:
global CURRENCIES, DATA
currencies = []
data = {}
rate_data = xmltodict.parse(result)
rate_data = rate_data["gesmes:Envelope"]["Cube"]["Cube"]["Cube"]
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.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(action[0])
number = float(message.parameter[0])
except ValueError:
await message.edit("输入错误.\n-bc 数量 币种1 币种2")
await message.edit('输入错误.\nbc 数量 币种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
_from = message.parameter[1].upper().strip()
_to = message.parameter[2].upper().strip()
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()}"
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
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"
# from real currency to crypto
if currencies.count(_from) != 0:
usd_number = number * data["USD"] / data[_from]
try:
x_usdt_data = binanceclient.klines(f"{_to}USDT", "1m")[:1][0]
except ClientError:
await message.edit(f'Cannot find coinpair {_to}USDT')
return
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
if CURRENCIES.count(_to) != 0:
# from real currency to virtual currency
_to_USD_rate = DATA[_to] / DATA["USD"]
_to = "USDT"
# 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
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}")
# 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'))

View File

@ -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"