From ceb4536118efd96c5627f567d887a8054194cd2a Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Sat, 22 Oct 2022 00:24:19 +0700 Subject: [PATCH] analisys --- analysismonth.py | 117 +++++++++ database.sqlite | Bin 16384 -> 16384 bytes database/models.py | 4 +- diagrams/addanalysismonth.png | Bin 0 -> 21168 bytes diagrams/diagramallmonth.png | Bin 0 -> 19226 bytes diagrams/rmanalysismonth.png | Bin 0 -> 23780 bytes main.py | 466 ++++++++++++++++++---------------- 7 files changed, 361 insertions(+), 226 deletions(-) create mode 100644 analysismonth.py create mode 100644 diagrams/addanalysismonth.png create mode 100644 diagrams/diagramallmonth.png create mode 100644 diagrams/rmanalysismonth.png diff --git a/analysismonth.py b/analysismonth.py new file mode 100644 index 0000000..ed739a9 --- /dev/null +++ b/analysismonth.py @@ -0,0 +1,117 @@ +import currencyes +from bot import bot +import matplotlib.pyplot as plt +from database.models import User, Transaction +import datetime +import locales + + +# функция для обработки аналитики и построения диаграмм +def analysis_month(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.today().strftime('%m') + ) + incomes = 0 + consuptions = 0 + for i in transactions: + if i.type == 'incom': + incomes += i.sum + elif i.type == 'consuption': + consuptions += i.sum + + vals = [incomes, consuptions] + labels = [] + + if locales.LOCALE == 'ru': + labels = ['Доходы', 'Расходы'] + elif locales.LOCALE == 'en': + labels = ['Incomes', 'Consuptions'] + + exp = (0.1, 0) + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/diagramallmonth.png') + mes = labels[0] + ' : +' + str(vals[0]) + '\n' + labels[1] + ' : -' + str(vals[1]) + '\n' + with open('diagrams/diagramallmonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) + + +def analysis_month_rm(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'consuption' + ) + vals = [] + labels = [] + for i in transactions: + if have_in_vals(i.category, labels)[0]: + pos = have_in_vals(i.category, labels)[1] + vals[pos] += i.sum + else: + labels.append(i.category) + vals.append(i.sum) + + exp = [] + for _ in labels: + exp.append(0.1) + + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/rmanalysismonth.png') + + mes = '' + pos = 0 + for i in labels: + mes += i + ' : -' + str(vals[pos]) + currencyes.currensyes['ru-ruble'] + '\n' + pos += 1 + + with open('diagrams/rmanalysismonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) + + +def have_in_vals(category, labels): + pos = 0 + for i in labels: + if i == category: + return True, pos + pos += 1 + return False, pos + + +def analysis_month_add(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'incom' + ) + vals = [] + labels = [] + for i in transactions: + if have_in_vals(i.category, labels)[0]: + pos = have_in_vals(i.category, labels)[1] + vals[pos] += i.sum + else: + labels.append(i.category) + vals.append(i.sum) + + exp = [] + for _ in labels: + exp.append(0.1) + + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/addanalysismonth.png') + + mes = '' + pos = 0 + for i in labels: + mes += i + ' : +' + str(vals[pos]) + currencyes.currensyes['ru-ruble'] + '\n' + pos += 1 + + with open('diagrams/addanalysismonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) diff --git a/database.sqlite b/database.sqlite index a7453c0850635eeb3daa62332a029f4b5d99222c..3c24cde0131871de04e7cb42ccbc11a32928323a 100644 GIT binary patch delta 777 zcmZo@U~Fh$oFL68Hc`e|Sd2k0+>4iifq|K~jDf$1_YrT|#zq$2$=i8zxSDyH*u|BV z8Cw%4>++rUj!aD~Qc?(W4085x4AL+(&{XjA4^i+7_3_bBP|D5EE6Knqo03?GBDa}| zpM{a-Jp=#y&4LC``L+2OSs3J*%!~}pEsP9JEP`Y}F5=|lVc)(1+Ek1V5r5MM{sC_xz~Uh9zwF<5KDa_|RvB$0EcwSS*5q6ImC`E-p~A;J?Bk#Q%r?JO3yCxBM^oAM@YizsY|E lm@anl>##6$GID|l4iLc(BG^C#D~MnL5zHWhiJ6&`69Cf<(=-48 delta 266 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 literal 0 HcmV?d00001 diff --git a/diagrams/diagramallmonth.png b/diagrams/diagramallmonth.png new file mode 100644 index 0000000000000000000000000000000000000000..d360b74112b86668b5b1a91dea69155e6cbe7f4b GIT binary patch literal 19226 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

}v6>ojG^6UDqwR&vG}l^q`5;M47h>og_g2SC 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index ee1ab21..aef6edb 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ import locales from changelocale import change_locale from database.models import User, Transaction from currencyes import currensyes +from multiprocessing import Process +from analysismonth import analysis_month, analysis_month_rm, analysis_month_add # функция ограничения количества знаков после запятой @@ -12,244 +14,258 @@ def to_fixed(num_obj, digits=0): return f"{num_obj:.{digits}f}" -# основной обработчик для бота -def main_bot(messages): - for message in messages: - if message.text.split(' ')[0] == '/start' or message.text.split(' ')[0] == '/help': - mes = None - if locales.LOCALE == 'ru': - mes = locales.ru['help_message'] - elif locales.LOCALE == 'en': - mes = locales.en['help_message'] - _, user = User.get_or_create(username=message.chat.id) - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/ru' or message.text.split(' ')[0] == '/en': - change_locale(message) # функция для изменения языка - elif message.text.split(' ')[0] == '/balance': - user = User.get(username=message.chat.id) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Баланс: ' - elif locales.LOCALE == 'en': - mes = 'Balance: ' - mes += to_fixed(user.balance, 2) + currensyes['ru-ruble'] - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/add' or message.text.split(' ')[0] == '+': - if len(message.text.split(' ')) < 2: +def main(): + # основной обработчик для бота + def main_bot(messages): + for message in messages: + if message.text.split(' ')[0] == '/start' or message.text.split(' ')[0] == '/help': mes = None if locales.LOCALE == 'ru': - mes = locales.ru['erradd'] + mes = locales.ru['help_message'] elif locales.LOCALE == 'en': - mes = locales.en['erradd'] + mes = locales.en['help_message'] + _, user = User.get_or_create(username=message.chat.id) bot.send_message(message.chat.id, mes) - else: + elif message.text.split(' ')[0] == '/ru' or message.text.split(' ')[0] == '/en': + change_locale(message) # функция для изменения языка + elif message.text.split(' ')[0] == '/balance': user = User.get(username=message.chat.id) - user.balance += float(message.text.split(' ')[1]) - user.save() - if len(message.text.split(' ')) == 3: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='incom', - user=User.get(username=message.chat.id), - category=message.text.split(' ')[2] - ) - else: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='incom', - user=User.get(username=message.chat.id) - ) - bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) - elif message.text.split(' ')[0] == '/rm' or message.text.split(' ')[0] == '-': - if len(message.text.split(' ')) < 2: - mes = None + mes = '' if locales.LOCALE == 'ru': - mes = locales.ru['errrm'] + mes = 'Баланс: ' elif locales.LOCALE == 'en': - mes = locales.en['errrm'] + mes = 'Balance: ' + mes += to_fixed(user.balance, 2) + currensyes['ru-ruble'] bot.send_message(message.chat.id, mes) - else: - user = User.get(username=message.chat.id) - user.balance -= float(message.text.split(' ')[1]) - user.save() - if len(message.text.split(' ')) == 3: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='consuption', - user=User.get(username=message.chat.id), - category=message.text.split(' ')[2] - ) + elif message.text.split(' ')[0] == '/add' or message.text.split(' ')[0] == '+': + if len(message.text.split(' ')) < 2: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['erradd'] + elif locales.LOCALE == 'en': + mes = locales.en['erradd'] + bot.send_message(message.chat.id, mes) else: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='consuption', - user=User.get(username=message.chat.id) - ) - bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) - elif message.text.split(' ')[0] == '/addtoday': - transactions = Transaction.select().where( - Transaction.type == 'incom', - Transaction.date == datetime.datetime.today(), - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за сегодня:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your incomes today:\n\n' - iteration = 1 - if len(transactions) == 0: + user = User.get(username=message.chat.id) + user.balance += float(message.text.split(' ')[1]) + user.save() + if len(message.text.split(' ')) == 3: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='incom', + user=User.get(username=message.chat.id), + category=message.text.split(' ')[2] + ) + else: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='incom', + user=User.get(username=message.chat.id) + ) + bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) + elif message.text.split(' ')[0] == '/rm' or message.text.split(' ')[0] == '-': + if len(message.text.split(' ')) < 2: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['errrm'] + elif locales.LOCALE == 'en': + mes = locales.en['errrm'] + bot.send_message(message.chat.id, mes) + else: + user = User.get(username=message.chat.id) + user.balance -= float(message.text.split(' ')[1]) + user.save() + if len(message.text.split(' ')) == 3: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='consuption', + user=User.get(username=message.chat.id), + category=message.text.split(' ')[2] + ) + else: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='consuption', + user=User.get(username=message.chat.id) + ) + bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) + elif message.text.split(' ')[0] == '/addtoday': + transactions = Transaction.select().where( + Transaction.type == 'incom', + Transaction.day == datetime.datetime.today().strftime('%d'), + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' if locales.LOCALE == 'ru': - mes += 'Нет доходов за сегодня' + mes = 'Ваши доходы за сегодня:\n\n' elif locales.LOCALE == 'en': - mes += 'No incomes today' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmtoday': - transactions = Transaction.select().where( - Transaction.type == 'consuption', - Transaction.date == datetime.datetime.today(), - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за сегодня:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your consuptions today:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за сегодня' - elif locales.LOCALE == 'en': - mes += 'No consuptions today' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmall': - transactions = Transaction.select().where( - Transaction.type == 'consuption', - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за все время:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your all consuptions:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за все время' - elif locales.LOCALE == 'en': - mes += 'No consuptions for all time' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/addall': - transactions = Transaction.select().where( - Transaction.type == 'incom', - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за все время:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your all incomes:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет доходов за все время' - elif locales.LOCALE == 'en': - mes += 'No incomes for all time' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmmonth': - transactions = Transaction.select().where( - Transaction.user == User.get(username=message.chat.id), - Transaction.type == 'consuption' - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за этот месяц:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your consuptions for this month:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за этот месяц\n' - elif locales.LOCALE == 'en': - mes += 'No consuptions for this month\n' - - for i in transactions: - if str(i.date).split('-')[1] == datetime.datetime.today().strftime('%m'): - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/addmonth': - transactions = Transaction.select().where( - Transaction.user == User.get(username=message.chat.id), - Transaction.type == 'incom' - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за этот месяц:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your incomes for this month:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет доходов за этот месяц\n' - elif locales.LOCALE == 'en': - mes += 'No incomes for this month\n' - - for i in transactions: - if str(i.date).split('-')[1] == datetime.datetime.today().strftime('%m'): + mes = 'Your incomes today:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за сегодня\n' + elif locales.LOCALE == 'en': + mes += 'No incomes today\n' + for i in transactions: mes += '-------------------------------------\n' mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/analysismonth': - bot.send_message(message.chat.id, 'pass') - else: - mes = None - if locales.LOCALE == 'ru': - mes = locales.ru['error404_message'] - elif locales.LOCALE == 'en': - mes = locales.en['error404_message'] - bot.send_message(message.chat.id, mes) + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmtoday': + transactions = Transaction.select().where( + Transaction.type == 'consuption', + Transaction.day == datetime.datetime.today().strftime('%d'), + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за сегодня:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your consuptions today:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за сегодня\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions today\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmall': + transactions = Transaction.select().where( + Transaction.type == 'consuption', + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за все время:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your all consuptions:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за все время\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions for all time\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/addall': + transactions = Transaction.select().where( + Transaction.type == 'incom', + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши доходы за все время:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your all incomes:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за все время\n' + elif locales.LOCALE == 'en': + mes += 'No incomes for all time\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmmonth': + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'consuption' + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за этот месяц:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your consuptions for this month:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за этот месяц\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions for this month\n' + + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/addmonth': + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'incom' + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши доходы за этот месяц:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your incomes for this month:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за этот месяц\n' + elif locales.LOCALE == 'en': + mes += 'No incomes for this month\n' + + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/analysismonth': + Process(target=analysis_month, args=(message,)).start() + elif message.text.split(' ')[0] == '/rmanalysismonth': + Process(target=analysis_month_rm, args=(message, )).start() + elif message.text.split(' ')[0] == '/addanalysismonth': + Process(target=analysis_month_add, args=(message,)).start() + else: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['error404_message'] + elif locales.LOCALE == 'en': + mes = locales.en['error404_message'] + bot.send_message(message.chat.id, mes) + + bot.set_update_listener(main_bot) + + try: + bot.polling(none_stop=True) + while True: + pass + except KeyboardInterrupt: + cprint('\ngoodbye', 'green') + exit() + except Exception as e: + cprint(str(e), 'red') + bot.polling(none_stop=True) -bot.set_update_listener(main_bot) - -try: - bot.polling(none_stop=True) - while True: - pass -except KeyboardInterrupt: - cprint('\ngoodbye', 'green') - exit() -except Exception as e: - cprint(str(e), 'red') - bot.polling(none_stop=True) +if __name__ == '__main__': + main()