基于wio.db开发topcoins命令:生成kwanzas前20富豪榜及查询自身位次
实现'topcoins'富豪榜单命令(基于wio.db)
需求概述
- 提取数据库中所有用户的
kwanzas数值 - 生成排名前20的富豪榜单
- 显示命令发起者在该榜单中的位次
现有信息
数据库结构示例
{ "usuario": { "982405935404285962": { "economia": { "kwanzas": 20000, "banco": -20000, "trabalho": 1661702099111, "aposta": false, "roubo": 1661712130044 }, "nome": "vk 7vvch#0007", "xp": { "xp": 24, "max": 50, "level": 1 } }, "992935083231150231": { "economia": { "kwanzas": 115139, "banco": 0, "aposta": false }, "nome": "krozz#0007", "xp": { "xp": 22 } } } }
当前单用户数据获取方式
client.userdb.get(`usuario.'id'.economia.kwanzas`)
实现方案
核心思路
- 一次性获取所有用户数据
- 转换为可排序的数组,提取关键信息(用户ID、昵称、kwanzas)
- 按
kwanzas降序排序 - 截取前20条生成榜单
- 定位发起者在排序后的数组中的位置,计算位次
代码示例
// 以Discord.js命令结构为例,可根据实际框架调整 async function topcoinsCommand(interaction) { // 1. 获取所有用户数据 const allUsers = await client.userdb.get('usuario'); if (!allUsers) { return interaction.reply('暂无用户数据'); } // 2. 转换为数组并处理缺失字段 const userList = Object.entries(allUsers).map(([userId, userData]) => ({ id: userId, name: userData.nome || '未知用户', kwanzas: userData.economia?.kwanzas || 0 })); // 3. 按kwanzas降序排序 const sortedUsers = userList.sort((a, b) => b.kwanzas - a.kwanzas); // 4. 生成前20榜单内容 const top20 = sortedUsers.slice(0, 20); let leaderboard = '🏆 富豪榜单(前20名)\n'; top20.forEach((user, index) => { leaderboard += `${index + 1}. ${user.name} - ${user.kwanzas.toLocaleString()} Kz\n`; }); // 5. 查找发起者位次 const authorIndex = sortedUsers.findIndex(user => user.id === interaction.user.id); if (authorIndex !== -1) { const authorRank = authorIndex + 1; leaderboard += `\n你的位次:第${authorRank}名(拥有${sortedUsers[authorIndex].kwanzas.toLocaleString()} Kz)`; } else { leaderboard += '\n你还没有任何Kz数据哦'; } // 发送结果 interaction.reply(leaderboard); }
注意事项
- 若存在多个用户
kwanzas数值相同的情况,上述代码会按原始数据顺序排序,如需并列排名逻辑,可额外处理(比如记录上一名分数,相同分数则位次一致) - 调用
wio.db方法时必须使用异步操作(await),避免数据未加载完成就执行后续逻辑 - 对缺失
economia或kwanzas字段的用户,默认设为0,防止程序报错
内容的提问来源于stack exchange,提问作者Bondzinn
相关产品推荐
相关产品推荐

