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