reimpl roleme
This commit is contained in:
parent
88f070c078
commit
3eddd3ce2d
1 changed files with 225 additions and 0 deletions
225
src/modules/roleme.js
Normal file
225
src/modules/roleme.js
Normal file
|
@ -0,0 +1,225 @@
|
|||
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(
|
||||
"SELECT roles FROM roleme WHERE user = $key",
|
||||
{
|
||||
$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.";
|
||||
}
|
||||
|
||||
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 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",
|
||||
description: roles.map((r) => `<@&${r.id}>`).join("\n"),
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
}
|
||||
case "give": {
|
||||
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 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.";
|
||||
}
|
||||
|
||||
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 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.";
|
||||
}
|
||||
|
||||
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 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"};
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Reference in a new issue