diff --git a/commands/message/info/role.js b/commands/message/info/role.js new file mode 100644 index 0000000..5ad061b --- /dev/null +++ b/commands/message/info/role.js @@ -0,0 +1,156 @@ +const { paginator } = require('#client'); +const { PERMISSION_CATEGORIES, PERMISSIONS_TEXT } = require('#permissions'); + +const { createEmbed, page, formatPaginationEmbeds } = require("#utils/embed"); +const { guildFeaturesField } = require("#utils/fields"); +const { icon, highlight, timestamp, codeblock, iconPill, smallPill, pill } = require("#utils/markdown"); +const { editOrReply } = require("#utils/message"); + +// TODO: Turn this into a general purpose permissions constant +const { Permissions } = require("detritus-client/lib/constants"); +const { PermissionTools } = require('detritus-client/lib/utils'); + +// TODO: Move this to a utility module +function toCodePoint(unicodeSurrogates, sep) { + var + r = [], + c = 0, + p = 0, + i = 0; + while (i < unicodeSurrogates.length) { + c = unicodeSurrogates.charCodeAt(i++); + if (p) { + r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16)); + p = 0; + } else if (0xD800 <= c && c <= 0xDBFF) { + p = c; + } else { + r.push(c.toString(16)); + } + } + return r.join(sep || '-'); +} + +const DEFAULT_ROLE_COLOR = "99AAB5" + +const PERMISSION_CATEGORY = [ + [ + { + label: "General Server Permissions", + icon: icon("shield"), + permissions: PERMISSION_CATEGORIES.GENERAL_SERVER + } + ], + [ + { + label: "Membership Permissions", + icon: icon("mod"), + permissions: PERMISSION_CATEGORIES.MEMBERSHIP_PERMISSIONS + } + ], + [ + { + label: "Text Channel Permissions", + icon: icon("shield"), + permissions: PERMISSION_CATEGORIES.TEXT_CHANNEL_PERMISSIONS + } + ], + [ + { + label: "Voice Channel Permissions", + icon: icon("shield"), + permissions: PERMISSION_CATEGORIES.VOICE_CHANNEL_PERMISSIONS + }, + { + label: "Apps Permissions", + icon: icon("robot"), + permissions: PERMISSION_CATEGORIES.APPS_PERMISSIONS + } + ], + [ + { + label: "Events Permissions", + icon: icon("calendar"), + permissions: PERMISSION_CATEGORIES.EVENTS_PERMISSIONS + }, + { + label: "Stage Channel Permissions", + icon: icon("calendar"), + permissions: PERMISSION_CATEGORIES.STAGE_CHANNEL_PERMISSIONS + }, + { + label: "Advanced Permissions", + icon: icon("calendar"), + permissions: PERMISSION_CATEGORIES.ADVANCED_PERMISSIONS + } + ] +] + +module.exports = { + name: 'role', + label: 'query', + aliases: ['roleinfo'], + metadata: { + description: 'Displays information about a role in the server.', + description_short: 'Information about roles', + category: 'info', + usage: 'role ' + }, + permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.READ_MESSAGE_HISTORY], + run: async (context, args) => { + let r = context.guild.roles.filter((r)=>r.name.toLowerCase().includes(args.query.toLowerCase()) || r.id == args.query)[0] + + if(!r) return await editOrReply(context, createEmbed("warning", context, "No roles matched your query.")) + + let pages = []; + + let rolePage = createEmbed("default", context, { + author: { + name: r.name + }, + description: `${smallPill("ID ")} ${pill(r.id)}\n${smallPill("Position ")} ${pill(`${r.position}/${context.guild.roles.length}`)}\n${smallPill("Hoisted ")} ${pill(`${r.hoist}`)}` + }) + + if(r.color === 0) rolePage.author.iconUrl = `https://lh3.googleusercontent.com/akBt-2Rz3efGuxAnOoSJbGuaqxZuRAI7ZUYKBgYZLT4vsk34qVWoAm3o6--RxupzZpayLSRsxO1LCwBECyBT_giQ3xhLMR03z7xngvm4m9ZgQ2Gya1i-3Q=w256-h256-bc0x0055aa-fcrop64=1,0000000000010001-rj-b36-c0x${DEFAULT_ROLE_COLOR}` + else { + rolePage.description += `\n${smallPill("Color ")} ${pill("#" + r.color.toString(16))}` + rolePage.author.iconUrl = `https://lh3.googleusercontent.com/akBt-2Rz3efGuxAnOoSJbGuaqxZuRAI7ZUYKBgYZLT4vsk34qVWoAm3o6--RxupzZpayLSRsxO1LCwBECyBT_giQ3xhLMR03z7xngvm4m9ZgQ2Gya1i-3Q=w256-h256-bc0x0055aa-fcrop64=1,0000000000010001-rj-b36-c0x${r.color.toString(16)}` + } + + if(r.unicode_emoji){ + rolePage.thumbnail = { + url: `https://raw.githubusercontent.com/jdecked/twemoji/main/assets/72x72/${toCodePoint(r.unicode_emoji)}.png` + } + } else if(r.icon){ + rolePage.thumbnail = { + url: r.iconUrl + } + } + + let permSection; + // Render Permissions + for(const c of PERMISSION_CATEGORY){ + permSection = []; + for(const section of c){ + let sectionRender = `${iconPill(section.icon, section.label)}\n` + let permissionsRender = [] + for(const p of section.permissions){ + permissionsRender.push(`${PermissionTools.checkPermissions(r.permissions, p) ? icon("failiure_simple") : icon("success_simple")} ${PERMISSIONS_TEXT[p]}`) + } + permSection.push(sectionRender + permissionsRender.join("\n")) + } + + let newPage = structuredClone(rolePage) + newPage.description += "\n\n" + permSection.join('\n\n'); + + pages.push(page(newPage)) + } + + + + await paginator.createPaginator({ + context, + pages: formatPaginationEmbeds(pages) + }); + }, +}; \ No newline at end of file diff --git a/labscore/client.js b/labscore/client.js index 5a8d8f8..2773508 100644 --- a/labscore/client.js +++ b/labscore/client.js @@ -1,7 +1,9 @@ const { ClusterClient, CommandClient, InteractionCommandClient } = require('detritus-client'); const { ActivityTypes, PresenceStatuses, GatewayIntents, Permissions, ClientEvents } = require('detritus-client/lib/constants'); -const { PERMISSIONS_TEXT, DEFAULT_BOT_NAME, DEFAULT_PREFIXES } = require('#constants'); +const { DEFAULT_BOT_NAME, DEFAULT_PREFIXES } = require('#constants'); +const { PERMISSIONS_TEXT } = require('#permissions'); + const Paginator = require('./paginator').PaginatorCluster const cluster = new ClusterClient("", { diff --git a/labscore/constants.js b/labscore/constants.js index 15af1f2..05d9c34 100644 --- a/labscore/constants.js +++ b/labscore/constants.js @@ -1063,43 +1063,6 @@ module.exports.REXTESTER_COMPILER_ARGS = Object.freeze({ "11": "-o a.out source_file.hs" }) -const { Permissions } = require("detritus-client/lib/constants") - -module.exports.PERMISSIONS_TEXT = Object.freeze({ - [Permissions.ADD_REACTIONS]: "Add Reactions", - [Permissions.ADMINISTRATOR]: "Administrator", - [Permissions.ATTACH_FILES]: "Attach Files", - [Permissions.BAN_MEMBERS]: "Ban Members", - [Permissions.CHANGE_NICKNAME]: "Change Nickname", - [Permissions.CHANGE_NICKNAMES]: "Change Nicknames", - [Permissions.CONNECT]: "Connect", - [Permissions.CREATE_INSTANT_INVITE]: "Create Invites", - [Permissions.DEAFEN_MEMBERS]: "Deafen Members", - [Permissions.EMBED_LINKS]: "Embed Links", - [Permissions.KICK_MEMBERS]: "Kick Members", - [Permissions.MANAGE_CHANNELS]: "Manage Channels", - [Permissions.MANAGE_EMOJIS]: "Manage Emojis", - [Permissions.MANAGE_GUILD]: "Manage Guild", - [Permissions.MANAGE_MESSAGES]: "Manage Messages", - [Permissions.MANAGE_ROLES]: "Manage Roles", - [Permissions.MANAGE_WEBHOOKS]: "Manage Webhooks", - [Permissions.MENTION_EVERYONE]: "Mention Everyone", - [Permissions.MOVE_MEMBERS]: "Move Members", - [Permissions.MUTE_MEMBERS]: "Mute Members", - [Permissions.NONE]: "None", - [Permissions.PRIORITY_SPEAKER]: "Priority Speaker", - [Permissions.READ_MESSAGE_HISTORY]: "Read Message History", - [Permissions.SEND_MESSAGES]: "Send Messages", - [Permissions.SEND_TTS_MESSAGES]: "Text-To-Speech", - [Permissions.SPEAK]: "Speak", - [Permissions.STREAM]: "Go Live", - [Permissions.USE_EXTERNAL_EMOJIS]: "Use External Emojis", - [Permissions.USE_VAD]: "Voice Auto Detect", - [Permissions.VIEW_AUDIT_LOG]: "View Audit Logs", - [Permissions.VIEW_CHANNEL]: "View Channel", - [Permissions.VIEW_GUILD_ANALYTICS]: "View Server Insights" -}); - module.exports.YOUTUBE_CATEGORIES = { "music": "10", "animals": "15", diff --git a/labscore/permissions.js b/labscore/permissions.js new file mode 100644 index 0000000..8de370a --- /dev/null +++ b/labscore/permissions.js @@ -0,0 +1,126 @@ + +const { Permissions } = require("detritus-client/lib/constants") + +module.exports.PERMISSIONS_TEXT = Object.freeze({ + [Permissions.ADD_REACTIONS]: "Add Reactions", + [Permissions.ADMINISTRATOR]: "Administrator", + [Permissions.ATTACH_FILES]: "Attach Files", + [Permissions.BAN_MEMBERS]: "Ban Members", + [Permissions.CHANGE_NICKNAME]: "Change Nickname", + [Permissions.CHANGE_NICKNAMES]: "Manage Nicknames", + [Permissions.CONNECT]: "Connect", + [Permissions.CREATE_INSTANT_INVITE]: "Create Invites", + [Permissions.DEAFEN_MEMBERS]: "Deafen Members", + [Permissions.EMBED_LINKS]: "Embed Links", + [Permissions.KICK_MEMBERS]: "Kick Members", + [Permissions.MANAGE_CHANNELS]: "Manage Channels", + [1 << 30]: "Manage Expressions", // + [Permissions.MANAGE_GUILD]: "Manage Server", + [Permissions.MANAGE_MESSAGES]: "Manage Messages", + [Permissions.MANAGE_ROLES]: "Manage Roles", + [Permissions.MANAGE_WEBHOOKS]: "Manage Webhooks", + [Permissions.MENTION_EVERYONE]: "Mention Everyone", + [Permissions.MOVE_MEMBERS]: "Move Members", + [Permissions.MUTE_MEMBERS]: "Mute Members", + [Permissions.NONE]: "None", + [Permissions.PRIORITY_SPEAKER]: "Priority Speaker", + [Permissions.READ_MESSAGE_HISTORY]: "Read Message History", + [Permissions.SEND_MESSAGES]: "Send Messages", + [Permissions.SEND_TTS_MESSAGES]: "Text-To-Speech", + [Permissions.SPEAK]: "Speak", + [Permissions.STREAM]: "Video", + [Permissions.USE_EXTERNAL_EMOJIS]: "Use External Emojis", + [Permissions.USE_VAD]: "Voice Auto Detect", + [Permissions.VIEW_AUDIT_LOG]: "View Audit Logs", + [Permissions.VIEW_CHANNEL]: "View Channel", + [Permissions.VIEW_GUILD_ANALYTICS]: "View Server Insights", + [Permissions.MANAGE_EVENTS]: "Manage Events", + [Permissions.MANAGE_THREADS]: "Manage Threads", + [Permissions.REQUEST_TO_SPEAK]: "Request to Speak", + [Permissions.SEND_MESSAGES_IN_THREADS]: "Send Messages in Threads", + [Permissions.USE_APPLICATION_COMMANDS]: "Use Application Commands", + [Permissions.USE_EXTERNAL_STICKERS]: "Use External Stickers", + [Permissions.USE_PRIVATE_THREADS]: "Create Private Threads", + [Permissions.USE_PUBLIC_THREADS]: "Create Public Threads", + [1 << 39]: "Use Activities", + [1 << 40]: "Time out members", + [1 << 41]: "View Server Subscription Insights", + [1 << 42]: "Use Soundboard", + [1 << 43]: "Create Expressions", + [1 << 44]: "Create Events", + [1 << 45]: "Use External Sounds", + [1 << 46]: "Send Voice Messages", + [1 << 47]: "Use Clyde AI", + [1 << 48]: "Set Voice Channel Status", + [1 << 49]: "Create Polls", + [1 << 50]: "Use External Apps" +}); + +module.exports.PERMISSION_CATEGORIES = Object.freeze({ + GENERAL_SERVER: [ + Permissions.VIEW_CHANNEL, + Permissions.MANAGE_CHANNELS, + Permissions.MANAGE_ROLES, + Permissions.MANAGE_EMOJIS, + 1 << 43, // Create expressions + Permissions.VIEW_AUDIT_LOG, + Permissions.VIEW_GUILD_ANALYTICS, + 1 << 41, // View subscription analytics + Permissions.MANAGE_WEBHOOKS, + Permissions.MANAGE_GUILD + ], + MEMBERSHIP_PERMISSIONS: [ + Permissions.CREATE_INSTANT_INVITE, + Permissions.CHANGE_NICKNAME, + Permissions.CHANGE_NICKNAMES, + Permissions.KICK_MEMBERS, + Permissions.BAN_MEMBERS, + 1 << 40 // Time out members + ], + TEXT_CHANNEL_PERMISSIONS: [ + Permissions.SEND_MESSAGES, + Permissions.SEND_MESSAGES_IN_THREADS, + Permissions.USE_PUBLIC_THREADS, + Permissions.USE_PRIVATE_THREADS, + Permissions.EMBED_LINKS, + Permissions.ATTACH_FILES, + Permissions.ADD_REACTIONS, + Permissions.USE_EXTERNAL_EMOJIS, + Permissions.USE_EXTERNAL_STICKERS, + Permissions.MENTION_EVERYONE, + Permissions.MANAGE_MESSAGES, + Permissions.MANAGE_THREADS, + Permissions.READ_MESSAGE_HISTORY, + Permissions.SEND_TTS_MESSAGES, + 1 << 46, // Send Voice Messages + 1 << 49 // Create Polls + ], + VOICE_CHANNEL_PERMISSIONS: [ + Permissions.CONNECT, + Permissions.SPEAK, + Permissions.STREAM, + 1 << 42, // Use soundboard + 1 << 45, // Use external sounds + Permissions.USE_VAD, + Permissions.PRIORITY_SPEAKER, + Permissions.MUTE_MEMBERS, + Permissions.DEAFEN_MEMBERS, + Permissions.MOVE_MEMBERS, + 1 << 48 // Set voice channel status + ], + APPS_PERMISSIONS: [ + Permissions.USE_APPLICATION_COMMANDS, + 1 << 39, // Use Activities + 1 << 50 // Use External Apps + ], + STAGE_CHANNEL_PERMISSIONS: [ + Permissions.REQUEST_TO_SPEAK + ], + EVENTS_PERMISSIONS: [ + 1 << 44, // Create Events + Permissions.MANAGE_EVENTS + ], + ADVANCED_PERMISSIONS: [ + Permissions.ADMINISTRATOR + ] +}) \ No newline at end of file diff --git a/package.json b/package.json index 0ecb866..37a100c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "#constants": "./labscore/constants.js", "#logging": "./labscore/logging.js", "#obelisk": "./labscore/api/obelisk/index.js", + "#permissions": "./labscore/permissions.js", "#utils/*": "./labscore/utils/*.js" } }