custom-dbs
Mysql

Mysql

index.js
// Connect to the database
 
const MySQL = require('mysql');
const sql = MySQL.createConnection({
    host: 'localhost',
    user: 'Your MySQL user',
    password: 'Your MySQL password',
    database: 'Your MySQL database name',
    charset: 'utf8mb4' // In order to save emojis correctly
});
sql.connect((err) => {
    if (err) {
        // Stop the process if we can't connect to the MySQL server
        throw new Error('Impossible to connect to MySQL server. Code: ' + err.code);
    } else {
        console.log('[SQL] Connected to the MySQL server! Connection ID: ' + sql.threadId);
    }
});
 
// Create giveaways table
sql.query(
    `
	CREATE TABLE IF NOT EXISTS \`giveaways\`
	(
		\`id\` INT(1) NOT NULL AUTO_INCREMENT,
		\`message_id\` VARCHAR(20) NOT NULL,
		\`data\` JSON NOT NULL,
		PRIMARY KEY (\`id\`)
	);
`,
    (err) => {
        if (err) console.error(err);
        console.log('[SQL] Created table `giveaways`');
    }
);
 
const { GiveawaysManager } = require('givify');
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
    // This function is called when the manager needs to get all giveaways which are stored in the database.
    async getAllGiveaways() {
        return new Promise((resolve, reject) => {
            sql.query('SELECT `data` FROM `giveaways`', (err, res) => {
                if (err) {
                    console.error(err);
                    return reject(err);
                }
                const giveaways = res.map((row) =>
                    JSON.parse(row.data, (_, v) =>
                        typeof v === 'string' && /BigInt\("(-?\d+)"\)/.test(v) ? eval(v) : v
                    )
                );
                resolve(giveaways);
            });
        });
    }
 
    // This function is called when a giveaway needs to be saved in the database.
    async saveGiveaway(messageId, giveawayData) {
        return new Promise((resolve, reject) => {
            sql.query(
                'INSERT INTO `giveaways` (`message_id`, `data`) VALUES (?,?)',
                [messageId, JSON.stringify(giveawayData, (_, v) => (typeof v === 'bigint' ? `BigInt("${v}")` : v))],
                (err, res) => {
                    if (err) {
                        console.error(err);
                        return reject(err);
                    }
                    resolve(true);
                }
            );
        });
    }
 
    // This function is called when a giveaway needs to be edited in the database.
    async editGiveaway(messageId, giveawayData) {
        return new Promise((resolve, reject) => {
            sql.query(
                'UPDATE `giveaways` SET `data` = ? WHERE `message_id` = ?',
                [JSON.stringify(giveawayData, (_, v) => (typeof v === 'bigint' ? `BigInt("${v}")` : v)), messageId],
                (err, res) => {
                    if (err) {
                        console.error(err);
                        return reject(err);
                    }
                    resolve(true);
                }
            );
        });
    }
 
    // This function is called when a giveaway needs to be deleted from the database.
    async deleteGiveaway(messageId) {
        return new Promise((resolve, reject) => {
            sql.query('DELETE FROM `giveaways` WHERE `message_id` = ?', messageId, (err, res) => {
                if (err) {
                    console.error(err);
                    return reject(err);
                }
                resolve(true);
            });
        });
    }
};
 
// Create a new instance of your new class
const manager = new GiveawayManagerWithOwnDatabase(client, {
    default: {
        botsCanWin: false,
        embedColor: '#FF0000',
        embedColorEnd: '#000000',
        reaction: '🎉'
    }
});
 
// We now have a giveawaysManager property to access the manager everywhere!
client.manager = manager;