Как запустить 2 декоратора одновременно?
Нужно чтобы одновременно работало 2 обработчика. От telebot get_text_messages(message): и telethon normal_handler(event).
В исходном коде ниже исправно работает только обработчик бота, так как он стоит первый, естественно второй обработчик не запустится пока первый не закончит свою работу.
Я не сведущий в потоках и асинхронности опробовал оба варианта и естественно ничего не заработало должным образом. Так как всё таки заставить работать их одновременно?
import os
import time, datetime
from telethon import TelegramClient, events
import json
import telebot
import sys
command = ["Чтобы посчитать часы за последний день: /Count_time_today",
"Чтобы получить часы за всё время введите: /Count_time_all",
"Чтобы получить часы за конкретный период введите даты по шаблону: /count dd.mm.yyyy-dd.mm.yyyy",
]
client = TelegramClient('SELF', api_id, api_hash)
bot = telebot.TeleBot(TOKEN)
def getid_dialog():
"""Возвращает id диалога"""
for dialog in client.iter_dialogs():
if dialog.name == "DataWork":
return dialog.id
def is_time_full(arg):
"""Принимает строку типа '11:17-19:16'(str).
Возвращает True если время записано в нужном виде"""
try:
arg = arg.replace('-',':')
except:
result = False
arg = arg.split(':')
if len(arg) == 4:
for a in arg:
if a.isdigit():
if (arg.index(a)+1)%2 != 0:
if int(a) <= 24:
return True
elif (arg.index(a)+1)%2 == 0:
if int(a) <= 59:
return True
else:
return False
else:
return False
else:
return False
def is_date(arg):
try:
datetime.datetime.strptime(arg, "%d.%m.%Y").date()
return True
except:
return False
def correct_message(message):
"""Принимает объект сообщения телеграм, а возвращает True если данные в норме"""
mass = [False, False]
if message.message != None:
for i in message.message.split(" "):
if is_time_full(i):
mass[0] = True
elif is_date(i):
mass[1] = True
else:
return False
if ((mass == [True, True]) or (mass == [True, False])):
return True
else:
return False
else:
return False
def right_note(message):
"""Принимает объект сообщения телеграм и определяет дату в тексте сообщения,
возвращает новую структуру сообщения для записи в базу данных, где дата из текста сообщения
заменяет дату объекта."""
new_message = []
new_date = False
for i in message.message.split(" "):
if is_date(i):
new_date = datetime.datetime.strptime(i, "%d.%m.%Y").date().strftime('%Y-%m-%d')
elif is_time_full(i):
new_message.append(i)
if not new_date:
new_date = message.date.strftime('%Y-%m-%d')
new_message = " ".join(new_message)
minutes = count_time(new_message)
return {"id":message.id, "message":new_message, "message_date":new_date, 'minutes':minutes}
def sorted_date_in_right_notes(mass_right_notes):
return sorted(mass_right_notes,key=lambda x: x['message_date'])
extract = lambda x,y: x[x.index(y)]['message']
def count_time(arg):
sum_min = 0
for i in arg.split(' '):
left = i.split('-')[0].split(':')
right = i.split('-')[1].split(':')
if int(right[0]) == 0:
right[0] = '24'
Left_minutes = int(left[0])*60+int(left[1])
right_minutes = int(right[0])*60+int(right[1])
difference_min = right_minutes - Left_minutes
sum_min += difference_min
return sum_min
path = os.path.join(os.path.split(os.path.abspath(__file__))[0],'DataWork.json')
client.start()
if not os.path.isfile(path):
with open(path,'w', encoding='utf-8') as db:
id_dialog = getid_dialog()
mass_messages = []
for message in client.iter_messages(id_dialog):
if correct_message(message):
mass_messages.insert(0, right_note(message))
mass_messages = sorted_date_in_right_notes(mass_messages)
json.dump(mass_messages, db)
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
if message.text == '/help':
bot.send_message(439522950, "\n".join(command))
elif message.text == "/Count_time_today":
mass_messages = reopen_data(path)
minutes = f"{mass_messages[-1]['minutes']//60}ч. {mass_messages[-1]['minutes']%60}мин."
bot.send_message(439522950, minutes)
elif message.text == "/Count_time_all":
mass_messages = reopen_data(path)
summ = 0
for i in mass_messages:
summ += int(i['minutes'])
summ = f"{summ//60}ч. {summ%60}мин."
bot.send_message(439522950, summ)
elif message.text[:6] == '/count':
mass_messages = reopen_data(path)
period_date = message.text[6:].strip()
left_date = period_date.split("-")[0]
right_date = period_date.split("-")[1]
try:
left_date = datetime.datetime.strptime(left_date, "%d.%m.%Y").date()
right_date = datetime.datetime.strptime(right_date, "%d.%m.%Y").date()
except:
bot.send_message(439522950, "Не правильный формат ввода.")
for i in mass_messages:
if datetime.datetime.strptime(i['message_date'],"%Y-%m-%d").date() >= left_date:
first_date = mass_messages.index(i)
break
for i in mass_messages:
if datetime.datetime.strptime(i['message_date'],"%Y-%m-%d").date() >= right_date:
second_date = mass_messages.index(i)
break
new_mass_messages = mass_messages[first_date:second_date+1]
summ = 0
for i in new_mass_messages:
summ += int(i['minutes'])
summ = f"{summ//60}ч. {summ%60}мин."
bot.send_message(439522950, summ)
bot.polling(none_stop=True, timeout=20)
@client.on(events.NewMessage(chats=getid_dialog()))
def normal_handler(event):
if event.message.message == 'exit':
exit()
if correct_message(event.message):
with open(path,'r', encoding='utf-8') as db:
mass_messages = json.load(db)
mass_messages.append(right_note(event.message))
with open(path, 'w', encoding="utf-8") as db:
json.dump(mass_messages, db)
client.run_until_disconnected()```