@Vlad995

При запуске телеграмм бота с нескольких устройств некорректно работает. Как это можно исправить?

Пишу бота в телеграмм что бы учить слова по Английскому языку с помощью библиотеки aiogram. Когда запускаю бота с одного устройства все работает корректно, но если запустить с нескольких устройств то переменные data, right и wrone работают некорректно. Подскажите пожалуйста как это можно исправить или написать код по другому. Заранее спасибо!
import random

from config import TOKEN
from word_list import word_list
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

from aiogram.dispatcher import FSMContext
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup

storage = MemoryStorage()

bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=storage)

data = []
right = []
wrone = []


@dp.message_handler(commands=['start', 'help'])
async def command_start(message: types.Message):
    await message.answer(f'В программе всего слов: {len(word_list)}')

class FSMTest(StatesGroup):
    question_1 = State()
    question_2 = State()
    question_3 = State()
    question_4 = State()
    question_5 = State()
    question_6 = State()
    question_7 = State()
    question_8 = State()
    question_9 = State()
    question_10 = State()



@dp.message_handler(commands='test', state=None)
async def cm_start(message: types.Message, state: FSMContext):
    def random_start():
        random_list = random.sample(range(len(word_list)), 10)
        data.append(random_list)
    random_start()
    await FSMTest.question_1.set()
    await message.reply(f"Переведи слово: {word_list[data[0][0]] [1]}")


@dp.message_handler(state=FSMTest.question_1)
async def load_question_1(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][0]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][0]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][1]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_2)
async def load_question_2(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][1]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][1]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][2]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_3)
async def load_question_3(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][2]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][2]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][3]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_4)
async def load_question_4(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][3]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][3]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][4]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_5)
async def load_question_5(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][4]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][4]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][5]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_6)
async def load_question_6(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][5]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][5]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][6]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_7)
async def load_question_7(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][6]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][6]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][7]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_8)
async def load_question_8(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][7]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][7]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][8]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_9)
async def load_question_9(message: types.Message):
    answer = (word_list[data[0][8]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][8]] [0]}")
    await message.reply(f"Переведи слово: {word_list[data[0][9]] [1]}")
    await FSMTest.next()

@dp.message_handler(state=FSMTest.question_10)
async def load_question_10(message: types.Message, state: FSMContext):
    answer = (word_list[data[0][9]] [0])
    if answer == message.text:
        right.append(1)
        await message.reply('Правильный овтет ')
    else:
        wrone.append(1)
        await message.reply(f"Не верно ❌❌❌, правильный ответ: {word_list[data[0][9]] [0]}")
    await message.reply(f'Правильных ответов:  {len(right)}, Неправильных ответов: {len(wrone)}')
    data.clear()
    right.clear()
    wrone.clear()
    await state.finish()




executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix
yellow
Потому что эти списки
data = []
right = []
wrone = []

одинаковы для всех юзеров. В Aiogram используется хранилище для подобных переменных: https://docs.aiogram.dev/en/latest/dispatcher/fsm.html

Причем один из вариантов хранилища в коде у вас есть: storage = MemoryStorage(), но не используется для этих данных. Есть такой пример по FSM: https://docs.aiogram.dev/en/latest/examples/finite... где видно как нужно использовать хранилище. Ну и по хорошему бы заменить списки на простые числовые переменные, если их единственная цель - быть счетчиком.

Должно быть что-то вроде
async with state.proxy() as data:
    if answer == message.text:
        data['right'] += 1
    else:
        data['wrong'] += 1


Для списка "data" аналогично
Ответ написан
Ваш ответ на вопрос

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

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