Не могу использовать бота, когда ботом пользуются 2 или более человек

#python #telegram-bot #python-telegram-bot

#python #telegram-бот #python-telegram-bot

Вопрос:

Бот работает хорошо, когда ботом пользуется 1 человек. Если кто-то начинает использовать бота, dPoints целое число начинает путаться. Это тест, который помогает людям определить уровень депрессии.

У меня есть идея. Может быть, я могу, может быть, по-другому dPoints.py файл для каждого пользователя, который начинает использовать бота.

например, user1_dPoints, user2_dPoints и т.д..

Если вы хотите протестировать моего бота, чтобы понять, в чем проблема — вот мой telegram: @kmuradoff

Бот, созданный с помощью TeleBot

 # imports
import sys
import time
import os
import config
import telebot
from telebot import types

# vars
dPoints = 0

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(commands = ['points'])
def showPoints(message):

    bot.send_message(message.chat.id, str(dPoints).format(
    message.from_user, bot.get_me()))

@bot.message_handler(commands=['start', 'help'])
def welcome(message):
    global dPoints
    dPoints = 0
    welcomeMarkup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    doTheTest = types.KeyboardButton("Начать тест")
    welcomeMarkup.add(doTheTest)
    bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!".format(
    message.from_user, bot.get_me()), reply_markup=welcomeMarkup)


@bot.message_handler(content_types=['text'])
def startingTest(message):

    UserName = message.from_user.first_name

    question0Heading = "----------- "   UserName   " -----------"

    question1Answer = "N/A"
    question2Answer = "N/A"
    question3Answer = "N/A"
    question4Answer = "N/A"
    question5Answer = "N/A"
    question6Answer = "N/A"
    question7Answer = "N/A"
    question8Answer = "N/A"
    question9Answer = "N/A"
    question10Answer = "N/A"
    question11Answer = "N/A"
    question12Answer = "N/A"
    question13Answer = "N/A"
    question14Answer = "N/A"
    question15Answer = "N/A"
    question16Answer = "N/A"
    question17Answer = "N/A"
    question18Answer = "N/A"
    question19Answer = "N/A"
    question20Answer = "N/A"

    q1 = types.ReplyKeyboardMarkup(row_width=1)
    q1s1 = types.KeyboardButton("Я не чувствую себя расстроенным, печальным.")
    q1s2 = types.KeyboardButton("Я расстроен")
    q1s3 = types.KeyboardButton("Я все время расстроен и не могу от этого отключиться.")
    q1s4 = types.KeyboardButton("Я настолько расстроен и несчастлив, что не могу это выдержать.")
    q1.add(q1s1, q1s2, q1s3, q1s4)

    q2 = types.ReplyKeyboardMarkup(row_width=1)
    q2s1 = types.KeyboardButton("Я не тревожусь о своем будущем.")
    q2s2 = types.KeyboardButton("Я чувствую, что озадачен будущим.")
    q2s3 = types.KeyboardButton("Я чувствую, что меня ничего не ждет в будущем.")
    q2s4 = types.KeyboardButton("Мое будущее безнадежно, и ничто не может измениться к лучшему.")
    q2.add(q2s1, q2s2, q2s3, q2s4)

    q3 = types.ReplyKeyboardMarkup(row_width=1)
    q3s1 = types.KeyboardButton("Я не чувствую себя неудачником.")
    q3s2 = types.KeyboardButton("Я чувствую, что терпел больше неудач, чем другие люди.")
    q3s3 = types.KeyboardButton("Когда я оглядываюсь на свою жизнь, я вижу в ней много неудач.")
    q3s4 = types.KeyboardButton("Я чувствую, что как личность я - полный неудачник.")
    q3.add(q3s1, q3s2, q3s3, q3s4)
    
    while message.text == str(q21s1.text) or str(q21s2.text) or str(q21s3.text) or str(q21s4.text):
        if message.chat.type == "private":
            global dPoints
            if message.text == "Начать тест":
                markup = telebot.types.ReplyKeyboardRemove()
                bot.send_message(message.chat.id, "ИНСТРУКЦИЯ".format(
                message.from_user, bot.get_me()), reply_markup=markup)
                time.sleep(1.5)
                bot.send_message(message.chat.id, "Группа #1".format(
                message.from_user, bot.get_me()), reply_markup=q1)
                break
            elif message.text == str(q1s1.text) or message.text == str(q1s2.text) or message.text == str(q1s3.text) or message.text == str(q1s4.text):
                if message.text == str(q1s1.text):
                    dPoints = dPoints   0
                elif message.text == str(q1s2.text):
                    dPoints = dPoints   1
                elif message.text == str(q1s3.text):
                    dPoints = dPoints   2
                elif message.text == str(q1s4.text):
                    dPoints = dPoints   3
                markup = telebot.types.ReplyKeyboardRemove()
                time.sleep(1)
                bot.send_message(message.chat.id, "Вы ответили на 1 из 21 вопросов".format(
                message.from_user, bot.get_me()), reply_markup=markup)
                time.sleep(2)
                bot.send_message(message.chat.id, "Группа #2".format(
                message.from_user, bot.get_me()), reply_markup=q2)
                break

            elif message.text == str(q2s1.text) or message.text == str(q2s2.text) or message.text == str(q2s3.text) or message.text == str(q2s4.text):
                if message.text == str(q2s1.text):
                    dPoints = dPoints   0
                elif message.text == str(q2s2.text):
                    dPoints = dPoints   1
                elif message.text == str(q2s3.text):
                    dPoints = dPoints   2
                elif message.text == str(q2s4.text):
                    dPoints = dPoints   3
                markup = telebot.types.ReplyKeyboardRemove()
                time.sleep(1)
                bot.send_message(message.chat.id, "Вы ответили на 2 из 21 вопросов".format(
                message.from_user, bot.get_me()), reply_markup=markup)
                time.sleep(2)
                bot.send_message(message.chat.id, "Группа #3".format(
                message.from_user, bot.get_me()), reply_markup=q3)
                break



print("Bot Started Successfully")

bot.polling(none_stop=True)
  

Комментарии:

1. Первое правило многопользовательского клуба: нет global .

2. @KlausD. Итак, что мне теперь делать? Не могли бы вы мне помочь, пожалуйста?)

3. Перепишите свой код, чтобы не использовать глобальные переменные. У вас мог бы быть словарь, который хранит информацию, связанную с пользователем, для каждого пользователя. (забавный факт: словари не нужны global ) Следующим шагом в эволюции будет объектно-ориентированное программирование.

4. @KlausD. Можете ли вы показать мне, что я, вероятно, должен сделать. Можете показать мне код, как он должен выглядеть, спасибо!

5. Я с радостью подскажу, в каком направлении идти, но я не собираюсь нести вас.

Ответ №1:

Как вы можете видеть из примера в репозитории GitHub библиотеки TeleBot, они предлагают использовать user_dict со значениями для каждого chat_id . Вы можете сделать то же самое.

Что еще я бы посоветовал использовать default_dict .

 
# YOUR IMPORTS HERE
from collections import defaultdict


import config
import telebot
from telebot import types


bot = telebot.TeleBot(config.TOKEN)

# dict that will store all information per chat
user_info = defaultdict(dict)


# Show current amount of points to user
@bot.message_handler(commands = ['points'])
def show_points(message):
    d_points = user_info[message.chat.id].get('d_points', 0)

    bot.send_message(message.chat.id, 'You have {} d_points'.format(d_points).format(message.from_user, bot.get_me()))


# You method where value should be changed
@bot.message_handler(content_types=['text'])
def message_method(message):
    points = 3
    d_points = user_info[message.chat.id].get('d_points', 0)
    user_info[message.chat.id] = d_points   points

    bot.send_message(message.chat.id, 'Now you have: {} d_points'.format(d_points).format(message.from_user, bot.get_me()))