База данных DiscordJS не хранит информацию в идеале - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь заставить бота Discord создать базу данных, которая является в основном пользовательской картой (строка для каждого пользователя и столбцы для идентификатора, псевдонима, URL-адреса аватара и т. Д.), Когда он получает команду! Getdata.

Я дошел до того, что база данных успешно принимает данные, в данном случае имя пользователя и идентификатор пользователя, но отображает все уникальные значения в двух столбцах в виде длинных значений, разделенных запятыми (т. Е. В столбце имени пользователя отображается 'user1, user2, user3' ).

Я уверен, что это так, но я действительно борюсь с реструктуризацией. Я бы хотел, чтобы он взял все данные из карты объектов (client.users или message.guild.members), но я не могу понять это.

Другой вариант, который я сейчас пытаюсь сделать, - создать строку для каждого пользователя, а затем заполнить значения, которые я хочу сохранить, но у меня ничего не получается быстро.

Я очень новичок в SQLite (и в этом отношении к node / DiscordJS / JS), поэтому любые советы очень ценятся.

index.js

const Discord = require('discord.js');
const client = new Discord.Client();
const sql = require('sqlite3');

let db = new sql.Database("users.sqlite", (err) => {
    if (err) {
        console.log('Error connecting to the database', err)
    } else {
        console.log('Database connected.')
    }
})

let token = process.env.CLIENT_TOKEN;
let prefix = process.env.PREFIX ;

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
    db.run(`CREATE TABLE IF NOT EXISTS users(username TEXT, id TEXT)`);
})

client.on('message', function(message) {

    if (!message.content.startsWith(prefix));

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'getdata') {
        let username = message.guild.members.map(m=>m.user.username);
        let userid = message.guild.members.map(m=>m.user.id);
        db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [`${username}`,`${userid}`]);
        return message.channel.send(`User database updated.`);
    }
});

client.login(token);

Если вас интересует форматирование или способ написания, ответ будет двояким:

  1. Я довольно новичок в этом
  2. Это был единственный способ получить значения в базе данных, чтобы они возвращали что-то отличное от нуля

Заранее спасибо,

1 Ответ

1 голос
/ 30 мая 2019

Прежде всего, добро пожаловать на сайт.

Я надеюсь, что смогу пролить немного света здесь, не вдаваясь в рефакторинг вашего кода или заставляя вас что-то менять.

Мне приходит в голову одна вещь: , почему вы храните массив вместо одного значения.

let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);

Вызов .map возвращает массив, а не одно значение.

Каждый пользователь, который выдает команду, является частью объекта сообщения. Если я правильно помню, вы бы хотели, чтобы это было что-то вроде ...

(упрощенная версия)

const { username, id } = message.member.user;
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [username, id]);
// ...

Документацию пользователя можно найти здесь

Edit:

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

db.serialize(() => {
  db.run('BEGIN TRANSACTION;');
  // execute inserts in transaction
  for (const m of message.guild.members) {
    db.run('INSERT OR REPLACE INTO users(username, id) VALUES(?,?);', [m.user.username, m.user.id]);
  }
  // commit all inserts :)
  db.run('COMMIT;')
});

message.channel.send('User database updated.');

Контрольная документация потока

Надеюсь, это укажет вам правильное направление:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...