Discord.py 如何创建仅管理员可用的斜杠命令?
修复Discord.py管理员斜杠命令
setbienvenida并实现欢迎消息功能 原代码的核心问题
- 斜杠命令(App Commands)不兼容前缀命令的
@commands.has_permissions装饰器,需要用专属的权限检查方式 - 全局变量
welcome_message无法适配多服务器场景,且机器人重启后配置会丢失 - 缺少新成员加入时的消息发送逻辑,也没处理消息中的提及占位符
完整修复代码
import discord from discord import app_commands from discord.ext import commands # 初始化机器人,必须开启成员意图才能监听新成员加入事件 intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix="!", intents=intents) # 用字典存储各服务器的欢迎消息,key为服务器ID,value为欢迎内容 welcome_messages = {} # 定义管理员权限检查函数,用于斜杠命令的权限验证 def is_admin(interaction: discord.Interaction) -> bool: return interaction.user.guild_permissions.administrator @bot.event async def on_ready(): print(f"已登录为 {bot.user}") # 同步斜杠命令到所有服务器(也可指定单个服务器ID同步) await bot.tree.sync() print("斜杠命令已同步完成") # 修复后的setbienvenida斜杠命令 @bot.tree.command(name="setbienvenida", description="设置新成员欢迎消息(仅管理员可用)") @app_commands.check(is_admin) async def set_welcome_message(interaction: discord.Interaction, *, message: str): # 按服务器ID存储欢迎消息,避免多服务器冲突 welcome_messages[interaction.guild.id] = message # 发送临时提示消息,仅执行命令的人可见 await interaction.response.send_message("Mensaje de bienvenida configurado.", ephemeral=True) # 处理权限不足的错误提示 @set_welcome_message.error async def set_welcome_error(interaction: discord.Interaction, error): if isinstance(error, app_commands.CheckFailure): await interaction.response.send_message("你没有权限执行此命令!", ephemeral=True) # 新成员加入事件,自动发送欢迎消息 @bot.event async def on_member_join(member: discord.Member): guild_id = member.guild.id # 如果当前服务器有配置欢迎消息 if guild_id in welcome_messages: welcome_msg = welcome_messages[guild_id] # 替换占位符:{user}转为成员提及,{server}转为服务器名称 welcome_msg = welcome_msg.replace("{user}", member.mention) welcome_msg = welcome_msg.replace("{server}", member.guild.name) # 默认发送到服务器的系统通知频道(即成员加入提示的频道) channel = member.guild.system_channel if channel: await channel.send(welcome_msg) # 替换成你的机器人Token bot.run("你的机器人Token")
关键修改点说明
- 权限检查适配:用
@app_commands.check(is_admin)替代原前缀命令装饰器,专门适配斜杠命令的权限验证,同时添加错误处理给无权限用户明确提示。 - 多服务器兼容:用字典按服务器ID存储消息,避免不同服务器的欢迎配置冲突。如果需要重启不丢失配置,后续可扩展为将字典内容写入JSON文件。
- 占位符支持:用户设置消息时可使用
{user}自动替换为新成员的提及,{server}替换为服务器名称,无需手动输入复杂的提及格式。 - 成员意图配置:必须开启
intents.members,同时在Discord开发者后台的机器人页面开启「服务器成员意图」,否则机器人无法监听新成员加入事件。 - 斜杠命令同步:在
on_ready事件中执行bot.tree.sync(),确保命令能被服务器识别并使用。
使用方法
- 登录Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」下开启「Server Members Intent」。
- 启动机器人后,管理员在服务器中输入
/setbienvenida并填入欢迎消息,比如:欢迎{user}加入{server}!请务必查看#规则频道。 - 新成员加入时,机器人会自动将替换后的消息发送到服务器的系统通知频道。
内容的提问来源于stack exchange,提问作者SrAdryX
相关产品推荐
相关产品推荐

