You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py 如何创建仅管理员可用的斜杠命令?

修复Discord.py管理员斜杠命令setbienvenida并实现欢迎消息功能

原代码的核心问题

  1. 斜杠命令(App Commands)不兼容前缀命令的@commands.has_permissions装饰器,需要用专属的权限检查方式
  2. 全局变量welcome_message无法适配多服务器场景,且机器人重启后配置会丢失
  3. 缺少新成员加入时的消息发送逻辑,也没处理消息中的提及占位符

完整修复代码

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")

关键修改点说明

  1. 权限检查适配:用@app_commands.check(is_admin)替代原前缀命令装饰器,专门适配斜杠命令的权限验证,同时添加错误处理给无权限用户明确提示。
  2. 多服务器兼容:用字典按服务器ID存储消息,避免不同服务器的欢迎配置冲突。如果需要重启不丢失配置,后续可扩展为将字典内容写入JSON文件。
  3. 占位符支持:用户设置消息时可使用{user}自动替换为新成员的提及,{server}替换为服务器名称,无需手动输入复杂的提及格式。
  4. 成员意图配置:必须开启intents.members,同时在Discord开发者后台的机器人页面开启「服务器成员意图」,否则机器人无法监听新成员加入事件。
  5. 斜杠命令同步:在on_ready事件中执行bot.tree.sync(),确保命令能被服务器识别并使用。

使用方法

  1. 登录Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」下开启「Server Members Intent」。
  2. 启动机器人后,管理员在服务器中输入/setbienvenida并填入欢迎消息,比如:欢迎{user}加入{server}!请务必查看#规则频道。
  3. 新成员加入时,机器人会自动将替换后的消息发送到服务器的系统通知频道。

内容的提问来源于stack exchange,提问作者SrAdryX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:42:52