# █ █ █ █▄▀ ▄▀█ █▀▄▀█ █▀█ █▀█ █ █
# █▀█ █ █ █ █▀█ █ ▀ █ █▄█ █▀▄ █▄█
# 🔒 Licensed under the GNU GPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# 👤 https://t.me/hikamoru
# meta developer: @hikamorumods
# meta banner: https://github.com/AmoreForever/assets/blob/master/Aeconv.jpg?raw=true
# meta pic: https://cdn-icons-png.flaticon.com/512/5670/5670084.png
import re
import logging
from bs4 import BeautifulSoup as bs
from requests import get
from asyncio import sleep
from asyncio.exceptions import TimeoutError
from hikkatl.tl.types import Message
from hikkatl.errors.common import AlreadyInConversationError
from .. import utils, loader
from ..inline.types import InlineCall
logger = logging.getLogger(__name__)
@loader.tds
class Aeconv(loader.Module):
"""Easy and fast valute converter"""
bot = "@exchange_rates_vsk_bot"
strings = {
"name": "Aeconv",
"wait": "💵 Converting...",
"no_args": "🖕 Where are the arguments?",
"unsupported": "🚫 Unsupported currency!",
"converted": "💸 Converted {}\n\n",
"already": "⚠️ Wait until the bot responds!",
"wrong_currency": "🤷♀️ Wrong currency",
"choose_currency": "📉 Choose currency",
"processing": "🕔 Processing...",
"done": "✅ Done!",
"already_in_conv": "⚠️ Already in conversation!",
}
strings_ru = {
"wait": "💵 Конвертирую...",
"no_args": "🖕 Где аргументы?",
"unsupported": "🚫 Валюта не поддерживается!",
"converted": "💸 Сконвертирован {}\n\n",
"already": "⚠️ Подожди пока бот ответит!",
"wrong_currency": "🤷♀️ Неправильная валюта",
"choose_currency": "📉 Выберите валюту",
"processing": "🕔 Обрабатываю...",
"done": "[Aeconv] ✅ Готово!",
"already_in_conv": "⚠️ Жди пока закончится процесс!",
}
strings_uz = {
"wait": "💵 Valyuta konvertatsiyasi...",
"no_args": "🖕 Argumetlar qayerda?",
"unsupported": "🚫 Valyuta qo'llab-quvvatlanmaydi!",
"converted": "💸 Konvertatsiya qilindi {}\n\n",
"already": "⚠️ Bot javob berishini kuting!",
"wrong_currency": "🤷♀️ Noto'g'ri valyuta",
"choose_currency": "📉 Valyutani tanlang",
"processing": "🕔 Qayta ishlayapman...",
"done": "[Aeconv] ✅ Tayyor!",
"already_in_conv": "⚠️ Protsess tugaguncha kuting!",
}
strings_de = { # i'm really sorry for translations, i'm not good at it
"wait": "💵 Konvertiere...",
"no_args": "🖕 Wo sind die Argumente?",
"unsupported": "🚫 Nicht unterstützte Währung!",
"converted": "💸 Konvertiert {}\n\n",
"already": "⚠️ Warten Sie, bis der Bot antwortet!",
"wrong_currency": "🤷♀️ Falsche Währung",
"choose_currency": "📉 Währung auswählen",
"processing": "🕔 Verarbeitung...",
"done": "[Aeconv] ✅ Fertig!",
"already_in_conv": "⚠️ Warten Sie, bis der Prozess beendet ist!",
}
strings_tr = { # i'm really sorry for translations, i'm not good at it
"wait": "💵 Dönüştürülüyor...",
"no_args": "🖕 Argümanlar nerede?",
"unsupported": "🚫 Desteklenmeyen para birimi!",
"converted": "💸 Dönüştürüldü {}\n\n",
"already": "⚠️ Bot cevap verene kadar bekleyin!",
"wrong_currency": "🤷♀️ Yanlış para birimi",
"choose_currency": "📉 Para birimini seçin",
"processing": "🕔 İşleniyor...",
"done": "[Aeconv] ✅ Tamam!",
"already_in_conv": "⚠️ İşlem bitene kadar bekleyin!",
}
strings_kk = { # i'm really sorry for translations, i'm not good at it
"wait": "💵 Валюта айырбасталуда...",
"no_args": "🖕 Аргументтер қайда?",
"unsupported": "🚫 Валюта қолдау көрсетілмейді!",
"converted": "💸 Айырбасталды {}\n\n",
"already": "⚠️ Бот жауап бергенге дейін күтіңіз!",
"wrong_currency": "🤷♀️ Дұрыс валюта емес",
"choose_currency": "📉 Валютаны таңдаңыз",
"processing": "🕔 Қайта өңдеу...",
"done": "[Aeconv] ✅ Тайық!",
"already_in_conv": "⚠️ Процесс аяқталғанда дейін күтіңіз!",
}
custom_emojis = {
"🇬🇧": "🇬🇧",
"🇺🇿": "🇺🇿",
"🇺🇸": "🇺🇸",
"🇷🇺": "🇷🇺",
"🇰🇿": "🇰🇿",
"🇪🇺": "🇪🇺",
"🇺🇦": "🇺🇦",
"🇹🇷": "🇹🇷",
"🇵🇱": "🇵🇱",
"🇰🇬": "🇰🇬",
"bit": "💰",
"eth": "🔹",
"ton": "💰"
}
currency_mapping = {
"EU": ("🇪🇺", "EUR"),
"GB": ("🇬🇧", "GBP"),
"UZ": ("🇺🇿", "UZS"),
"US": ("🇺🇸", "USD"),
"RU": ("🇷🇺", "RUB"),
"KZ": ("🇰🇿", "KZT"),
"UA": ("🇺🇦", "UAH"),
"PL": ("🇵🇱", "PLN"),
"TR": ("🇹🇷", "TRY"),
"KG": ("🇰🇬", "KGS")
}
currencies = [
"EUR", "GBP", "UZS", "USD", "RUB", "KZT", "UAH", "PLN", "TRY", "KGS", "TON", "ETH", "BTC"
]
currency_flags = {
"EUR": "🇪🇺",
"GBP": "🇬🇧",
"UZS": "🇺🇿",
"USD": "🇺🇸",
"RUB": "🇷🇺",
"KZT": "🇰🇿",
"UAH": "🇺🇦",
"PLN": "🇵🇱",
"TRY": "🇹🇷",
"KGS": "🇰🇬"
}
letters_stashing = {
"E": "cur_df",
"G": "cur_gh",
"P": "cur_nq",
"R": "cur_rs",
"S": "cur_rs",
"T": "cur_tu",
"U": "cur_tu",
}
def currencies_markup(self, argument: str = "") -> list:
return utils.chunks(
[
{
"text": f"{self.currency_flags[cur]} {cur}",
"callback": self.callback_4_currency,
"args": (cur,),
}
for cur in [
i
for i in self.currency_flags.keys()
if i.startswith(argument.upper())
]
if cur.startswith(argument.upper())
],
5,
)
async def client_ready(self, client, db):
await utils.dnd(client, self.bot, archive=True)
async def get_ton_in_rub(self, am, what: str = "uzs", cup: bool = False) -> str:
r = (
get(f"https://coinchefs.com/{what}/ton/{am}/")
if cup
else get(f"https://coinchefs.com/ton/{what}/{am}/")
)
soup = bs(r.text, "html.parser")
if result_div := soup.find('div', class_='convert-result'):
if result_text_div := result_div.find(
'div', class_='col-xs-10 col-sm-10 text-center result-text'
):
if value_element := result_text_div.b:
return value_element.get_text(strip=True)
else:
logger.debug("Value element not found")
else:
logger.debug("Result text div not found")
else:
logger.debug("Result div not found")
return None
async def callback_4_currency(self, call: InlineCall, currency: str):
try:
first_letter = currency[0]
await call.answer(self.strings["processing"], show_alert=True)
await call.delete()
async with self.client.conversation(self.bot) as conv:
m = await conv.send_message("/settings")
r = await conv.get_response()
await r.click(data=b'cur_menu')
await r.click(data=b'cur_curmenu')
await r.click(data=self.letters_stashing[first_letter])
await r.click(data=f"cur_{currency.upper()}")
await r.delete()
await m.delete()
await self.inline.bot.send_message(self.tg_id, self.strings["done"])
except AlreadyInConversationError:
await call.answer(self.strings["already_in_conv"], show_alert=True)
@loader.command(ru_doc="<количество> [валюта] должны быть разделены пробелом")
async def conv(self, message: Message):
""" [currency] should be separated by space"""
args = utils.get_args_raw(message)
if not args:
await utils.answer(message, self.strings["no_args"])
return
# if args.split(" ")[1].upper() not in self.currencies:
# await utils.answer(message, self.strings["wrong_currency"])
# return
await utils.answer(message, self.strings["wait"])
if "ton".lower() in args.lower():
li_args = args.split(" ")
ex_ = await self.get_ton_in_rub(li_args[0])
try:
async with message.client.conversation(self.bot) as conv:
msg = await conv.send_message(args) if "ton".lower() not in args.lower() else await conv.send_message(ex_)
r = await conv.get_response()
res = r.text
text_ = ""
text_ += (
self.strings["converted"].format(args)
if "ton".lower() not in args.lower()
else self.strings["converted"].format(f"{li_args[0]} TON")
)
for emoji, currency, *_ in self.currency_mapping.values():
if match := re.findall(f"{emoji} ?(.*) {currency}", res):
text_ += (
f"{self.custom_emojis.get(emoji)} {currency}: "
f"{match[0]}\n"
)
if match := re.findall(r"(.*) BTC", res):
text_ += f"\n{self.custom_emojis['bit']} BTC: {match[0]}\n"
if match := re.findall(r"(.*) ETH", res):
text_ += f"{self.custom_emojis['eth']} ETH: {match[0]}\n"
if ex_ := await self.get_ton_in_rub(args.split(" ")[0], args.split(" ")[1].lower(), True):
text_ += f"{self.custom_emojis['ton']} TON: {ex_.split(' = ')[1]}\n"
await utils.answer(message, text_)
await msg.delete()
await r.delete()
except AlreadyInConversationError:
await utils.answer(message, self.strings["already"])
except TimeoutError:
await utils.answer(message, self.strings["unsupported"])
except IndexError:
await utils.answer(message, self.strings["no_args"])
@loader.command(ru_doc="[валюта] | без аргументов покажет список валют для включения/выключения")
async def controlvalute(self, message: Message):
"""[currency] | without arguments will show list of currencies for enable/disable"""
if args := utils.get_args_raw(message):
await utils.answer(message, self.strings["choose_currency"], reply_markup=self.currencies_markup(args))
else:
return await utils.answer(message, self.strings["choose_currency"], reply_markup=self.currencies_markup())