【问题标题】:Discord.js Displaying sqlite rows in message?Discord.js 在消息中显示 sqlite 行?
【发布时间】:2018-04-07 20:41:24
【问题描述】:

我是 discord.js 的新手,在消息中显示/排序来自 sqlite 数据库的数据时遇到问题。我目前正在更新每个用户行,因为他们在服务器中发送消息,这工作正常。但是,我想要一个“排行榜”,使用数据库中包含的数据。

这是我正在尝试的改进版本:

var Discord = require('discord.js');
var bot = new Discord.Client();
var moment = require('moment');
var Roll = require('roll'),
const sql = require("sqlite");
sql.open("userData.sqlite");

bot.on('message', message => {

var prefix = config.prefix;
var sender = message.author;
var msg = message.content.toUpperCase();

sql.get(`SELECT * FROM userData WHERE userId ="${message.author.id}"`).then(row => {
        if (!row) {
            sql.run("INSERT INTO userData (userId, username, level, money, time) VALUES (?, ?, ?, ?, ?)", [message.author.id, sender.username, 0, 0, 0]);
        }
    }).catch(() => {
        console.error;
        sql.run("CREATE TABLE IF NOT EXISTS userData (userId TEXT, username TEXT, level INTEGER, money INTEGER, time INTEGER)").then(() => {
            sql.run("INSERT INTO userData (userId, username, level, money, time) VALUES (?, ?, ?, ?, ?)", [message.author.id, sender.username, 0, 0, 0]);
        });
    });
});

读取数据并在消息中发送内容的命令可以正常工作,例如:

if (msg === prefix + 'MONEY') {
        sql.get(`SELECT * FROM userData WHERE userId ="${sender.id}"`).then(row => {
            message.channel.send(`You have: $${row.money}`)
        })
    }

但是,我对 sqlite 不是很了解,关于排序/显示的文档似乎对我不起作用。我试着看看有多少总用户以及他们有多少钱(对于小游戏):

if (msg === prefix + 'LEADERBOARD') {
        sql.get(`SELECT username,money FROM userData ORDER BY username`).then(rows => { 
                message.channel.send(rows); 
        })
    } 

但是,这会返回:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): DiscordAPIError: Cannot send an empty message. 任何帮助或建议将不胜感激!

【问题讨论】:

    标签: node.js sqlite discord.js


    【解决方案1】:
    const Discord = require('discord.js');
    const bot = new Discord.Client();
    const sql = require("sqlite");
    sql.open("userData.sqlite");
    
    bot.on('ready', () => {
    console.log('I\'m Ready!');
    });
    
    bot.on('message', async message => {
     const data = await sql.get(/*do something*/);
     if (!data){
       // do something
      return;
     }
     // else - do something
     // for example
      return message.channel.send(`${data.username} hi!`);
    });
    
    bot.login(/*super-secret-accsess-token*/);
    

    您必须使用异步/等待。

    【讨论】:

    • 我可能误解了你的意思,但是当我尝试等待查询时,节点说:const data = await sql.get(SELECT username,money FROM data);SyntaxError: Unexpected identifier
    • 等待 sql.get(SELECT username, money FROM data WHERE tableName ="${message.author.id}");这不是 discord.js 问题。这通常是 javascript 和 SQL 问题。而SyntaxErrors 主要是由拼写错误触发的。
    • 试试这个: const data = await sql.get('SELECT * FROM userData WHERE userId ="${message.author.id}"'); console.log(data);
    【解决方案2】:

    这个问题的答案似乎根本没有使用异步。我只是误用了 sqlite,需要将sql.get 更改为sql.all(sql.get 仅读取第一行,如果您不设置限制,则 sql.all 读取所有行)并且能够轻松地控制台记录结果。

    cannot send empty message 的问题是由于 discord 无法在一条消息中发送多行数据,因此必须使用新行进行迭代。为此,我使用了“rows.forEach”,效果很好。 (在嵌入中看起来比发送多条消息要好得多)

    对于遇到此问题的其他人,这是对我有用的解决方案:

    if (msg === prefix + 'LEADERBOARD') {
        sql.all('SELECT username,money FROM userData ORDER BY money DESC').then(rows => {
            rows.forEach(function (row) {  
                console.log(row.username, row.money);
                message.channel.send(row.username + ' Has: $' + row.money);  
            }) 
        })
    }
    

    【讨论】:

      【解决方案3】:

      我已经找到了一个更好的方法来做到这一点,通过在 sqlite 数据库中输出一个带有排序数量的条目的嵌入。这就是我如何让 +leaderboard 显示数据库中排名前 3 的用户而不发送单独的消息。

      if (msg === prefix + 'LEADERBOARD') {
          sql.all('SELECT username,money FROM userdata ORDER BY money DESC LIMIT 3').then(rows => {
              var leaders = '';
              rows.forEach(function (row) {
                  descr += `${row.username}: $${row.money}\n`
              })
              message.channel.send({
                  embed: {
                      title: "Leaderboard Top 3",
                      color: 3447003,
                      description: `${leaders}`
                  }
              });
          })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多