Имеем вот такой код:
from config import URL, PROXY, TOKEN
import telebot
from sqlite_module import *
import time
from threading import Thread
telebot.apihelper.proxy = {'https': PROXY}
bot = telebot.TeleBot(TOKEN)
# Пользователь регистрируется в БД по UID и пишет название сериала, запрос обрабатывается в БД при наличии совпадений сериал/ы добавляются в таблицу favorites для этого юзера.
# Тут вопрос использования цикла, для добавления нескольких сериалов подряд
@bot.message_handler(commands=['start'])
def start(message):
tupp = (message.from_user.id, message.from_user.username, message.from_user.first_name, message.from_user.last_name, time.ctime())
send_user_info(tupp)
send = bot.send_message(message.from_user.id, 'What series do you search?')
bot.register_next_step_handler(send, add_to_fav)
def add_to_fav(message):
msg = search_in_db(message.text, message.from_user.id)
if msg == 'No match found':
bot.send_message(message.from_user.id, msg)
else:
text = '@' + message.from_user.username + ' ' + 'Next series added to favorites: '
bot.send_message(message.from_user.id, text)
for elem in msg:
bot.send_message(message.from_user.id, elem[1] + ': ' + elem[2])
# хендлер по команде сделает запрос в БД и вернет список серий для юзера при наличии
@bot.message_handler(commands=['show'])
def show(message):
# print(message)
# print(type(message))
msg = show_user_info(message.from_user.id)
if msg == 'No series in favorites':
bot.send_message(message.from_user.id, msg)
else:
text = '@' + message.from_user.username + ' ' + 'List favorites series: '
bot.send_message(message.from_user.id, text)
for elem in msg:
bot.send_message(message.from_user.id, elem[0] + ': ' + elem[1])
# хендлер по команде запускает функцию в отдельном потоке, для цикличной проверки обновлений вышедших серий
@bot.message_handler(commands=['check'])
def download(message):
bot.register_next_step_handler(message, thread_loop)
# запускаю в отдельном потоке задачу
def thread_loop(message):
Thread(target=main_body, args=(message,)).start()
# тут вызывается цикл следящий за апдейтом RSS ленты, при обновлении формирует словарь {сериал: ссылка} и отправляет на скачивание
def main_body(message):
last_update = ''
while True:
if last_update != parsing_rss(URL).updated:
last_update = parsing_rss(URL).updated
d = parsing_rss(URL)
result_parsing = d.entries
series_list = {search_block_symbols(x['title']): x['link'] for x in result_parsing if x['tags'][0]['term'] == '[MP4]'}
series_list_name_en = {key[key.find('(') + 1:key.find(')')]: value for key, value in series_list.items()}
check_rss_in_fav(series_list_name_en, message.from_user.id)
time.sleep(3600)
else:
time.sleep(3600)
#да да, пока что ещё лонг поллинг, к веб хукам позже.
if __name__ == '__main__':
bot.polling(none_stop=True)
Модуль sqlite_module содержит функции создания / проверки в ДБ, парсинг RSS и скачивания.
Если убрать telebot, то цикл и все функции работаю как надо. Добавление юзера и списка серий, проверка апдейта и скачка.
Подскажите куда правильно смотреть, и если уж читаете за перерывом на кофе, то надеюсь вы не облились при виде кода) Нужно чтобы функция проверки жила "отдельно" от остальных хендлеров и могла вызываться для каждого юзера отдельно.