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

如何在discord.js中存储用户钱包金额,实现乞讨赚钱功能

实现Discord.js用户专属钱包功能

1. 选择数据存储方案

  • 轻量场景用JSON文件:适合小型机器人,无需额外数据库依赖,读写逻辑简单直接
  • 进阶用数据库:比如SQLite、PostgreSQL,适合用户量较多、数据持久化稳定性要求高的场景

2. JSON文件实现示例(快速上手)

先创建一个wallet.json文件作为数据存储,初始内容为空对象:

{}

核心逻辑代码

读取用户余额

const fs = require('fs');
const path = require('path');

// 获取指定用户的钱包余额,默认返回0
function getUserBalance(userId) {
  const walletPath = path.join(__dirname, 'wallet.json');
  const rawData = fs.readFileSync(walletPath, 'utf8');
  const wallets = JSON.parse(rawData || '{}');
  return wallets[userId] || 0;
}

更新用户余额(乞讨金额累加)

function updateUserBalance(userId, amount) {
  const walletPath = path.join(__dirname, 'wallet.json');
  const rawData = fs.readFileSync(walletPath, 'utf8');
  const wallets = JSON.parse(rawData || '{}');
  
  // 累加金额,若用户无记录则初始化
  wallets[userId] = (wallets[userId] || 0) + amount;
  
  fs.writeFileSync(walletPath, JSON.stringify(wallets, null, 2));
  return wallets[userId];
}

整合到乞讨命令

假设你的乞讨触发命令是!beg,修改后的完整逻辑:

client.on('messageCreate', (message) => {
  if (message.author.bot) return;
  
  if (message.content === '!beg') {
    // 生成1-100的随机乞讨金额
    const begAmount = Math.floor(Math.random() * 100) + 1;
    // 更新用户钱包并获取新余额
    const newBalance = updateUserBalance(message.author.id, begAmount);
    
    message.channel.send(`你乞讨到了 ${begAmount} 金币!当前余额:${newBalance} 金币`);
  }
});

3. 数据库实现示例(SQLite)

适合用户量较大的场景,先安装依赖:

npm install sqlite3

核心逻辑代码

初始化数据库连接与表

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./wallets.db');

// 创建用户钱包表,不存在则创建
db.run(`CREATE TABLE IF NOT EXISTS wallets (
  userId TEXT PRIMARY KEY,
  balance INTEGER DEFAULT 0
)`);

读取用户余额(异步)

function getUserBalance(userId) {
  return new Promise((resolve, reject) => {
    db.get('SELECT balance FROM wallets WHERE userId = ?', [userId], (err, row) => {
      if (err) reject(err);
      resolve(row ? row.balance : 0);
    });
  });
}

更新用户余额(异步,支持新增/更新)

function updateUserBalance(userId, amount) {
  return new Promise((resolve, reject) => {
    // 存在用户则累加余额,不存在则新增记录
    db.run(`INSERT INTO wallets (userId, balance)
            VALUES (?, ?)
            ON CONFLICT(userId) DO UPDATE SET balance = balance + ?`,
          [userId, amount, amount],
          async function(err) {
            if (err) reject(err);
            // 返回更新后的余额
            const newBalance = await getUserBalance(userId);
            resolve(newBalance);
          });
  });
}

整合到乞讨命令

client.on('messageCreate', async (message) => {
  if (message.author.bot) return;
  
  if (message.content === '!beg') {
    const begAmount = Math.floor(Math.random() * 100) + 1;
    try {
      const newBalance = await updateUserBalance(message.author.id, begAmount);
      message.channel.send(`你乞讨到了 ${begAmount} 金币!当前余额:${newBalance} 金币`);
    } catch (err) {
      message.channel.send('乞讨失败,请稍后再试');
      console.error(err);
    }
  }
});

4. 注意事项

  • JSON文件需注意并发问题:如果多个用户同时触发命令,可能出现文件读写冲突,小型机器人可忽略,或改用fs.promises配合简单锁机制
  • 数据库方案稳定性更高:数据不易因文件损坏丢失,适合长期运营的机器人
  • 可拓展功能:比如添加!balance查询余额命令、用户间转账功能等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:15:46