Как решить ошибку в Дискорд The user is banned from this guild

Александр Пиндык

Senior Software Engineer в Wargaming.net

Я расскажу о создании 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, как внутри команды, так и вне её.

Боты для Discord на Python: проект для начинающих

Перед тем, как начать писать бот, необходимо подготовить окружение. Для этого настроим Unity Cloud Build и Discord-гильдию (сервер) на сборку проекта под разные платформы. После этого настроим отправку сообщений об успешном завершении сборки из Unity Cloud Build в канал. И создадим бота, работающего с Unity Cloud Build и Discord.

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

Переходим в Unity Dashboard: https://dashboard.unity3d.com/landing и выбираем 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-гильдии (сервера)

Переходим по ссылке к Discord https://discord.com/, скачиваем приложение и создаем аккаунт. После того как приложение установлено и произведена авторизация в аккаунт, необходимо создать новый Discord-сервер (далее будем называть их гильдиями). Создаем новую гильдию нажав на  «‎+». Выбираем пункт Create My Own → For me and my friends и вводим название гильдии без пробелов.

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

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

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

  • ci для отправки команд боту;
  • build для сообщений от Unity Cloud Build;
  • testing отправки ссылок QA.

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

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

Боты для Discord создаются на Discord Developer Portal: https://discord.com/developers/applications. Необходимо перейти по ссылке и авторизоваться. Затем создаем новое приложение, нажав на New Application. Вводим имя приложения и нажимаем Create:

Далее создаем бота. Для этого переходим в созданное приложение, выбираем вкладку 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:

В появившемся окне выбираем события, при которых будут отправляться сообщения в гильдию. Затем нажимаем NEXT:

В появившемся окне авторизации выбираем нашу гильдию и канал, куда приходить сообщения. Нажимаем Authorize:

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

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

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

Для создания бота будем использовать Python 3.9, а для работы с Discord — библиотеку discord.py: https://pypi.org/project/discord.py/. Также понадобится библиотека python-dotenv для получения переменных окружения из .env файла.

Middle и Senior Python developer в проект Clutch

, ,

tproger.ruВакансии на tproger.ru

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

aiohttp==3.7.3 python-dotenv==0.15.0 discord.py==1.6.0

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

DISCORD_TOKEN= DISCORD_GUILD= DISCORD_BOT_NAME= UNITY_API_KEY= UNITY_ORGANIZATION_ID= PROJECT_ID=PROJECT_NAME=

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 гильдии:

import discord   class DiscordBot(discord.Client):     def __init__(self):         super(DiscordBot, self).__init__()

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

await self.start('discord bot token', bot=True)

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

async def on_ready(self):     for guild in self.guilds:         if guild.name == 'self guild name here':             print('Connected to the Discord guild')             return     print('Fails connect to the Discord guild')     await self.close()

Для обработки сообщений необходимо реализовать метод on_message:

async def on_message(self, message: discord.Message):     try:         # Do not process self messages or messages not from bot supported channels         message_channel = message.channel.name         if message.author == self.user or message_channel not in ['ci', 'build']:             return          if message_channel == 'build':             await self._process_build_event(message)         else:             # React only for messages that mention bot             for mention in message.mentions:                 if self.user == mention:                     await self._process_bot_command(message)                     return     except Exception as e:         print(f'Exception: {e}')

В первой проверке отсекаем все сообщения от самого бота, а также сообщения, пришедшие не из каналов, поддерживаемых ботом. Затем разделяем сообщения на два типа: команды боту и сообщения от Unity Cloud Build. В зависимости от результата передаём сообщение нужному обработчику.

Обработчик сообщений для выполнения команд ботом. Метод _get_command_for_bot читает сообщение, ищет в нем команду и параметры команды. После этого выполняется метод конкретной команды:

async def _process_bot_command(self, message: discord.Message):     command, params = self._get_command_for_bot(message)     if command == 'build':         await self._start_build(message, params)     elif command == 'build_target_info':         await self._build_target_info(message, params)     else:         print(f'Unsupported command for bot: {command}')

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

from aiohttp import ClientSession   class UnityCloudBuildWorker(object):     def __init__(self, base_url: str, project_id: str, api_key: str):         self._base_url = base_url         self._project_id = project_id         self._cloud_build_targets = {             'qa_windows': 'qa-windows-64-bit',             'qa_android': 'qa-android'         }         self._supported_builds = list(self._cloud_build_targets.keys())         self._session = None         self._base_header = {             'Content-Type': 'application/json',             'Authorization': f'Basic {api_key}',         }      async def start_worker(self):         assert self._session is None         self._session = ClientSession()      async def stop_worker(self):         if self._session is not None:             await self._session.close()             self._session = None

Разберём пример отправки команды на сборку проекта. Для этого в канал «ci» боту отправляется команда @AleksPinGames_DEV_Bot build qa_windows. Она обозначает, что необходимо начать сборку QA Windows.

Обработчик в DiscordBot получает сообщение и набор параметров и отправляет в чат ответ о начале выполнения задачи. Далее в UnityCloudBuildWorker отправляется запрос на сборку проекта через Unity Cloud Build. После получения ответа бот сообщает о том, какая сборка начала строиться и какая ветка использовалась в Git репозитории:

async def _start_build(self, message: discord.Message, params: str):     await message.channel.send('Send start build command to Unity Cloud Build')     result = await self._unity_cloud_build_worker.cmd_start_build(params)     await message.channel.send(result)

UnityCloudBuildWorker получает команду и выполняет метод cmd_start_build. Затем формируется url запроса и выполняется запрос. Полное описание API для работы с Unity Cloud Build можно найти тут: https://build-api.cloud.unity3d.com/docs/1.0.0/index.html#intro:

async def cmd_start_build(self, build_target: str) -> str:     build_target_id = self._cloud_build_targets.get(build_target, None)     if build_target_id is None:         return f'Unsupported build target: {build_target}'      url = f'{self._base_url}/projects/{self._project_id}/buildtargets/{build_target_id}/builds'     headers = {'clean': 'true'}     response = await self._send(self._send_post, url, headers)     result = await response.json() if response is not None else {}     self._logger.info(f'{self._log_tag} cmd_start_build result: {result}')     if result and len(result) > 0:         result_msg = f"Start building {result[0]['buildTargetName']} | Branch: {result[0]['scmBranch']}"     else:         result_msg = f'Error starting build for target: {build_target}'     return result_msg  async def _send(self, send_method: callable, url: str, headers: dict = None):     try:         if headers is not None:             headers.update(self._base_header)         else:             headers = self._base_header         result = await send_method(url, headers)         return result     except Exception as e:         print(f'Exception: {e}')         return None  async def _send_get(self, url: str, headers: dict = None):     return await self._session.get(url=url, headers=headers, ssl=True)  async def _send_post(self, url: str, headers: dict = None):     return await self._session.post(url=url, headers=headers, ssl=True)

После сборки проекта Unity Cloud Build отправляет в канал build сообщение о результате сборки. На это сообщение реагирует обработчик сообщений от Unity Cloud Build.

Обработчик сообщений от Unity Cloud Build проверяет от кого пришло сообщение. Все сообщения от Unity с данными по сборке вычитываются и формируется ссылка для канала QA testing. Сообщение в канал QA попадёт только в случае build_success = True. Также в данном обработчике удаляется ссылка на скачивание собранного проекта непосредственно в Unity Cloud Build. Остаётся только внешняя ссылка, не требующая авторизации в Unity Team.

async def _process_build_event(self, message: discord.Message):         try:             if message.author.name != 'Unity' or len(message.embeds) <= 0:                 return              to_delete_idx = None             build_success = False             embed = message.embeds[0]             for idx, field in enumerate(embed.fields):                 field_name = field.name                 if field_name == 'Build success':                     build_success = True                 elif field_name == 'Download':                     to_delete_idx = idx              if build_success:                 if to_delete_idx is not None:                     embed.remove_field(to_delete_idx)                 channel = self._server_text_channels['testing']                 await channel.send(embed=embed)         except Exception as e:             print(f'Exception: {e}')

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

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

FROM python:3.9.2-buster  ENV APP_DIR /unity_cloud_build_discord_bot ENV PYTHONPATH $PYTHONPATH:$APP_DIR  WORKDIR $APP_DIR  COPY requirements.txt requirements.txt  RUN pip install -r requirements.txt RUN apt-get update && apt-get install -y --no-install-recommends locales locales-all  COPY . $APP_DIR  CMD python app/discord_bot.py

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

TAG ?= latest CONTAINER_NAME ?= unity_cloud_build_discord_bot IMAGE_NAME ?= $(CONTAINER_NAME):$(TAG)  build:    docker build . -t $(IMAGE_NAME)  up: build    docker run -d     --name $(CONTAINER_NAME)     --env-file .env     $(IMAGE_NAME)  down:    docker stop $(CONTAINER_NAME)    docker rm $(CONTAINER_NAME)

Все инструкции и полная версия кода бота доступны в GitHub-репозитории: https://github.com/AleksandrPindyk/unity_cloud_build_discord_bot

Итог

На этом всё ? Мы запустили бот в качестве Docker-контейнера и настроили на Discord-гильдию, где идёт общение разработчиков и внешних QA. После нескольких дней тестирования мы пришли к выводу, что использовать бота удобнее, чем запускать сборку через веб-страницу Unity Cloud Build. В следующей версии добавим поддержку нескольких проектов и разворачивание WebGL-версии сразу на удаленном сервере в Docker-контейнере. Более детальную информацию о возможностях разработки Discord-ботов на Python, можно получить на сайте с официальной документацией: https://discord.com/developers/docs/intro.

Не смешно? А здесь смешно: @ithumor

Гильдия — вид сообщества, группа людей, играющих в многопользовательскую игру в одной команде.

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

Лобби

Здесь видим список всех членов гильдии, их уровень, бр, количество их золота гильдии, позицию в гильдии и онлайн-статус. Также прямо отсюда можно написать любому члену гильдии сообщение и просмотреть подробную информацию о каждом. Внизу расположено 5 кнопок, если вы не глава и не офицер, то не можете управлять гильдией и вам будет доступна только кнопка уйти, с ее помощью вы легко покинете гильдию. После этого идет перерыв 24 часа, только после этого вы сможете снова подать заявку на вступление в любую из гильдий.

Вход

Отметка посещаемости гильдии. Вы можете отметиться за золото, либо за кристаллы, за что вам будет начислено золото гильдии и фонд гильдии и определенное количество очков учета за вход. Фондыгильдии, заработанные всеми участниками, глава гильдии использует на повышение уровня гильдии и отправку курьера.

Молитва гильдии

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

Красный конверт

Каждые 24 часа, начиная от 19:00 по времени сервера, в гильдии есть возможность получить золото и кристаллов из красных конвертов. При желании можно и самому положить подарки в эти же конверты.

Магазин гильдии

Здесь можно приобрести различные необходимые ресурсы за золото гильдии, которое вы заработали. После любого обновления магазина доступны фрагменты питомца Криарино. Товары в магазине обновляются ежедневно в 12:00 и 18:00 по времени сервера. Также вы можете обновить список товаров при помощи золота гильдии, но каждая попытка обновления будет дороже предыдущей.

Спутник гильдии

Ежедневно вам дается определенное количество монет (5 максимально) и определенное количество попыток бесплатного сброса (максимально 7). Можно получить золото гильдии, камни звёзд, и фрагменты питомца Криарино. Если у вас выпало, допустим, 5 изображений из 6,то использование сброса не затрагивает эти 4 поля, после использования всех попыток бесплатного сброса вы сможете осуществить сброс за кристаллы. Если изображение питомца выпадет на 6/6 слотов, то вы получите фрагмент питомца. Чем больше слотов выпадет с изображением питомца, тем выше будет награда.

Задания гильдии.

Отмечайтесь за вход в гильдии, играйте в спутника гильдии, проходите подземелья гильдии вместе с согильдийцами и получайте награды — золото гильдии и фонд гильдии.

Благословение гильдии

После разблокировки данной функции глава гильдии в ответе за ее улучшения. Для повышения уровня благословения необходим фонд гильдии. Благословение гильдии состоит из увеличения макс. ХП, ф. защита, м. защита, атака, т. е. с повышением уровня благословения у всех членов гильдии данные характеристики увеличиваются. Золото гильдии теряется при выходе из нее.

Конвой

Необходимо защитить сокровища вашей гильдии.  Небесный Город посылает поставки гильдиям каждый день, и члены гильдии должны войти в Пустоши, чтобы защитить свои товары от воров. Глава гильдии или офицер ги назначает время конвоя по своему выбору не раньше, чем через 2 минуты от текущего времени, все члены гильдии получат на почту сообщение о начале эскорта, а затем слон должен будет доставить товар до станции разгрузки. Члены гильдии должны защищать свой драгоценный груз от монстров и других игроков (1 раз в день). Назначивший время конвоя мгновенно получит бонусную награду. Чем выше уровень слона, тем больше у него запас хп. Остаток ХП в конце конвоя влияет на качество получаемых наград. Награды за эскорт получат все члены ги, даже не принимавшие участие в конвое(карты сокровищ, коробки и золото гильдии). Во время конвоя других гильдий нападайте на их слона и,убив его, получите вознаграждение (не более 5 раз в день). За грабеж награды получают только участники грабежа в виде коробок и золота гильдии.

Если глава гильдии игнорирует свои обязанности, то вы, либо другой член гильдии можете занять его место.

В некоторых случаях в использовании дискорд сервер или канал пользователя попадает бан. Тут возникает, почему происходит the user is banned from this guild discord и как с ним бороться. Большинство пользователей постоянно жалуются на то, как попав в один сервис, они вынуждены терпеть неадекватное отношение со стороны администрации сервера. По каким причинам подобное происходит? Рассмотрим данный вопрос согласно с правилами приложения.

the-user-is-banned-from-this-guild-discord.jpg

Что значит эта ошибка

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

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

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

the-user-is-banned-from-this-guild-discord1.png

Как решить: можно ли обойти бан

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

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

Если вы уверены, что бана нет: пишем в службу поддержки

Если пользователь просто уверен, что бана нет, а его страница заблокирована, решить неприятную ситуацию пользователи могут, обратившись в службу поддержки. Техническая служба рассматривает разные вопросы и многочисленные неприятности, возникшие из-за подобных явлений. Невозможно войти на собственную страницу, из-за системного бана. Задействованная система иногда при неправильных действиях пользователя, начинает перечищать сервера от участников. Не следует вести борьбу с задействованной системой, поскольку она полностью запретит вход в приложение. Обратитесь в службу поддержки, которая моментально рассмотрит данный вопрос, с учетом всех формальностей.

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

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

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

Используемые источники:

  • https://tproger.ru/articles/discord-bot-na-python-dlja-avtomatizacii-raboty-s-unity-cloud-build-v-gamedev-komande/
  • https://legacy-of-discord.fandom.com/ru/wiki/гильдия
  • https://discordik.ru/problemy/the-user-is-banned-from-this-guild-discord/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий