Discord.js 在消息中显示 sqlite 行?
Discord.js Displaying sqlite rows in message?
我是 discord.js 的新手,在消息中 displaying/sorting 来自 sqlite 数据库的数据时遇到问题。我目前正在更新每个用户行,因为他们在服务器中发送了一条消息,工作正常。但是,我想要使用数据库中包含的数据进行 'leaderboard' 排序。
这是我正在尝试的改进版本:
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 不是很了解,sorting/displaying 上的文档似乎对我不起作用。我只是想看看有多少用户以及他们有多少钱(用于迷你游戏):
if (msg === prefix + 'LEADERBOARD') {
sql.get(`SELECT username,money FROM userData ORDER BY username`).then(rows => {
message.channel.send(rows);
})
}
然而,这个returns:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): DiscordAPIError: Cannot send an empty message.
如有任何帮助或建议,我们将不胜感激!
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。
这个问题的答案似乎根本没有使用异步。我只是误用了 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);
})
})
}
从那以后,我找到了一种更好的方法来执行此操作,即输出一个包含 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}`
}
});
})
}
我是 discord.js 的新手,在消息中 displaying/sorting 来自 sqlite 数据库的数据时遇到问题。我目前正在更新每个用户行,因为他们在服务器中发送了一条消息,工作正常。但是,我想要使用数据库中包含的数据进行 'leaderboard' 排序。
这是我正在尝试的改进版本:
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 不是很了解,sorting/displaying 上的文档似乎对我不起作用。我只是想看看有多少用户以及他们有多少钱(用于迷你游戏):
if (msg === prefix + 'LEADERBOARD') {
sql.get(`SELECT username,money FROM userData ORDER BY username`).then(rows => {
message.channel.send(rows);
})
}
然而,这个returns:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): DiscordAPIError: Cannot send an empty message.
如有任何帮助或建议,我们将不胜感激!
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。
这个问题的答案似乎根本没有使用异步。我只是误用了 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);
})
})
}
从那以后,我找到了一种更好的方法来执行此操作,即输出一个包含 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}`
}
});
})
}