如何编写支持用户自定义参数变量的Python Discord机器人命令?
可自定义触发角色的Discord机器人消息功能实现方案
核心逻辑
- 用本地文件(或数据库)存储各服务器的触发角色ID,避免硬编码
- 提供管理员专属斜杠命令,用于设置/移除触发角色
- 监听用户角色更新事件,检测到用户获得触发角色时发送指定消息
代码实现(基于discord.py v2.x)
1. 初始化准备
先创建trigger_roles.json文件(初始内容为{}),用来存储服务器ID与触发角色ID的映射关系。同时在Discord开发者门户开启成员意图(Member Intent),否则无法监听角色变化。
2. 完整代码
import discord from discord import app_commands import json import os # 初始化机器人意图 intents = discord.Intents.default() intents.members = True # 必须开启成员意图 client = discord.Client(intents=intents) tree = app_commands.CommandTree(client) # 加载/保存触发角色数据 def load_trigger_roles(): return json.load(open('trigger_roles.json')) if os.path.exists('trigger_roles.json') else {} def save_trigger_roles(data): json.dump(data, open('trigger_roles.json', 'w'), indent=4) trigger_roles = load_trigger_roles() # 设置触发角色的斜杠命令 @tree.command(name="set_trigger_role", description="设置用户获得后触发消息的角色") @app_commands.checks.has_permissions(manage_roles=True) @app_commands.describe(role="目标触发角色") async def set_trigger_role(interaction: discord.Interaction, role: discord.Role): guild_id = str(interaction.guild_id) trigger_roles[guild_id] = role.id save_trigger_roles(trigger_roles) await interaction.response.send_message(f已设置触发角色:{role.mention},用户获得该角色时将自动发送通知。", ephemeral=True) # 移除触发角色的斜杠命令 @tree.command(name="remove_trigger_role", description="取消当前服务器的触发角色设置") @app_commands.checks.has_permissions(manage_roles=True) async def remove_trigger_role(interaction: discord.Interaction): guild_id = str(interaction.guild_id) if guild_id in trigger_roles: del trigger_roles[guild_id] save_trigger_roles(trigger_roles) await interaction.response.send_message("已移除触发角色设置。", ephemeral=True) else: await interaction.response.send_message("当前服务器未设置触发角色。", ephemeral=True) # 监听角色变化事件 @client.event async def on_member_update(before: discord.Member, after: discord.Member): guild_id = str(before.guild.id) if guild_id not in trigger_roles: return trigger_role_id = trigger_roles[guild_id] # 检查用户是否新增了触发角色 before_role_ids = {r.id for r in before.roles} after_role_ids = {r.id for r in after.roles} if trigger_role_id in after_role_ids and trigger_role_id not in before_role_ids: # 自定义消息发送逻辑,示例:优先发私信,失败则发服务器系统频道 try: await after.send(f🎉 恭喜你获得角色:<@&{trigger_role_id}>!") except discord.Forbidden: if before.guild.system_channel: await before.guild.system_channel.send(f🎉 恭喜{after.mention}获得角色:<@&{trigger_role_id}>!") # 同步命令并启动机器人 @client.event async def on_ready(): await tree.sync() print(f"机器人已登录:{client.user}") client.run("你的机器人TOKEN")
关键说明
- 权限控制:斜杠命令通过
manage_roles权限限制,仅管理员/版主可操作 - 消息逻辑:示例中优先给用户发私信,若用户关闭私信则 fallback 到服务器系统频道,可根据需求修改为指定频道
- 存储扩展:如果机器人服务大量服务器,建议将JSON替换为SQLite/MySQL等数据库,提升数据稳定性
- 命令同步:首次启动机器人后,斜杠命令可能需要1-5分钟同步到服务器,耐心等待即可
内容的提问来源于stack exchange,提问作者Bluesombre
相关产品推荐
相关产品推荐

