что такое guild в дискорде
Вступление
Всем привет! Недавно я написал Discord бота для World of Warcraft гильдии. Он регулярно забирает данные об игроках с серверов игры и пишет сообщения в Discord о том что к гильдии присоединился новый игрок или о том что гильдию покинул старый игрок. Между собой мы прозвали этого бота Батрак.
От вас не потребуется никаких знаний об игре. Я написал материал так чтобы можно было абстрагироваться от игры и сделал заглушку для данных об игроках. Но если у вас есть учетная запись в Battle.net, то вы сможете получать реальные данные.
Для понимания материала, от вас ожидается хотя бы минимальный опыт создания веб сервисов с помощью фреймворка ASP.NET и небольшой опыт работы с Docker.
На каждом шаге будем постепенно наращивать функционал.
Создадим новый web api проект с одним контроллером /check. При обращении к этому адресу будем отправлять строку “Hello!” в Discord чат.
Научимся получать данные о составе гильдии с помощью готовой библиотеки или заглушки.
Научимся сохранять в кэш полученный список игроков чтобы при следующих проверках находить различия с предыдущей версией списка. Обо всех изменениях будем писать в Discord.
Напишем Dockerfile для нашего проекта и разместим проект на хостинге Heroku.
Посмотрим на несколько способов сделать периодическое выполнение кода.
Реализуем автоматическую сборку, запуск тестов и публикацию проекта после каждого коммита в master
Шаг 1. Отправляем сообщение в Discord
Нам потребуется создать новый ASP.NET Core Web API проект.
Добавим к проекту новый контроллер
Получить его можно в пункте integrations в настройках любого текстового канала вашего Discord сервера.
Создание webhook
Добавим webhook в appsettings.json нашего проекта. Позже мы унесем его в переменные окружения Heroku. Если вы не знакомы с тем как работать с конфигурацией в ASP Core проектах предварительно изучите эту тему.
Теперь создадим новый сервис DiscordBroker, который умеет отправлять сообщения в Discord. Создайте папку Services и поместите туда новый класс, эта папка нам еще пригодится.
По сути этот новый сервис делает post запрос по адресу из webhook и содержит сообщение в теле запроса.
Как видите, мы используем внедрение зависимостей. IConfiguration позволит нам достать webhook из конфигов, а IHttpClientFactory создать новый HttpClient.
Кроме того, я извлек интерфейс этого класса, чтобы в дальнейшем можно было сделать его заглушку при тестировании. Делайте это для всех сервисов которые мы будем создавать далее.
Не забудьте что новый класс нужно будет зарегистрировать в Startup.
А также нужно будет зарегистрировать HttpClient, для работы IHttpClientFactory.
Теперь можно воспользоваться новым классом в контроллере.
Запустите проект, зайдите по адресу /check в браузере и убедитесь что в Discord пришло новое сообщение.
Шаг 2. Получаем данные из Battle.net
У нас есть два варианта: получать данные из настоящих серверов battle.net или из моей заглушки. Если у вас нет аккаунта в battle.net, то пропустите следующий кусок статьи до момента где приводится реализация заглушки.
Получаем реальные данные
Вам понадобится зайти на https://develop.battle.net/ и получить там две персональных строки BattleNetId и BattleNetSecret. Они будут нужны нам чтобы авторизоваться в api перед отправкой запросов. Поместите их в appsettings.
Подключим к проекту библиотеку 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.
GuildRepository нужно зарегистрировать как Singletone зависимость, чтобы кэш не пересоздавался на каждый запрос.
Теперь можно написать сервис который будет сравнивать новый список игроков с сохраненным.
В качестве возвращаемого результата используется модель Report. Ее нужно создать и поместить в папку Models.
Применим GuildService в контроллере.
Теперь отправим в Discord какие игроки присоединились или покинули гильдию.
Эту логику я добавил в GuildService в конец метода Check. Писать бизнес логику в контроллере не стоит, у него другое назначение. В самом начале мы делали там отправку сообщения в Discord потому что еще не существовало GuildService.
Можно вывести больше информации об игроке. Ее можно получить если воспользоваться библиотекой 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 минут.
Есть несколько способов это реализовать:
Шаг 6. Автоматическая сборка, прогон тестов и публикация
Во-первых, зайдите в настройки приложения в Heroku.
Там есть пункт Deploy. Подключите там свой Github аккаунт и включите Automatic deploys после каждого коммита в master.
Поставьте галочку у пункта Wait for CI to pass before deploy. Нам нужно чтобы Heroku дожидался сборки и прогонки тестов. Если тесты покраснеют, то публикация не случится.
Сделаем сборку и прогонку тестов в Github Actions.
Зайдите в репозиторий и перейдите в пункт Actions. Теперь создайте новый workflow на основе шаблона .NET
В репозитории появится новый файл dotnet.yml. Он описывает процесс сборки.
Как видите по его содержимому, задание build будет запускаться после пуша в ветку master.
Содержимое самого задания нас полностью устраивает. Если вы вчитаетесь в то что там происходит, то увидите что там происходит запуск команд dotnet build и dotnet test.
Менять в этом файле ничего не нужно, все уже будет работать из коробки.
Запушьте что-нибудь в master и посмотрите что задание запускается. Кстати, оно уже должно было запуститься после создания нового workflow.
Надеюсь данная статья подкинула вам пару новых идей и тем для изучения. Спасибо за внимание. Удачи вам в ваших проектах!
Что такое guild в дискорде
Привет, игрок. Если ты попал в нашу гильдию, то знай, у нас есть правила.
#1 Запрещено материться
#2 Запрещено оскорблять участников сервера
#3 Запрещен пиар(не важно,чего,запрещен и точка)
#4 Запрещено баловаться с ботами(абузить лвл,флудить командами и т.п.)
#5 Запрещен флуд
#6 Запрещен спам
#7 Не рекомендовано писать капсом
#8 Запрещено разводить срач в чате, устраивать ссоры (для этого есть ЛС)
#9 Запрещено спорить с администрацией этого сервера
#10 Запрещены никнеймы, содержащие ненормативную лексику
#11 Запрещено обсуждать действия администрации
#12 Запрещено выпрашивать привилегии
#13 Запрещено писать,разделяя каждое слово-словосочетание слов разными сообщениями
Правила голосовых чатов
#1 Запрещено оскорблять других участников сервера
#2 Запрещено кричать в микрофон
#3 Запрещено мешать комфортному общению людей
#4 Запрещено реконектиться к комнате несколько раз
#5 Запрещено держать ботов в голосовых каналах,если они вам не нужны(простите,но он у нас одни) для #DJ
Правила для модераторов
#1 Запрещено выдавать роли без причины
#2 Запрещено вытворять беспредел
#3-. все вышеперечисленные правила
На администрацию данные правила не распространяются
Discord сервер и гильдия-чат сообщества
Всем привет. Напоминаем, что у нашего русскоязычного сообщества есть свой Discord сервер, на котором вы всегда можете задать вопросы другим игрокам, найти новых знакомых, гильдии, или просто компанию на несколько часов игры. Также для удобства игроков была создана «гильдия-чат», которая позволит вам все то же самое только прямо в игре.
Некоторое время гильдия находилась в режиме тестирования и неплохо себя показала, так что было решено далее её развивать.
Гильдия создана не для того, чтобы стать крупной ГИ, добивающейся чего-либо. По сути, это выделенный внутриигровой чат, где вы сможете найти русскоязычных игроков, находящихся на данный момент в игре, и пойти с ними по своим игровым делам.
Репрезента не требуется, каких-либо сборов, обязательств и требований (кроме как нормально общаться и не нарушать банальных правил хорошего тона) нет.
Другие гильдии могут заниматься рекрутингом в чате гильдии сообщества (только не надо спамить, пожалуйста), это только приветствуется — вы можете найти здесь новых людей для вашей гильдии.
Получился вполне удобный инструмент для поиска новых друзей, товарищей и согильдийцев.
Чтобы получить приглашение в гильдию, напишите ник в выделенный канал в дискорде (#community_guild) и ждите приглашения в игре.
И еще раз ссылка для входа на Discord сервер — https://discord.gg/cAPSahg
Ну и не забываем про сообщество в VK, где вам также ответят на вопросы по игре и где есть выделенные темы для поиска друзей и гильдий.
Гильдия
Содержание
Лобби
Здесь видим список всех членов гильдии, их уровень, бр, количество их золота гильдии, позицию в гильдии и онлайн-статус. Также прямо отсюда можно написать любому члену гильдии сообщение и просмотреть подробную информацию о каждом. Внизу расположено 5 кнопок, если вы не глава и не офицер, то не можете управлять гильдией и вам будет доступна только кнопка уйти, с ее помощью вы легко покинете гильдию. После этого идет перерыв 24 часа, только после этого вы сможете снова подать заявку на вступление в любую из гильдий.
Отметка посещаемости гильдии. Вы можете отметиться за золото, либо за кристаллы, за что вам будет начислено золото гильдии и фонд гильдии и определенное количество очков учета за вход. Фондыгильдии, заработанные всеми участниками, глава гильдии использует на повышение уровня гильдии и отправку курьера.
Молитва гильдии
Здесь находятся трое самых сильных игроков из вашей гильдии. Вы можете уважить их либо золотом, либо кристаллами. За молитву можно получить камни увеличения звёзд снаряжения. Можно также сразится с любым из них и занять его место в случае победы.
Красный конверт
Каждые 24 часа, начиная от 19:00 по времени сервера, в гильдии есть возможность получить золото и кристаллов из красных конвертов. При желании можно и самому положить подарки в эти же конверты.
Магазин гильдии
Здесь можно приобрести различные необходимые ресурсы за золото гильдии, которое вы заработали. После любого обновления магазина доступны фрагменты питомца Криарино. Товары в магазине обновляются ежедневно в 12:00 и 18:00 по времени сервера. Также вы можете обновить список товаров при помощи золота гильдии, но каждая попытка обновления будет дороже предыдущей.
Спутник гильдии
Ежедневно вам дается определенное количество монет (5 максимально) и определенное количество попыток бесплатного сброса (максимально 7). Можно получить золото гильдии, камни звёзд, и фрагменты питомца Криарино. Если у вас выпало, допустим, 5 изображений из 6,то использование сброса не затрагивает эти 4 поля, после использования всех попыток бесплатного сброса вы сможете осуществить сброс за кристаллы. Если изображение питомца выпадет на 6/6 слотов, то вы получите фрагмент питомца. Чем больше слотов выпадет с изображением питомца, тем выше будет награда.
Задания гильдии.
Благословение гильдии
После разблокировки данной функции глава гильдии в ответе за ее улучшения. Для повышения уровня благословения необходим фонд гильдии. Благословение гильдии состоит из увеличения макс. ХП, ф. защита, м. защита, атака, т. е. с повышением уровня благословения у всех членов гильдии данные характеристики увеличиваются. Золото гильдии теряется при выходе из нее.
Конвой
Необходимо защитить сокровища вашей гильдии. Небесный Город посылает поставки гильдиям каждый день, и члены гильдии должны войти в Пустоши, чтобы защитить свои товары от воров. Глава гильдии или офицер ги назначает время конвоя по своему выбору не раньше, чем через 2 минуты от текущего времени, все члены гильдии получат на почту сообщение о начале эскорта, а затем слон должен будет доставить товар до станции разгрузки. Члены гильдии должны защищать свой драгоценный груз от монстров и других игроков (1 раз в день). Назначивший время конвоя мгновенно получит бонусную награду. Чем выше уровень слона, тем больше у него запас хп. Остаток ХП в конце конвоя влияет на качество получаемых наград. Награды за эскорт получат все члены ги, даже не принимавшие участие в конвое(карты сокровищ, коробки и золото гильдии). Во время конвоя других гильдий нападайте на их слона и,убив его, получите вознаграждение (не более 5 раз в день). За грабеж награды получают только участники грабежа в виде коробок и золота гильдии.
Если глава гильдии игнорирует свои обязанности, то вы, либо другой член гильдии можете занять его место.
Что такое guild в дискорде
Discord guild copy
Did you ever want to create a copy of a guild? Now you can! There is no need to manually create roles, channels and permissions, which can take very long depending on the original guilds size. The script does everything for you. It backs up a guild into a single file and lets you create a new guild from it. You can share your file with others, too.
What will be copied
What will not be copied
The script must be run with a bot user token. According to discords statement, any kind of user account botting including so called SelfBots are forbidden. The script will therefore block the execution with a user account token.
Most of the common issues are displayed in the console while running the script. If you encounter crashes or any other weird behaviour not listed here feel free to create an issue. The script creates logs in the ‘logs’ folder. Feel free to upload those to something like pastebin and add them to the created issue to help me find the problem.
Can I suggest new features (or complain about ugly code)
Of course, just create an issue or a pull request.
If you want to help translate the script, feel free do so so. Just create a copy of the en.json in the translation folder and create a pull request with the new translation. All [@@X@@] statements are dynamic parts of a sentence and need to be in the correct spot for each language numbered with 1,2,3. Please test your translation at least once before submitting it and don’t forget to change the langcode/language/author at the top of the file.
This software is licensed under the terms of the GPLv3. For more details see LICENSE.