-
Notifications
You must be signed in to change notification settings - Fork 159
/
Copy pathserver.py
105 lines (82 loc) · 3.87 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
103
104
105
"""Сервер Telegram бота, запускаемый непосредственно"""
import logging
import os
import aiohttp
from aiogram import Bot, Dispatcher, executor, types
import exceptions
import expenses
from categories import Categories
from middlewares import AccessMiddleware
logging.basicConfig(level=logging.INFO)
API_TOKEN = os.getenv("TELEGRAM_API_TOKEN")
PROXY_URL = os.getenv("TELEGRAM_PROXY_URL")
PROXY_AUTH = aiohttp.BasicAuth(
login=os.getenv("TELEGRAM_PROXY_LOGIN"),
password=os.getenv("TELEGRAM_PROXY_PASSWORD")
)
ACCESS_ID = os.getenv("TELEGRAM_ACCESS_ID")
bot = Bot(token=API_TOKEN, proxy=PROXY_URL, proxy_auth=PROXY_AUTH)
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} руб на {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)