Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 19 additions & 13 deletions src/commands/helpers.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
const readSheet = require("./read_sheet");

const getMember = (client, userId) => {
async function getMember(client, userId) {
const guild = client.guilds.cache.get(process.env.GUILD_ID);
const member = guild.members.cache.get(userId);
const member = await guild.members.cache.get(userId);
return member;
};
}

const addRoleToUser = async (client, user_id, role_to_assign) => {
async function addRoleToUser(client, user_id, role_to_assign) {
if (!role_to_assign) {
return null;
}
const member = getMember(client, user_id);
const member = await getMember(client, user_id);
const role = member.guild.roles.cache.find((r) => r.name === role_to_assign);
member.roles.add(role);
return role_to_assign;
};
}

async function updateUserFromSheet(email, user_id, client) {
const members = await readSheet();
const members = global.sheetData;
const user = members.find((value) => value.email === email);

// If we could not find user
Expand All @@ -26,15 +24,23 @@ async function updateUserFromSheet(email, user_id, client) {
}

// Give user respective team role
const member = getMember(client, user_id);
const member = await getMember(client, user_id);
const role = member.guild.roles.cache.find((r) => r.name === user.status);
member.roles.add(role);
if (role) {
try {
await member.roles.add(role);
} catch (err) {
console.error(`Failed to set ${user.name}'s role:`, err);
}
} else {
console.error(`Could not find role '${user.status}' for ${user.name}.`);
}

// Set user's name
try {
member.setNickname(user.name);
await member.setNickname(user.name);
} catch (err) {
console.error(`Failed to set ${user.name}'s nickname: `, err);
console.error(`Failed to set ${user.name}'s nickname:`, err);
}

return user.status;
Expand Down
12 changes: 11 additions & 1 deletion src/commands/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,18 @@ const updateRoles = require("./update_roles");
const verify = require("./verify");
const whoami = require("./whoami");
const datalearn = require("./datalearn");
const updateAll = require("./update_all");
const updateSheet = require("./update_sheet");

const commands = [iam, updateRoles, verify, whoami, datalearn];
const commands = [
iam,
updateRoles,
verify,
whoami,
datalearn,
updateAll,
updateSheet,
];

module.exports = (client) => {
// Collate commands into Collection
Expand Down
10 changes: 6 additions & 4 deletions src/commands/read_sheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const API_KEY = process.env.GOOGLE_API_KEY;
const SHEET_ID = process.env.SHEET_ID;
const SHEET_GID = process.env.SHEET_GID;

const readSheet = async () => {
async function updateSheet() {
const doc = new GoogleSpreadsheet(SHEET_ID);
doc.useApiKey(API_KEY);
// https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet
Expand All @@ -16,7 +16,9 @@ const readSheet = async () => {
for (const row of rows) {
data.push({ name: row.Name, email: row.Email, status: row.Status });
}
return data;
};
global.sheetData = data;
}

module.exports = readSheet;
updateSheet();

module.exports = { updateSheet };
29 changes: 29 additions & 0 deletions src/commands/update_all.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
const db = require("../db");
const { updateUserFromSheet } = require("./helpers");

async function execute(interaction) {
const users = db.collection("users").find();
const ids_in_guild = (await interaction.guild.members.fetch()).map(
(member) => member.user.id
);

users.forEach(async (doc) => {
if (doc && ids_in_guild.includes(doc.user_id)) {
updateUserFromSheet(doc.email, doc.user_id, interaction.client);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should wrap this in try/catch or at least handle the status that's returned from updateUserFromSheet to return an error to the user.

Currently, if we get some issue in that function it will not return anything to the user.

}
});

interaction.reply({
content: "Updating users...",
ephemeral: true,
});
}

module.exports = {
data: new SlashCommandBuilder()
.setName("update-all")
.setDescription("update all users team roles and names (ADMIN ONLY!)")
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
execute,
};
18 changes: 18 additions & 0 deletions src/commands/update_sheet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
const { updateSheet } = require("./read_sheet");

async function execute(interaction) {
await updateSheet();
interaction.reply({
content: "Sheet updated",
ephemeral: true,
});
}

module.exports = {
data: new SlashCommandBuilder()
.setName("update-sheet")
.setDescription("update google sheet cached data (ADMIN ONLY!)")
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
execute,
};
4 changes: 3 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ const registerCommands = require("./commands");
const SERVER_ID = process.env.SERVER_ID;

// Create a new client instance
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
});

// When the client is ready, run this code (only once)
client.once("ready", async () => {
Expand Down