Как проверить, существует ли строка в Better Sqlite3, и если да, вернуть. - Discord. js: лучше-Sqlite3 - PullRequest
0 голосов
/ 15 января 2020

Так что название на самом деле является основным вопросом, но у меня есть два технически. Во-первых, я в настоящее время кодирую диссон-бота, а также использую модуль узла 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);

    });


}

Так что, если кто-то делает

, он будет искать Клана sh Кланов базы данных, и посмотрите, существует ли этот тег (Работает), тогда, если он делает, он должен проверить, существует ли строка в базе данных (кажется, что часть сломана). Если строка с этим тегом существует, она стреляет в сообщение. Если нет, то он создает строку с этим тегом.

В настоящее время он просто берет нового человека, который выполнил команду, и перезаписывает данные старого игрока.

Второй вопрос: На самом деле я медленно распространяю команды в собственный файл и экспортирую их в основной файл. Однако, похоже, что когда команда включает 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));

        }

Если я помещаю это в отдельный файл (с каждым его битом (только объявления)), то по какой-то причине она возвращает ноль на всех смайлики Бот найдет labelName3, и все, но как только придет смайлик, похоже, он не сработает. Есть мысли?

...