From ef72d62fde4752ac8499a6098098a0126663e65f Mon Sep 17 00:00:00 2001 From: Larsundso Date: Sat, 30 Dec 2023 00:40:26 +0100 Subject: [PATCH] [PATCH] members get all roles removed / replace mode is broken --- package.json | 2 +- prisma/schema.prisma | 4 +-- .../messageEvents/messageCreate/levelling.ts | 31 +++++++++++++++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index dfe70d02c..f74bf4acc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "type": "module", - "version": "2.0.20", + "version": "2.0.21", "scripts": { "start": "node --max-old-space-size=8192 ./dist/index.js", "build": "npx tsc", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fe551b121..ab657fc23 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -439,8 +439,8 @@ model leveling { wlroleid String[] @db.VarChar wluserid String[] @db.VarChar xppermsg Decimal @db.Decimal @default(25) - // true = stack, false = replace - rolemode Boolean @db.Boolean @default(true) + // false = stack, true = replace + rolemode Boolean @db.Boolean @default(false) lvlupmode LevelUpMode @default(silent) lvlupdeltimeout Decimal @db.Decimal @default(10) lvlupchannels String[] @db.VarChar diff --git a/src/Events/messageEvents/messageCreate/levelling.ts b/src/Events/messageEvents/messageCreate/levelling.ts index dd2c6db10..27412c4d8 100644 --- a/src/Events/messageEvents/messageCreate/levelling.ts +++ b/src/Events/messageEvents/messageCreate/levelling.ts @@ -37,6 +37,7 @@ const globalLevelling = async (msg: Discord.Message) => { }; const levelling = async (msg: Discord.Message) => { + await checkLevelRoles(msg); if (ch.cache.guildLevellingCD.has(msg.author.id)) return; const lastMessage = ch.cache.lastMessageGuild.get(msg.author.id); @@ -394,7 +395,7 @@ const roleAssign = async ( language: CT.Language, ) => { const roles = await ch.DataBase.levelingroles.findMany({ - where: { guildid: msg.guildId }, + where: { guildid: msg.guildId, level: { lte: newLevel } }, }); if (!roles.length) return; @@ -402,7 +403,7 @@ const roleAssign = async ( let remove: string[] = []; switch (rolemode) { - case true: { + case false: { roles .filter((r) => Number(r.level) <= newLevel) .forEach((r) => { @@ -419,6 +420,8 @@ const roleAssign = async ( break; } default: { + if (!roles.find((r) => Number(r.level) === newLevel)) return; + roles .filter((r) => Number(r.level) <= newLevel) .forEach((r) => { @@ -572,3 +575,27 @@ const send = async ( }, ); }; + +const checkLevelRoles = async (msg: Discord.Message) => { + const msgsFromUserLastHour = msg.channel.messages.cache.filter( + (m) => m.createdTimestamp > Date.now() - 3600000 && m.author.id === msg.author.id, + ); + if (msgsFromUserLastHour.size > 2) return; + + const level = await ch.DataBase.level.findUnique({ + where: { userid_guildid_type: { userid: msg.author.id, guildid: msg.guildId, type: 'guild' } }, + }); + if (!level) return; + + const settings = await ch.DataBase.leveling.findUnique({ + where: { guildid: msg.guildId, active: true }, + }); + if (!settings) return; + + const roles = await ch.DataBase.levelingroles.findMany({ + where: { guildid: msg.guildId, level: { lte: level.level } }, + }); + if (!roles.length) return; + + await roleAssign(msg, settings.rolemode, Number(level.level), await ch.getLanguage(msg.guildId)); +};