質問: "今日のお昼ご飯当番は" + s[0].mention + "さんです!!" await message.channel.send(m) # Botの起動とDiscordサーバーへの接続 client.run(BOT_TOKEN) ``` ### わからないこと discordにおける ~~・channel と guild~~ ・member と user など、区別がついてないなど初歩的な躓きも多いので、 もし合わせてご教授いただけますと幸いです。 ### 補足情報(FW/ツールのバージョンなど) 数日前にインストールしたばかりのため ・Python3.8.2 ・discord.py 1.3 (rewriteのほう) だと思います。
回答: 2~5の条件を一つずつ解決していくと良いでしょう。 ### 2. 特定のチャンネル内にいるメンバーの取得 `on_message` 内の `message.channel.members` と同様に、 `discord.TextChannel.members` を使用すると良いでしょう。(ドキュメント) `loops`内では `channel_sent` の内容が `discord.TextChannel` インスタンスですね。 つまり、`channel_sent.members` がそのメンバーのリストになります。 ### 3. 特定のロールを付与されているメンバーの取得 `discord.Role.members` を使用します。(ドキュメント) なお、2.で取得したメンバーリストと重複するメンバーを抜き出すなら、一度それらを集合型に変換して、その積集合を取ると良いでしょう。 ### 4. オンラインのメンバーの取得 既にメンバーのリストを取得しているので、その中からオンラインのメンバーを抽出します。 メンバーのステータスは `discord.Member.status` で取得することができます。 これは、`discord.Status` クラスで定義されているいずれかの値を取ります。 オンラインの場合、`discord.Status.online` になります。 実際の抽出方法についてですが、様々な実装方法があると思います。 内包表記を使ったり、filter() 関数を利用するとスマートです。 以下はメンバーのリストからオンラインのものを抜き出す例です(`members`を抽出前のそれと定義します) ``` onlines = [] for member in members: if members.status == discord.Status.online: onlines.append(member) onlines = [member for member in members if member.status == discord.Status.online] onlines = list(filter(lambda member:member.status == discord.Status.online,members)) ``` ### 5. ランダムで一人代表者を決める リストから特定の要素をランダムに選択する場合、`random.choice()` を使用するのが良いでしょう。 `random.choice` はランダムに選択した要素をそのまま返します。 ### 実装例 このように実装できるのでは、と思います。 (動作確認は行っていません、ご了承ください) 基本的には上記の内容をそのまま実装しているつもりです。 質問内容との齟齬があれば、すみません。 ``` ROLE_ID = 123456789123456789 # ここにはロールのIDを記述することを想定しています # 60秒に一回ループ @tasks.loop(seconds=60) async def loops(): # 現在の時刻 now = datetime.now().strftime('%H:%M') print(lunchtime) channel_sent = client.get_channel(CHANNEL_ID) lunch_role = channel_sent.guild.get_role(ROLE_ID) # ROLE_ID のロールを取得 tmp = list(set(channel_sent.members) & set(lunch_role.members)) # 特定のチャンネル内にいる、お昼ご飯を注文したい人のリスト。積集合を取っています online_members = [member for member in tmp if member.status == discord.Status.online] # 先のリストから、ステータスがオンラインのメンバーのみのリストを作成。 #お知らせの設定時刻 if now == '11:00': m = f"今日のお昼ご飯当番は {random.choice(online_members).mention} さんです!!" await channel_sent.send(m) ``` ### わからないこと について `discord.User` はDiscordのユーザーそのものを指し示すクラスです。 つまり、Discord全体から見た一個人です。 `discord.Member` は、あるサーバーのメンバーを指し示すクラスです。 これは、一つのサーバーから見た一個人です。 `discord.User` にサーバー特有の情報(持っている役職など)を付け加えたものが `discord.Member` 、という感じでしょうか?