Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2024 21:35:24

utyara3
Зарегистрирован: 2021-07-12
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

Я пишу телеграм бота, его цель заключается в том, что он отправляет русское/английское слово, а ты должен написать ему перевод. Я все реализовал, но столкнулся с проблемой, что если ботом пользуются сразу множество пользователей, то происходит вот что:
Бот отправляет слово с переводом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)

Офлайн

#2 Янв. 12, 2024 19:19:01

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

Ну так у вас кто дернул функцию того и тапки и если первый дернул и в то же время другой то переменная у их одна на двоих

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



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Янв. 12, 2024 19:59:16

utyara3
Зарегистрирован: 2021-07-12
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

ZerG
Ну так у вас кто дернул функцию того и тапки и если первый дернул и в то же время другой то переменная у их одна на двоихНапример при запуске функции создавайте словарь по айди пользователя со статусом и возвращайте пользователю значение из него же по айдиХотя хорошо бы условие узнать полное
да, я уже это исправил, спасибо, но возникла еще одна проблема, что хоть перевод закреплется за пользователем, если кто то другой написал перевод на свое слово, то результат отправляется другому, я думаю что то не так тут:
if (sessions[session_id].find(message.text.lower()) != -1):
await message.answer('✅Верно!')
else:
await message.answer('❌Ответ неверный. Правильный ответ: ' + en_words[rand_word_index])
тут sessions это словарь пользователь:перевод, session_id это его username.
он проверяет сообщение(message.text.lower()) не у того пользователя, как мне сделать что бы конкретный перевод проверялся у конкретного пользователя?

Отредактировано utyara3 (Янв. 12, 2024 20:01:51)

Офлайн

#4 Янв. 12, 2024 20:31:56

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

Понятия не имею что вы там куда поменяли и откуда этот кусок кода
Я же не вижу ваше монитор

 if (sessions[session_id].find(message.text.lower()) != -1):
Это что?
Код приложите



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Янв. 13, 2024 01:37:43

utyara3
Зарегистрирован: 2021-07-12
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

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

Офлайн

#6 Апрель 11, 2024 11:30:04

squeakreproduce
Зарегистрирован: 2024-04-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка множества пользователей aiogram

Одна из первых библиотек для создания ботов. Отличается от Aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
drift hunters

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version