Làm cách nào để xóa lệnh do người dùng viết trong discord.py sau x giây

Jan 19 2021

Vì vậy, tôi đã thực hiện một lệnh $mute @name which basically mutes a player when typed. But what i want is when i type the command , after 5 or 10 seconds the command input line that is $mute @name bị xóa khỏi cuộc trò chuyện.

Trả lời

IPSDSILVA Jan 19 2021 at 19:08

Điều đó có nghĩa là bạn sẽ phải đợi 5-10 giây sau lệnh và sau đó xóa nó. Chỉ cần đảm bảo rằng bot của bạn có quyền xóa tin nhắn:

@client.command()
async def mute(ctx, member: discord.Member):
    muted_role = ctx.guild.get_role(YOUR_ROLE_ID)  # Make sure not to put it in a string
    await member.add_roles(muted_role)
    await asyncio.sleep(5)  # Make sure you import asyncio, also change the 5 to whatever seconds you would like
    await ctx.message.delete()

Đoạn mã trên sẽ cung cấp cho người dùng Mutedvai trò (bạn chỉ định vai trò nào thông qua id của vai trò đó) và sẽ cấp vai trò đó cho thành viên. Sau đó, nó sẽ đợi 5 giây (bạn có thể thay đổi điều này thành bất cứ điều gì bạn muốn) và sau đó xóa thông báo lệnh.

Bagle Jan 19 2021 at 19:09

Đây là hai phương pháp bạn có thể sử dụng.


Cách đầu tiên sẽ là sử dụng await asyncio.sleepbằng cách asyncionhập . Lý do chúng tôi không sử dụng time.sleeplà vì đây sẽ là một trình chặn. Trình chặn có nghĩa là nếu bạn sử dụng lệnh này ở một nơi, bạn sẽ dừng toàn bộ bot và không ai khác có thể sử dụng lệnh cho đến khi hoàn tất. Một ví dụ sẽ như sau:

import asyncio

@client.command()
async def test(ctx):
    await ctx.message.delete() # deletes message sent by user
    # do some things here
    msg = await ctx.send("done")
    await asyncio.sleep(5) # waits for 5 seconds
    await msg.delete() # deletes message sent by bot, aka 'done'

Cách thứ hai sẽ là sử dụng delete_aftergiả sử bạn chỉ xóa tin nhắn của bot. Tôi không thể nhận được liên kết trực tiếp đến các tài liệu, nhưng họ nói:

xóa_ sau (float) - Nếu được cung cấp, số giây phải đợi ở chế độ nền trước khi xóa thư chúng tôi vừa gửi. Nếu việc xóa không thành công, thì nó sẽ bị bỏ qua một cách âm thầm.

Ví dụ như sau:

@client.command()
async def test2(ctx):
    await ctx.send("done", delete_after=5)

Một số liên kết giới thiệu khác:

  • VẬY: Cách làm cho bot xóa tin nhắn của chính nó sau 5 giây
  • SO: Discord.py Làm cách nào để khiến bot xóa tin nhắn sau một khoảng thời gian cụ thể
  • VẬY: Xóa tin nhắn của bot trong discord.py

Lưu ý : Cả hai lệnh này đều đã được thử nghiệm và cả hai lệnh đều hoạt động như mong đợi.