Guild manager discord команды
Любой, кто находится в сети, знаком с Discord. Он бесплатный и простой в использовании, что позволяет вам создавать социальную онлайн-среду без необходимости знать что-либо, кроме имен пользователей вашего компаньона.
Команды так же просты в использовании, как и сама программа: просто введите правильный код в окно чата сервера, добавьте любой необходимый префикс — и готово!
Список команд в чате Discord
Основные команды чата Discord не очень продуманы, но они должны помочь вам немного улучшить работу с Discord. Они не требуют использования бота, и если вы хотите увидеть полный список, введите ‘/’ в чат сервера. Оттуда просто нажмите на тот, который вам нужен!
/giphy [текст] — ищет на сайте Giphy анимированный GIF.
/me [text] — «Отображает текст с выделением».
/nick — «Меняет ник на этом сервере».
/shrug — Вставляет этот фрагмент ASCII-арта «¯ \ _ (ツ) _ / ¯» в канал.
/tableflip — Вставляет этот фрагмент ASCII-арта «(╯ ° □ °) ╯︵ ┻━┻» в канал.
/unflip — Вставляет этот фрагмент ASCII-арта «┬─┬ ノ (゜ — ゜ ノ)» в канал.
/tenor [текст] — ищет на сайте Tenor анимированный GIF.
Разные команды Dyno Bot
Но это еще не все. Бот Dyno также предлагает ряд других команд, столь же простых, сколь и случайных:
?afk — используется для установки статуса «вне клавиатуры», который может отображаться всякий раз, когда упоминается ваше имя.
?afk set [status] — Используется для отображения статуса «вне клавиатуры», который также может отображаться в вашем нике.
?afk ignore [канал] — Используется, чтобы не возвращаться из вашего статуса «вне клавиатуры» при разговоре по каналу.
?avatar [пользователь] — используется для создания увеличенной версии изображения аватара пользователя в чате. Хотите знать, как кто-то действительно выглядит? Это команда для вас!
?color [шестнадцатеричное число] — используется для поиска информации о конкретном шестнадцатеричном числе цвета.
?dynoav — Используется для немедленного создания аватара, похожего на Dynoav.
?randomcolor — Генератор случайного шестнадцатеричного цвета, который ваши коллеги-покровители могут наблюдать в канале.
?remindme 09:13:52 PM [остаток] — Создает напоминание в определенном канале.
?whois [упоминание пользователя] — извлекает информацию о конкретном пользователе на сервере, в том числе о том, как долго он был участником, когда была создана его учетная запись и есть ли у него какие-либо роли на сервере.
?distance [координаты] [координаты] — используется для вычисления расстояния между двумя наборами координат.
?Дискриминатор [4 члена] — создает список пользователей, у которых есть определенный номер дискриминатора Discord.
?membercount — генерирует общее количество пользователей на определенном сервере.
?serverinfo — Получает общую информацию о сервере, включая номера участников, количество каналов и текущее количество людей в сети и активных.
•emotes — Создает полный список всех смайликов и эмоций для конкретного сервера.
Current settings: .settings
Let's create a small basic guild: .create
Note: if it's not your first clan you'll most likely not become its member automatically
This command is for joining clans: .join
Opposite action: .leave-guild
Now let's make an advanced guild.
All you need is .edit-guild . There's a couple of moments I want to mention. If your guild's name is longer than 1 word, it should be [in square brackets]. BUT! Usually you don't have to type the full name. Bot can also recognize partial names.
- In case you want to rename your creation: .edit-guild name
- Add a cool description: .edit-guild desc
- You can change clan's avatar by using .edit-guild avatar
- There's such thing as private mode: .edit-guild privacy If enabled, you'll get join requests.
- You can also set local member limit: .edit-guild limit
- Sometimes leaders link a role to their guilds: .edit-guild role
- Another nice option to improve your guild is to add a helper: .edit-guild helper
- Finally, you can transfer ownership: .edit-guild leader
Let's imagine we have a clan named "Rich Kings" and I made it private by typing .eg privacy [Rich Kings] on
Now if someone wants to join my clan, guild helper and I will recieve a join request.
- View all requests: .requests
- Accept a request: .accept
- Decline a request: .decline
Helpers are also able to kick members: .kick
If you're an administrator or a guild master, you're able to change reputation.
Command: .rep
But you can always earn free reputation by upvoting the bot: .i-voted
- Видео-туториал
Сменить язык на русский: .lang ru
Список команд: .help
Текущие настройки бота можно увидеть в .settings
Допустим у меня есть клан, и назвается он Крепость
Включу ему приватность: .eg privacy Крепость on
Теперь, если кто-то захочет вступить в мой клан, то мне и моему помощнику придёт запрос на вступление, который кто-то из нас может принять или отклонить.
- Посмотреть список запросов: .requests
- Принять запрос: .accept
- Отклонить запрос: .decline
Помимо отбора участников, помощник уполномочен кикать пользователей, команда: .kick
Если Вы являетесь создателем, админом или обладателем мастер-роли на своём сервере, то это значит, что Вы имеете право начислять / снимать репутацию
Команда для начисления репутации: .rep
А если не являетесь? Что ж, всегда можно забрать халявную репутацию, проголосовав за бота и прописав .i-voted
Current settings: .settings
Let's create a small basic guild: .create
Note: if it's not your first clan you'll most likely not become its member automatically
This command is for joining clans: .join
Opposite action: .leave-guild
Now let's make an advanced guild.
All you need is .edit-guild . There's a couple of moments I want to mention. If your guild's name is longer than 1 word, it should be [in square brackets]. BUT! Usually you don't have to type the full name. Bot can also recognize partial names.
- In case you want to rename your creation: .edit-guild name
- Add a cool description: .edit-guild desc
- You can change clan's avatar by using .edit-guild avatar
- There's such thing as private mode: .edit-guild privacy If enabled, you'll get join requests.
- You can also set local member limit: .edit-guild limit
- Sometimes leaders link a role to their guilds: .edit-guild role
- Another nice option to improve your guild is to add a helper: .edit-guild helper
- Finally, you can transfer ownership: .edit-guild leader
Let's imagine we have a clan named "Rich Kings" and I made it private by typing .eg privacy [Rich Kings] on
Now if someone wants to join my clan, guild helper and I will recieve a join request.
- View all requests: .requests
- Accept a request: .accept
- Decline a request: .decline
Helpers are also able to kick members: .kick
If you're an administrator or a guild master, you're able to change reputation.
Command: .rep
But you can always earn free reputation by upvoting the bot: .i-voted
- Видео-туториал
Сменить язык на русский: .lang ru
Список команд: .help
Текущие настройки бота можно увидеть в .settings
Допустим у меня есть клан, и назвается он Крепость
Включу ему приватность: .eg privacy Крепость on
Теперь, если кто-то захочет вступить в мой клан, то мне и моему помощнику придёт запрос на вступление, который кто-то из нас может принять или отклонить.
- Посмотреть список запросов: .requests
- Принять запрос: .accept
- Отклонить запрос: .decline
Помимо отбора участников, помощник уполномочен кикать пользователей, команда: .kick
Если Вы являетесь создателем, админом или обладателем мастер-роли на своём сервере, то это значит, что Вы имеете право начислять / снимать репутацию
Команда для начисления репутации: .rep
А если не являетесь? Что ж, всегда можно забрать халявную репутацию, проголосовав за бота и прописав .i-voted
Current settings: .settings
Let's create a small basic guild: .create
Note: if it's not your first clan you'll most likely not become its member automatically
This command is for joining clans: .join
Opposite action: .leave-guild
Now let's make an advanced guild.
All you need is .edit-guild . There's a couple of moments I want to mention. If your guild's name is longer than 1 word, it should be [in square brackets]. BUT! Usually you don't have to type the full name. Bot can also recognize partial names.
- In case you want to rename your creation: .edit-guild name
- Add a cool description: .edit-guild desc
- You can change clan's avatar by using .edit-guild avatar
- There's such thing as private mode: .edit-guild privacy If enabled, you'll get join requests.
- You can also set local member limit: .edit-guild limit
- Sometimes leaders link a role to their guilds: .edit-guild role
- Another nice option to improve your guild is to add a helper: .edit-guild helper
- Finally, you can transfer ownership: .edit-guild leader
Let's imagine we have a clan named "Rich Kings" and I made it private by typing .eg privacy [Rich Kings] on
Now if someone wants to join my clan, guild helper and I will recieve a join request.
- View all requests: .requests
- Accept a request: .accept
- Decline a request: .decline
Helpers are also able to kick members: .kick
If you're an administrator or a guild master, you're able to change reputation.
Command: .rep
But you can always earn free reputation by upvoting the bot: .i-voted
- Видео-туториал
Сменить язык на русский: .lang ru
Список команд: .help
Текущие настройки бота можно увидеть в .settings
Допустим у меня есть клан, и назвается он Крепость
Включу ему приватность: .eg privacy Крепость on
Теперь, если кто-то захочет вступить в мой клан, то мне и моему помощнику придёт запрос на вступление, который кто-то из нас может принять или отклонить.
- Посмотреть список запросов: .requests
- Принять запрос: .accept
- Отклонить запрос: .decline
Помимо отбора участников, помощник уполномочен кикать пользователей, команда: .kick
Если Вы являетесь создателем, админом или обладателем мастер-роли на своём сервере, то это значит, что Вы имеете право начислять / снимать репутацию
Команда для начисления репутации: .rep
А если не являетесь? Что ж, всегда можно забрать халявную репутацию, проголосовав за бота и прописав .i-voted
На каждом шаге будем постепенно наращивать функционал.
Создадим новый web api проект с одним контроллером /check. При обращении к этому адресу будем отправлять строку “Hello!” в Discord чат.
Научимся получать данные о составе гильдии с помощью готовой библиотеки или заглушки.
Научимся сохранять в кэш полученный список игроков чтобы при следующих проверках находить различия с предыдущей версией списка. Обо всех изменениях будем писать в Discord.
Напишем Dockerfile для нашего проекта и разместим проект на хостинге Heroku.
Посмотрим на несколько способов сделать периодическое выполнение кода.
Реализуем автоматическую сборку, запуск тестов и публикацию проекта после каждого коммита в master
Создание нового проекта - это одна из фундаментальных вещей которые я не буду подробно расписывать. При работе над проектом используйте сервис Github для хранения кода. В дальнейшем мы воспользуемся несколькими возможностями Github.
Добавим к проекту новый контроллер
Получить его можно в пункте integrations в настройках любого текстового канала вашего Discord сервера.
Создание 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.
Надеюсь данная статья подкинула вам пару новых идей и тем для изучения. Спасибо за внимание. Удачи вам в ваших проектах!
Команды поиска ботов MEE6
Мало того, MEE6 предлагает набор потрясающих команд поиска, позволяющих извлекать информацию обо всем, от покемонов до стримеров Twitch, или вставлять видео и изображения YouTube. Вот полный список команд.
!anime [поисковый запрос] — Используется для поиска аниме на Kitsu.
!imgur [поисковый запрос] — Используется для поиска мемов на Imgur.
!manga [поисковый запрос] — Используется для поиска манги на Kitsu.
!pokemon [поисковый запрос ] — Используется для поиска покемонов в Pokeapi Pokedex.
!twitch [поисковый запрос] — Используется для поиска канала на Twitch.
!urban [поисковый запрос] — используется для поиска сленговых словечек в Городском словаре.
!youtube [поисковый запрос] — используется для поиска видео на YouTube.
Команды модерации бота MEE6
MEE6 предлагает набор основных команд модерации чата:
!ban [пользователь] [необязательная причина] — Используется для изгнания одного участника с сервера Discord. Не то, чтобы его можно было взять, но часто необходимое оружие в арсенале любого модератора.
!tempban [участник] [продолжительность] [необязательная причина] — используется для изгнания одного участника с сервера Discord на ограниченный период времени.
!mute [участник] [необязательная причина] — Используется для отключения звука участника, чтобы он не мог участвовать в различных каналах.
!tempmute [участник] [продолжительность] [необязательная причина] — используется для отключения звука участника, чтобы он не мог участвовать в различных каналах в течение ограниченного периода времени.
!unmute [member] — используется для отмены команды отключения звука.
!clear [необязательный член] [необязательный счетчик] — используется для очистки вкладов в определенном канале.
!infractions [member] — Используется, чтобы показать, сколько нарушений имеет конкретный участник против них.
! kick [участник] [необязательная причина] — Используется для удаления пользователя с сервера. Более-менее похоже на бан, но они смогут присоединиться позже.
! slowmode [необязательный тайм-аут] [необязательно выключен] — Используется для включения или выключения медленного режима на определенном канале.
!warn [участник] [необязательная причина] — Используется для предупреждения пользователя о том, что он нарушает правила и вызывает нарушение.
Команды модерации и новизны Dyno Bot в Discord
Если MEE6 — самый любимый модератор чата в Discord, то Dyno вероятно самый полезный из них. Это, наверное, и самое интересное.
Dyno предлагает команды модерации, аналогичные Dyno, но с большей и более сложной базой данных функций. Тем не менее, где Dyno действительно сияет, так это в новинках. Поверь мне, тебе очень захочется их похвастаться.
Команды модерации Dyno Bot
Бот Dyno Discord предлагает самый полный набор команд модерации на платформе, позволяющий вам контролировать каналы вашего сервера — даже с самыми коварными рапскальонами.
?modlogs [пользователь] — используется для получения списка журналов модератора для указанного пользователя.
?note [пользователь] [текст] — используется для создания заметки о конкретном пользователе.
?notes [пользователь] — используется для просмотра заметок, созданных о конкретном пользователе.
?clearnotes [пользователь] — используется для удаления всех заметок, созданных о конкретном пользователе.
?warn [пользователь] [причина] — используется, чтобы предупредить участника о том, что его поведение может нарушить правила сервера.
?warnings [пользователь] — используется для просмотра предупреждений, полученных указанным участником. Он сообщит вам, имеете ли вы дело с преступником, совершившим впервые, или с опытным преступником.
?mute [пользователь] [ограничение] [причина] — используется, чтобы запретить пользователю участвовать в различных каналах сервера.
?unmute [пользователь] [причина] — используется для повторного разрешения пользователю участвовать в различных каналах сервера.
?undeafen [пользователь] — используется для снятия защиты с пользователя.
?kick [пользователь] [причина] — используется для удаления пользователя с сервера.
?ban [пользователь] [лимит] [причина] — Используется для блокировки участника сервера, возможность ограничения на определенный период.
?unban [пользователь или идентификатор] [причина] — используется для разблокировки участника сервера.
?addmod [роль ] — Добавить пользователя в роль модератора.
?members [роль] — используется для перечисления до 90 участников с указанной ролью.
Команды Dyno Bot для новинок
Однако бот Dyno Discord помогает не только модерировать ваш сервер. Dyno — это тоже очень весело! Вот полный список новых команд Dyno:
?cat — генерирует случайное изображение очаровательной кошки из Интернета, которое Dyno немедленно публикует на канале.
?country [код страны] — используется для получения статистики по конкретной стране, включая население, столицу и валюту.
?dadjoke — используется для извлечения случайной отцовской шутки, которая автоматически публикуется в канале. Гарантированно будет настолько же увлекательным, насколько и несмешным!
?dog — генерирует случайное изображение очаровательной собаки из Интернета, которое Dyno немедленно публикует на канале.
?flip — Используется для подбрасывания монеты между орлом и решкой.
?github [имя репозитория] — используется для генерации информации о конкретном репозитории Github.
?itunes [название песни] — используется для получения основной информации о песне, включая имя исполнителя и альбом, из которого она принадлежит.
?norris — используется для генерации случайного факта о Чаке Норрисе. 100% правда в стиле техасских рейнджеров.
?pokemon [имя] — используется для получения основной информации о покемоне, включая способности, тип, вес и рост.
?pug — Создает случайное очаровательное изображение мопса из Интернета, которое Dyno немедленно публикует на канале.
?roll [размер кубика, количество сторон или количество кубиков] — используется для броска кубика или количества кубиков в канале.
?rps [выбор] — Используется для игры в камень-ножницы-бумага с ботом Dyno.
?space — используется для получения информации о Международной космической станции.
Команды модерации и поиска MEE6 Bot
MEE6 — популярный робот-модератор чата Discord. Для многих пользователей, которые присоединятся к своему первому серверу Discord или голосовому чату, MEE6 станет первым дружелюбным лицом, с которым они столкнутся.
MEE6 имеет всевозможные функции, позволяя пользователям использовать MEE6 как для модерации, так и для поиска. Команды модерации дают администраторам серверов возможность поддерживать закон и порядок в своих различных каналах. Команды поиска предписывают MEE6 сканировать различные базы данных в поисках записей, изображений, видео и информации.
Кроме того, панель управления MEE6 позволяет пользователям программировать свои собственные команды для ботов.
Программирование пользовательских команд MEE6
Программировать собственные команды MEE6 поразительно просто. Он не требует знания Python или синтаксиса и встроен в вашу панель управления MEE6. Но на всякий случай, если вы никогда не делали этого раньше, я здесь, чтобы дать вам быстрый урок
- Войдите в панель управления MEE6 со своей учетной записью Discord.
- Выберите сервер, на котором вы хотите применить новую настраиваемую команду, нажав кнопку «Перейти к панели управления».
- Выберите вариант «Пользовательские команды», который предлагает вам «добавить потрясающие пользовательские команды на ваш сервер».
- Коснитесь параметра «Создать команды» и выберите «Создать команду» в появившемся меню.
- Введите имя команды после восклицательного знака, это будет ваш код для активации команды. Главный совет: чем короче и запоминается, тем лучше!
- Введите текст, которым должен ответить бот. Вы также можете добавить дополнительные свойства, чтобы контролировать, кто может его использовать, на каких каналах и как часто.
- Нажмите «Добавить».
Читайте также: