如何在一定时间内给某人一个角色?

Posted

技术标签:

【中文标题】如何在一定时间内给某人一个角色?【英文标题】:How do I give someone a role for a certain amount of time? 【发布时间】:2021-10-19 13:26:28 【问题描述】:

我正试图让我的机器人在用户在聊天中说脏话时让他们静音一段时间。我已经正确设置了触发器,因此当有人在聊天中说一个或多个坏话时,它可以做任何我想做的事情。该代码是:

@bot.event
async def on_message(message):
    bannedwords = ['badword1', 'badword2']
    words_in_message = [word for word in bannedwords if word in message.content]
    word_string = ", ".join(words_in_message)
    yourServer = bot.get_guild(SERVER_ID)
    if not message.author.bot:
        if words_in_message:
            DO.STUFF()
    await bot.process_commands(message)

效果很好。 word_string 用于我发送给用户的 DM,其中包含他们所说的话,因此他们知道不要再这样做了。

好的!回到我的问题。如何在特定时间内为用户分配角色? 我试过了

await message.author.add_roles(discord.utils.get(yourServer.roles, name="Muted"))
time.sleep(5)
await message.author.remove_roles(discord.utils.get(yourServer.roles, name="Muted"))

理论上可行,但由于某种原因它没有。然而,这让我想到,如果机器人在用户被静音期间的任何时候崩溃,他们将永远不会被取消静音,因为线程将被关闭。

依赖于线程不断计数的静音持续时间也向我揭示了另一个问题,很可能一旦用户被静音,机器人将无法执行任何事情 直到此人取消静音。

所以!我将如何正确地做到这一点?我正在考虑一个 SQL 数据库,但我根本不知道如何使用它们,尤其是使用 python 自动使用。

我的理论是创建一个 SQL 数据库,其中包含每个静音的人、他们静音的日期和时间、静音的持续时间以及他们要取消静音的日期和时间。也许我也可以包括他们所说的只是为了贴合目的。然后,我让我的机器人每分钟读取一次数据库,一旦取消静音时间高于当前时间,就取消静音用户。高于,因为这将防止出现取消静音时间已经过去但由于任何原因未触发的情况。

我该怎么做? SQL 数据库是不是最好的主意?

【问题讨论】:

你会希望 await asyncio.sleep(5) 让异步协程等待,而不是让一切停滞,但即便如此,你最终可能会遇到重入问题,更不用说如果你的机器人,这些人永远不会被取消静音在此期间崩溃。 进一步扩展:是的,为了让您的机器人更防崩溃和更无状态,您需要某种持久层,无论是 SQL 数据库、充满文件的目录、. .. 您可以将此播放列表作为您的机器人的基础:youtube.com/playlist?list=PLYeOw6sTSy6ZGyygcbta7GcpI8a5-Cooc 我看到了标签,但这真的和SQL 语言有关吗? 【参考方案1】:

Discord.py 有Async tasks 您可以将其设置为在固定的时间段重复,这样您就可以将删除角色的时间存储在列表中并迭代每个任务循环并在时间匹配时将其删除(您可以使用日期时间模块)

【讨论】:

以上是关于如何在一定时间内给某人一个角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何让一个不和谐的 js 机器人在某人获得某个角色后向他发送消息

当某人有太多角色无法嵌入嵌入时,如何发送“无法显示的角色太多”消息?

有没有办法在不提及/ping他们的情况下向某人添加角色? [discord.js]

有没有办法检查何时添加了某人的角色? [不和谐.js]

当我尝试使具有正常角色的某人静音时,它给了我您不能使具有相同或更高角色的某人静音?

如何在命令中创建一个自定义不和谐机器人@某人@某人?