forked from alexey-goloburdin/telegram-finance-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
102 lines (78 loc) · 3.69 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""Сервер Telegram бота, запускаемый непосредственно"""
import logging
import os
from aiogram import Bot, Dispatcher, executor, types
from dotenv import load_dotenv
import exceptions
import expenses
from categories import Categories
from middlewares import AccessMiddleware
logging.basicConfig(level=logging.INFO)
load_dotenv()
API_TOKEN = os.getenv("TELEGRAM_API_TOKEN")
ACCESS_ID = os.getenv("TELEGRAM_ACCESS_ID")
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(AccessMiddleware(ACCESS_ID))
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):
"""Отправляет приветственное сообщение и помощь по боту"""
await message.answer(
"Бот для учёта финансов\n\n"
"Добавить расход: 250 такси\n"
"Сегодняшняя статистика: /today\n"
"За текущий месяц: /month\n"
"Последние внесённые расходы: /expenses\n"
"Категории трат: /categories")
@dp.message_handler(lambda message: message.text.startswith('/del'))
async def del_expense(message: types.Message):
"""Удаляет одну запись о расходе по её идентификатору"""
row_id = int(message.text[4:])
expenses.delete_expense(row_id)
answer_message = "Удалил"
await message.answer(answer_message)
@dp.message_handler(commands=['categories'])
async def categories_list(message: types.Message):
"""Отправляет список категорий расходов"""
categories = Categories().get_all_categories()
answer_message = "Категории трат:\n\n* " +\
("\n* ".join([c.name+' ('+", ".join(c.aliases)+')' for c in categories]))
await message.answer(answer_message)
@dp.message_handler(commands=['today'])
async def today_statistics(message: types.Message):
"""Отправляет сегодняшнюю статистику трат"""
answer_message = expenses.get_today_statistics()
await message.answer(answer_message)
@dp.message_handler(commands=['month'])
async def month_statistics(message: types.Message):
"""Отправляет статистику трат текущего месяца"""
answer_message = expenses.get_month_statistics()
await message.answer(answer_message)
@dp.message_handler(commands=['expenses'])
async def list_expenses(message: types.Message):
"""Отправляет последние несколько записей о расходах"""
last_expenses = expenses.last()
if not last_expenses:
await message.answer("Расходы ещё не заведены")
return
last_expenses_rows = [
f"{expense.amount} юсд. на {expense.category_name} — нажми "
f"/del{expense.id} для удаления"
for expense in last_expenses]
answer_message = "Последние сохранённые траты:\n\n* " + "\n\n* "\
.join(last_expenses_rows)
await message.answer(answer_message)
@dp.message_handler()
async def add_expense(message: types.Message):
"""Добавляет новый расход"""
try:
expense = expenses.add_expense(message.text)
except exceptions.NotCorrectMessage as e:
await message.answer(str(e))
return
answer_message = (
f"Добавлены траты {expense.amount} gel на {expense.category_name}.\n\n"
f"{expenses.get_today_statistics()}")
await message.answer(answer_message)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)