Discord botの実装を勉強している②

ころん
·

↑の続き

昨日、定期的にbot側からメッセージを送信するのを試した。(技術サポートをしてもらいつつ(感謝))

非同期処理まわりがドチャクソ面倒臭いすぎる。

やりたいこと:Botを起動させ、特定のサーバのチャンネルに一定時間ごとにメッセージを送信

読んでいる人類へ:脳内に from discord.ext.commands import Bot と import asyncio して読んでくだしあ

discord.pyのBot.run()と、メッセージを定期的に送信するコルーチンを並行実行させたかった。

だが、Bot.run()のリファレンスに、

イベントループをより詳細に制御するには、この関数を使用しないでください。 start() または connect() + login() を使用してください。

と記述されている為、Bot.start()の方に変えた。

そして以下のように記述した。

asyncio.run(asyncio.gather(client.start(TOKEN), loop_message_sender()))

(loop_message_sender()は自分で書いたコルーチン、clientは以下

client = Bot(command_prefix="!", intents=discord.Intents.all())

、TOKENはbotのトークン)

しかし、

ValueError: a coroutine was expected, got <_GatheringFuture pending>

というエラーが出る。

どうやらリファレンスによると、asyncio.run()の引数はコルーチンのみ受け取るらしい。

そして、Awaitableオブジェクトの説明を読むと、

awaitable オブジェクトには主に3つの種類があります: コルーチン, Task, そして Future です

となっている。あ?何か色々種類があるが?

asyncio.gather()の返り値がasyncio.tasks._GatheringFutureで、Futureの方なので駄目っぽい。オ~~~イ

仕方がないのでコルーチンの中にawait式でgatherしたものを記述し、runにそのコルーチンをブチ込みました。動きました。はい。

つづけ

@koron_d
ンァ