Thanks to visit codestin.com
Credit goes to github.com

Skip to content

lixelv-junior/cur-convert-bot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cnf.py:

from aiogram import Bot, Dispatcher, types
from envparse import env
from db import DB

sql = DB('db.db')

env.read_envfile('.env')

token = env('TELEGRAM')

bot = Bot(token)
dp = Dispatcher(bot)

def inline(lst: list, width: int = 6, f_t: str = '') -> types.InlineKeyboardMarkup:
    kb = types.InlineKeyboardMarkup(row_width=width, width=1200)
    button_lst = []
    for item in lst:
        button_lst.append(types.InlineKeyboardButton(text=item, callback_data=f_t+item))

    kb.add(*button_lst)

    return kb

def cur_(f_t: str = '') -> types.InlineKeyboardMarkup:
    return inline(['RUB', 'USD', 'EUR', 'UAH', 'BYN', 'KZT', 'GBP', 'CNY', 'CHF', 'JPY', 'CAD', 'AUD', 'PLN', 'INR', 'SEK', 'TRY', 'NOK', 'DKK', 'CZK', 'AZN', 'AMD', 'KGS', 'UZS', 'TJS', 'MDL', 'BRL', 'SGD', 'HKD', 'EGP', 'ZAR', 'BGN', 'QAR', 'AED', 'THB', 'VND', 'GEL', 'HUF', 'IDR', 'NZD', 'KRW', 'TMT', 'XDR', 'RSD', 'RON'], f_t=f_t)

start_ = "Привет\! Я был создан чтобы конвертировать валюты\," \
         "\nИспользуй команду */currency* чтобы конвертировать валюту"

cur_parse.py:

import requests

data = requests.get('https://www.cbr-xml-daily.ru/latest.js').json()

data = data["rates"]
data.update({'RUB': 1.0})

val_lst = data.keys()
print(val_lst)

cur_from = input('Выберете валюту, из которой вы конвертируете: ').upper()
val_from = float(input('Введите кол-во валюты: '))
cur_to = input('Выберете валюту, в которую конвертируете: ').upper()

result = (data[cur_to]/data[cur_from])*val_from

print(f'{result:.6g} {cur_to}')

db.py:

import sqlite3


class DB:
    def __init__(self, db_name):
        self.connect = sqlite3.connect(db_name)
        self.cursor = self.connect.cursor()
        self.do("""
CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY,
    name TEXT,
    state INTEGER DEFAULT 0,
    data TEXT,
    date DATETIME DEFAULT CURRENT_TIMESTAMP
    );""")

    def do(self, query: str, values=()) -> None:
        self.cursor.execute(query.replace('%s', '?'), values)
        self.connect.commit()

    def read(self, query: str, values=(), one=False) -> tuple:
        self.cursor.execute(query.replace('%s', '?'), values)
        return self.cursor.fetchall() if not one else self.cursor.fetchone()

    def user_exists(self, user_id: int) -> bool:
        return bool(self.read('SELECT id FROM user WHERE id = ?;', (user_id,)))

    def add_user(self, user_id: int, user_name: str):
        self.do('INSERT INTO user(id, name) VALUES(?, ?);', (user_id, user_name))

    def set_state(self, user_id: int, state: int) -> None:
        self.do('UPDATE user SET state = ? WHERE id = ?;', (state, user_id))

    def state(self, user_id: int) -> bool:
        return self.read('SELECT state FROM user WHERE id = ?;', (user_id,), one=True)[0]

    def set_data(self, user_id: int, data: str) -> None:
        self.do('UPDATE user SET data = ? WHERE id = ?;', (data, user_id))

    def get_data(self, user_id: int) -> str:
        return self.read('SELECT data FROM user WHERE id = ?;', (user_id,), one=True)[0]

main.py:

import requests
from aiogram import executor
from cnf import *


@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    if not sql.user_exists(message.from_user.id):
        sql.add_user(message.from_user.id, message.from_user.username)

    await message.answer(start_, parse_mode='MarkdownV2')

@dp.message_handler(commands=['c', 'cur', 'currency'])
async def cur(message: types.Message):
    await message.answer('Выберете *валюту*, из которой вы конвертируете: ', reply_markup=cur_(f_t='_'), parse_mode='MarkdownV2')
    sql.set_state(message.from_user.id, 1)

@dp.callback_query_handler(lambda call: sql.state(call.from_user.id) == 1)
async def cur_from(call: types.CallbackQuery):
    sql.set_data(call.from_user.id, call.data.replace('_', ''))
    await call.message.edit_text('Выберете *валюту*, в которую конвертируете: ', reply_markup=cur_(), parse_mode='MarkdownV2')
    # await call.message.delete()
    sql.set_state(call.from_user.id, 2)

@dp.callback_query_handler(lambda call: sql.state(call.from_user.id) == 2)
async def cur_to(call: types.CallbackQuery):
    data = sql.get_data(call.from_user.id)
    sql.set_data(call.from_user.id, f'{data}_{call.data}')
    await call.message.edit_text(f'Введите кол\-во *валюты:*', parse_mode='MarkdownV2')
    # await call.message.delete()
    sql.set_state(call.from_user.id, 3)

@dp.message_handler(lambda message: sql.state(message.from_user.id) == 3)
async def get_cur(message: types.Message):
    try:
        message.text = float(message.text.split(' ')[0].replace(' ', '').replace(',', '.'))
    except Exception as e:
        print(e)
        await message.answer('Некорректный ввод, попробуйте еще раз')
        return None

    data = requests.get('https://www.cbr-xml-daily.ru/latest.js').json()
    data = data["rates"]
    data.update({'RUB': 1.0})
    sub_data = sql.get_data(message.from_user.id)
    sub_data = sub_data.split('_')
    result = (data[sub_data[1]] / data[sub_data[0]]) * message.text
    await message.answer(f'`{message.text}` {sub_data[0]} \= `{result:.6g}` {sub_data[1]}', parse_mode='MarkdownV2')

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

About

This is bot for converting the currency

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages