2023-04-06 01:18:53 +00:00
|
|
|
const Command = require("../lib/command.js");
|
|
|
|
|
|
|
|
const {selectionMessage} = require("../lib/utils.js");
|
|
|
|
|
|
|
|
hf.database.run(
|
|
|
|
"CREATE TABLE IF NOT EXISTS roleme (guild TEXT NOT NULL PRIMARY KEY, roles TEXT NOT NULL) WITHOUT ROWID"
|
|
|
|
);
|
|
|
|
|
|
|
|
function setRoles(id, roles) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
hf.database.run(
|
|
|
|
"REPLACE INTO roleme VALUES ($key,$value)",
|
|
|
|
{
|
|
|
|
$value: JSON.stringify(roles),
|
|
|
|
$key: id,
|
|
|
|
},
|
|
|
|
(err) => {
|
|
|
|
if (err == null) {
|
|
|
|
resolve(true);
|
|
|
|
} else {
|
|
|
|
reject(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function getRoles(id) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
hf.database.get(
|
2023-04-06 01:22:19 +00:00
|
|
|
"SELECT roles FROM roleme WHERE guild = $key",
|
2023-04-06 01:18:53 +00:00
|
|
|
{
|
|
|
|
$key: id,
|
|
|
|
},
|
|
|
|
(err, row) => {
|
|
|
|
if (err == null) {
|
|
|
|
resolve(JSON.parse(row?.roles ?? "[]"));
|
|
|
|
} else {
|
|
|
|
reject(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function lookupRole(msg, str, filter) {
|
|
|
|
let roles;
|
|
|
|
if (filter) {
|
|
|
|
roles = msg.channel.guild.roles.filter(filter).values();
|
|
|
|
} else {
|
|
|
|
roles = msg.channel.guild.roles.values();
|
|
|
|
}
|
|
|
|
|
|
|
|
const selection = [];
|
|
|
|
for (const role of roles) {
|
|
|
|
if (role.name.toLowerCase() == str.toLowerCase()) {
|
|
|
|
return role;
|
|
|
|
} else if (role.name.toLowerCase().indexOf(str.toLowerCase()) > -1) {
|
|
|
|
selection.push({
|
|
|
|
value: role,
|
|
|
|
key: role.id,
|
|
|
|
display: role.name,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
selection.sort((a, b) => a.display - b.display);
|
|
|
|
|
|
|
|
if (selection.length == 0) {
|
|
|
|
return "No results";
|
|
|
|
} else if (selection.length == 1) {
|
|
|
|
return selection[0].value;
|
|
|
|
} else {
|
|
|
|
selection.splice(20);
|
|
|
|
|
|
|
|
try {
|
|
|
|
return await selectionMessage(
|
|
|
|
msg,
|
|
|
|
"Multiple roles found, please pick from this list:",
|
|
|
|
selection
|
|
|
|
);
|
|
|
|
} catch (out) {
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const roleme = new Command("roleme");
|
|
|
|
roleme.category = "guildutility";
|
|
|
|
roleme.helpText = "Self assignable roles";
|
|
|
|
roleme.usage = "help";
|
|
|
|
roleme.callback = async function (msg, line, args) {
|
|
|
|
if (!msg.guildID) return "This command can only be used in guilds.";
|
|
|
|
|
|
|
|
const subcommand = args.shift();
|
|
|
|
const argStr = args.join(" ");
|
|
|
|
|
|
|
|
switch (subcommand) {
|
|
|
|
case "add": {
|
|
|
|
if (!msg.channel.permissionsOf(msg.author.id).has("manageRoles")) {
|
|
|
|
return "You do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
if (!msg.channel.permissionsOf(hf.bot.user.id).has("manageRoles")) {
|
|
|
|
return "I do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
|
|
|
|
const role = await lookupRole(msg, argStr);
|
|
|
|
if (role === "No results") return role;
|
|
|
|
|
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
if (roles.includes(role.id)) {
|
|
|
|
return "Role already assignable.";
|
|
|
|
} else {
|
|
|
|
roles.push(role.id);
|
|
|
|
await setRoles(msg.guildID, roles);
|
|
|
|
|
|
|
|
return `Added **${role.name}** to assignable roles.`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "delete": {
|
|
|
|
if (!msg.channel.permissionsOf(msg.author.id).has("manageRoles")) {
|
|
|
|
return "You do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
if (!msg.channel.permissionsOf(hf.bot.user.id).has("manageRoles")) {
|
|
|
|
return "I do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
|
2023-05-12 22:20:35 +00:00
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
|
|
|
|
const role = await lookupRole(msg, argStr, (role) =>
|
|
|
|
roles.includes(role.id)
|
|
|
|
);
|
2023-04-06 01:18:53 +00:00
|
|
|
if (role === "No results") return role;
|
|
|
|
|
|
|
|
if (!roles.includes(role.id)) {
|
|
|
|
return "Role not in assignable roles.";
|
|
|
|
} else {
|
|
|
|
await setRoles(
|
|
|
|
msg.guildID,
|
|
|
|
roles.filter((r) => r !== role.id)
|
|
|
|
);
|
|
|
|
|
|
|
|
return `Removed **${role.name}** from assignable roles.`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "list": {
|
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
|
|
|
|
if (roles.length === 0) {
|
|
|
|
return "No roles are assignable.";
|
|
|
|
} else {
|
|
|
|
return {
|
|
|
|
embeds: [
|
|
|
|
{
|
|
|
|
title: "Assignable Roles",
|
2023-04-06 01:26:50 +00:00
|
|
|
description: roles.map((r) => `<@&${r}>`).join("\n"),
|
2023-04-06 01:18:53 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "give": {
|
|
|
|
if (!msg.channel.permissionsOf(hf.bot.user.id).has("manageRoles")) {
|
|
|
|
return "I do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
|
2023-05-12 22:20:35 +00:00
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
|
|
|
|
const role = await lookupRole(msg, argStr, (role) =>
|
|
|
|
roles.includes(role.id)
|
|
|
|
);
|
2023-04-06 01:18:53 +00:00
|
|
|
if (role === "No results") return role;
|
|
|
|
|
|
|
|
if (!roles.includes(role.id)) {
|
|
|
|
return "Role not in assignable roles.";
|
|
|
|
} else if (msg.member.roles.includes(role.id)) {
|
|
|
|
return "You already have this role.";
|
|
|
|
} else {
|
|
|
|
await msg.member.addRole(role.id, "Self assigned role");
|
|
|
|
return {reaction: "\uD83D\uDC4D"};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "take": {
|
|
|
|
if (!msg.channel.permissionsOf(hf.bot.user.id).has("manageRoles")) {
|
|
|
|
return "I do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
|
2023-05-12 22:20:35 +00:00
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
|
|
|
|
const role = await lookupRole(
|
|
|
|
msg,
|
|
|
|
argStr,
|
|
|
|
(role) => roles.includes(role.id) && msg.member.roles.includes(role.id)
|
|
|
|
);
|
2023-04-06 01:18:53 +00:00
|
|
|
if (role === "No results") return role;
|
|
|
|
|
|
|
|
if (!roles.includes(role.id)) {
|
|
|
|
return "Role not in assignable roles.";
|
|
|
|
} else if (!msg.member.roles.includes(role.id)) {
|
|
|
|
return "You do not have this role.";
|
|
|
|
} else {
|
|
|
|
await msg.member.removeRole(role.id, "Self unassigned role");
|
|
|
|
return {reaction: "\uD83E\uDEF3"};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "help":
|
|
|
|
return `**__RoleMe Subcommands__**
|
|
|
|
\u2022 \`<role name>\` - Toggles assignment of a role.
|
|
|
|
\u2022 \`give\` - Assigns yourself a role.
|
|
|
|
\u2022 \`take\` - Unassigns yourself a role.
|
|
|
|
\u2022 \`list\` - Lists assignable roles.
|
|
|
|
|
|
|
|
**[Manage Roles]**
|
|
|
|
\u2022 \`add\` - Adds a new role to assignable roles.
|
|
|
|
\u2022 \`delete\` - Deletes a new role from assignable roles.`;
|
|
|
|
default: {
|
|
|
|
if (!msg.channel.permissionsOf(hf.bot.user.id).has("manageRoles")) {
|
|
|
|
return "I do not have `Manage Roles` permission.";
|
|
|
|
}
|
|
|
|
|
2023-05-12 22:20:35 +00:00
|
|
|
const roles = await getRoles(msg.guildID);
|
|
|
|
|
|
|
|
const role = await lookupRole(
|
|
|
|
msg,
|
|
|
|
(subcommand + " " + argStr).trim(),
|
|
|
|
(role) => roles.includes(role.id)
|
|
|
|
);
|
2023-04-06 01:18:53 +00:00
|
|
|
if (role === "No results") return role;
|
|
|
|
|
|
|
|
if (!roles.includes(role.id)) return "Role not in assignable roles.";
|
|
|
|
|
|
|
|
if (msg.member.roles.includes(role.id)) {
|
|
|
|
await msg.member.removeRole(role.id, "Self unassigned role");
|
|
|
|
return {reaction: "\uD83E\uDEF3"};
|
|
|
|
} else {
|
|
|
|
await msg.member.addRole(role.id, "Self assigned role");
|
|
|
|
return {reaction: "\uD83D\uDC4D"};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2023-04-06 01:21:03 +00:00
|
|
|
hf.registerCommand(roleme);
|