discord.js 如何在不提及已记录用户的情况下记录用户名以供将来使用?
Posted
技术标签:
【中文标题】discord.js 如何在不提及已记录用户的情况下记录用户名以供将来使用?【英文标题】:discord.js how do I record a username for future use without mentioning the recorded user? 【发布时间】:2018-05-08 19:34:23 【问题描述】:我正在尝试构建一个具有积分系统和积分最高用户排行榜的机器人。不幸的是,每次有人调用命令时,我都无法提及排行榜上的前 5 名玩家。我试过 msg.author.id 和 msg.author.username 似乎无法记录所需的信息。 .id 只记录一系列数字,以后可以使用 来提及用户,但 .username 始终未定义。我想知道我是否错误地使用了 .username 函数,或者是否有另一种方法可以做到这一点。我还尝试通过 ```` 在代码文本中使用提及功能,虽然它删除了提及,但它并没有显示用户的姓名,只显示数字。
sql.get(`SELECT * FROM scores WHERE userId ="$msg.author.id"`).then(row => // Level System
if (!row)
sql.run("INSERT INTO scores (userId, daily, points, level, glimmer, wr, rotw, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", [msg.author.id, 0, 0, 0, 500, 0, 0, msg.author.username]);
//msg.channel.send(`Welcome <@$msg.author.id>! Thank you for joining Playing Destiny Fast! You start off with 500 glimmer!`);
console.log("new player added to database");
else
sql.run(`UPDATE scores SET points = $row.points + 1 WHERE userId = $msg.author.id`);
let curLevel = Math.floor(0.02 * row.points + 1);
if (row.level > 100 || curLevel > 100) row.level = 100; msg.channel.send(`<@$msg.author.id> has already achieved the highest level! Thank you for your continued support!`)
if (curLevel > row.level)
row.level = curLevel;
sql.run(`UPDATE scores SET points = $row.points + 1, level = $row.level WHERE userId = $msg.author.id`);
msg.reply(`has reached level $curLevel!`);
).catch(() =>
console.error;
console.log("Table doesn't exist. Compiling...");
sql.run("CREATE TABLE IF NOT EXISTS scores (userId TEXT, daily INTEGER, points INTEGER, level INTEGER, glimmer INTEGER, wr INTEGER, rotw INTEGER, name TEXT)").then(() =>
sql.run("INSERT INTO scores (userId, daily, points, level, glimmer, wr, rotw, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", [msg.author.id, 0, 0, 0, 500, 0, 0, msg.author.username]);
msg.channel.send(`<@Programmer> I've encountered a critical error in the database. Please ensure that there is nothing wrong with my primary objective.`);
);
);
if (cat === "level")
sql.all(`SELECT userId, level FROM scores ORDER BY level DESC LIMIT $amount`).then(rows =>
tops.length = 0;
rows.forEach(function (row)
tops.push(`\n $row.name -- $row.level`);
);
embed = new Discord.RichEmbed()
.setAuthor(`Failsafe`)
.setColor(0x7EC0EE)
.setThumbnail("https://i.imgur.com/1XPQkeC.jpg")
.setDescription("---------------------------------------------------------------")
.setFooter("")
.addField(StringFormat(`Top $amount Users: $cat`, [NumShown]), "```" + tops.join('') + "```");
msg.channel.send(embed);
);
我正在使用 Microsoft Visual Studios 2017、Node.js 8x、discord.js、cheerio、sqlite、node-pre-gyp 和 sqlite 3 作为主要库。我在 Windows 10 上使用单个 sqlite 文件将收集的数据存储到只有行和列的单个表中。我没有收到任何错误消息,只是输出不正确。它当前输出用户的编号或“未定义”以在提及下拉语法中使用,但我想显示用户的名称而不提及它们。
【问题讨论】:
【参考方案1】:我没有选择名称列,而是选择了 userId 列。这意味着从未检查过 name 列并使结果未定义。 .id 非常适合存储特定用户,而 .username 最适合确定玩家的姓名。一切都正确使用,但我必须进行以下修改。
sql.all(`SELECT name, level FROM scores ORDER BY level DESC LIMIT $amount`).then(rows =>
【讨论】:
以上是关于discord.js 如何在不提及已记录用户的情况下记录用户名以供将来使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 discord.js 机器人在不包含前缀和命令名称的情况下重复用户的消息?
(discord.js) 如何提及对机器人消息做出反应的用户?