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 from sys import executable
import urllib.request import urllib.request
from pyrogram import Client from pyrogram import Client
from pagermaid.listener import listener from pagermaid.listener import listener
from pagermaid.utils import Message, pip_install from pagermaid.utils import Message, pip_install
pip_install("python-binance", alias="binance") pip_install("binance-connector", alias="binance")
pip_install("xmltodict") pip_install("xmltodict")
from binance.client import Client from binance.spot import Spot
from binance.error import ClientError
import xmltodict import xmltodict
API = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" API = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
CURRENCIES = []
DATA = {}
BINANCE_API_KEY = "8PDfQ2lSIyHPWdNAHNIaIoNy3MiiMuvgwYADbmtsKo867B0xnIhIGjPULsOtvMRk"
BINANCE_API_SECRET = "tbUiyZ94l0zpYOlKs3eO1dvLNMOSbOb2T1T0eT0I1eogH9Fh8Htvli05eZ1iDvra"
def init() -> list:
def init() -> None: """ INIT """
"""INIT"""
with urllib.request.urlopen(API) as response: with urllib.request.urlopen(API) as response:
result = response.read() result = response.read()
try: currencies = []
global CURRENCIES, DATA data = {}
rate_data = xmltodict.parse(result) 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: for i in rate_data:
CURRENCIES.append(i["@currency"]) currencies.append(i['@currency'])
DATA[i["@currency"]] = float(i["@rate"]) data[i['@currency']] = float(i['@rate'])
CURRENCIES.sort() currencies.sort()
except Exception as e: return [currencies, data]
raise e
@listener(command="bc", description="coins", parameters="[num] [coin1] [coin2]") @listener(command="bc", description="coins", parameters="[num] [coin1] [coin2]")
async def coin(_: Client, message: Message) -> None: async def coin(_: Client, message: Message) -> None:
"""coin change""" """coin change"""
init() currencies, data = init()
action = message.arguments.split() binanceclient = Spot()
binanceclient = Client(BINANCE_API_KEY, BINANCE_API_SECRET) nowtimestamp = binanceclient.time()
if len(action) < 3: nowtime = datetime.fromtimestamp(float(nowtimestamp['serverTime'])/1000)
await message.edit("输入错误.\n-bc 数量 币种1 币种2") 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 return
else:
prices = binanceclient.get_all_tickers()
try: try:
number = float(action[0]) number = float(message.parameter[0])
except ValueError: except ValueError:
await message.edit("输入错误.\n-bc 数量 币种1 币种2") await message.edit('输入错误.\nbc 数量 币种1 币种2')
return return
_from = action[1].upper().strip() _from = message.parameter[1].upper().strip()
_to = action[2].upper().strip() _to = message.parameter[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 # 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: # from real currency to crypto
if CURRENCIES.count(_from) != 0: if currencies.count(_from) != 0:
# from virtual currency to real currency usd_number = number * data["USD"] / data[_from]
number = number * DATA["USD"] / DATA[_from] try:
_from = "USDT" x_usdt_data = binanceclient.klines(f"{_to}USDT", "1m")[:1][0]
front_text = f"{action[0]} {action[1]} = \n" 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 crypto to real currency
# from real currency to virtual currency if currencies.count(_to) != 0:
_to_USD_rate = DATA[_to] / DATA["USD"] usd_number = number * data[_to] / data["USD"]
_to = "USDT" 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: # both crypto
if _a["symbol"] == str(f"{_from}{_to}"): try:
price = _a["price"] from_to_data = binanceclient.klines(f"{_from}{_to}", "1m")[:1][0]
if _to == "USDT": except ClientError:
if action[2].upper().strip() == "USDT": await message.edit(f'Cannot find coinpair {_from}{_to}')
rear_text = f'\n= {number * float(price) * DATA["CNY"]/DATA["USD"]:.2f} CNY' return
else: await message.edit((
rear_text = f"\n= {number * float(price) * _to_USD_rate:.2f} {action[2].upper().strip()}" f'{message.parameter[0]} **{_from}** = '
if float(price) < 1: f'{float(from_to_data[1]) * number} **{_to}**\n'))
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}")

View File

@ -82,10 +82,10 @@
}, },
{ {
"name": "bc", "name": "bc",
"version": "1.252", "version": "1.3",
"section": "chat", "section": "chat",
"maintainer": "Pentacene", "maintainer": "Pentacene",
"size": "4.171 kb", "size": "4.116 kb",
"supported": true, "supported": true,
"des_short": "查询含虚拟货币在内的货币价格", "des_short": "查询含虚拟货币在内的货币价格",
"des": "命令bc 数量 货币1 货币2" "des": "命令bc 数量 货币1 货币2"