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 return
else: if len(message.parameter) < 3:
prices = binanceclient.get_all_tickers() await message.edit('输入错误.\nbc 数量 币种1 币种2')
return
try:
number = float(message.parameter[0])
except ValueError:
await message.edit('输入错误.\nbc 数量 币种1 币种2')
return
_from = message.parameter[1].upper().strip()
_to = message.parameter[2].upper().strip()
# both are real currency
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
# from real currency to crypto
if currencies.count(_from) != 0:
usd_number = number * data["USD"] / data[_from]
try: try:
number = float(action[0]) x_usdt_data = binanceclient.klines(f"{_to}USDT", "1m")[:1][0]
except ValueError: except ClientError:
await message.edit("输入错误.\n-bc 数量 币种1 币种2") await message.edit(f'Cannot find coinpair {_to}USDT')
return return
_from = action[1].upper().strip() await message.edit((
_to = action[2].upper().strip() f'{message.parameter[0]} **{_from}** = '
front_text = "" f'{1 / float(x_usdt_data[1]) * usd_number:.8f} **{_to}**\n'
text = "" f'{message.parameter[0]} **{_from}** = '
rear_text = "" f'{usd_number:.2f} **USD**'))
price = 0.0 return
_to_USD_rate = 0.0
# 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
if (CURRENCIES.count(_from) != 0) and (CURRENCIES.count(_to) != 0): # both crypto
# both are real currency try:
text = f"{action[0]} {action[1].upper().strip()} = {float(action[0])*DATA[_to]/DATA[_from]:.2f} {action[2].upper().strip()}" from_to_data = binanceclient.klines(f"{_from}{_to}", "1m")[:1][0]
except ClientError:
else: await message.edit(f'Cannot find coinpair {_from}{_to}')
if CURRENCIES.count(_from) != 0: return
# from virtual currency to real currency await message.edit((
number = number * DATA["USD"] / DATA[_from] f'{message.parameter[0]} **{_from}** = '
_from = "USDT" f'{float(from_to_data[1]) * number} **{_to}**\n'))
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}")

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"
@ -1101,4 +1101,4 @@
"des": "" "des": ""
} }
] ]
} }