Так вот и вторая часть серии статьей про то, как я пытался интегрировать дота бота в дискорд бота.
НАЧАЛО
За основу дискорд бота была взята библиотека disnake. Тут все просто, создаем класс бота
и добавляем к нему ивент что бот готов. Теперь напишем класс нашего дота бота
Так как мы будем генерировать команды по ммрам, то нужно создать кнопку регистрации игрока где он будет указывать свой ММР и сохранять эти данные в базу данных. Я всегда любил MongoDB, а не эти ваши SQL.
Тут все просто. И теперь создадим модал для дискорда.
Два поля с дота айди и ммрами. Функция callback вызывается, когда пользователь отправил модал. Создадим команду которая будет отправлять кнопку для регистрации, и сделаем обработчик нажатия на кнопку.
Теперь создадим наш главный класс, который будет отвечать за матч в компьютерной игре Dota 2.
Разберем самые интересные моменты.
- Метод check проверят готовы ли игроки к созданию лобби ( 1 часть метода ). Вторая же часть проверяет все ли игроки на своих местах, и если да то начинается игра.
- Метод shuffle. Шафлит случайно по ммрам. Метод основанных на выборке случайного из игроков, что делает каждое лобби уникальным и оно редко повторяется.
Теперь создадим команду которая будет регистрировать игру и обработчик для кнопки
Я создал базу для все этого. Теперь осталось понять как это все запустить. Очевидно, что будет использована многопоточность, но как тогда передавать данные из одного потока в другой? Для этого я использовал библиотеку queue.
В свойствах класса NGSGame вы могли заметить свойство game_state оно, как очевидно из названия хранит в себе состояние игры.
и в методе end мы изменяем состояние игры и засовываем ее в очередь. А в файле с ботом дискорда создаем task.loop
который и будет проверять состояние игры и взаимодействовать уже с дискордом. Теперь наконец создадим экземпляры наших классов и запустим
И как мы видим все прекрасно работает. Это лишь одна из реализаций этой идеи. Также есть обновление, но я расскажу про него в следующем выпуске