Lua开发Discord机器人发送日语短语及空值判断问题求解
问题根因
你的代码有3个核心错误,导致逻辑完全不生效:
string.sub参数顺序颠倒:Lua中string.sub的参数规则是(目标字符串, 起始位置, 结束位置),如果起始位置数值大于结束位置,会直接返回空字符串,你写的Content:sub(7,2)永远拿不到正确的参数内容。- 命令匹配条件写死:你用
if Content == "hello"做判断,当用户输入m/hello jp时,去掉前缀后的内容是hello jp,和hello字符串不相等,整个命令分支根本不会触发,带参数的指令自然没有响应。 - 缺少参数拆分、空白字符处理逻辑,没有正确实现空参数判断。
修复后可直接运行的代码
-- 工具函数:裁剪字符串首尾空白 local function trim(s) return s:match("^%s*(.-)%s*$") end Client:on("messageCreate", function(Message) local rawContent = Message.content -- 前缀判断,自动适配前缀长度 local CommandYes = rawContent:sub(1, #Settings.Prefix) == Settings.Prefix if not CommandYes then return end -- 统一转小写、裁剪首尾空白,去掉前缀部分 local content = trim(rawContent:lower():sub(#Settings.Prefix + 1)) -- 拆分命令和参数:第一个连续非空格段是命令,后面的内容是参数 local cmd, arg = content:match("^(%S+)%s*(.*)$") -- 没匹配到命令直接返回 if not cmd then return end arg = trim(arg) if cmd == "hello" then if arg == "jp" then Message:reply(string.format("こんにちは, %s-様!", Message.author.mentionString)) elseif arg == "en" or arg == "" then -- 参数是en或者空(无输入/全空格)走英文回复 Message:reply(string.format("Hello my master, %s-sama!", Message.author.mentionString)) else Message:reply(string.format("I'm sorry, I don't know that language...\nBut hello my master, %s-sama!", Message.author.mentionString)) end end end)
逻辑说明
- 不再硬编码前缀长度,通过
#Settings.Prefix动态获取前缀长度,后续修改前缀不需要同步修改多处截取逻辑 - 增加空白裁剪逻辑,用户不小心在指令前后多打空格、参数前后带空格都不会影响匹配结果
- 用模式匹配直接拆分命令和参数,不需要手动数字符索引,从根源避免索引数错、参数顺序写反的问题
- 参数统一做小写转换+trim处理,用户输入
JP/Jp这类不规范格式都能正常识别 - 空参数判断直接校验trim后的arg是否为空字符串即可,覆盖无参数、参数全是空格的场景
内容的提问来源于stack exchange,提问作者JustHowWhy
相关产品推荐
相关产品推荐

