↑の続き
昨日、定期的に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にそのコルーチンをブチ込みました。動きました。はい。
つづけ