PythonでDiscord bot 「4.helloコマンドの中身を知ろう!」

スポンサーリンク

こんにちは。前回までで、「〇/hello」コマンドで「Hello, world!」がbotを返すところまで説明しました。今回は、前回できなかった、コードの中身についての説明にあてたいと思います。私もコードの全てを理解できているわけではない(=過去の拾い物を使いまわしている部分が一部あります)ので、そこはご了承ください。

コードの全体像

3.botを実行しよう!」で作成したコードの全体像を示します。
これを一つずつ読み解いていきます。

BOT_TOKEN

冒頭でBOT_TOKENを記述しています。

BOT_TOKEN = "*******************************"

「******」の部分には実際には各bot固有のTOKENが入ります。TOKENは、絶対に他人に知られてはいけないコードです。
詳細は「 3.botを実行しよう! 」を確認してください。
ここで記述したBOT_TOKENは、コードの最後の「client.run(BOT_TOKEN)」とセットで動きます。「このトークンを起動してください。」という命令になるかと思います。

パッケージのインポート

以下で、2つのパッケージをインポート(=読み込み)しています。

import discord
import datetime

「import discord 」は、「3.botを実行しよう!」でインストールした「discord.py」を読み込むものです。この指定をして初めて、このコードの中で「discord.py」が有効になります。
それに対して、「import datetime」は、時間制御に関するパッケージ「datetime」を読み込むものですが、「discord.py」とは異なり、インストールをしなくても良いPython標準パッケージです。これもimportは必要です。

Discord botとして認識させる

client = discord.Client()

これは私の認識ですが、上記でこのbotをDiscord用として定義しているはずです。

コメントアウト

#起動時のshellメッセージ 

ここで少し脱線します。コードに「#」を付けると、それより右はコメント扱いとなり、プログラム実行に影響を与えなくなります。

起動時メッセージ

@client.event
async def on_ready():
       print('Logged in as')
       print('BOT-NAME :', client.user.name)
       print('BOT-ID   :', client.user.id)
       print('Time     :', datetime.datetime.now())
       print('------')

この塊で、起動時のメッセージを定義しています。

「on_ready()」は「起動したら」くらいの意味合いでしょうか。
「print」は起動画面に表示を行う命令です。
‘Logged in as’など、’ ‘で囲われている部分は文字列を表します。
Pythonでは、文字列を表すものとして、 ‘ ‘ と ” ”のいずれも使用できます。

client.user.nameは起動したbotの名前、client.user.idは固有のDiscord id(これはTOKENではないです)、datetime.datetime.now()は現在時刻です。先ほどインポートしたdatetimeパッケージはここで使われています。

起動が成功すると、起動画面に以下のように表示されます。

イベント定義

@client.event
async def on_message(message):

Discordで発言があったら、というイベントの定義を行っています。

命令

ここから、命令の本体になります。

 if client.user == message.author:
   return

起動しているbotと発言者が同じだったら無視する(=return)、となります。
botが自分の発言を命令とみなしてしまうと、コマンド実行の永久ループに陥る可能性があるので、このような命令を記述しています。
この他、「発言をしているのが(自分以外も含めて)botだったら無視する」という以下の命令もあります。

 if message.author.bot:
   return

ここで、上で説明したコードの塊を2つ並べてみます。


@client.event
async def on_message(message):

 if client.user == message.author:
   return

「if」の分がその上の「async」より半角スペース右にずれているのがわかるでしょうか。
Pythonでコードを記述する際、この半角スペース(=インデント)が重要な意味を持ちます。
同列の命令なら同じインデントで書き、下位の命令ならインデントを下げないと、「インデントエラー」が返ってきたり、意図しない挙動となったりします。

インデントは半角スペースであれば何文字でも構いませんが、自分で決めておくと良いと思います。(確か半角スペース4文字が標準ですが、私は面倒なので1文字で書いています。)

次に進みます。

 if message.content.startswith('k1/hello'):
  await message.channel.send("Hello, world!")

1行目は、「発言の内容が『k1/hello』で始まったら、」
2行目は、「発言のあったチャンネルに『Hello, world!』と送信する。」となります。
ここでも2行目はインデント1文字下がっていますね。
なお、このように、Pythonは単語を「.」でつないで命令を記述します。

Botの起動

client.run(BOT_TOKEN)

冒頭でも説明したbotの起動の命令です。

今回はここまでで終了です。コードの内容は理解できたでしょうか。
次回以降何を書くかは未定ですが、「こうすればこんなことができるよ!」というトピック紹介的な感じで進めてもいいかな、と思っています。リクエストがあれば教えてください。
(私、こげさんは「アルファDIscord」にいます。)
お疲れさまでした!

よろしければ記事のシェアをお願いします!