#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()))