mirror of
https://github.com/TeamPGM/PagerMaid_Plugins_Pyro.git
synced 2024-11-16 13:01:20 +00:00
110 lines
4.2 KiB
Python
110 lines
4.2 KiB
Python
""" Pagermaid currency exchange rates plugin. Plugin by @fruitymelon and @xtaodada"""
|
|
|
|
from json.decoder import JSONDecodeError
|
|
|
|
from pagermaid import log
|
|
from pagermaid.utils import alias_command
|
|
from pagermaid.enums import Message
|
|
from pagermaid.services import client, scheduler
|
|
from pagermaid.hook import Hook
|
|
from pagermaid.listener import listener
|
|
from pagermaid.config import Config
|
|
|
|
|
|
class Rate:
|
|
def __init__(self):
|
|
if Config.LANGUAGE == "en":
|
|
self.lang_rate = {
|
|
"des": "Currency exchange rate plugin", "arg": "<from_> <to_> <NUM>",
|
|
"help": "Currency exchange rate plugin\n\n"
|
|
f"Usage: `,{alias_command('rate')} <from_> <to_> <NUM> where <NUM> is "
|
|
"optional`\n\nAvailable currencies: \n",
|
|
"nc": "is not available.\n\nAvailable currencies: \n",
|
|
"notice": "Data are updated daily.",
|
|
"warning": "Data are updated daily."}
|
|
else:
|
|
self.lang_rate = {
|
|
"des": "货币汇率插件", "arg": "<from_> <to_> <NUM>",
|
|
"help": "这是货币汇率插件\n\n"
|
|
f"使用方法: `,{alias_command('rate')} <from_> <to_> <NUM>,其中 <NUM> 是可省略的`\n\n"
|
|
"支持货币: \n",
|
|
"nc": "不是支持的货币. \n\n支持货币: \n",
|
|
"notice": "数据每日八点更新",
|
|
"warning": "数据每日八点更新"}
|
|
self.host = "https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest"
|
|
self.api = f"{self.host}/currencies.json"
|
|
self.currencies = []
|
|
self.data = {}
|
|
|
|
async def get_data(self):
|
|
try:
|
|
req = await client.get(self.api, follow_redirects=True)
|
|
assert req.status_code == 200
|
|
self.data = req.json()
|
|
for key in list(enumerate(self.data)):
|
|
self.currencies.append(key[1].upper())
|
|
self.currencies.sort()
|
|
except JSONDecodeError as e:
|
|
await log(f"Warning: plugin rate failed to refresh rates data. {e}")
|
|
|
|
async def get_rate(self, from_: str, to_: str, nb: float):
|
|
endpoint = f"{self.host}/currencies/{from_.lower()}/{to_.lower()}.json"
|
|
try:
|
|
req = await client.get(endpoint, follow_redirects=True)
|
|
rate__data = req.json()
|
|
return f'`{from_} : {to_} = {nb} : {round(nb * rate__data[to_.lower()], 4)}`' \
|
|
f'\n\n' \
|
|
f'{self.lang_rate["warning"]}'
|
|
except Exception as e:
|
|
return str(e)
|
|
|
|
|
|
rate_data = Rate()
|
|
|
|
|
|
@Hook.on_startup()
|
|
async def init_rate():
|
|
await rate_data.get_data()
|
|
|
|
|
|
@scheduler.scheduled_job("cron", hour="8", id="refresher_rate")
|
|
async def refresher_rate():
|
|
await rate_data.get_data()
|
|
|
|
|
|
@listener(command="rate",
|
|
description=rate_data.lang_rate["des"],
|
|
parameters=rate_data.lang_rate["arg"])
|
|
async def rate(message: Message):
|
|
global rate_data
|
|
if not rate_data.data:
|
|
await rate_data.get_data()
|
|
if not rate_data.data:
|
|
return
|
|
if not message.arguments:
|
|
await message.edit(f"{rate_data.lang_rate['help']}`{', '.join(rate_data.currencies)}`\n\n"
|
|
f"{rate_data.lang_rate['notice']}")
|
|
return
|
|
nb = 1.0
|
|
if len(message.parameter) not in [3, 2]:
|
|
await message.edit(f"{rate_data.lang_rate['help']}`{', '.join(rate_data.currencies)}`"
|
|
f"\n\n{rate_data.lang_rate['notice']}")
|
|
return
|
|
from_ = message.parameter[0].upper().strip()
|
|
to_ = message.parameter[1].upper().strip()
|
|
try:
|
|
nb = nb if len(message.parameter) == 2 else float(message.parameter[2].strip())
|
|
except Exception:
|
|
nb = 1.0
|
|
if rate_data.currencies.count(from_) == 0:
|
|
await message.edit(f"{from_}{rate_data.lang_rate['nc']}`{', '.join(rate_data.currencies)}`")
|
|
return
|
|
if rate_data.currencies.count(to_) == 0:
|
|
await message.edit(f"{to_}{rate_data.lang_rate['nc']}{', '.join(rate_data.currencies)}`")
|
|
return
|
|
try:
|
|
text = await rate_data.get_rate(from_, to_, nb)
|
|
except Exception as e:
|
|
text = str(e)
|
|
await message.edit(text)
|