Discord.js开发:检测用户昵称含数字与PRs并更新计算
优化Discord.js昵称更新命令:识别并计算昵称中的PRs数字
需求概述
需要实现:
- 检测Discord用户昵称是否包含「数字 + PRs」的格式
- 若存在该格式,提取现有数字与
multiplyNum运算后,替换原数字部分,保留昵称其余内容 - 若不存在该格式,沿用原有逻辑:有昵称则追加
, {finalNum} PRs;无昵称则设置为{用户名} - {finalNum} PRs
现有代码问题
- 未做「PRs数字格式」的识别与替换,仅单纯追加内容
member有效性判断位置错误,应该先校验用户是否存在再处理昵称- 缺少运算过程中的异常处理(比如非数字输入)
优化后的代码
module.exports = { name: 'test', cooldown: 1000, run: async(client, message, args) => { // 先校验提及用户是否有效 const member = message.mentions.members.first(); if (!member) return message.channel.send("无效用户"); // 校验输入是否为有效数字 const inputNum = parseFloat(args[0]); if (isNaN(inputNum)) return message.channel.send("请输入有效数字"); // 计算最终乘数 const multiplyNum = inputNum * ((100 - 50) / 100) * 0.23; const finalNum = multiplyNum.toFixed(2); // 获取用户当前昵称(无昵称则显示用户名) const currentNick = member.displayName; // 匹配「数字 + PRs」的正则,支持整数和小数 const prsRegex = /(\d+(\.\d+)?) PRs/; let newNick; if (prsRegex.test(currentNick)) { // 提取现有数字并计算新值 const match = currentNick.match(prsRegex); const existingNum = parseFloat(match[1]); const updatedNum = (existingNum * multiplyNum).toFixed(2); // 替换原数字部分 newNick = currentNick.replace(prsRegex, `${updatedNum} PRs`); } else { // 无匹配时按原有逻辑处理 if (member.nickname) { newNick = `${currentNick}, ${finalNum} PRs`; } else { newNick = `${member.user.username} - ${finalNum} PRs`; } } // 处理昵称长度限制(Discord昵称最多32字符) if (newNick.length > 32) { return message.channel.send("更新后的昵称过长,请调整输入值"); } // 设置昵称并处理权限问题 try { await member.setNickname(newNick); message.channel.send(`已更新昵称为:${newNick}`); } catch (err) { message.channel.send("设置昵称失败,请检查机器人权限"); console.error(err); } } }
关键逻辑说明
- 正则匹配:
/(\d+(\.\d+)?) PRs/可以匹配整数(如5 PRs)和小数(如3.14 PRs)格式的内容,确保精准定位需要替换的部分 - 数字运算:提取现有数字后与
multiplyNum相乘,保留两位小数保证格式统一 - 错误处理:
- 提前校验提及用户和输入数字的有效性
- 捕获设置昵称时的权限异常
- 检查昵称长度是否符合Discord的32字符限制
- 无匹配场景:兼容原有逻辑,确保未包含PRs格式的昵称能正常更新
内容的提问来源于stack exchange,提问作者lkityehvlwoyy
相关产品推荐
相关产品推荐

