@ARN00LD

Как исправить такую ошибку при проверке подписки pyTelegramBotAPI?

Здравствуйте. Делаю Telegram-бота на PyTelegramBotAPI в котором присутствует проверка подписки на telegram-канал и столкнулся с такой ошибкой:
Если один человек напишет команду /start и сразу после него какой-то другой человек напишет данную команду, то у первого человека кнопка "Проверить подписку" просто перестанет работать (просто будет писать "Спасибо за подписку на канал", но не будет перенаправлять на функцию valid, которая в свою очередь добавляет человека в базу данных бота). У второго же человека кнопка "Проверить подписку" будет исправно работать.

Код:

Обработчик команды /start
@bot.message_handler(commands=['start'])
def start(message):
    global usid
    usid = message.chat.id
    global usname
    usname = message.from_user.username
    try:
        global referrer_id
        referrer_id = message.text.split(' ')[1]
    except IndexError:
        referrer_id = 1005380696
    sql.execute(f"SELECT chatid FROM users WHERE chatid = '{usid}'")
    if sql.fetchone() is None:
        marku = types.InlineKeyboardMarkup(row_width=2)
        item1 = types.InlineKeyboardButton(" Проверить подписку", callback_data='sub_check')
        marku.add(item1)
        global res
        res = bot.send_message(message.chat.id, " <b>Добро пожаловать</b>\n\n❗ Для <b>продолжения работы</b> с ботом вам необходимо <b>подписаться</b> на наш <b>оффициальный канал</b>: \n\nhttps://t.me/*ссылка на канал*", parse_mode='html', reply_markup=marku)
    else:
        bot.send_message(message.chat.id, " Вы в главном меню.", reply_markup=mm)
        for value in sql.execute("SELECT * FROM users"):
            print(value)


Обработчик кнопки "Проверить подписку"
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            if call.data == 'sub_check':
                user_id = call.message.chat.id
                group_id = "*айди группы*"
                check = bot.get_chat_member(group_id, user_id)
                if check.status == "member":
                    sql.execute(f"SELECT chatid FROM users WHERE chatid = '{usid}'")
                    if sql.fetchone() is None:
                        valid(call.message)
                        bot.send_message(call.message.chat.id, "✔ Благодарим вас за подписку на канал!\n\n❗ Если бот по каким-то причинам вам не отвечает - напишите /start.")
                        bot.delete_message(call.message.chat.id, res.message_id)
                    else:
                        bot.send_message(call.message.chat.id, "❗ Вы уже зарегистрированы.")
                elif check.status == "creator":
                    sql.execute(f"SELECT chatid FROM users WHERE chatid = '{usid}'")
                    if sql.fetchone() is None:
                        valid(call.message)
                        bot.send_message(call.message.chat.id, "✔ Благодарим вас за подписку на канал!")
                        bot.delete_message(call.message.chat.id, res.message_id)
                    else:
                        bot.send_message(call.message.chat.id, "❗ Вы уже зарегистрированы.")
                else:
                    bot.send_message(call.message.chat.id, "❌ Пожалуйста, проверьте подписаны ли вы на все каналы.")


Функция valid, на которую должно перенаправлять пользователя после проверки
def valid(message):
    sql.execute(f"INSERT INTO users VALUES(?,?,?,?,?)", (usid, usname, 0, 0, referrer_id))
    for value in sql.execute(f"SELECT * FROM users WHERE chatid = '{message.chat.id}'"):
        print(f"Новый пользователь: @{value[1]}, referal: {value[4]}")
        for value in sql.execute(f"SELECT * FROM users WHERE chatid = '{value[4]}'"):
            print(value[1])
            ref_balance = value[2]
            print(ref_balance, value[1])
            new_ref_balance = ref_balance + 2
            print(new_ref_balance, value[1])
            ref_count = value[3]
            new_ref_count = ref_count + 1
            print(new_ref_count, value[1])
            bot.send_message(value[0],
                             f"➕ Вы пригласили <b>реферала</b>.\n\n Текущий баланс: <b>{new_ref_balance} рублей</b>\n\n Всего приглашено пользователей: <b>{new_ref_count}</b>",
                             parse_mode='html')
            sql.execute(f"UPDATE users SET balance = {new_ref_balance} WHERE chatid = '{value[0]}'")
            sql.execute(f"UPDATE users SET refcount = {new_ref_count} WHERE chatid = '{value[0]}'")
            sql.execute(f"UPDATE info SET earned = earned+2")
            db.commit()
        bot.send_message(message.chat.id, f"➖ Вы успешно <b>зарегистрировались</b>\n\n➕ В данном <b>боте</b> вы сможете <b>заработать</b> на <b>привлечении рефералов</b>.", parse_mode='html', reply_markup=mm)
        db.commit()
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
MinTnt
@MinTnt
Проблемы из-за использования global, так как это переменные глобальные, то они можно сказать управляют всем. Из-за этого если кто-то другой вводит кмд, глобальные переменные изменяются под нового учатсника, а прошлого "бросяют в пучины отчаяния"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы