Guild manager discord команды

Обновлено: 06.07.2024

Я расскажу о создании Discord-бота на Python, который запускает сборку проекта в Unity Cloud Build и создаёт ссылку на скачивание для QA из внешней команды.

Настройка и поддержка полноценного CI занимает много времени и средств. При этом команде чаще всего нужна базовая функциональность. Так случилось и с нашим проектом. Потребовался простой способ сборки проекта в Unity Cloud Build и передачи его на внешний QA.

На начальном этапе были такие условия и ограничения:

  • репозиторий проекта — Bitbucket (есть поддержка GitHub и GitLab);
  • наличие лицензии Unity Teams Advanced, которая разблокирует доступ к Unity Cloud Build;
  • ограниченный доступ к Unity Cloud Build для части команды;
  • сборка версии проекта не после каждого коммита в ветку, а только после завершения работы над функциональностью или багом.

Для этих целей был создан Discord-бот на Python (этот язык выбрал, как самый быстрый и удобный для автоматизации). Он позволил команде запускать сборку версии в Unity Cloud Build, и после её успешного завершения формировал ссылку для скачивания QA, как внутри команды, так и вне её.

Настройка проекта в Unity Cloud Build


Далее выбираем Create project и вводим имя нашего проекта (для примера, назовем его Dungeon Crawl Prototype):


После этого в списке проектов появится созданный проект. Переходим к нему и выбираем SET UP CLOUD BUILD:


На следующей странице выбираем с каким Git репозиторием будем интегрировать наш проект. В нашем случае это GitHub:


Подключаем GitHub и переходим к настройке сборки проекта:


Добавляем новую сборку SETUP NEW TARGET:


Выбираем платформу. В нашем примере было создано две сборки под Windows 64 и Android:


Вводим название Target Label, в Branch ветку в git репозитории. Для тестового примера был установлен флаг Auto Detect Version:


Для примера был выбран Debug ключ и тестовый Bundle ID:


Далее нажимаем NEXT: BUILD, после чего настройка сборки завершена. Те же шаги необходимо повторить и для других платформ. На этом заканчиваем настройку Unity Cloud Build. В будущем понадобится создать Discord-оповещения для старта построения сборки и результата сборки. Сделаем это после настройки сервера.

Создание и настройка Discord-гильдии (сервера)


После создания сервера необходимо добавить новые роли. Для этого переходим в настройки и создаем три:

  • bot для нашего бота, ci для пользователей:
  • ci для пользователей, которые смогут давать команды боту:
  • qa для тех, кому будет доступна ссылка на скачивания сборки.


Далее создадим три канала:


На этом настройка гильдии закончена. Следующим шагом будет создание Discord-бота.

Создание и настройка Discord-бота


Далее создаем бота. Для этого переходим в созданное приложение, выбираем вкладку Bot и нажимаем Add Bot:


Далее необходимо настроить разрешения для бота. Переходим в пункт OAuth2 и выбираем следующие опции:


После выбора всех опций копируем url кнопкой Copy. Затем в браузере переходим по скопированной ссылке, выбираем Discord-гильдию, созданную ранее, и проверяем, выставленные разрешения:


Далее в настройках Discord-гильдии добавляем нашего бота в роль bot, которую создали ранее:


Осталось настроить Discord-оповещения для Unity Cloud Build (о начале и завершении сборки, и её результате):

Настройка Discord оповещения для Unity Cloud Build

Возвращаемся в Unity Cloud Build и переходим в раздел Notifications, в котором выбираем Integrations page:


Далее создаем новую интеграцию, нажав на NEW INTEGRATION:


Выбираем Discord и нажимаем NEXT:




На этом настройка оповещений и окружения завершена. На следующем этапе создадим Discord-бот на Python.

Создание Discord-бота на Python

Настройка проекта

Руководитель направления (Technical Product Manager)

Sportmaster Lab , Липецк, Санкт-Петербург, Москва , От 200 000 до 300 000 ₽

Создаём новый проект и добавляем в него requirements.txt с таким содержанием:

Так же создаём файл .env с переменными:

DISCORD_GUILD — название Discord гильдии.

DISCORD_BOT_NAME — имя бота.

DISCORD_TOKEN — можно получить на Discord Developer Portal в разделе Bot, скопировав токен:


UNITY_API_KEY можно получить в настройках Unity Cloud Build:


UNITY_ORGANIZATION_ID и PROJECT_ID так же можно получить в Unity Cloud Build. Для этого открываем конфигурацию сборки и нажимаем на EDIT BASIC INFO:


Далее в строке браузера можно увидеть UNITY_ORGANIZATION_ID и PROJECT_ID:


PROJECT_NAME — имя проекта, который собирается в Unity Cloud Build:

Написание бота

Далее я опишу основные моменты реализации Discord-бота. Создаём класс DiscordBot который наследуется от discord.Client. Он реализует API, позволяющее подключиться к Discord гильдии:

Далее необходимо подключиться к Discord-гильдии:

Метод on_ready, позволяет реагировать на событие подключения бота к Discord-гильдии:

Для работы с Unity Cloud Build создаём класс UnityCloudBuildWorker:

Запуск бота как сервис

Для удобства запуска бота на удаленном сервере мы добавили в репозиторий возможность собрать и запустить бота в качестве Docker-контейнера. Для этого были добавлены Dockerfile:

И Makefile, в котором описаны команды up и down для запуска и остановки контейнера с ботом:

На каждом шаге будем постепенно наращивать функционал.

Создадим новый web api проект с одним контроллером /check. При обращении к этому адресу будем отправлять строку “Hello!” в Discord чат.

Научимся получать данные о составе гильдии с помощью готовой библиотеки или заглушки.

Научимся сохранять в кэш полученный список игроков чтобы при следующих проверках находить различия с предыдущей версией списка. Обо всех изменениях будем писать в Discord.

Напишем Dockerfile для нашего проекта и разместим проект на хостинге Heroku.

Посмотрим на несколько способов сделать периодическое выполнение кода.

Реализуем автоматическую сборку, запуск тестов и публикацию проекта после каждого коммита в master

Создание нового проекта - это одна из фундаментальных вещей которые я не буду подробно расписывать. При работе над проектом используйте сервис Github для хранения кода. В дальнейшем мы воспользуемся несколькими возможностями Github.

Добавим к проекту новый контроллер

Получить его можно в пункте integrations в настройках любого текстового канала вашего Discord сервера.

Создание webhook

Создание webhook

Добавим webhook в appsettings.json нашего проекта. Позже мы унесем его в переменные окружения Heroku. Если вы не знакомы с тем как работать с конфигурацией в ASP Core проектах предварительно изучите эту тему.

Кроме того, я извлек интерфейс этого класса, чтобы в дальнейшем можно было сделать его заглушку при тестировании. Делайте это для всех сервисов которые мы будем создавать далее.

Не забудьте что новый класс нужно будет зарегистрировать в Startup.

Теперь можно воспользоваться новым классом в контроллере.

Получаем реальные данные

Подключим к проекту библиотеку ArgentPonyWarcraftClient.

Создадим новый класс BattleNetApiClient в папке Services.

В конструкторе мы создаем новый экземпляр класса WarcraftClient.
Этот класс относится к библиотеке, которую мы установили ранее. С его помощью можно получать данные об игроках.

Кроме этого, нужно создать в appsettings проекта две новых записи RealmName и GuildName. RealmName это название игрового мира, а GuildName это название гильдии. Их будем использовать как параметры при запросе.

Сделаем метод GetGuildMembers чтобы получать состав гильдии и создадим модель WowCharacterToken которая будет представлять собой информацию об игроке.

Класс WowCharacterToken следует поместить в папку Models.

Не забудьте подключить BattleNetApiClient в Startup.

Берем данные из заглушки

Для начала создадим модель WowCharacterToken и поместим ее в папку Models. Она представляет собой информацию об игроке.

Дальше сделаем вот такой класс

Он возвращает зашитый в него список игроков. При первом вызове метода мы вернем один список, при последующих другой. Это нужно нам что смоделировать изменчивое поведение api. Этой заглушки хватит чтобы продолжить делать проект.

Сделайте интерфейс и подключите все что мы создали в Startup.

Выведем результаты в Discord

После того как мы сделали BattleNetApiClient, им можно воспользоваться в контроллере чтобы вывести кол-во игроков в Discord.

Шаг 3. Находим новых и ушедших игроков

Нужно научиться определять какие игроки появились или пропали из списка при последующих запросах к api. Для этого мы можем закэшировать список в InMemory кэше (в оперативной памяти) или во внешнем хранилище.

Если закэшировать список в InMemory кэше, то мы потеряем его при перезапуске приложения. Поэтому позже мы подключим базу данных Redis как аддон в Heroku и будем кешировать туда.

А пока что подключим InMemory кэш в Startup.

Теперь в нашем распоряжении есть IDistributedCache, который можно подключить через конструктор. Я предпочел не использовать его напрямую , а написать для него обертку. Создайте класс GuildRepository и поместите его в новую папку Repositories.

GuildRepository нужно зарегистрировать как Singletone зависимость, чтобы кэш не пересоздавался на каждый запрос.

Теперь можно написать сервис который будет сравнивать новый список игроков с сохраненным.

В качестве возвращаемого результата используется модель Report. Ее нужно создать и поместить в папку Models.

Применим GuildService в контроллере.

Теперь отправим в Discord какие игроки присоединились или покинули гильдию.

Можно вывести больше информации об игроке. Ее можно получить если воспользоваться библиотекой ArgentPonyWarcraftClient

Я решил не добавлять в статью больше кода в BattleNetApiClient, чтобы статья не разрослась до безумных размеров.

Unit тесты

У нас появился класс GuildService с нетривиальной логикой, который будет изменяться и расширяться в будущем. Стоит написать на него тесты. Для этого нужно будет сделать заглушки для BattleNetApiClient, GuildRepository и DiscordBroker. Я специально просил создавать интерфейсы для этих классов чтобы можно было сделать их фейки.

Создайте новый проект для Unit тестов. Заведите в нем папку Fakes и сделайте три фейка.

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

Первый тест на GuildService будет выглядеть так:

Как видно из названия, тест позволяет проверить что мы сохраним список игроков, если кэш пуст. Заметьте, в конце теста используется специальный набор методов Should, Be. Это методы из библиотеки FluentAssertions, которые помогают нам сделать Assertion более читабельным.

Теперь у нас есть база для написания тестов. Я показал вам основную идею, дальнейшее написание тестов оставляю вам.

Главный функционал проекта готов. Теперь можно подумать о его публикации.

Шаг 4. Привет Docker и Heroku!

Чтобы упаковать проект в Docker нам понадобится создать в корне репозитория Dockerfile со следующим содержимым

peon.dll это название моего Solution. Peon переводится как батрак.

О том как работать с Docker и Heroku можно прочитать здесь. Но я все же опишу последовательность действий.

Вам понадобится создать аккаунт в Heroku, установить Heroku CLI.

Создайте новый проект в heroku и свяжите его с вашим репозиторием.

Теперь нам необходимо создать файл heroku.yml в папке с проектом. У него будет такое содержимое:

Дальше выполним небольшую череду команд:

Можете открыть приложение в браузере с помощью команды:

После того как мы разместили приложение в Heroku, нужно подключить базу данных Redis для кэша. Как вы помните InMemory кэш будет исчезать после перезапуска приложения.

Установите для нашего Heroku приложения бесплатный аддон RedisCloud.

Строку подключения для Redis можно будет получить через переменную окружения REDISCLOUD_URL. Она будет доступна, когда приложение будет запущено в экосистеме Heroku.

Нам нужно получить эту переменную в коде приложения.

С помощью нее можно зарегистрировать Redis реализацию для IDistributedCache в Startup.

В этом коде мы получили переменную REDISCLOUD_URL из переменных окружения системы. После этого мы извлекли адрес и пароль базы данных с помощью класса RedisUtils. Его написал я сам:

На этот класс можно сделать простой Unit тест.

После того что мы сделали, GuildRepository будет сохранять кэш не в оперативную память, а в Redis. Нам даже не нужно ничего менять в коде приложения.

Опубликуйте новую версию приложения.

Шаг 5. Реализуем циклическое выполнение

Нам нужно сделать так чтобы проверка состава гильдии происходила регулярно, например каждые 15 минут.

Есть несколько способов это реализовать:

Третий способ - это подключить к проекту специальные Cron аддоны. Например Heroku Scheduler. Можете пойти этим путем и разобраться как создать cron job в Heroku.

Шаг 6. Автоматическая сборка, прогон тестов и публикация

Во-первых, зайдите в настройки приложения в Heroku.

Там есть пункт Deploy. Подключите там свой Github аккаунт и включите Automatic deploys после каждого коммита в master.


Поставьте галочку у пункта Wait for CI to pass before deploy. Нам нужно чтобы Heroku дожидался сборки и прогонки тестов. Если тесты покраснеют, то публикация не случится.

Сделаем сборку и прогонку тестов в Github Actions.


В репозитории появится новый файл dotnet.yml. Он описывает процесс сборки.

Как видите по его содержимому, задание build будет запускаться после пуша в ветку master.

Содержимое самого задания нас полностью устраивает. Если вы вчитаетесь в то что там происходит, то увидите что там происходит запуск команд dotnet build и dotnet test.

Менять в этом файле ничего не нужно, все уже будет работать из коробки.

Запушьте что-нибудь в master и посмотрите что задание запускается. Кстати, оно уже должно было запуститься после создания нового workflow.


Надеюсь данная статья подкинула вам пару новых идей и тем для изучения. Спасибо за внимание. Удачи вам в ваших проектах!

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Сегодня я хотел узнать как сделать получение ролей по нажатию на смайлик (реакцию под текстом), как на одном популярном русскоязычном сервере по осаде.

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Довольно удобная механика, думал и реализация простая, но не тут то было.

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

Встречайте его - YAGPDB.xyz. Бот обладающий не только функцией с деланием таких таблиц с ролями, но и многими другими (честно добавил ради таблицы с ролями :)). Начнем с добавления его на сервер.

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

1.Нас встречает такая красивая обложка, добавляем его с помощью кнопки справа сверху.

2. Когда добавили, можно заходить в "control panel", авторизируемся и выбираем нужный сервер, там уже будет наши инструменты. Для работы нам нужен только один раздел, а именно "Role Commands".

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Пока что, все непонятно, щас объясню.

Role command - это само название роли, пишите какое вам нужно, в подразделе виднеется две вкладки, group и role. О группе я расскажу чуть-чуть по позже, а роль, это присвоение этого название к определенной роли на сервере.

Пример: делаете роль для игры в Майнкрафт, пишите во вкладке name название роли, Майнкрафт, а во вкладке role выбираете роль на сервере (предварительно создав саму роль),

Оставшиеся две вкладки в разделе, нам не пригодятся (точнее мне они не пригодились), в разделе "Create a new group", нужно создать грубо говоря, категорию ролей, пишите что вам по душе, я писал "Игровые роли", т.к и делал игровые роли;)

В эту категорию нам нужно переместить нашу роль/роли, в самой категории нас могут интересовать две вкладки, "Temporary roles (minutes)" и "Mode".

Первая вкладка отвечает за время за которое будут сниматься роль, если убрали реакцию, а вторая сколько можно будет иметь этих ролей, не больше одной или наоборот, несколько. (Не забудьте в максимальном колличестве ролей, написать нужное ВАМ число, вместо нуля, а то тогда не получится взять не одну роль).

Дальше пора переходить на сервер, там нужно прописать команду:

-rolemenu create "ваше название категории"

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Дальше, прописываем команду:

Вот что у меня получилось:

Как сделать получение ролей через реакции в дискорде Discord, Длиннопост, Боты, Первый пост, Сервера дискорд

Теперь на этом точно все, писал я это в полную ночь, так что мог что то не уследить, поэтому задавайте вопросы, и если что то не поняли можете спросить у меня на прямую, на самом сервере, вот ссылка:

Надеюсь хоть кому-то помог в этом большом обзоре, не забывайте про место где меня можно найти, и всем пока!

Какое-то из них нужно копировать, или написать свое, и вставить его айди?

при вставке реакции
"Flags:-nodm: false toggle with rolemenu update -nodm 570117347390783488: disables dm messages.-rr: true toggle with rolemenu update -rr 570117347390783488: removing reactions removes the role"

Как сделать так, чтоб при нажатии на роль, участник мог только получить только одну роль.(если он нажмёт на вторую emoji чтоб получить роль то первая роль снимается, а вторая выдается)

Как по мне, вариант с написанием своего бота получше, бо тогда будет намного больше функций, чем этот способ. (хостить можно на бесплатном хостинге heroku)

Спасибо. От души!

Здравствуйте, возникла такая ситуация, не могу добавить роль, тоесть говорить эта роль больше бота и т.д

На данный момент, можно с вами как-нибудь связаться? В дискорде. Ссылка уже неактивна..

спасибо тебе добрый человек, некоторые моменты уже не актуальны, но в целом ты очень помог

Ответ на пост «Как сделать получение ролей через реакции в дискорде» Discord, Боты, Первый пост, Ответ на пост

Опять шерстяной.

Московский бородач сначала жестоко избил парня на улице, а затем ударил в лицо его девушку, которая заступилась за любимого.

Причина конфликта — пострадавший косо посмотрел на проходившего мимо агрессивного молодого человека.

Про штрафы и наказания

Про штрафы и наказания Антипрививочники, QR-код, Скриншот, Комментарии, Россия, Штраф, Политика

Акула бизнеса

Акула бизнеса Быдло, 2ГИС, Длиннопост, Повтор, Мат, Скриншот

Акула бизнеса Быдло, 2ГИС, Длиннопост, Повтор, Мат, Скриншот

Акула бизнеса Быдло, 2ГИС, Длиннопост, Повтор, Мат, Скриншот

За качество скринов извиняюсь, брал в местном паблике


Нараспев

Нараспев

А ты слышишь этот звук ?)

А ты слышишь этот звук ?) Зима, Штаны, Россия, Холод, Утро, Улица, Звук, Картинка с текстом, Юмор


Окончание проекта "икота"

Здравствуйте, люди добрые.
Вот и добрались до неутешительной сути. Гепатит С.
Пока не знаю, что дальше.
Не болейте. Проверьтесь на всякий случай.
Зараза ничем себя не выдаёт. Завтра иду на эластографию печени. Поглядим, что там.
Спасибо всем, кто "учавствовал" )
Всего доброго. Берегите себя.


Тем временем в Тиндере на злобу дня:

Тем временем в Тиндере на злобу дня:


Человек

Ответ на пост «Промашка»

Пришел со школы. 5 класс. По дороге встретил маму, идущую в магазин.Она сказала сейчас из магазина вернется и будем кушать.
Есть хотелось сильно, на плите ( печь кирпичная дровяная) в кастрюле стояла уха. Решил сам поесть, не маленький.
Налил уху, поел. С добавкой.
Мама заходит:
- Пойдем кушать
- Мам, я уже поел
- Что ты поел? Еда в духовке нетронутая стоит
- Уху
- Это не уха, это я поросятам маленьким потроха рыбные сварила с картофельными очистками.
Не знаю как поросятам, мне было вкусно)


Надёжный план

Надёжный план Юмор, Скриншот, Twitter, Отношения

. *и делает вид, что поверила*

. *и делает вид, что поверила*


А баба то шарит.

А баба то шарит. Мемы, Авто, Девушки

Бородатые рейсеры

В Подмосковье бородатые рейсеры избили мужчину с грудным ребёнком, возмутившегося гонками под окнами. Дела на них заводить не стали.

Балашиха, сентябрь. 37-летний Станислав выходит гулять с ребёнком. В это время Гаджимурад Джанболатов, его жена Айшат Хидирбекова и её племянник тестят во дворе новую BMW X6, как она разгоняется от 0 до 100. Станислав просит парней отъехать от дома, чтобы пыль не летела в коляску, а грохот не мешал ребёнку спать. А дальше — всё по классике.

Гонщики выскочили из автомобиля и полезли в драку. Станислав кое-как отбился, зашёл в подъезд и оттуда вызвал полицию. Борцухи зашли следом за ним, просьбу мужчины разрешить завезти в дом коляску и потом разобраться один на один проигнорировали. После драки два месяца Станислав лечился, из-за тремора не может брать ребёнка на руки, водить машину, работать. Судмедэкспертиза усмотрела в происшедшем только лёгкий вред здоровью, дело не возбудили.

Далее по тексту следующая статья.

Мужчине, избитому уличными рейсерами в Балашихе, пришлось продать квартиру и переехать — он боялся за свою жизнь и жизнь ребёнка.

В сентябре Станислав гулял с коляской, сделал замечание гонявшим во дворе Гаджимураду Джанболатову с компанией — после чего его избили всей толпой при грудном ребёнке. Дела правоохранители возбуждать не стали. Зато, по словам Станислава, сильно возбудились его соседи. Они караулили его под дверью, преследовали его и его жену, когда они покидали квартиру.

Потом Станислав узнал, что Айшат Хидирбекова в драке откусила кусок носа другой женщине — тогда против неё возбудили дело о причинении тяжкого вреда здоровью, но вместо 8 лет тюрьмы она отделалась штрафом в 10 тысяч. Услышав об этом, Станислав продал квартиру и съехал в другой район. Сейчас он добивается независимой экспертизы и хочет, чтобы дело всё же было возбуждено. Гаджимурад, один из подозреваемых, сказал нам, что "конфликт замяли", никакого вреда здоровью не было, а гипс мужчина надел специально, чтобы симулировать травму.

Она ещё не поняла

Она ещё не поняла


Необычное имя

Необычное имя


У нас открыли памп трек.и яжматери сразу привели малышей на него

Интересно как скоро лбы подротски собьют мелких и будут драться с родителями?)

У нас открыли памп трек.и яжматери сразу привели малышей на него Дети, Яжмать, Безопасность, Техника безопасности, Длиннопост

Мелкие падают.подскальзываются.не могут выбраться из ямы)

У нас открыли памп трек.и яжматери сразу привели малышей на него Дети, Яжмать, Безопасность, Техника безопасности, Длиннопост

12+? Шлемы? Всем пофигу)

Ответ на пост «Опять шерстяной. »

Любой, кто находится в сети, знаком с Discord. Он бесплатный и простой в использовании, что позволяет вам создавать социальную онлайн-среду без необходимости знать что-либо, кроме имен пользователей вашего компаньона.

Список команд в чате Discord

Команды модерации и поиска MEE6 Bot

MEE6 имеет всевозможные функции, позволяя пользователям использовать MEE6 как для модерации, так и для поиска. Команды модерации дают администраторам серверов возможность поддерживать закон и порядок в своих различных каналах. Команды поиска предписывают MEE6 сканировать различные базы данных в поисках записей, изображений, видео и информации.

Кроме того, панель управления MEE6 позволяет пользователям программировать свои собственные команды для ботов.

Полный гайд по командам Discord

Команды модерации бота MEE6

MEE6 предлагает набор основных команд модерации чата:

Команды поиска ботов MEE6

Мало того, MEE6 предлагает набор потрясающих команд поиска, позволяющих извлекать информацию обо всем, от покемонов до стримеров Twitch, или вставлять видео и изображения YouTube. Вот полный список команд.

Программирование пользовательских команд MEE6

Программировать собственные команды MEE6 поразительно просто. Он не требует знания Python или синтаксиса и встроен в вашу панель управления MEE6. Но на всякий случай, если вы никогда не делали этого раньше, я здесь, чтобы дать вам быстрый урок

  • Войдите в панель управления MEE6 со своей учетной записью Discord.
  • Выберите сервер, на котором вы хотите применить новую настраиваемую команду, нажав кнопку «Перейти к панели управления».
  • Выберите вариант «Пользовательские команды», который предлагает вам «добавить потрясающие пользовательские команды на ваш сервер».
  • Коснитесь параметра «Создать команды» и выберите «Создать команду» в появившемся меню.
  • Введите имя команды после восклицательного знака, это будет ваш код для активации команды. Главный совет: чем короче и запоминается, тем лучше!
  • Введите текст, которым должен ответить бот. Вы также можете добавить дополнительные свойства, чтобы контролировать, кто может его использовать, на каких каналах и как часто.
  • Нажмите «Добавить».

Команды модерации и новизны Dyno Bot в Discord

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

Команды модерации Dyno Bot

Команды Dyno Bot для новинок

Разные команды Dyno Bot

Но это еще не все. Бот Dyno также предлагает ряд других команд, столь же простых, сколь и случайных:

Я расскажу о создании Discord-бота на Python, который запускает сборку проекта в Unity Cloud Build и создаёт ссылку на скачивание для QA из внешней команды.

Настройка и поддержка полноценного CI занимает много времени и средств. При этом команде чаще всего нужна базовая функциональность. Так случилось и с нашим проектом. Потребовался простой способ сборки проекта в Unity Cloud Build и передачи его на внешний QA.

На начальном этапе были такие условия и ограничения:

  • репозиторий проекта — Bitbucket (есть поддержка GitHub и GitLab);
  • наличие лицензии Unity Teams Advanced, которая разблокирует доступ к Unity Cloud Build;
  • ограниченный доступ к Unity Cloud Build для части команды;
  • сборка версии проекта не после каждого коммита в ветку, а только после завершения работы над функциональностью или багом.

Для этих целей был создан Discord-бот на Python (этот язык выбрал, как самый быстрый и удобный для автоматизации). Он позволил команде запускать сборку версии в Unity Cloud Build, и после её успешного завершения формировал ссылку для скачивания QA, как внутри команды, так и вне её.

Настройка проекта в Unity Cloud Build


Далее выбираем Create project и вводим имя нашего проекта (для примера, назовем его Dungeon Crawl Prototype):


После этого в списке проектов появится созданный проект. Переходим к нему и выбираем SET UP CLOUD BUILD:


На следующей странице выбираем с каким Git репозиторием будем интегрировать наш проект. В нашем случае это GitHub:


Подключаем GitHub и переходим к настройке сборки проекта:


Добавляем новую сборку SETUP NEW TARGET:


Выбираем платформу. В нашем примере было создано две сборки под Windows 64 и Android:


Вводим название Target Label, в Branch ветку в git репозитории. Для тестового примера был установлен флаг Auto Detect Version:


Для примера был выбран Debug ключ и тестовый Bundle ID:


Далее нажимаем NEXT: BUILD, после чего настройка сборки завершена. Те же шаги необходимо повторить и для других платформ. На этом заканчиваем настройку Unity Cloud Build. В будущем понадобится создать Discord-оповещения для старта построения сборки и результата сборки. Сделаем это после настройки сервера.

Создание и настройка Discord-гильдии (сервера)


После создания сервера необходимо добавить новые роли. Для этого переходим в настройки и создаем три:

  • bot для нашего бота, ci для пользователей:
  • ci для пользователей, которые смогут давать команды боту:
  • qa для тех, кому будет доступна ссылка на скачивания сборки.


Далее создадим три канала:


На этом настройка гильдии закончена. Следующим шагом будет создание Discord-бота.

Создание и настройка Discord-бота


Далее создаем бота. Для этого переходим в созданное приложение, выбираем вкладку Bot и нажимаем Add Bot:


Далее необходимо настроить разрешения для бота. Переходим в пункт OAuth2 и выбираем следующие опции:


После выбора всех опций копируем url кнопкой Copy. Затем в браузере переходим по скопированной ссылке, выбираем Discord-гильдию, созданную ранее, и проверяем, выставленные разрешения:


Далее в настройках Discord-гильдии добавляем нашего бота в роль bot, которую создали ранее:


Осталось настроить Discord-оповещения для Unity Cloud Build (о начале и завершении сборки, и её результате):

Настройка Discord оповещения для Unity Cloud Build

Возвращаемся в Unity Cloud Build и переходим в раздел Notifications, в котором выбираем Integrations page:


Далее создаем новую интеграцию, нажав на NEW INTEGRATION:


Выбираем Discord и нажимаем NEXT:




На этом настройка оповещений и окружения завершена. На следующем этапе создадим Discord-бот на Python.

Создание Discord-бота на Python

Настройка проекта

Руководитель направления (Technical Product Manager)

Sportmaster Lab , Липецк, Санкт-Петербург, Москва , От 200 000 до 300 000 ₽

Создаём новый проект и добавляем в него requirements.txt с таким содержанием:

Так же создаём файл .env с переменными:

DISCORD_GUILD — название Discord гильдии.

DISCORD_BOT_NAME — имя бота.

DISCORD_TOKEN — можно получить на Discord Developer Portal в разделе Bot, скопировав токен:


UNITY_API_KEY можно получить в настройках Unity Cloud Build:


UNITY_ORGANIZATION_ID и PROJECT_ID так же можно получить в Unity Cloud Build. Для этого открываем конфигурацию сборки и нажимаем на EDIT BASIC INFO:


Далее в строке браузера можно увидеть UNITY_ORGANIZATION_ID и PROJECT_ID:


PROJECT_NAME — имя проекта, который собирается в Unity Cloud Build:

Написание бота

Далее я опишу основные моменты реализации Discord-бота. Создаём класс DiscordBot который наследуется от discord.Client. Он реализует API, позволяющее подключиться к Discord гильдии:

Далее необходимо подключиться к Discord-гильдии:

Метод on_ready, позволяет реагировать на событие подключения бота к Discord-гильдии:

Для работы с Unity Cloud Build создаём класс UnityCloudBuildWorker:

Запуск бота как сервис

Для удобства запуска бота на удаленном сервере мы добавили в репозиторий возможность собрать и запустить бота в качестве Docker-контейнера. Для этого были добавлены Dockerfile:

И Makefile, в котором описаны команды up и down для запуска и остановки контейнера с ботом:

Читайте также: