RuntimeError: <_overlapped.Overlapped object at 0x000002C310EC5030> still has pending operation at deallocation, the process may crash
INFO:aiogram.dispatcher.dispatcher:Start polling.
Почему выдает в коде вроде бы все верно?
Код:
# Настройка логирования
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