Compare commits

...

2 commits

2 changed files with 70 additions and 115 deletions

182
main.py
View file

@ -4,12 +4,8 @@ import asyncio
import yaml import yaml
import hashlib import hashlib
import aiohttp
import json import json
import re
from word2number import w2n
from function.convert import Converter from function.convert import Converter
from function.format_number import format_number from function.format_number import format_number
@ -18,124 +14,84 @@ dp = Dispatcher()
@dp.message() @dp.message()
async def message_conv(message: types.Message):
with open('currency.json', 'r', encoding='utf-8') as f:
currency_json = json.load(f)
text = message.text.lower()
args = text.split()
number_match = re.match(r'\d+\.?\d*|\w+', args[0])
if number_match:
number_text = number_match.group(0)
try:
amount = float(number_text)
except ValueError:
try:
amount = float(w2n.word_to_num(number_text))
except ValueError:
await message.reply("Не удалось распознать числовое значение.")
return
else:
await message.reply("Не удалось найти числовое значение.")
return
if len(args) == 4:
source_currency_alias = args[1]
target_currency_alias = args[3]
elif len(args) == 3:
source_currency_alias = args[0]
target_currency_alias = args[2]
else:
await message.reply("Не удалось определить исходную и целевую валюту.")
return
source_currency_code = None
target_currency_code = None
for currency_code, aliases in currency_json.items():
if source_currency_alias in aliases:
source_currency_code = currency_code
if target_currency_alias in aliases:
target_currency_code = currency_code
if not source_currency_code or not target_currency_code or amount is None:
await message.reply("Не удалось найти сумму или валюты по указанным данным.")
return
conv = Converter()
conv.amount = amount
conv.from_currency = source_currency_code.upper()
conv.conv_currency = target_currency_code.upper()
conv.convert()
result = f'{format_number(conv.amount)} {conv.from_currency} = {conv.conv_amount} {conv.conv_currency}'
await message.reply(result)
async def inline_reply(result_id: str, title: str, description: str or None, inline_query: types.InlineQuery) -> None:
article = [None]
article[0] = types.InlineQueryResultArticle(
id=result_id,
title=title,
description=description,
input_message_content=types.InputTextMessageContent(
message_text=title
)
)
await inline_query.answer(
article,
cache_time=1,
is_personal=True,
)
@dp.inline_query() @dp.inline_query()
async def currency(inline_query: types.InlineQuery) -> None: async def currency(query: types.Message | types.InlineQuery) -> None:
global result global result
query = inline_query.query
args = query.split()
result_id = hashlib.md5(query.encode()).hexdigest()
conv = Converter()
try: try:
currency_json = json.load(open('currency.json', 'r', encoding='utf-8'))
text = query.query if isinstance(query, types.InlineQuery) else query.text
args = text.split()
result_id = hashlib.md5(text.encode()).hexdigest()
conv = Converter()
if len(args) <= 1: if len(args) <= 1:
await inline_reply(result_id, return await reply(result_id,
"2 or 3 arguments are required", "2 or 3 arguments are required.",
f"@shirino_bot USD RUB \n@shirino_bot 12 USD RUB", inline_query) "@shirino_bot USD RUB "
"\n@shirino_bot 12 USD RUB",
if len(args) == 3: query)
conv.amount = float(args[0].replace(',', '.')) if len(args) == 4:
conv.from_currency = args[1].upper() conv.amount = float(args[0])
conv.conv_currency = args[2].upper() from_currency_alias = args[1].lower()
conv.convert() conv_currency_alias = args[3].lower()
elif len(args) == 3:
conv.amount = float(args[0])
from_currency_alias = args[1].lower()
conv_currency_alias = args[2].lower()
elif len(args) == 2: elif len(args) == 2:
conv.from_currency = args[0].upper() from_currency_alias = args[0].lower()
conv.conv_currency = args[1].upper() conv_currency_alias = args[1].lower()
conv.convert() else:
return await reply(result_id, 'The source and target currency could not be determined.', None, query)
result = ( from_currency, conv_currency = None, None
f'{format_number(conv.amount)} {conv.from_currency} = '
f'{conv.conv_amount} {conv.conv_currency}' for currency_code, aliases in currency_json.items():
if from_currency_alias in aliases:
from_currency = currency_code
if conv_currency_alias in aliases:
conv_currency = currency_code
if from_currency and conv_currency:
break
if not from_currency or not conv_currency:
return await reply(result_id,
'The currency exchange rate could not be found.',
None,
query)
conv.from_currency = from_currency.upper()
conv.conv_currency = conv_currency.upper()
conv.convert()
result = f'{format_number(conv.amount)} {conv.from_currency} = {conv.conv_amount} {conv.conv_currency}'
return await reply(result_id, result, None, query)
except Exception as e:
print(e)
async def reply(result_id: str | None, title: str | None, desc, query: types.InlineQuery | types.Message) -> None:
if isinstance(query, types.InlineQuery):
article = [None]
article[0] = types.InlineQueryResultArticle(
id=result_id,
title=title,
description=desc,
input_message_content=types.InputTextMessageContent(
message_text=title
)
) )
except aiohttp.client_exceptions.ClientError: await query.answer(
await inline_reply(result_id, article,
"Rate-limit from the Telegram API, repeat the request later", cache_time=1,
None, is_personal=True,
inline_query) )
else:
await asyncio.sleep(1) await query.answer(title)
except Exception:
await inline_reply(result_id, "Invalid data format",
"@shirino_bot USD RUB \n@shirino_bot 12 USD RUB",
inline_query)
await inline_reply(result_id, result, None, inline_query)
async def main() -> None: async def main() -> None:

View file

@ -1,5 +1,4 @@
aiohttp~=3.9.5 aiohttp~=3.9.5
requests~=2.32.3 requests~=2.32.3
PyYAML~=6.0.1 PyYAML~=6.0.1
aiogram~=3.7.0 aiogram~=3.7.0
word2number~=1.1