Боты Discord с Javacord: как сделать своего первого бота

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

Время отказаться от ответственности!

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

Еще одно важное замечание: Это не официальная статья или серия статей о Javacord, и я не являюсь членом команды Javacord. Я просто распространяю информацию и правильно использую библиотеку, которую мне нравится использовать для моего Discord. боты. Однако эта статья включает информацию, предоставленную непосредственно командой Javacord, чтобы гарантировать, что я даю вам максимально правильный и чистый код.

Теперь пришло время ответить на этот первый большой вопрос.

Что такое Javacord?

Javacord — это замечательная библиотека, которая позволяет вам взаимодействовать с API Discord из вашего Java-кода значительно упрощенным способом. Вы можете создавать объекты и вызывать методы, которые ваш бот будет использовать для отправки сообщений, управления ролями пользователя и многого другого. На веб-сайте Javacord все четко изложено с точки зрения надлежащей документации и примера кода, так что даже новичок может создать базового бота Discord. Я буду ссылаться на некоторые из их примеров, вики-страниц и JavaDocs в этой статье и любых будущих статьях о ботах, чтобы вы могли больше узнать о том, как работает библиотека.

Я настоятельно рекомендую вам присоединиться к официальному Javacord Discord серверу, прежде чем вы начнете работать с этой библиотекой. Его окружает абсолютно замечательное сообщество (и я рад сообщить, что являюсь его частью), которое всегда готово помочь вам с проблемой, если вы хотите учиться. Здесь вы можете поговорить со мной, создателями, участниками и многими другими разработчиками ботов, такими же, как и вы. Присоединяйтесь к обсуждению!

Итак, мне нужен Javacord для моего бота, как мне его получить?

Вики-страница приветствия Javacord расскажет вам, что именно нужно сделать, чтобы добавить Javacord в ваш проект бота, независимо от того, используете ли вы Gradle или Maven. В нашем случае использования Gradle это очень простая пара шагов:

  1. Откройте файл build.gradle в проекте бота IntelliJ.
  2. Удалите строку testCompile в блоке dependencies (эта строка предназначена для выполнения тестов кода, о которых я расскажу в следующей статье).
  3. Там, где вы удалили предыдущую строку, добавьте следующее: implementation ‘org.javacord:javacord:3.0.6’

Обязательно нажмите кнопку Загрузить изменения Gradle в правом верхнем углу после добавления этой строки. Это позволяет Gradle импортировать Javacord в ваш проект, чтобы вы могли создать своего бота.

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

Как заставить своего бота что-то делать?

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

import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
public class Bot {
    public static void main(String[] args) {
        DiscordApi api = new DiscordApiBuilder().setToken("yourtokenhere").login().join);
        // Add a listener which answers with "Pong!" if someone writes "!ping"
        api.addMessageCreateListener(event -> {
            if (event.getMessageContent().equalsIgnoreCase("!ping")) {
                event.getChannel().sendMessage("Pong!");
            }
        });
        // Print the invite url of your bot
        System.out.println("You can invite the bot by using the following url: " + api.createBotInvite());
    }
}

Отсюда вы можете запустить своего бота, нажав Shift+F10; если вы правильно выполнили все эти шаги, вы должны увидеть оператор печати со ссылкой для приглашения бота в консоли в нижней части экрана. Используйте это, чтобы пригласить своего бота на свой сервер, чтобы вы могли проверить, как он работает!

Что я только что написал?

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

  • Во-первых: мы создаем экземпляр DiscordApi. Проще говоря, это то, что позволяет нам взаимодействовать с Discord API. Мы создаем экземпляр класса DiscordApiBuilder, передаем ему токен для входа в систему, а затем говорим ему войти в учетную запись бота. join() — это метод CompletableFuture, который возвращает login(); он блокирует текущий поток и возвращает завершенный экземпляр DiscordApi в переменную api.
  • Второе: мы добавляем так называемый «слушатель». Слушатель делает именно то, на что это похоже; он ждет и слушает, пока не произойдет определенное событие, и в следующем блоке кода реагирует соответствующим образом. В нашем случае мы прослушиваем любое сообщение, которое бот может прочитать. Каждый раз, когда это происходит, это называется событием, и бот может получить доступ к информации об этом с помощью параметра event. Вы можете использовать любое имя для события, но вы хотите, чтобы оно по-прежнему представляло событие, которое вы передаете лямбда-выражению (в данном случае MessageCreateEvent).
  • Третье: каждый раз, когда бот получает сообщение, он проверяет, соответствует ли содержимое сообщения события «!ping». Метод equalsIgnoreCase() выполняет это сравнение и, как следует из названия, игнорирует буквы верхнего или нижнего регистра и возвращает значение true или false в зависимости от совпадения.
  • Четвертое: при совпадении содержимого сообщения получаем текстовый канал, в котором произошло событие, и на него отправляем сообщение «Pong!».
  • И наконец: последняя строка в основном методе — это просто оператор печати, который вызывает метод createBotInvite() экземпляра API. Это распечатает URL-адрес, который вы можете использовать, чтобы пригласить бота на свой сервер.

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

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

Я хочу, чтобы мой бот делал что-то полезное!

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

Основной движущей силой этой задачи является прослушиватель другого типа, который называется ServerMemberJoinListener. Как следует из названия, он ожидает и прослушивает члена, чтобы присоединиться к любому серверу, на котором находится бот. Мы хотим приветствовать новых пользователей на сервере, поэтому мы хотим использовать этот прослушиватель, чтобы действовать, когда кто-то присоединяется.

Как вы можете видеть в моем коде ниже, я ввел нечто, называемое Optional. В вики Javacord есть отличное объяснение того, как использовать этот класс Java, и я настоятельно рекомендую заглянуть на эту страницу, чтобы понять, что я делаю с channel.ifPresent().

import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
import org.javacord.api.entity.channel.TextChannel;
import java.util.Optional;
public class Bot {
    public static void main(String[] args) {
        DiscordApi api = new DiscordApiBuilder().setToken("yourtokenhere").login().join());
        // Welcome new users to your server
        api.addServerMemberJoinListener(event -> {
            Optional<Textchannel> channel = api.getTextChannelById(yourchannelidL);
            channel.ifPresent(textChannel -> textChannel.sendMessage("Welcome to the server, " + event.getUser().getMentionTag() + "!"));
        });
        // Print the invite url of your bot
        System.out.println("You can invite the bot by using the following url: " + api.createBotInvite());
    }
}

Как и ранее, позвольте мне дать вам краткое изложение того, что делает код:

  • Во-первых: добавьте ServerMemberJoinListener для ожидания и прослушивания пользователя Discord, присоединяющегося к серверу, на котором находится бот. Это триггер event, который мы будем использовать для упоминания пользователя через мгновение.
  • Второе: запросите Необязательный объект с параметром типа TextChannel, используйте экземпляр API, чтобы получить текстовый канал по его идентификатору (ознакомьтесь с этой публикацией поддержки Discord о том, как чтобы получить идентификатор канала) и присвойте это значение параметру Необязательно. Поскольку мы просто вводим строку чисел, этот канал может существовать, а может и не существовать, поэтому мы используем необязательно. (Примечание: L в конце чисел указывает long, тип данных Java. При жестком кодировании идентификаторов рекомендуется использовать этот тип данных, а не String, так как естественная форма идентификаторов — длинная.)
  • Третье: правильно обработайте Optional. Вызовите метод ifPresent() элемента Optional, чтобы проверить, существует ли канал и, видит ли его бот; если да, то используйте параметр textChannel лямбды для отправки запрограммированного сообщения. Получите пользователя, который присоединился (Пользователь хранится в переменной event, поэтому мы используем event.getUser() для их получения) и получите их тег упоминания для использования в сообщении. Тег упоминания в тесте ниже, где имени пользователя предшествует @. Использование тега упоминания «пингует» пользователя и дает ему понять, что кто-то пытается привлечь его внимание; в нашем случае это наш бот!

Поздравляю х3! После того, как вы напишете весь этот код и перезапустите своего бота, любой пользователь должен быть тепло встречен в любом указанном вами канале. Это не самый впечатляющий первый проект, но это очень хорошее введение в основы библиотеки Javacord и разработки ботов для Discord. У него есть практическое применение, так как некоторые владельцы серверов хотят автоматизировать прием новых пользователей. Если вы хотите приукрасить приветственное сообщение бота, я бы посоветовал ознакомиться с Часто задаваемыми вопросами о встраиваниях Javacord и узнать о встраиваниях, чтобы все выглядело немного опрятнее.

На этом ваше знакомство с ботами Discord с помощью Javacord завершено! Я хотел бы поблагодарить команду Javacord за то, что лично предоставили мне нужную информацию, чтобы я мог сделать эту статью точной и качественной. возможно. Я буду рад ответить на любые вопросы, комментарии или предложения, которые могут у вас возникнуть по поводу этой или будущих статей. Не забудьте подписаться на информационный бюллетень The Playground Digest, чтобы первым узнавать о новых статьях, посвященных Java, и не забудьте подписаться на меня, чтобы в будущем я мог видеть больше подобных статей. Если вы знаете кого-то, кто не совсем уверен, как создать базового бота Discord на Java, поделитесь с ним этой статьей, чтобы дать им отличную отправную точку!

Хотите увидеть все эти концепции в действии? Посетите мой Fiverr®️ Gig®️, чтобы узнать, как я могу создать собственного бота Discord для вашего сервера, используя все, что я обсуждал в этой статье, и все, что вы хотите, чтобы ваш бот делал!