diff --git a/.env b/.env index fb60787..a1c625e 100644 --- a/.env +++ b/.env @@ -3,3 +3,7 @@ VERIFIED_ROLE= MINIMUM_MESSAGES=30 MESSAGE_COOLDOWN=3 + +SUPPORTER_ROLE= +DONATOR_ROLE= +BOOSTER_ROLE= diff --git a/src/discord/client.ts b/src/discord/client.ts index dfdd961..4b9003b 100644 --- a/src/discord/client.ts +++ b/src/discord/client.ts @@ -5,7 +5,7 @@ import { string } from "../util/env"; log.info("Creating Discord client..."); export const client = new Client({ - "intents": [GatewayIntentBits.MessageContent, GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages] + "intents": [GatewayIntentBits.MessageContent, GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMembers] }); const success = !!(await client.login(string("DISCORD_TOKEN"))); diff --git a/src/discord/events/checkSupporter.ts b/src/discord/events/checkSupporter.ts new file mode 100644 index 0000000..d0b5d0f --- /dev/null +++ b/src/discord/events/checkSupporter.ts @@ -0,0 +1,46 @@ +import { Events } from "discord.js"; +import { client } from "../client"; +import { log } from "../../log"; +import { string } from "../../util/env"; + +const roles = { + "supporter": string("SUPPORTER_ROLE"), + "donator": string("DONATOR_ROLE"), + "booster": string("BOOSTER_ROLE") +}; + +client.on(Events.GuildMemberUpdate, (old, current) => { + const hadSupporter = old.roles.cache.has(roles.supporter); + const hasSupporter = current.roles.cache.has(roles.supporter); + if (hadSupporter !== hasSupporter) { + return; + } + + const hadDonator = old.roles.cache.has(roles.donator); + const hasDonator = current.roles.cache.has(roles.donator); + + const hadBooster = old.roles.cache.has(roles.booster); + const hasBooster = current.roles.cache.has(roles.booster); + + log.debug(`Roles updated for ${current.displayName}.`); + log.debug(`Donator role: ${hadDonator} -> ${hasDonator}`); + log.debug(`Booster role: ${hadBooster} -> ${hasBooster}`); + + if (hadDonator === hasDonator && hadBooster === hasBooster) { + log.debug("Nothing changed! Not modifying roles."); + return; + } + + if ((!hadDonator && hasDonator) || (!hadBooster && hasBooster)) { + log.debug("Adding the supporter role!"); + + current.roles.add(roles.supporter); + return; + } + + if (hadBooster && !hasBooster) { + log.debug("Removing the supporter role!"); + + current.roles.remove(roles.supporter); + } +}); diff --git a/src/discord/events/onMessage.ts b/src/discord/events/checkVerified.ts similarity index 96% rename from src/discord/events/onMessage.ts rename to src/discord/events/checkVerified.ts index 2d644db..c0aee39 100644 --- a/src/discord/events/onMessage.ts +++ b/src/discord/events/checkVerified.ts @@ -8,6 +8,7 @@ import { log } from "../../log"; const roleId = string("VERIFIED_ROLE"); const minimumMessages = number("MINIMUM_MESSAGES"); +// TODO: Abstract this so it can be used for other roles let roleValid = false; for (const [_, guild] of client.guilds.cache) { const roles = await guild.roles.fetch(); diff --git a/src/discord/events/register.ts b/src/discord/events/register.ts index bfc7882..23b8314 100644 --- a/src/discord/events/register.ts +++ b/src/discord/events/register.ts @@ -5,6 +5,7 @@ import { log } from "../../log"; const self = basename(__filename); const path = resolve(__dirname); +// TODO: Abstract this so it can be used for other listeners (commands) export async function register() { log.info("Registering all Discord listeners...");