2017-10-26 7 views
0

Ich bin ziemlich neu in discord.js und habe Probleme beim Anzeigen/Sortieren der Daten aus einer SQLite-Datenbank in einer Nachricht. Ich aktualisiere gerade jede Benutzerreihe, nachdem sie eine Nachricht auf dem Server gesendet haben, was gut funktioniert. Ich möchte jedoch eine Art "Leaderboard", das die in der Datenbank enthaltenen Daten verwendet.Discord.js SQLite-Zeilen in Nachricht anzeigen?

Hier ist eine verfeinerte Version von dem, was ich versuche:

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]); 
     }); 
    }); 
}); 

Befehle, die die Daten lesen und den Inhalt in einer Nachricht funktionieren, wie senden:

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

Aber ich Ich bin nicht sehr sachkundig in SQLite und die Dokumentation zum Sortieren/Anzeigen scheint nicht für mich zu arbeiten. Ich habe nur um zu sehen versucht, wie viele Benutzer insgesamt gibt es und wie viel Geld sie haben (für Mini-Games):

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

Dies ist jedoch zurück: UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): DiscordAPIError: Cannot send an empty message. Jede Hilfe oder Rat würden geschätzt!

Antwort

0

Ich habe da eine noch bessere Möglichkeit gefunden Dazu wird eine Einbettung mit der sortierten Anzahl von Einträgen in der SQLite-Datenbank ausgegeben. Dies ist, wie ich + Leaderboard bekam, um die Top 3 Benutzer in der Datenbank anzuzeigen, ohne separate Nachrichten zu senden.

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

Sie müssen async/warten verwenden.

+0

ich Missverständnis sein kann, was Sie meinen, aber wenn ich versuche, um die Abfrage zu erwarten, Knoten sagt: 'const data = sql.get await (Benutzername SELECT, Geld von Daten);' ' Syntax : Unerwarteter Bezeichner " – koubi

+0

await sql.get (' SELECT username, money FROM daten WHERE tableName = "$ {message.author.id}" '); Dies ist nicht discord.js Frage. Dies ist in der Regel Javascript und SQL-Frage. Und 'SyntaxErrors' löst meist von Typo aus. –

+0

versuchen Sie dies: const data = erwarten sql.get ('SELECT * FROM userData WHERE userId = "$ {message.author.id}"'); console.log (Daten); –

0

Die Antwort scheint Async überhaupt nicht zu verwenden. Ich habe einfach sqlite missbraucht und musste sql.get zu sql.all ändern (sql.get liest nur die erste Zeile, sql.all liest alle Zeilen, wenn Sie kein Limit setzen) und war in der Lage, die Ergebnisse einfach zu protokollieren.

Das Problem mit cannot send empty message war ein Ergebnis der Zwietracht nicht in der Lage, die Daten von mehreren Zeilen in einer Nachricht zu senden und musste mit neuen Zeilen wiederholt werden. Dafür habe ich 'rows.forEach' verwendet und es hat gut funktioniert. (Sieht viel besser in einem einbetten als mehrere Nachrichten senden)

Für alle anderen, die sich über diese Frage kommt, das ist die Lösung, die für mich gearbeitet:

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); 
     }) 
    }) 
}