所以标题实际上是主要问题,但从技术上讲,我有两个。首先,我目前正在为它编写一个不和谐的机器人,并且我正在使用 Better-Sqlite3 节点模块。我已经制作了数据库,但命令有点不正常。命令是 !linkplayer(标签)。它通过在数据库中存储标签、discordid、discorduser 和其他一些标签来链接播放器。该命令本身与 if/else 语句链接,询问数据库中的行是否存在,如果存在,则发送消息并返回。如果没有,则在数据库中创建帐户。唯一的问题是,如果存在,它会跳过发送消息部分,然后继续创建它。我也不确定如何解决这个问题。
开启代码:
const sql = new SQLite('./accounts.sqlite');
const bot = new Discord.Client();
bot.once("ready", () => {
console.log(`Logged in as ${bot.user.tag}.`);
const table = sql.prepare("SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'accounts';").get();
if (!table['count(*)']) {
sql.prepare("CREATE TABLE accounts (tag TEXT PRIMARY KEY, id INTEGER, username TEXT, user TEXT, clan TEXT, clanTag TEXT);").run();
sql.prepare("CREATE UNIQUE INDEX idx_accounts_tag ON accounts (tag);").run();
sql.prepare("CREATE UNIQUE INDEX idx_accounts_id ON accounts (id);").run();
sql.pragma("synchronous = 1");
sql.pragma("journal_mode = wal");
}
bot.getScore = sql.prepare("SELECT * FROM accounts WHERE user = ? AND clanTag = ?");
bot.setScore = sql.prepare("INSERT OR REPLACE INTO accounts (tag, id, username, user, clan, clanTag) VALUES (@tag, @id, @username, @user, @clan, @clanTag);");
});
命令代码:
if (cmd === "linkplayer") {
if (!args[0]) return message.channel.send(`You must include the tag with the #!\nUsage: ${prefix}linkplayer #134613 (Town Hall Level)`);
if (!args[0].startsWith(`#`)) return message.channel.send('You must include # before the player tag.');
let playerTag = args[0];
client
.playerByTag(playerTag)
.then(player => {
let accounts = bot.getScore.get(playerTag, message.author.id);
if (accounts) {
if (!accounts.id === message.author.id) {
return message.channel.send(`The user ${accounts.username} already has linked with this account. If you feel this is incorrect, please DM a staff member for help. Provide proof.`);
}
} else if (!accounts) {
accounts = {
tag: player.tag,
id: message.author.id,
username: message.author.username,
user: player.name,
clan: player.clan.name,
clanTag: player.clan.tag,
}
}
bot.setScore.run(accounts);
});
}
所以如果有人这样做
链接播放器 #123456
它将搜索 Clash of Clans 数据库,并查看该标签是否存在(有效),如果存在,则应检查数据库中的行是否存在(似乎是损坏的部分)。如果该行存在带有该标签的行,则它会发送该消息。如果不是,那么它会创建带有该标签的行。
目前它只需要执行命令的新人并覆盖旧玩家信息。
第二个问题: 我其实一直在慢慢地把命令放到他们自己的文件中,然后将它们导出到主文件中。但是,似乎当命令涉及 emjoi 时:
if (!args[1]) {
client
.clanByTag(clanTag)
.then(clan => {
let labels = [clan.labels[0].name, clan.labels[1].name, clan.labels[2].name];
let labelName1 = labels[0].replace(" ", "_");
let labelName2 = labels[1].replace(" ", "_");
let labelName3 = labels[2].replace(" ", "_");
let emoji1 = bot.emojis.find(emoji => emoji.name === labelName1);
let emoji2 = bot.emojis.find(emoji => emoji.name === labelName2);
let emoji3 = bot.emojis.find(emoji => emoji.name === labelName3);
let def = clan.description;
def = def.replace('https://discord.gg/', '');
if (!emoji1) emoji1 = "";
if (!emoji2) emoji2 = "";
if (!emoji3) emoji3 = "";
let clanEmbed = new Discord.RichEmbed()
.setColor(`#312345`)
.setAuthor(clan.name)
.setTitle(`${emoji1} ${emoji2} ${emoji3}`)
.setDescription(def)
.addField(`Members:`, clan.members, true)
.addField(`Type:`, clan.type, true)
.addField(`Level:`, clan.clanLevel, true)
.addField(`Required Trophies:`, clan.requiredTrophies + `:trophy:`, true)
if (clan.location.name) clanEmbed.addField(`Location:`, clan.location.name, true)
.setTimestamp()
.setFooter(clan.tag)
message.channel.send(clanEmbed);
})
.catch(err => console.log(err));
}
如果我把它放到一个单独的文件中(其中的每一点(只是声明)),那么由于某种原因,它会在所有表情符号上返回 null。机器人会找到 labelName3 和所有内容,但是一旦表情符号进来,它似乎就不起作用了。有什么想法吗?