Umagameです。
今回は前の記事の続きです。
前の記事を見ていない人はこちらから:
umagame.hatenablog.jp
メッセージの検知
まず、ListenerAdapterというクラスを継承して、メッセージを検知できるようにします。
なぜこれをするかというと、Botでよくある「コマンドを打てば処理を行う機能」を実装するためです。
ListenerAdapterを継承した後は、JDAのaddEventListenerメソッドを行う必要があります。
こんな感じです。
public class TutorialBot extends ListenerAdapter{
public static void main(String[] args) {
JDABuilder b = new JDABuilder();
JDA jda = null;
try {
jda = b.setToken("ここにトークンを入力").build();
} catch (LoginException e) {
e.printStackTrace();
}
jda.addEventListener(new TutorialBot());
}
}
「ローカル変数 jda が初期化されていない可能性があります」とでるため、
4行目の部分をJDA jda = null;にしています。
そして、onMessageReceivedメソッドをOverrideします。
@Override
public void onMessageReceived(MessageReceivedEvent e) {
}
これで、メッセージを受け取ったときにこのメソッドが呼び出されます。
メッセージの送信
メッセージの送信は、Discordのテキストチャンネルを表す、
TextChannelクラスのsendMessageメソッドで行うことができます。
ですが、sendMessageメソッドの後ろにqueue();をつけないと処理が実行されません。
そして、メッセージが送られたテキストチャンネルは、
MessageReceivedEventのgetTextChannelメソッドで入手できます。
こんな感じ。
@Override
public void onMessageReceived(MessageReceivedEvent e) {
e.getTextChannel().sendMessage("メッセージ").queue();
}
それでは、「Hello」と言ったら「Hello」と返してくれる機能を作ってみましょう。
送られたメッセージは、MessageReceivedEventのgetMessageで入手できます。
このままでは文字列として使えないので、getContentRawでStringにしましょう。
こんな感じ。
@Override
public void onMessageReceived(MessageReceivedEvent e) {
String s = e.getMessage().getContentRaw();
if(s.equals("Hello")) {
e.getTextChannel().sendMessage("Hello").queue();
}
}
ちなみに、getContentRaw以外にも、getContentDisplay、getContentStrippedがありますが、
これらのメソッドに違いは特にありませんので、どれでも良いです。
ですが、これではBot自身が言った「Hello」にも反応してしまうため、
「Hello」と送信した人がBotかそうでないかを確認する必要があります。
すこし面倒ですが、このようにすれば解決できます。
@Override
public void onMessageReceived(MessageReceivedEvent e) {
String s = e.getMessage().getContentRaw();
if(s.equals("Hello")) {
if(!e.getAuthor().equals(jda.getSelfUser())) {
e.getTextChannel().sendMessage("Hello").queue();
}
}
}
getAuthorでメッセージに送信元を入手し、getSelfUserでBot自身のインスタンスを入手します。
さいごに
今回はここまでです。
前の記事:
umagame.hatenablog.jp
次の記事:
umagame.hatenablog.jp