Почему при запуске телеграмм бота на двух разных аккаунтах он отправляет все сообщения, только тому, кто 1 его запустил

Я пишу теллеграмм бота для проекта на конкурс, нужно сделать по сути некий каталог задач, который отправляет задания по математике смотря от того, какой выбрал пользователь.

Проблема состоит в том, что когда я проверяю бота только на одном аккаунте, то он работает отлично, но если с ним одновременно работает несколько аккаунтов, то он начинает отправлять сообщения только тому, кто первый его запустил, даже если с других аккаунтов нажимают выбор какого то задания, то оно сразу отправляется не тому кто захотел открыть это задание, а тому кто первый запустил бота

Вот главный код:

import telebot
from telebot import types
from telegram_bot_open import OPEN_NAMES_TASKS, OPEN_CATALOG, OPEN_ANSWER
from telegram_bot_text import TEXT_START, TEXT_HELP, TEXT_INFO
from telegram_bot_names_tasks import KEYBOARD

bot = telebot.TeleBot('')

"""
OPEN_NAMES_TASKS, OPEN_CATALOG и OPEN_ANSWER - это функции, написанные в другом файле, которые открывают текстовый документ
и возвращают список с содержимым

TEXT_START, TEXT_HELP и TEXT_INFO возвращают написанный в другом коде текст и выводят его
"""


@bot.message_handler(commands=['start'])
def start(message):
    """Выводит начальное приветствие и дает команды которые можно использовать"""
    kb = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn_1 = types.KeyboardButton(text='/catalog')
    btn_2 = types.KeyboardButton(text='/help')
    kb.add(btn_1, btn_2)

    bot.send_message(message.chat.id, TEXT_START(message), reply_markup=kb)



@bot.message_handler(commands=['help'])
def help(message):
    """Выводит просто текст"""
    bot.send_message(message.chat.id, TEXT_HELP(message))


@bot.message_handler(commands=['info'])
def info(message):
    """Выводит просто текст"""
    bot.send_message(message.chat.id, TEXT_INFO(message))



@bot.message_handler(commands=['catalog'])
def names_tasks(message):
    """Выводим названия задач"""

    names_tasks_list = OPEN_NAMES_TASKS()
    bot.send_message(message.chat.id, ''.join(names_tasks_list), reply_markup=KEYBOARD(message))

    @bot.callback_query_handler(func=lambda callback: callback.data)
    def task(callback):
        """Выводим задание"""

        if callback.data == '0':
            user_response = 0
        elif callback.data == '1':
            user_response = 1
        elif callback.data == '2':
            user_response = 2
        elif callback.data == '3':
            user_response = 3
        elif callback.data == '4':
            user_response = 4
        elif callback.data == '5':
            user_response = 5
        elif callback.data == '6':
            user_response = 6
        elif callback.data == '7':
            user_response = 7
        elif callback.data == '8':
            user_response = 8
        elif callback.data == '9':
            user_response = 9

        catalog_zd_list = OPEN_CATALOG()
        bot.send_message(message.chat.id, f'{catalog_zd_list[user_response]}\nОтветом является число')




@bot.message_handler(content_types=['text'])
def Except(message):
    bot.send_message(message.chat.id, 
    'Я тебя не понимаю :(\n'
    'Используй интерактивную клавиатуру\n'
    'Если возникли вопросы, то отправь команду /help')


bot.polling(non_stop=True)

Вот уже дополнительные коды которые используются: telegram_bot_open

def OPEN_NAMES_TASKS():
    """Выводим названия задач"""
    names_tasks = open(r'D:\Programming\function_per_hundred_bot\names_tasks.txt', encoding='utf-8')
    names_tasks_list = [line for line in names_tasks.readlines()]
    names_tasks.close()
    return names_tasks_list

def OPEN_CATALOG():
    """Выводим задание"""
    catalog = open(r'D:\Programming\function_per_hundred_bot\catalog.txt', encoding='utf-8')
    catalog_zd_list = [line.strip() for line in catalog.readlines()]
    catalog.close()
    return catalog_zd_list

def OPEN_ANSWER():
    """Проверка ответа"""
    answer = open(r'D:\Programming\function_per_hundred_bot\answer.txt', encoding='utf-8')
    answer_zd_list = [line.strip() for line in answer.readlines()]
    answer.close()
    return answer_zd_list

telegram_bot_names_tasks:

from telebot import types

def KEYBOARD(message):
    kb = types.InlineKeyboardMarkup()

    name_1 = types.InlineKeyboardButton(text='Задание 1', callback_data='0')
    name_2 = types.InlineKeyboardButton(text='Задание 2', callback_data='1')
    name_3 = types.InlineKeyboardButton(text='Задание 3', callback_data='2')
    name_4 = types.InlineKeyboardButton(text='Задание 4', callback_data='3')
    name_5 = types.InlineKeyboardButton(text='Задание 5', callback_data='4')
    name_6 = types.InlineKeyboardButton(text='Задание 6', callback_data='5')
    name_7 = types.InlineKeyboardButton(text='Задание 7', callback_data='6')
    name_8 = types.InlineKeyboardButton(text='Задание 8', callback_data='7')
    name_9 = types.InlineKeyboardButton(text='Задание 9', callback_data='8')
    name_10 = types.InlineKeyboardButton(text='Задание 10', callback_data='9')


    kb.add(name_1, name_2, name_3, name_4, name_5, name_6, name_7, name_8, name_9, name_10)
    return(kb)

Вот скриншоты проблемы: Тут я запустил бота и отправил команду /catalog, после этого на данном аккаунте я ничего не делал Затем на другом аккаунте я сделал тоже самое, но в этот раз нажал для обратной отправки задания 1 2 и 3, но вместо того что бы они появились в том же диалоге, они отправились в чат, где бот был запущен самым первым, что видно на первом скрине

На 1 скрине я запустил бота и отправил команду /catalog, после этого на данном аккаунте я ничего не делал На втором скрине уже на другом аккаунте я сделал тоже самое, но в этот раз нажал для обратной отправки задания 1 2 и 3, но вместо того что бы они появились в том же диалоге, они отправились в чат, где бот был запущен самым первым, что видно на первом скрине

А вот как он должен работать, ну и как он впринципе работает если только один аккант общается с ботом Я запускаю бот, нажимаю на выбранный мной номер и он все правильно делает, ничего лишнего в отличии от того, когда несколько человек работает с ботом введите сюда описание изображения введите сюда описание изображения


Ответы (1 шт):

Автор решения: Владимир Клыков

Ваши функции чтения(сохранения) настроек необходимо немного поправить: Добавить параметр, который будем использовать для чтения данных по каждому пользователю.

def OPEN_NAMES_TASKS(uid):
    names_tasks = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\names_tasks.txt', encoding='utf-8')

def OPEN_CATALOG(uid):
    catalog = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\catalog.txt', encoding='utf-8')


def OPEN_ANSWER(uid):
    answer = open('D:\\Programming\\function_per_hundred_bot\\'+uid+'\\answer.txt', encoding='utf-8')

Для тех файлов которые общие для всех пользователей - такие параметры добавлять не нужно, или использовать всегда одинаковый параметр, например "0"

@bot.message_handler(commands=['catalog'])
def names_tasks(message):
#В дальнейшем для использования подобных функций нужно будет передавать параметр
#Например использовать user.id или chat.id
#При использовании chat.id - получим в приватном чате у каждого свои результаты, а в общем чате - общие на всех
#Если же использовать user.id - в общем чате так же будут персональные результаты по запросу :)

    names_tasks_list = OPEN_NAMES_TASKS(message.user.id)
    catalog_zd_list = OPEN_CATALOG(message.chat.id)

з.ы. вы случайно сделали замыкание :)

@bot.message_handler(commands=['catalog'])
def names_tasks(message):
    names_tasks_list = OPEN_NAMES_TASKS()
    bot.send_message(message.chat.id, ''.join(names_tasks_list), reply_markup=KEYBOARD(message))
#Вот тут вы сделали замыкание своим отступом(исправлено): 
@bot.callback_query_handler(func=lambda call: True)
def task(callback):
      if callback.data == '0':
          user_response = 0
      elif callback.data == '1':
          user_response = 1
      elif callback.data == '2':
          user_response = 2
      elif callback.data == '3':
          user_response = 3
      elif callback.data == '4':
          user_response = 4
      elif callback.data == '5':
          user_response = 5
      elif callback.data == '6':
          user_response = 6
      elif callback.data == '7':
          user_response = 7
      elif callback.data == '8':
          user_response = 8
      elif callback.data == '9':
          user_response = 9
      catalog_zd_list = OPEN_CATALOG()
      bot.send_message(callback.message.chat.id, f'{catalog_zd_list[user_response]}\nОтветом является число')
→ Ссылка