如何让Discord.py机器人在命令后接收输入?附!nuke命令实现疑问
Discord机器人命令后接收用户输入及!nuke命令实现
咱们先解决命令执行后接收用户输入的核心问题——discord.py里可以用client.wait_for()方法监听后续用户消息,通过自定义判断条件,确保只接收触发命令的用户在同一频道发送的内容。
针对你的!nuke命令,我帮你修正代码问题,同时完善权限校验、消息数量获取和批量删除的逻辑:
修正后的完整代码示例
import discord import random import time import asyncio from discord.ext import commands from discord.ext.commands import Bot # 设置命令前缀,新版本推荐用command_prefix参数 client = Bot(command_prefix='!') @client.event async def on_ready(): print(f"Logged in as {client.user}") # 机器人上线提示,方便调试 @client.event async def on_message(message): if message.author == client.user: # 忽略机器人自身消息,避免循环触发 return if message.content == '!nuke': # 权限判断:新版本discord.py已用guild_permissions替代旧版server_permissions if message.author.guild_permissions.administrator: await message.channel.send('How many messages do you want to remove?') # 定义消息过滤规则:仅接收触发命令的用户在当前频道的输入 def check(msg): return msg.author == message.author and msg.channel == message.channel try: # 等待用户输入,超时时间设为60秒 user_input = await client.wait_for('message', check=check, timeout=60.0) # 尝试将输入转为整数 delete_count = int(user_input.content) # 批量删除限制:一次最多删100条,且不能删除超过14天的消息 if 1 <= delete_count <= 100: # 包含触发命令的消息和用户输入的消息,所以要多删2条 messages = await message.channel.history(limit=delete_count + 2).flatten() await message.channel.delete_messages(messages) await message.channel.send(f'Successfully deleted {delete_count} messages!', delete_after=5.0) else: await message.channel.send('Please enter a number between 1 and 100.', delete_after=5.0) except ValueError: # 用户输入非数字的情况处理 await message.channel.send('Invalid input! Please enter a number.', delete_after=5.0) except asyncio.TimeoutError: # 用户超时未输入的情况处理 await message.channel.send('You took too long to respond!', delete_after=5.0) else: await message.channel.send('You don\'t have permission to use this command!', delete_after=5.0) # 必须添加这句,否则其他基于commands框架的命令会失效 await client.process_commands(message) # 替换为你的机器人Token client.run('YOUR_BOT_TOKEN_HERE')
关键细节说明
- 接收用户输入:通过
client.wait_for('message', check=check, timeout=60.0)实现,check函数用来过滤消息,确保只有触发命令的用户在同一频道的输入才会被处理。 - 权限校验修正:旧版的
server_permissions已被弃用,现在统一使用guild_permissions。 - 批量删除限制:
bulk_delete方法一次最多删除100条消息,且仅支持删除14天以内的消息;另外要把触发命令的消息和用户输入的消息一起删掉,所以需要多算2条。 - 异常处理:加入了输入非数字、超时未输入的异常捕获,让机器人的响应更健壮。
另外,更推荐用commands装饰器写法,代码结构更清晰:
@client.command() @commands.has_permissions(administrator=True) async def nuke(ctx): await ctx.send('How many messages do you want to remove?') def check(msg): return msg.author == ctx.author and msg.channel == ctx.channel try: user_input = await client.wait_for('message', check=check, timeout=60.0) delete_count = int(user_input.content) if 1 <= delete_count <= 100: messages = await ctx.channel.history(limit=delete_count + 2).flatten() await ctx.channel.delete_messages(messages) await ctx.send(f'Deleted {delete_count} messages successfully!', delete_after=5) else: await ctx.send('Please enter a number between 1 and 100.', delete_after=5) except ValueError: await ctx.send('Please enter a valid number!', delete_after=5) except asyncio.TimeoutError: await ctx.send('Timeout! You didn\'t respond in time.', delete_after=5)
这种写法用@commands.has_permissions直接做权限校验,代码更简洁,也符合discord.py的最佳实践。
内容的提问来源于stack exchange,提问作者French_bread_gud
相关产品推荐
相关产品推荐

