スポンサーリンク
こんにちは。前回までで、「〇/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」にいます。)
お疲れさまでした!
<関連記事>
多機能情報BOT Panderoid開発者・あるちっぷ共同運営者
国産仮想通貨SanDeGoの黎明期からSanDeGoコミュニティに参加し、積極的にサポート活動を展開。相場情報取得やフォーセット機能などの実用性に加え、多様なゲーム性を併せ持つ多機能情報BOT 「Panderoid」を開発し、Discord上で提供。アルファのチップサービス「あるちっぷ」のフロント開発を担当し、共同運営中。