You need to enable JavaScript to run this app. Discord.JS 按用户特定角色差异化扣减积分及重复扣费问题解决
优惠活动
大模型
产品
解决方案
定价
更多

Discord.JS 按用户特定角色差异化扣减积分及重复扣费问题解决

Discord.js 角色差异化扣费功能修复

核心问题排查

  • 原代码存在重复扣费逻辑:先后两次调用db.subtract扣取20000积分,不管有没有优惠规则都会触发两次全额扣除,是观察到「同时扣多份额度」的直接原因
  • 余额判断逻辑失效:原代码中author < 20000没有实际从数据库读取用户的积分值,属于无效判断
  • 缺少优惠分支判断:没有根据用户的角色持有状态动态匹配扣费金额,全流程硬编码了固定扣费值
  • 原有数据库写入逻辑错误:db.push未指定合法的存储键名,会导致购买记录无法正常写入

正确实现逻辑

  1. 从数据库读取用户当前的积分余额,存储为独立变量
  2. 校验用户是否持有指定的优惠角色
  3. 根据角色状态动态计算本次购买的实际扣费金额
  4. 校验用户余额是否满足扣费要求,余额不足时直接返回对应提示
  5. 余额充足时仅执行一次扣费,再正常执行后续的角色发放、记录存储、成功提示流程

可直接适配的修复代码

// 读取用户当前积分,异步数据库操作需要搭配await
const userBalance = await db.fetch(`money_${message.guild.id}_${user.id}`) || 0;
// 替换为实际的优惠角色ID
const DISCOUNT_ROLE_ID = '你的优惠角色ID';
// 替换为实际的原价、优惠扣费值
const ORIGINAL_PRICE = 20000;
const DISCOUNT_PRICE = 10000;

// 判断用户是否持有优惠角色,动态计算扣费金额
const hasDiscountRole = message.guild.members.cache.get(user.id).roles.cache.has(DISCOUNT_ROLE_ID);
const cost = hasDiscountRole ? DISCOUNT_PRICE : ORIGINAL_PRICE;

// 已持有目标商品的错误提示
const ownedEmbed = new Discord.MessageEmbed()
 .setColor('#FFFFFF')
 .setDescription(`You already own ${message.guild.roles.cache.get('733373020491481219')} !`);

// 余额不足时直接返回提示
if (userBalance < cost) {
 return message.channel.send(balanceNotEnoughEmbed); // 替换为你实际的余额不足提示Embed
}

// 全流程仅执行一次扣费
db.subtract(`money_${message.guild.id}_${user.id}`, cost);
db.set(`hot_rod_red_${message.guild.id}_${user.id}`, true);

// 成功提示动态展示实际扣费金额
const successEmbed = new Discord.MessageEmbed()
 .setColor("#FFFFFF")
 .setDescription(`:white_check_mark: You bought ${message.guild.roles.cache.get('733373020491481219')} for ${cost.toLocaleString()} credits!`);

// 发放角色、写入购买记录
message.guild.members.cache.get(user.id).roles.add("733373020491481219");
db.push(`inventory_${message.guild.id}_${user.id}`, message.guild.roles.cache.get('733373020491481219'));
message.channel.send(successEmbed);

适配注意事项

  • 若使用quick.db等异步数据库,外层处理购买逻辑的函数需要加上async标识,否则读取到的积分值会为undefined,导致校验逻辑失效
  • 不要在流程中重复调用db.subtract,整个购买链路只需要执行一次扣费即可
  • 成功提示中的扣费金额要和动态计算的cost变量绑定,不要硬编码固定值,避免实际扣费和提示金额不一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:54:06