【发布时间】: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 语言有关吗?
标签: python sql python-3.x discord discord.py