AeThex-Bot-Master/aethex-bot/utils/roleManager.js
sirpiglr ba613d2a7c Add missing commands and functionality to the bot
Restores and registers previously missing commands such as /verify, /profile, /leaderboard, and others, alongside their associated functionality and the role management utilities.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e72fc1b7-94bd-4d6c-801f-cbac2fae245c
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 9f9fe241-9650-4ed0-9631-2a4d2267f526
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3bdfff67-975a-46ad-9845-fbb6b4a4c4b5/e72fc1b7-94bd-4d6c-801f-cbac2fae245c/MSxeu36
Replit-Helium-Checkpoint-Created: true
2025-12-07 22:39:17 +00:00

137 lines
3.7 KiB
JavaScript

const { EmbedBuilder } = require("discord.js");
/**
* Assign Discord role based on user's arm and type
* @param {Guild} guild - Discord guild
* @param {string} discordId - Discord user ID
* @param {string} arm - User's primary arm (labs, gameforge, corp, foundation, devlink)
* @param {object} supabase - Supabase client
* @returns {Promise<boolean>} - Success status
*/
async function assignRoleByArm(guild, discordId, arm, supabase) {
try {
// Fetch guild member
const member = await guild.members.fetch(discordId);
if (!member) {
console.warn(`Member not found: ${discordId}`);
return false;
}
// Get role mapping from Supabase
const { data: mapping, error: mapError } = await supabase
.from("discord_role_mappings")
.select("discord_role")
.eq("arm", arm)
.eq("server_id", guild.id)
.maybeSingle();
if (mapError) {
console.error("Error fetching role mapping:", mapError);
return false;
}
if (!mapping) {
console.warn(
`No role mapping found for arm: ${arm} in server: ${guild.id}`,
);
return false;
}
// Find role by name or ID
let roleToAssign = guild.roles.cache.find(
(r) => r.id === mapping.discord_role || r.name === mapping.discord_role,
);
if (!roleToAssign) {
console.warn(`Role not found: ${mapping.discord_role}`);
return false;
}
// Remove old arm roles
const armRoles = member.roles.cache.filter((role) =>
["Labs", "GameForge", "Corp", "Foundation", "Dev-Link"].some((arm) =>
role.name.includes(arm),
),
);
for (const [, role] of armRoles) {
try {
if (role.id !== roleToAssign.id) {
await member.roles.remove(role);
}
} catch (e) {
console.warn(`Could not remove role ${role.name}: ${e.message}`);
}
}
// Assign new role
if (!member.roles.cache.has(roleToAssign.id)) {
await member.roles.add(roleToAssign);
console.log(
`✅ Assigned role ${roleToAssign.name} to ${member.user.tag}`,
);
return true;
}
return true;
} catch (error) {
console.error("Error assigning role:", error);
return false;
}
}
/**
* Get user's primary arm from Supabase
* @param {string} discordId - Discord user ID
* @param {object} supabase - Supabase client
* @returns {Promise<string>} - Primary arm (labs, gameforge, corp, foundation, devlink)
*/
async function getUserArm(discordId, supabase) {
try {
const { data: link, error } = await supabase
.from("discord_links")
.select("primary_arm")
.eq("discord_id", discordId)
.maybeSingle();
if (error) {
console.error("Error fetching user arm:", error);
return null;
}
return link?.primary_arm || null;
} catch (error) {
console.error("Error getting user arm:", error);
return null;
}
}
/**
* Sync roles for a user across all guilds
* @param {Client} client - Discord client
* @param {string} discordId - Discord user ID
* @param {string} arm - Primary arm
* @param {object} supabase - Supabase client
*/
async function syncRolesAcrossGuilds(client, discordId, arm, supabase) {
try {
for (const [, guild] of client.guilds.cache) {
try {
const member = await guild.members.fetch(discordId);
if (member) {
await assignRoleByArm(guild, discordId, arm, supabase);
}
} catch (e) {
console.warn(`Could not sync roles in guild ${guild.id}: ${e.message}`);
}
}
} catch (error) {
console.error("Error syncing roles across guilds:", error);
}
}
module.exports = {
assignRoleByArm,
getUserArm,
syncRolesAcrossGuilds,
};