Найти тему

Интеграция бота для Dota 2 в бота для дискорда №2

Так вот и вторая часть серии статьей про то, как я пытался интегрировать дота бота в дискорд бота.

НАЧАЛО

За основу дискорд бота была взята библиотека disnake. Тут все просто, создаем класс бота

и добавляем к нему ивент что бот готов. Теперь напишем класс нашего дота бота

-2
-3

Так как мы будем генерировать команды по ммрам, то нужно создать кнопку регистрации игрока где он будет указывать свой ММР и сохранять эти данные в базу данных. Я всегда любил MongoDB, а не эти ваши SQL.

-4

Тут все просто. И теперь создадим модал для дискорда.

-5

Два поля с дота айди и ммрами. Функция callback вызывается, когда пользователь отправил модал. Создадим команду которая будет отправлять кнопку для регистрации, и сделаем обработчик нажатия на кнопку.

-6
-7

Теперь создадим наш главный класс, который будет отвечать за матч в компьютерной игре Dota 2.

-8
-9
-10
-11
-12

Разберем самые интересные моменты.

  1. Метод check проверят готовы ли игроки к созданию лобби ( 1 часть метода ). Вторая же часть проверяет все ли игроки на своих местах, и если да то начинается игра.
  2. Метод shuffle. Шафлит случайно по ммрам. Метод основанных на выборке случайного из игроков, что делает каждое лобби уникальным и оно редко повторяется.

Теперь создадим команду которая будет регистрировать игру и обработчик для кнопки

-13
-14

Я создал базу для все этого. Теперь осталось понять как это все запустить. Очевидно, что будет использована многопоточность, но как тогда передавать данные из одного потока в другой? Для этого я использовал библиотеку queue.

В свойствах класса NGSGame вы могли заметить свойство game_state оно, как очевидно из названия хранит в себе состояние игры.

-15

и в методе end мы изменяем состояние игры и засовываем ее в очередь. А в файле с ботом дискорда создаем task.loop

-16

который и будет проверять состояние игры и взаимодействовать уже с дискордом. Теперь наконец создадим экземпляры наших классов и запустим

-17
-18
-19
-20
-21
-22

И как мы видим все прекрасно работает. Это лишь одна из реализаций этой идеи. Также есть обновление, но я расскажу про него в следующем выпуске