我如何得到这个命令在不同的地方工作在同一时间??discord.py



我希望这个命令同时在不同的地方工作。当我在一个通道上运行它,我的朋友在另一个通道上运行它时,当我们中的一个按下按钮时,命令开始复制。我不点击任何东西,但是如果我的朋友点击了他的频道中的按钮,消息将在两个频道中发送。

import random
import string
import discord
from discord_components import DiscordComponents, Button, ButtonStyle
@bot.command()
async def random_screenshot(ctx):
while True:
letters = string.ascii_lowercase + string.digits
rand_string = ''.join(random.choice(letters) for i in range(6))
link = "https://prnt.sc/" + str(rand_string)
await ctx.send(link,
components=[
Button(style=ButtonStyle.blue, label="Next", emoji="➡")])
await bot.wait_for('button_click')

当我使用while循环

时,这通常发生在所有命令中

while循环不是这里的问题(尽管它是一个单独的问题)。

实际情况是await bot.wait_for("button_click")并不关心按下了哪个按钮。这意味着当命令运行两次,然后单击一个按钮,两个消息都响应。

您需要确保wait_for仅在按钮是我们消息的按钮(而不是另一个消息的按钮)时才继续。要做到这一点,您需要做两件事。

首先,我们需要生成一个随机字符串,并为它设置按钮的自定义id。这样我们就可以知道哪个按钮是根据它的自定义id被按下的。但是等一下,discord_components库已经在我们创建Button对象时为我们生成了一个ID,所以我们可以这样记住它的ID:

button = Button(style=ButtonStyle.blue, label="Next", emoji="➡")
button_id = button.custom_id
await ctx.send(link, components=[button])

其次,我们需要将一个函数传递给wait_for作为check关键字参数,该参数仅在单击的按钮是我们的按钮时返回True。像这样:

def check_interaction(interaction):
return interaction.custom_id == button_id
await bot.wait_for("button_click", check=check_interaction)

现在你的命令应该只响应它自己的按钮:D

最新更新