Help us understand the problem. What is going on with this article?

DiscordPHPを使って簡単なBotを作ってみる - 実践編

More than 1 year has passed since last update.

Discord Advent Carendar 2017 16日目

今回は、前回の導入編に引き続き実践編です。
※大したことはしないので、本当に触り程度の内容です。

やってみますぞ

今回はBotの発言をやってみます。

Botの発言

一概に発言といっても、Bot自ら発言するパターンやらメッセージに反応するパターンやら
色々ありますが今回はとても簡単なメッセージに反応するパターンです。

さっそくコードを見ていきましょう。

メッセージに反応させるパターン

run.php
<?php

// 一部のソースコードは省略しています

$discord->on('ready', function ($discord) {
    // Listen for events here
    $botUser = $discord->user;
    $discord->on('message', function ($message) use ($botUser) {
        if ($message->author->user->id !== $botUser->id) {
            $message->reply('こんにちはーっ!');
        }
    });
});

さて、上記ですが。。。

'ready' については特に詳しく触れません。というか特に詳しく書けません。
簡単にいうとBotが起動して準備できましたよ、ってことですね。

$discord->on('message', callback)
これはメッセージが来た時に走るイベントですね。
今回は、メッセージに反応したいので、ここのcallbackの処理に色々書いていきます。

上記の処理では、何かメッセージがきたら「こんにちは」と返すだけの簡単な処理です。
ただ、これだと「すべてのメッセージ」に対して反応してしまい、自分の発言したメッセージに対しても反応して無限ループになってしまいます。

ですので、 if ($message->author->user->id !== $botUser->id) と書いて自分以外のメッセージの場合のみ返信するようにしています。
(もしかするともっと良い制御があるかもしれませんね。)

実際に実行してみると、こんな感じになります。
image.png
なんて元気のいい返事でしょう。可愛いですぞ!

さて、 message イベントのcallbackに何かしら処理を書けば、メッセージに対して反応してくれるということがわかりました。

もう少し改良してみましょう。

メンションの条件をつけてみる

run.php
<?php

// 一部のソースコードは省略しています

$discord->on('ready', function ($discord) {
    // Listen for events here
    $botUser = $discord->user;
    $discord->on('message', function ($message) use ($botUser) {
        if ($message->author->user->id !== $botUser->id) {
            if (isset($message->mentions[$botUser->id])) {
                $message->reply('こんにちはーっ!');
            }
        }
    });
});

さらに「自分宛のメンションがついているときのみ」という条件を追加してみました。
あまり綺麗ではないですね。突っ込まないでください。

実行してみますぞ。
image.png
メンションがない場合は、反応していません。
メンションがある場合は、またまた元気に挨拶してくれますね!

isset() で使っている $message->mentions ここにメンション対象のUserクラスが配列として詰められています。

そのキーとして、UserのIDが設定されていますので、
今回はそのIDにBotユーザIDが含まれているかどうか、という判定をしています。

言い訳

普段はdiscord.jsで書いているので isMemberMentioned という便利なメソッドがあるのですが、PHPはないのですかね。
泣く泣く isset() なんていう判定にしてしまいました。

まとめ

こんな感じで反応の条件をカスタマイズできます。

色々いじっていけば
image.png
こんな感じでお話もすぐできそうですね!

おわりに

DiscordPHPはDocumentもあまり充実してる気がしないので、
PHPを読める人はライブラリの中を直接読んでしまった方が理解が早いかもしれませんね。
まぁ、正直なところnodeで書く方が色々楽だなと思いました。

明日はryo-yamaokaさんの順番ですー。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした