Discord.js在消息中显示sqlite行?

时间:2017-10-26 12:47:02

标签: node.js sqlite discord.js

我对discord.js相当新,并且无法在消息中显示/排序来自sqlite数据库的数据。我正在更新每个用户行,他们在服务器上发送消息,这是正常的。但是,我想使用数据库中包含的数据进行各种“排行榜”。

这是我正在尝试的精致版本:

mutate(xx, z = mapply(bla_fun, !!! syms))

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

mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))

但是,我对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}`) }) } 任何帮助或建议将不胜感激!

3 个答案:

答案 0 :(得分:0)

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*/);

你必须使用async / await。

答案 1 :(得分:0)

答案似乎并没有使用异步。我只是误用了sqlite并且需要将sql.get更改为sql.all(sql.get只读取第一行,如果没有设置限制,sql.all会读取所有行)并且能够控制日志结果很容易。

cannot send empty message的问题是由于不一致而无法在一条消息中发送多行数据而必须使用新行进行迭代。为此,我使用'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);  
        }) 
    })
}

答案 2 :(得分:0)

我已经找到了一种更好的方法,通过在sqlite数据库中输出带有已排序条目数的嵌入。这就是我如何获得+排行榜以显示数据库中的前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}`
            }
        });
    })
}