simple-budgeting-bot/bot.py
ChronosX88 e6a7a5e03b pew
2022-11-14 17:46:06 +03:00

112 lines
3.6 KiB
Python

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 = "<b>List of your budgets</b>: \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"<b>Budget name</b>: {b['budget_name']}\n<b>Current sum</b>: {b['budget_sum']}", parse_mode='HTML')
bot.infinity_polling()