如何在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
相关产品推荐
相关产品推荐

