たまにはドラビレの記事も書かなくてはね(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分に一度動くプログラムと、
現在時刻の取得が出来れば後は簡単ですね。
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
これだけでも色々と遊べそうですね。
今回はここまで!