Discord.pyの備忘録その3(1.6.0対応版)

たまにはドラビレの記事も書かなくてはね(n回目)

近頃ネタ切れ感はありますが、思いついたら機能追加~みたいな事を
しているうちに、いくつかBOTで出来る事も増えたので久しぶりに紹介して行きます。
(日々増していくスパゲッティ感・・・)

前回、前々回の記事は下記通り

初歩的なBOTに発言させたり、特定のワードに応対するのはこちら

BOTを停止させる。
発言にランダム性を持たせるのはこちら

Discord.pyとpipを更新する

期間が空いてるうちに、両者ともアップデートが掛かっていたみたいです。

まぁ、メジャーアップデートによりDiscord.pyの仕様が大きく変わって
今まで使っていたBOTが使えなくなる・・・なんて事もあるので
Discord側の仕様変更によりDiscord.pyが使えなくなった!って
ならない限りは無闇にアップデートするのも危険なんですけどね。

pipはしておくのが無難でしょう。

自身のターミナルに下記を入力してエンター押せばアップデートが掛かります。

pip install -U discord.py
pip install -U pip

最新であればこんな感じになります。(執筆現在pipはv21.0.1が最新)

自身の環境のバージョンが知りたい場合は

pip list

で、一覧が表示されます。

パッケージを追加してたりするとその分もツラツラと出てきます。

時報を作る

BOTといえば定型的な動作ですね。
1時間に1回発言するBOTを作ってみましょう。

使うコードは1回目より・・・

import discord
from discord.ext import tasks

client = discord.Client()

@client.event
async def on_ready():
    print("BOT RUN")
    timeloop.start()

@client.event
async def on_reaction_add(reaction, user):
    pass

@client.event
async def on_message(message):
    pass
	
@tasks.loop(seconds=60)
async def timeloop():
    #ここに時報に関するコードを記載

#Dirsocrdのトークン
client.run("TOKEN HERE")

短縮のため、コメントは削除しているので気になる方はその1にドウゾ。

20行移行のtimeloop()内に時報のコードを記載して行きます。

on_ready()内に記載されているtimeloop.start()を叩くと
定期イベントの処理が始まります。

時間の処理をして行くため、datetimeというパッケージを使っていきます。

インポート(プログラムへの組み込み)が必要なので、
メインコードのどこかに記載しておきましょう。

from datetime import datetime

timeloop()内に記載するか、
定型文のやり取りをする場合は先頭に記載しておきましょう。

@tasks.loop(seconds=60)
async def timeloop():
    from datetime import datetime
    print(str(datetime.now()))

ちなみに、timeloop()内にインポートの記載をした場合は
on_message内で使おうとするとエラーになります。
(timeloop内に記載したdatetimeはtimeloop内でしか使えない)

1分ごとに動く”1分経過”は出力されるも
発言時に現在時間を出力するプログラムはエラーになっている。

プロシージャ外で宣言してあげることで
どちらでも使う事が出来ます。

1分に一度動くプログラムと、
現在時刻の取得が出来れば後は簡単ですね。

datetime.now().minute

で”分”を取得できるので、0分の時だけ動く条件分岐を作ります。

if datetime.now().minute == 0 :

組み込むとこう・・・

@tasks.loop(seconds=60)
async def timeloop():
    print(str(datetime.now().minute)+"分")
    if datetime.now().minute == 0 :
        print("正時になりました。")

しっかり動作しています。

ちなみに、15分ごとに発言させるとしたらこんな感じで・・・

@tasks.loop(seconds=60)
async def timeloop():
    print(str(datetime.now().minute)+"分")
    if datetime.now().minute % 15 == 0 :
        #0分15分30分45分で実行
        print(str(datetime.now().minute)+"分になりました。")

時間を手動でズラしたらなぜか2回動きましたがちゃんと動いてそうですね。

if datetime.now().minute % 15 == 0 :

を30とすれば30分ごとにしたりすることも可能です。

tasks.loop(seconds=60)
async def timeloop():
    print(str(datetime.now().minute)+"分")
    if datetime.now().minute == 0 :
        #時報
        print(str(datetime.now().hour)+"時をお知らせします!")
    return

と、言う事で時報完成です。

条件分岐で時間を指定してあげることで、
特定の時間だけ発言する・・・って事も出来ます。

@tasks.loop(seconds=60)
async def timeloop():
    print(str(datetime.now().hour)+"時"+str(datetime.now().minute)+"分")
    if  datetime.now().hour == 2 and datetime.now().minute == 0 :
        #時報
        print("ドワンゴが、午前2時をお知らせします。")
    return

これだけでも色々と遊べそうですね。

今回はここまで!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です