Форум сайта python.su
Я пишу телеграм бота, его цель заключается в том, что он отправляет русское/английское слово, а ты должен написать ему перевод. Я все реализовал, но столкнулся с проблемой, что если ботом пользуются сразу множество пользователей, то происходит вот что:
Бот отправляет слово с переводом1 пользователю1
Бот отправляет слово с переводом2 пользователю2
пользователь1 пишет перевод1 - неверно
пользователь2 пишет перевод2 - верно
как бы переводы заменяются, как мне это исправить, я думал как то привязать каждый перевод к отдельному пользователю, но все равно не понимаю как это сделать, помогите пожалуйста, вот код:
import asyncio from aiogram import F from aiogram import Bot,Dispatcher,types from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import ReplyKeyboardBuilder from aiogram.filters import Command from aiogram.utils.formatting import Text, Bold from lists_words import * import logging import random logging.basicConfig(level=logging.INFO) bot = Bot(bot_token, parse_mode='HTML') dp = Dispatcher() ru_words = [i[1:] for i in all_words] en_words = [i[0] for i in all_words] lang = 'en' count = 0 @dp.message(F.text, Command('start')) async def start_command(message: types.Message, bot: Bot): builder_inline = InlineKeyboardBuilder() builder_reply = ReplyKeyboardBuilder() builder_reply.add(types.KeyboardButton(text = 'Отправка русского слова')) builder_reply.add(types.KeyboardButton(text = 'Отправка английского слова')) content = Text( 'Привет, ', Bold(message.from_user.full_name), '!' ) user_id = """мой id для обратной связи""" chat_info = await bot.get_chat(user_id) if not chat_info.has_private_forwards: builder_inline.row(types.InlineKeyboardButton( text='Связаться с разработчиком', url=f't.me/mytelegram' ) ) await message.answer( **content.as_kwargs(), reply_markup=builder_reply.as_markup(resize_keyboard=True) ) await message.delete() await message.answer( 'Если у вас есть вопросы, то можно', reply_markup=builder_inline.as_markup() ) @dp.message(F.text.lower() == 'отправка русского слова') async def send_ru(message: types.Message): global rand_word_index global lang rand_word_index = random.randint(0, len(ru_words) - 1) word = ', '.join(ru_words[rand_word_index]) lang = 'ru' print('Бот пишет ' + message.from_user.full_name + ': ' + word) await message.answer(f'{word}') @dp.message(F.text.lower() == 'отправка английского слова') async def send_ru(message: types.Message): global rand_word_index global lang rand_word_index = random.randint(0, len(ru_words) - 1) word = en_words[rand_word_index] lang = 'en' print('Бот пишет ' + message.from_user.full_name + ': ' + word) await message.answer(f'{word}') @dp.message(F.text) async def send_translate(message: types.Message): global rand_word_index global lang global count true_or_false_word = False if lang == 'ru': for i in en_words: if i == message.text.lower(): true_or_false_word = True count += 1 await message.answer('✅Верно! Количество верных ответов: '+str(count)) if not true_or_false_word: await message.answer('❌Ответ неверный. Правильный ответ: ' + en_words[rand_word_index]) elif lang == 'en': for i in ru_words[rand_word_index]: if i == message.text.lower(): true_or_false_word = True count += 1 await message.answer('✅Верно! Количество верных ответов: '+str(count)) if not true_or_false_word: await message.answer('❌Ответ неверный. Правильный ответ: ' + ', '.join(ru_words[rand_word_index])) print(message.from_user.full_name + ' отвечает: ' + message.text) async def main(): await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) if __name__ == '__main__': asyncio.run(main())
Отредактировано utyara3 (Янв. 11, 2024 21:36:25)
Офлайн
Ну так у вас кто дернул функцию того и тапки и если первый дернул и в то же время другой то переменная у их одна на двоих
Например при запуске функции создавайте словарь по айди пользователя со статусом и возвращайте пользователю значение из него же по айди
Хотя хорошо бы условие узнать полное
Офлайн
ZerGда, я уже это исправил, спасибо, но возникла еще одна проблема, что хоть перевод закреплется за пользователем, если кто то другой написал перевод на свое слово, то результат отправляется другому, я думаю что то не так тут:
Ну так у вас кто дернул функцию того и тапки и если первый дернул и в то же время другой то переменная у их одна на двоихНапример при запуске функции создавайте словарь по айди пользователя со статусом и возвращайте пользователю значение из него же по айдиХотя хорошо бы условие узнать полное
if (sessions[session_id].find(message.text.lower()) != -1):
await message.answer('✅Верно!')
else:
await message.answer('❌Ответ неверный. Правильный ответ: ' + en_words[rand_word_index])
Отредактировано utyara3 (Янв. 12, 2024 20:01:51)
Офлайн
Понятия не имею что вы там куда поменяли и откуда этот кусок кода
Я же не вижу ваше монитор
if (sessions[session_id].find(message.text.lower()) != -1):
Офлайн
ZerG
откуда этот кусок кода
import asyncio from aiogram import F from aiogram import Bot,Dispatcher,types from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import ReplyKeyboardBuilder from aiogram.filters import Command from aiogram.utils.formatting import Text, Bold from lists_words import * import logging import random #logging.basicConfig(level=logging.INFO) bot = Bot(bot_token, parse_mode='HTML') dp = Dispatcher() ru_words = [i[1:] for i in all_words] en_words = [i[0] for i in all_words] lang = 'en' sessions = {} @dp.message(F.text, Command('start')) async def start_command(message: types.Message, bot: Bot): builder_inline = InlineKeyboardBuilder() builder_reply = ReplyKeyboardBuilder() builder_reply.add(types.KeyboardButton(text = 'Отправка русского слова')) builder_reply.add(types.KeyboardButton(text = 'Отправка английского слова')) content = Text( 'Привет, ', Bold(message.from_user.full_name), '!' ) user_id = 2043068682 chat_info = await bot.get_chat(user_id) if not chat_info.has_private_forwards: builder_inline.row(types.InlineKeyboardButton( text='Связаться с разработчиком', url=f't.me/utyara3' ) ) await message.answer( **content.as_kwargs(), reply_markup=builder_reply.as_markup(resize_keyboard=True) ) await message.delete() await message.answer( 'Если у вас есть вопросы, то можно', reply_markup=builder_inline.as_markup() ) @dp.message(F.text.lower() == 'отправка русского слова') async def send_ru(message: types.Message): global rand_word_index global lang rand_word_index = random.randint(0, len(ru_words) - 1) session_id = message.from_user.username word1 = en_words[rand_word_index] word2 = ', '.join(ru_words[rand_word_index]) sessions[session_id] = word1 print('Дикт сессионс',sessions) lang = 'ru' print('Бот пишет ' + message.from_user.full_name + ': ' + word2) await message.answer(f'{word2}') @dp.message(F.text.lower() == 'отправка английского слова') async def send_ru(message: types.Message): global rand_word_index global lang rand_word_index = random.randint(0, len(ru_words) - 1) word1 = ', '.join(ru_words[rand_word_index]) word2 = en_words[rand_word_index] session_id = message.from_user.username sessions[session_id] = word1 print('Дикт сессионс:', sessions) lang = 'en' print('Бот пишет ' + message.from_user.full_name + ': ' + word2) await message.answer(f'{word2}') @dp.message(F.text) async def send_translate(message: types.Message): global rand_word_index global lang session_id = message.from_user.username if lang == 'ru': if (sessions[session_id].find(message.text.lower()) != -1): await message.answer('✅Верно!') else: await message.answer('❌Ответ неверный. Правильный ответ: ' + en_words[rand_word_index]) elif lang == 'en': if (sessions[session_id].find(message.text.lower()) != -1): await message.answer('✅Верно!') else: await message.answer('❌Ответ неверный. Правильный ответ: ' + ', '.join(ru_words[rand_word_index])) print(message.from_user.username + ' отвечает: ' + message.text) async def main(): await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) if __name__ == '__main__': asyncio.run(main())
Офлайн
Одна из первых библиотек для создания ботов. Отличается от Aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
drift hunters
Офлайн