16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DiscordAdvent Calendar 2017

Day 16

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

Last updated at Posted at 2017-12-15

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さんの順番ですー。

16
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?