На разных пользователей срабатывает один счетчик

216 просмотра
0
0 Комментариев

Пишу простого бота в Telegram, который дает тесты. На тест дается n-ое количество вопросов. При прохождении теста выдается результат.
Однако, при работе с ботом нескольких юзеров счетчик срабатывает один на всех. Например: юзер_1 ответил на 2 вопроса, юзер_2 — на один. После этого, если юзер_3 даст команду /test, — бот отдаст ему результат.
Как прописать счетчик для каждого нового юзера?

@bot.message_handler(commands=['test'])
def handle_text(message):
    global x
    global q
    user_markup = telebot.types.ReplyKeyboardMarkup()
    user_markup.row('1', '2', '3', '4')
    bot.send_message(message.from_user.id, "rdy?", reply_markup = user_markup)
    try:
        x += 1 #счетчик обращений
    except:
        x = 0
 
    if x < 3:
        try:
            i += 1
        except:
            i = 0
        a = []
        for i in range(0, 4):
            a.append(i)
        rand.shuffle(a)
        numb = a[i]
        Quest = ['Text1', 'Text2','rr3', 'rr4', 'rr45']
        Answ = ['1', '2','3','4','4']
        bot.send_message(message.chat.id, Quest[numb]) #выдает рандомный вопрос
        q = Answ[numb] #записывает ответ на вопрос в переменную для сравнения с ответом
    else:
        bot.send_message(message.chat.id, "end " + str(y) + " iz " + str(x)) #результат
        x = 0 #обнуление счетчика

Так же еще одна проблема: если юзер_1 даст команду /test, а юзер_2 в этот момент отправит сообщение, то юзеру_1 в счетчик добавится +1, а юзер_2 получит ответ.


Добавить комментарий

1 Ответы

Python Опубликовано 12.12.2018
0

Используйте для счетчика не одну переменную, а словарь, в котором ключем будет являться номер чата, а значением — счетчик.

from collections import defaultdict
 
x = defaultdict(int)
 
@bot.message_handler(commands=['test'])
def handle_text(message):
    global x
    global q
    x_key = message.chat.id
    user_markup = telebot.types.ReplyKeyboardMarkup()
    user_markup.row('1', '2', '3', '4')
    bot.send_message(message.from_user.id, "rdy?", reply_markup = user_markup)
 
    x[x_key] += 1 #счетчик обращений
 
    if x < 3:
        try:
            i += 1
        except:
            i = 0
        a = []
        for i in range(0, 4):
            a.append(i)
        rand.shuffle(a)
        numb = a[i]
        Quest = ['Text1', 'Text2','rr3', 'rr4', 'rr45']
        Answ = ['1', '2','3','4','4']
        bot.send_message(message.chat.id, Quest[numb]) #выдает рандомный вопрос
        q = Answ[numb] #записывает ответ на вопрос в переменную для сравнения с ответом
    else:
        bot.send_message(message.chat.id, "end " + str(y) + " iz " + str(x[x_key])) #результат
        x[x_key] = 0 #обнуление счетчика

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up