A
A
Alexander2019-12-18 13:07:43
Python
Alexander, 2019-12-18 13:07:43

Endless loop in separate thread python telebot?

We have this code:

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)

The sqlite_module contains the functions for creating / checking in the database, parsing RSS and downloading.
If you remove the telebot, then the cycle and all functions work as they should. Adding a user and a list of series, checking the update and the jump.
Tell me where to look, and if you are already reading over a coffee break, then I hope you don’t get wet at the sight of the code) It is necessary that the check function live “separately” from the rest of the handlers and can be called for each user separately.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
S
shapick, 2019-12-18
@shabelski89

import threading
def async_function():
threading.Timer(5.0, f).start() # Restart in 5 seconds
print("Hello, world!")
async_function()

A
Alexander, 2019-12-18
@shabelski89

I implemented the launch of the function by a separate thread, but it’s not clear in this way to pass the message from the handler to the thread :(

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question