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

Discord.js开发:检测用户昵称含数字与PRs并更新计算

优化Discord.js昵称更新命令:识别并计算昵称中的PRs数字

需求概述

需要实现:

  • 检测Discord用户昵称是否包含「数字 + PRs」的格式
  • 若存在该格式,提取现有数字与multiplyNum运算后,替换原数字部分,保留昵称其余内容
  • 若不存在该格式,沿用原有逻辑:有昵称则追加, {finalNum} PRs;无昵称则设置为{用户名} - {finalNum} PRs

现有代码问题

  1. 未做「PRs数字格式」的识别与替换,仅单纯追加内容
  2. member有效性判断位置错误,应该先校验用户是否存在再处理昵称
  3. 缺少运算过程中的异常处理(比如非数字输入)

优化后的代码

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);
        }
    }
}

关键逻辑说明

  1. 正则匹配:/(\d+(\.\d+)?) PRs/ 可以匹配整数(如5 PRs)和小数(如3.14 PRs)格式的内容,确保精准定位需要替换的部分
  2. 数字运算:提取现有数字后与multiplyNum相乘,保留两位小数保证格式统一
  3. 错误处理:
    • 提前校验提及用户和输入数字的有效性
    • 捕获设置昵称时的权限异常
    • 检查昵称长度是否符合Discord的32字符限制
  4. 无匹配场景:兼容原有逻辑,确保未包含PRs格式的昵称能正常更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:55:33