2017-10-26 13 views
0

私はdiscord.jsについてかなり新しく、メッセージのsqliteデータベースからのデータの表示/ソートに問題があります。私は現在、サーバー上でメッセージを送信する際に各ユーザーの行を更新していますが、これは正常に動作しています。しかし、データベースに含まれているデータを使用して、「リーダーボード」が好きです。ここで 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}`) 
     }) 
    } 

しかし、I 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. 任意のヘルプやアドバイスをいただければ幸いです!

答えて

0

私は以来、より良い方法を見つけましたこれを行うには、sqliteデータベースにソートされたエントリ数の埋め込みを出力します。これは、別のメッセージを送信せずにデータベースの上位3人のユーザーを表示するために+ leaderboardを取得した方法です。

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

async/awaitを使用する必要があります。

+0

私はあなたが何を意味するか誤解することができるが、私は、クエリを待つしようとすると、ノードは言う: 'constのデータ=は、(データからユーザー名、お金をSELECT)sql.get待つ;' 'にSyntaxError :予期せぬ識別子 ' – koubi

+0

await sql.get(' SELECT username、money FROM data WHERE tableName = "$ {message.author.id}"); これはdiscord.jsの質問ではありません。これは一般的にjavascriptとSQLの質問です。また、SyntaxErrorsはtypoからトリガされます。 –

+0

これを試してください: const data = await sql.get( 'SELECT * FROM userData where userId = "$ {message.author.id}"'); console.log(data); –

0

これに対する答えは、非同期をまったく使用していないようです。私は単純にsqliteを誤用し、sql.getsql.allに変更する必要がありました(sql.getは最初の行のみを読み込み、sql.allは制限を設定しないとすべての行を読み込みます)。結果を簡単にコンソールログに記録できました。

cannot send empty messageの問題は、discordが1つのメッセージに複数行のデータを送信できず、改行を繰り返さなければならないという結果でした。このために、私は '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); 
     }) 
    }) 
} 
関連する問題