import telebot import dataset import re bot = telebot.TeleBot("5706001568:AAEldOutDkegAnc3rrIB0nuswTD6xBRy8nk") db = dataset.connect('sqlite:///mydatabase.db') budgets_bucket = db.create_table('budgets') # budgets_bucket = db['budgets'] def extract_args(arg): if len(arg.split()) == 1: return list() else: return arg.split()[1:] @bot.message_handler(commands=['start', 'help']) def send_welcome(message): bot.reply_to(message, "Howdy, how are you doing?") @bot.message_handler(commands=['create']) def create_budget(message): args = extract_args(message.text) if len(args) == 0: bot.send_message(message.chat.id, "No arguments provided") return if budgets_bucket.find_one(user=message.from_user.id, budget_name=' '.join(args)) is not None: bot.send_message(message.chat.id, "Budget with this name already exists") return budgets_bucket.insert( { 'user': message.from_user.id, 'budget_name': ' '.join(args), 'budget_sum': 0 } ) bot.reply_to(message, "Budget has been successfully created!") @bot.message_handler(commands=['list']) def list_budgets(message): user_budgets_iter = budgets_bucket.find(user=message.from_user.id, order_by='budget_name') user_budgets = list(user_budgets_iter) if len(user_budgets) == 0: bot.send_message(message.chat.id, "No budgets there") return list_budgets_str = "List of your budgets: \n" for i in range(len(user_budgets)): list_budgets_str += f"• [{str(i+1)}] {user_budgets[i]['budget_name']}: {user_budgets[i]['budget_sum']}\n" bot.send_message(message.chat.id, list_budgets_str, parse_mode='HTML') @bot.message_handler(commands=['remove']) def remove_budget(message): args = extract_args(message.text) if len(args) == 0: bot.send_message(message.chat.id, "No arguments provided") return budget_id = int(args[0]) b = find_budget(message.from_user.id, budget_id) if b is None: bot.send_message(message.chat.id, "Such budget doesn't exist") return budgets_bucket.delete(id=b['id']) bot.reply_to(message, "Budget has been successfully removed!") @bot.message_handler(regexp=r'^[+-][0-9]+(,\s?\w+\s?[\s|\w]*)*') def simple_message_handler(message): m = re.findall(r'[+-]|\d+|\w+', message.text) op = m[0] amount = int(m[1]) budget_name = 'default' if len(m) > 2: budget_name = str(' '.join(m[2:])) if budget_name == 'default': budgets_bucket.insert_ignore( { 'user': message.from_user.id, 'budget_name': budget_name, 'budget_sum': 0 }, ['budget_name'] ) b = budgets_bucket.find_one(user=message.from_user.id, budget_name=budget_name) if b is None: bot.send_message(message.chat.id, "no fucking way") return new_sum = 0 if op == '-': new_sum = b['budget_sum']-amount elif op == '+': new_sum = b['budget_sum']+amount budgets_bucket.update({'id':b['id'], 'budget_sum':new_sum}, ['id']) bot.send_message(message.chat.id, f'Budget sum has been updated! New sum is {new_sum}.') def find_budget(user_id: int, budget_id: int): budgets = list(budgets_bucket.find(user=user_id, order_by='budget_name')) if len(budgets) == 0 or (budget_id-1 > len(budgets)-1): return None return budgets[budget_id-1] @bot.message_handler(commands=['info']) def budget_info(message): args = extract_args(message.text) if len(args) == 0: bot.send_message(message.chat.id, "No arguments provided") return budget_id = int(args[0]) b = find_budget(message.from_user.id, budget_id) if b is None: bot.send_message(message.chat.id, "Such budget doesn't exist") return bot.send_message(message.chat.id, f"Budget name: {b['budget_name']}\nCurrent sum: {b['budget_sum']}", parse_mode='HTML') bot.infinity_polling()