@pe4nkasasha

Почему выдает ошибку при включении бота телеграмм?

RuntimeError: <_overlapped.Overlapped object at 0x000002C310EC5030> still has pending operation at deallocation, the process may crash
INFO:aiogram.dispatcher.dispatcher:Start polling.
Почему выдает в коде вроде бы все верно?
64e1c4fc10701375774016.png

Код:
# Настройка логирования
logging.basicConfig(level=logging.INFO)

# Создание объекта бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Множество для хранения авторизованных пользователей
authorized_users = set()

# Множество для ожидания подбора игрока
waiting_for_game = set()

# Словарь для хранения данных текущей игры
games = {}

# Задание списка вопросов для игры
game_questions = [
    "Назовите животное на букву 'К':",
    "Назовите столицу Франции:",
    "Назовите цвет глаз у человека:"
]

class WordGame:
    def __init__(self, user1, user2):
        self.user1 = user1
        self.user2 = user2
        self.score1 = 0
        self.score2 = 0
        self.current_question = None

    async def start_game(self):
        await self.ask_question()

    async def ask_question(self):
        self.current_question = random.choice(game_questions)
        await bot.send_message(self.user1, self.current_question)
        await bot.send_message(self.user2, self.current_question)

        await asyncio.sleep(15)  # Время на ответ

        await self.check_answers()

    async def check_answers(self):
        if self.current_question:
            user1_answer = games[self.user1]
            user2_answer = games[self.user2]

            if len(user1_answer) > len(user2_answer):
                self.score1 += 1
                await bot.send_message(self.user1, "Вы получаете очко!")
            elif len(user2_answer) > len(user1_answer):
                self.score2 += 1
                await bot.send_message(self.user2, "Вы получаете очко!")

            await bot.send_message(self.user1, f"Счет: {self.score1}-{self.score2}")
            await bot.send_message(self.user2, f"Счет: {self.score1}-{self.score2}")

            if self.score1 < 10 and self.score2 < 10:
                await self.ask_question()
            else:
                if self.score1 > self.score2:
                    winner = self.user1
                else:
                    winner = self.user2
                await bot.send_message(winner, "Вы выиграли!")
                await self.end_game()

    async def end_game(self):
        del games[self.user1]
        del games[self.user2]
        authorized_users.remove(self.user1)
        authorized_users.remove(self.user2)

# Обработчик команды /start для авторизации пользователя
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    user_id = message.from_user.id
    authorized_users.add(user_id)
    await message.answer("Вы авторизованы и готовы начать игру.\nИспользуйте /menu для выбора действия.")

# Обработчик команды /menu для отображения меню
@dp.message_handler(commands=['menu'])
async def menu(message: types.Message):
    user_id = message.from_user.id
    if user_id in authorized_users:
        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        join_button = types.KeyboardButton('Подбор игрока')
        menu_button = types.KeyboardButton('/menu')
        keyboard.row(join_button)
        keyboard.row(menu_button)
        await message.answer("Выберите действие:", reply_markup=keyboard)
    else:
        await message.answer("Вы не авторизованы. Используйте /start для авторизации.")

# Обработчик команды "Подбор игрока" для начала процесса поиска соперника
@dp.message_handler(lambda message: message.text == 'Подбор игрока')
async def join_game(message: types.Message):
    user_id = message.from_user.id
    if user_id in authorized_users:
        if user_id in waiting_for_game:
            await message.answer("Вы уже ждете подбора игрока.")
        else:
            waiting_for_game.add(user_id)
            await message.answer("Вы ждете подбора игрока.\nДля отмены используйте /cancel")
            await find_opponent(user_id)
    else:
        await message.answer("Вы не авторизованы. Используйте /start для авторизации.")

# Функция для поиска соперника
async def find_opponent(user_id):
    if len(waiting_for_game) >= 2:
        players = list(waiting_for_game)
        waiting_for_game.clear()

        user1 = players[0]
        user2 = players[1]

        games[user1] = ""
        games[user2] = ""

        await bot.send_message(user1, "Игра начинается! Ожидайте вопроса...")
        await bot.send_message(user2, "Игра начинается! Ожидайте вопроса...")

        game = WordGame(user1, user2)
        await game.start_game()

# Обработчик текстовых сообщений для ответов на вопросы
@dp.message_handler(lambda message: message.text and message.from_user.id in games)
async def save_answer(message: types.Message):
    user_id = message.from_user.id
    games[user_id] = message.text

# Обработчик команды "Отмена" для отмены ожидания подбора игрока
@dp.message_handler(commands=['cancel'])
async def cancel(message: types.Message):
    user_id = message.from_user.id
    if user_id in waiting_for_game:
        waiting_for_game.remove(user_id)
        await message.answer("Подбор игрока отменен.")
    else:
        await message.answer("Нет активных операций для отмены.")

# Функция для остановки бота
async def shutdown(dp):
    await bot.send_message("Бот выключается.")
    await dp.storage.close()
    await dp.storage.wait_closed()

# Запуск бота
if __name__ == '__main__':
    from aiogram import executor
    from aiogram.contrib.fsm_storage.memory import MemoryStorage

    # Инициализация хранилища состояний
    storage = MemoryStorage()

    # Подключение хранилища к диспетчеру
    dp.storage = storage

    # Запуск бота с обработчиком остановки
    executor.start_polling(dp, skip_updates=True, on_shutdown=shutdown)


Библиотеки:
import logging
import random
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.utils import executor
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Баг в Asyncio. Вылечить можно так:
import platform
if platform.system() == 'Windows':
   asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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