簡體   English   中英

Discord.py 在一定時間后向成員發送直接消息

[英]Discord.py send members a direct message after certain time

我想在 1 周后向所有服務器成員發送沒有“額外”角色的直接消息,並提醒他們在我的服務器上選擇額外的角色。 這可能嗎?

我已經搜索了一個教程,但我找不到一種方法來做到這一點。

也許“額外”角色可以是角色 ID 列表或其他內容。

是的,這是可能的。

在很長一段時間內,您可能希望使用某種持久性數據存儲來跟蹤事物,但是只要您的機器人永不停機(或者如果您對后果感到滿意),您就可以合理地在內存中執行此操作重置)

用於此目的的一個關鍵機制是任務 您可以安排一個任務定期運行,以便在沒有“額外”角色的情況下跟蹤人員。

請記住,任務調度應少於一天的時間。 因此,在這種情況下,我們每約 3 小時運行一次任務,但該任務只會每 7 天發送一次消息。

單個公會的這個想法的草圖可能看起來像這樣:


# the names of the roles to look for. You could also get these some other way.
EXTRA_ROLE_NAMES = {'foo', 'bar', 'baz'} 

import discord
from discord.ext import tasks


class MyBot(discord.Client):
    def __init__(self, *args, **kwargs):
        self._next_message_time = datetime.datetime.now()  # send reminder right away when the bot starts
        self.without_extra_role = set()  # set of members without an 'extra' role
        self._message_interval = datetime.timedelta(days=7)
        # if you don't want to send the message right away when the bot starts:
        # self._next_message_time = self._next_message_time + self._message_interval
        super().__init__(*args, **kwargs)
    @staticmethod
    def has_extra_role(member: discord.Member):
        for role in member.roles:
            if role.name in EXTRA_ROLE_NAMES:
                return True
        return False
    
    async def send_reminder(self, member):
        msg = "Don't forget to pick a role!"
        await member.send(msg)
    
    @tasks.loop(minutes=180)  # run this every 3 hours
    async def check_roles(self):
        guild = ... # get the discord guild object here
        # remove members that have picked a role
        to_remove = []
        for member in self.without_extra_role:
            if self.has_extra_role(member):
                to_remove.append(member)
        for member in to_remove:
            self.without_extra_role.remove(member)

        # Find members who still need to pick a role
        async for member in guild.fetch_members():
            if not self.has_extra_role(member):
                self.without_extra_role.add(member)

        # if it's time to send messages to everyone without a role...
        if datetime.datetime.now() >= self._next_message_time:
            # reset the next time to send the message
            self._next_message_time = datetime.datetime.now() + self._message_interval
            # send the messages
            for member in self.without_extra_role:
                # schedule reminder to be sent in the event loop
                self.loop.create_task(self.send_reminder(member))

在這里, self._next_message_time會跟蹤您應該何時發送下一個提醒。 理想情況下,這應該以某種方式持久化,以避免在您的機器人出現故障時出現不一致。

self.without_extra_role集合跟蹤沒有選擇額外角色的成員。 此列表每 3 小時更新一次(根據任務計划)。 7 天后,下次任務運行時,會更新成員列表,並向仍在列表中的成員發送提醒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM