
如何给Discord机器人加上前缀命令discordrb命令框架详解权限、限流与参数校验【免费下载链接】discordrbDiscord API for Ruby项目地址: https://gitcode.com/gh_mirrors/dis/discordrbdiscordrb 是一个用 Ruby 编写的 Discord API 库它的命令框架CommandBot让你只需几行代码就能让机器人响应!ping这类前缀命令并自带参数校验、权限控制与限流保护。本文面向新手带你在 10 分钟内掌握这套框架的核心玩法。一、先认识 discordrb 命令框架普通Bot只能被动监听消息而继承自它的CommandBot额外提供了command方法把解析消息 → 匹配命令 → 校验参数 → 执行逻辑整条链路都封装好了require discordrb # 关键用 CommandBot 替代 Bot并通过 prefix 指定前缀 bot Discordrb::Commands::CommandBot.new token: B0T.T0KEN.here, prefix: ! bot.command :ping do |event| event.respond Pong! end bot.runprefix决定了机器人如何识别命令。在 command_bot.rb 的initialize文档中可以看到它支持三种写法。1️⃣ 单个字符串前缀最简单的方式消息必须以该前缀开头才触发bot Discordrb::Commands::CommandBot.new(token: token, prefix: !)2️⃣ 前缀数组一个机器人多个前缀bot Discordrb::Commands::CommandBot.new(token: token, prefix: [!, ?])!ping和?ping都能触发同一个命令适合兼容社区旧习惯。3️⃣ 传入 Proc实现动态前缀当需要不同频道用不同前缀甚至数据库查前缀时可以传入一个接收Message对象的 Proc返回去掉前缀后的命令内容或返回nil表示忽略该消息。项目自带的 prefix_proc.rb 就是一个完整示例按频道 ID 查表返回!或?未配置的频道则回退到默认.逻辑清晰、极易扩展。二、参数校验min_args、max_args 与 arg_types命令最容易出问题的地方是用户乱输参数。command方法提供了一整套声明式校验定义见 container.rb 中command方法的文档参数作用min_args/max_args限定参数数量不满足时自动回复 usageusage用法提示例如random [min/max] [max]description命令说明会显示在帮助信息中arg_types声明式类型转换见下文aliases命令别名help 命令会自动列出看 commands.rb 中的随机数命令0 到 2 个参数全部合法还附带了清晰的 usage 说明bot.command(:random, min_args: 0, max_args: 2, description: Generates a random number., usage: random [min/max] [max]) do |_event, min, max| max ? rand(min.to_i..max.to_i) : rand endarg_types更是神器它能把字符串参数自动转换为目标类型支持Integer、Float、Time、Symbol、Range甚至 Discord 的User、Role、Emoji可直接解析id这种 mention# 第一个参数自动转成 User 对象支持解析 123456 bot.command(:hello, arg_types: [Discordrb::User]) do |_event, user| Hi, #{user.name}! end转换逻辑实现在CommandBot#arg_check中解析失败会得到nil你可以在命令块里自行判断并提示用户。三、权限控制permission_level 与角色限制discordrb 的权限体系分四层按需叠加即可permission_level自定义等级用set_user_permission(id, level)和set_role_permission(id, level)给指定用户/角色定级命令声明permission_level: 2就要求用户等级 ≥ 2。用户等级取个人定级与所有角色定级的最大值见permission?方法。required_roles用户必须拥有数组中的全部角色。allowed_roles用户至少拥有其中一个角色即可。required_permissions要求 Discord 原生动作权限如:kick_members、:manage_messages。一个典型的管理员命令写法bot.command(:ban, permission_level: 2, required_permissions: [:ban_members], permission_message: 你无权使用 %name% 命令 ❌) do |event| # ...执行封禁 end权限不足时会自动回复permission_message其中%name%会被替换成命令名。此外还可以channels: [...]限定命令只在某些频道可用chain_usable: false禁止命令出现在命令链中防止敏感操作被顺手带出help_available: false把命令从帮助列表隐藏。四、限流用 bucket 防止刷屏与滥用命令执行前先检查限流桶Bucket实现见 rate_limiter.rb。桶由三个参数控制limit时间窗口内最多允许多少次time_span窗口时长秒到期重置delay每次执行后强制冷却秒在 bot 上定义一个桶再让命令引用它# 每个用户每分钟最多用 5 次且每次间隔至少 2 秒 bot.bucket :general, limit: 5, time_span: 60, delay: 2 bot.command(:dice, bucket: :general, rate_limit_message: 冷静一下%time% 秒后再试 ⏳) do |_event| #{rand(1..6)} end被限流时会自动回复rate_limit_message%time%会被替换成还需等待的秒数。SimpleRateLimiter还能对非命令事件如普通消息防刷复用同一套桶机制。五、其他实用配置速查CommandBot.new还支持一批贴心选项详见 command_bot.rb 的initialize文档选项说明spaces_allowed: true允许! ping这种前缀与命令之间有空格webhook_commands: false禁止 webhook 消息触发命令ignore_bots: true忽略机器人消息防止机器人互相调用死循环command_doesnt_exist_message: 未知命令%command%自定义命令不存在提示advanced_functionality: true开启命令链chain一条消息串起多个命令rescue命令内部抛异常时的统一兜底回复六、关键文件导航 文件内容lib/discordrb/commands/command_bot.rbCommandBot 主类前缀解析、权限判定、参数转换lib/discordrb/commands/container.rbcommand 方法与全部命令属性的定义lib/discordrb/commands/rate_limiter.rb限流桶 Bucket 与 RateLimiterexamples/commands.rb各种命令写法示例examples/prefix_proc.rb动态前缀完整示例总结 掌握 discordrb 命令框架只需记住四件事CommandBot prefix让前缀命令上线min_args / arg_types / usage让参数校验自动化permission_level 角色限制让危险命令只对管理员开放bucket 限流让机器人远离刷屏滥用。配合项目自带的 examples/ 示例你就能快速搭建一个稳定、易用的 Discord 机器人了。【免费下载链接】discordrbDiscord API for Ruby项目地址: https://gitcode.com/gh_mirrors/dis/discordrb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考