Linked Questions

Popular Questions

How do i rewrite my Leveling System correctly

Asked by At

I am having this issue with Discord.JS v14. I have been working to update my Discord Bot to use the more modern Slash Commands, and i tried to implement the existing Leveling System into the new version. The issue is when i use the existing code, it keeps failing to actually work.

const config = require('../../../config/config');
const db = require('./cfgdb');
const lvldb = require('./lvldb');

module.exports = async (client, message) => {
  const guildEnable = getEnable(message.guild.id);
  if (guildEnable.leveling !== 1) return;
  const guildSettings = getGuildSettings(message.guild.id);
  if (!guildSettings) return;

  if (message.author.bot) return;

  const userId = message.author.id;
  const guildId = message.guild.id;
  const user = await client.users.fetch(userId);
  const username = user.username;

  const member = message.member;
  const booster = guildSettings.boosterrole;

  let xp;

  if(member.roles.cache.has(booster)) {
    xp = Math.floor(Math.random() * (50 - 35 + 1) + 35);
  } else {
    xp = Math.floor(Math.random() * (20 - 15 + 1) + 15);
  }

  const row = lvldb.prepare('SELECT * FROM level WHERE userid = ? AND guildid = ?').get(userId, guildId);

  if (!row || !('level' in row)) {
    lvldb.prepare('INSERT INTO level (userid, guildid, username, xp, totalxp) VALUES (?, ?, ?, ?, ?)').run(userId, guildId, username, xp, xp);
  } else {
    lvldb.prepare('UPDATE level SET xp = ?, totalxp = ? WHERE userid = ? AND guildid = ?').run(row.xp + xp, row.totalxp + xp, userId, guildId);
  }

  const updatedRow = lvldb.prepare('SELECT * FROM level WHERE userid = ? AND guildid = ?').get(userId, guildId);
  const xpNeededForCurrentLevel = 5 * (updatedRow.level ** 2 + 50 * updatedRow.level) + 100;
  const xpForPreviousLevels = updatedRow.level > 1 ? (5 * ((updatedRow.level - 1) ** 2 + 50 * (updatedRow.level - 1)) + 100) : 0;
  const currentLevelProgress = updatedRow.xp - xpForPreviousLevels;
  const totalXP = xpForPreviousLevels + currentLevelProgress;

  if ('level' in updatedRow && updatedRow.xp >= xpNeededForCurrentLevel) {
    lvldb.prepare('UPDATE level SET level = ?, xp = ?, totalxp = ? WHERE userid = ? AND guildid = ?').run(updatedRow.level + 1, updatedRow.xp - xpNeededForCurrentLevel, totalXP, userId, guildId);
    const level = updatedRow.level + 1;
    const channel = client.channels.cache.get(guildSettings.levelup);
    if(!channel) return;
    const message = await channel.send(`Congrats ${user}, you just reached level ${level}!`);

    function getRoleForLevel(guildId, levels) {
      const stmt = lvldb.prepare(`
        SELECT role_id FROM lvlroles 
        WHERE guild_id = ? AND levels = ?;
      `);
      const result = stmt.get(guildId, levels);
      return result ? result.role_id : null;
    }
    
    if (level) {
      const roleId = getRoleForLevel(message.guild.id, level);
      if (roleId) {
        const role = message.guild.roles.cache.get(roleId);
        if (role) {
          const member = message.guild.members.cache.get(userId);
          member.roles.add(role);
        }
      }
    }
  }
};

function getEnable(guildId) {
  const stmt = db.prepare('SELECT * FROM cfg_enable WHERE guild_id = ?');
  const row = stmt.get(guildId);
  return row;
}

function getGuildSettings(guildId) {
  const stmt = db.prepare('SELECT * FROM cfg_chid WHERE guild_id = ?');
  const row = stmt.get(guildId);
  return row;
}

The error i am getting is this:

D:\Development Projects\04 - Archived Bot Projects\SystemdBot-Beta\src\functions\database\level.js:6
  const guildEnable = getEnable(message.guild.id);
                                        ^

TypeError: Cannot read properties of undefined (reading 'guild')
    at module.exports (D:\Development Projects\04 - Archived Bot Projects\SystemdBot-Beta\src\functions\database\level.js:6:41)
    at Object.<anonymous> (D:\Development Projects\04 - Archived Bot Projects\SystemdBot-Beta\src\bot.js:18:46)
    at Module._compile (node:internal/modules/cjs/loader:1275:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1329:10)
    at Module.load (node:internal/modules/cjs/loader:1133:32)
    at Module._load (node:internal/modules/cjs/loader:972:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47

Node.js v19.9.0

Related Questions