/** * @name PermissionsViewer * @version 0.2.2 * @authorLink https://twitter.com/IAmZerebos * @website https://github.com/rauenzi/BetterDiscordAddons/tree/master/Plugins/PermissionsViewer * @source https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/PermissionsViewer/PermissionsViewer.plugin.js * @updateUrl https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/PermissionsViewer/PermissionsViewer.plugin.js */ /*@cc_on @if (@_jscript) // Offer to self-install for clueless users that try to run this directly. var shell = WScript.CreateObject("WScript.Shell"); var fs = new ActiveXObject("Scripting.FileSystemObject"); var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); var pathSelf = WScript.ScriptFullName; // Put the user at ease by addressing them in the first person shell.Popup("It looks like you've mistakenly tried to run me directly. \n(Don't do that!)", 0, "I'm a plugin for BetterDiscord", 0x30); if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); } else if (!fs.FolderExists(pathPlugins)) { shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); // Show the user where to put plugins in the future shell.Exec("explorer " + pathPlugins); shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); } WScript.Quit(); @else@*/ module.exports = (() => { const config = {info:{name:"PermissionsViewer",authors:[{name:"Zerebos",discord_id:"249746236008169473",github_username:"rauenzi",twitter_username:"ZackRauen"}],version:"0.2.2",description:"Allows you to view a user's permissions. Thanks to Noodlebox for the idea!",github:"https://github.com/rauenzi/BetterDiscordAddons/tree/master/Plugins/PermissionsViewer",github_raw:"https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/PermissionsViewer/PermissionsViewer.plugin.js"},changelog:[{title:"Fixes",type:"fixed",items:["Can select other roles in the modal."]}],defaultConfig:[{type:"switch",id:"contextMenus",name:"Context Menus",value:true},{type:"switch",id:"popouts",name:"Popouts",value:true},{type:"radio",id:"displayMode",name:"Modal Display Mode",value:"compact",options:[{name:"Cozy",value:"cozy"},{name:"Compact",value:"compact"}]}],strings:{es:{contextMenuLabel:"Permisos",popoutLabel:"Permisos",modal:{header:"Permisos de ${name}",rolesLabel:"Roles",permissionsLabel:"Permisos",owner:"@propietario"},settings:{popouts:{name:"Mostrar en Popouts",note:"Mostrar los permisos de usuario en popouts como los roles."},contextMenus:{name:"Botón de menú contextual",note:"Añadir un botón para ver permisos en los menús contextuales."}}},pt:{contextMenuLabel:"Permissões",popoutLabel:"Permissões",modal:{header:"Permissões de ${name}",rolesLabel:"Cargos",permissionsLabel:"Permissões",owner:"@dono"},settings:{popouts:{name:"Mostrar em Popouts",note:"Mostrar as permissões em popouts como os cargos."},contextMenus:{name:"Botão do menu de contexto",note:"Adicionar um botão parar ver permissões ao menu de contexto."}}},de:{contextMenuLabel:"Berechtigungen",popoutLabel:"Berechtigungen",modal:{header:"${name}s Berechtigungen",rolesLabel:"Rollen",permissionsLabel:"Berechtigungen",owner:"@eigentümer"},settings:{popouts:{name:"In Popouts anzeigen",note:"Zeigt die Gesamtberechtigungen eines Benutzers in seinem Popup ähnlich den Rollen an."},contextMenus:{name:"Kontextmenü-Schaltfläche",note:"Fügt eine Schaltfläche hinzu, um die Berechtigungen mithilfe von Kontextmenüs anzuzeigen."}}},en:{contextMenuLabel:"Permissions",popoutLabel:"Permissions",modal:{header:"${name}'s Permissions",rolesLabel:"Roles",permissionsLabel:"Permissions",owner:"@owner"},settings:{popouts:{name:"Show In Popouts",note:"Shows a user's total permissions in their popout similar to roles."},contextMenus:{name:"Context Menu Button",note:"Adds a button to view the permissions modal to select context menus."},displayMode:{name:"Modal Display Mode"}}},ru:{contextMenuLabel:"Полномочия",popoutLabel:"Полномочия",modal:{header:"Полномочия ${name}",rolesLabel:"Роли",permissionsLabel:"Полномочия",owner:"Владелец"},settings:{popouts:{name:"Показать во всплывающих окнах",note:"Отображает полномочия пользователя в их всплывающем окне, аналогичном ролям."},contextMenus:{name:"Кнопка контекстного меню",note:"Добавить кнопку для отображения полномочий с помощью контекстных меню."}}}},main:"index.js"}; return !global.ZeresPluginLibrary ? class { constructor() {this._config = config;} getName() {return config.info.name;} getAuthor() {return config.info.authors.map(a => a.name).join(", ");} getDescription() {return config.info.description;} getVersion() {return config.info.version;} load() { BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click Download Now to install it.`, { confirmText: "Download Now", cancelText: "Cancel", onConfirm: () => { require("request").get("https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js", async (error, response, body) => { if (error) return require("electron").shell.openExternal("https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js"); await new Promise(r => require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0PluginLibrary.plugin.js"), body, r)); }); } }); } start() {} stop() {} } : (([Plugin, Api]) => { const plugin = (Plugin, Api) => { const {Patcher, DiscordModules, WebpackModules, PluginUtilities, Toasts, DiscordClasses, Utilities, DOMTools, ColorConverter, DCM, Structs, ReactTools} = Api; const GuildStore = DiscordModules.GuildStore; const SelectedGuildStore = DiscordModules.SelectedGuildStore; const MemberStore = DiscordModules.GuildMemberStore; const UserStore = DiscordModules.UserStore; const DiscordPerms = Object.assign({}, DiscordModules.DiscordConstants.Permissions); const AvatarDefaults = WebpackModules.getByProps("DEFAULT_AVATARS"); const UserPopoutSelectors = Object.assign({}, WebpackModules.getByProps("userPopout"), WebpackModules.getByProps("rolesList")); for (const key in UserPopoutSelectors) UserPopoutSelectors[key] = new Structs.Selector(UserPopoutSelectors[key]); const escapeHTML = DOMTools.escapeHTML ? DOMTools.escapeHTML : function(html) { const textNode = document.createTextNode(""); const spanElement = document.createElement("span"); spanElement.append(textNode); textNode.nodeValue = html; return spanElement.innerHTML; }; if (DiscordPerms.STREAM) { DiscordPerms.VIDEO = DiscordPerms.STREAM; delete DiscordPerms.STREAM; } if (DiscordPerms.MANAGE_GUILD) { DiscordPerms.MANAGE_SERVER = DiscordPerms.MANAGE_GUILD; delete DiscordPerms.MANAGE_GUILD; } return class PermissionsViewer extends Plugin { constructor() { super(); this.css = `.member-perms-header { display: flex; justify-content: space-between; } .member-perms { display: flex; flex-wrap: wrap; margin-top: 2px; max-height: 160px; overflow-y: auto; overflow-x: hidden; } .member-perms .member-perm .perm-circle { border-radius: 50%; height: 12px; margin-right: 4px; width: 12px; } .member-perms .member-perm .name { margin-right: 4px; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .perm-details-button { cursor: pointer; height: 12px; } .perm-details { display: flex; justify-content: flex-end; } .member-perm-details { cursor: pointer; } .member-perm-details-button { fill: #72767d; height: 10px; } /* Modal */ @keyframes permissions-backdrop { to { opacity: 0.85; } } @keyframes permissions-modal-wrapper { to { transform: scale(1); opacity: 1; } } @keyframes permissions-backdrop-closing { to { opacity: 0; } } @keyframes permissions-modal-wrapper-closing { to { transform: scale(0.7); opacity: 0; } } #permissions-modal-wrapper { z-index: 100; } #permissions-modal-wrapper .callout-backdrop { animation: permissions-backdrop 250ms ease; animation-fill-mode: forwards; opacity: 0; background-color: rgb(0, 0, 0); transform: translateZ(0px); } #permissions-modal-wrapper.closing .callout-backdrop { animation: permissions-backdrop-closing 200ms linear; animation-fill-mode: forwards; animation-delay: 50ms; opacity: 0.85; } #permissions-modal-wrapper.closing .modal-wrapper { animation: permissions-modal-wrapper-closing 250ms cubic-bezier(0.19, 1, 0.22, 1); animation-fill-mode: forwards; opacity: 1; transform: scale(1); } #permissions-modal-wrapper .modal-wrapper { animation: permissions-modal-wrapper 250ms cubic-bezier(0.175, 0.885, 0.32, 1.275); animation-fill-mode: forwards; transform: scale(0.7); transform-origin: 50% 50%; display: flex; align-items: center; box-sizing: border-box; contain: content; justify-content: center; top: 0; left: 0; bottom: 0; right: 0; opacity: 0; pointer-events: none; position: absolute; user-select: none; z-index: 1000; } #permissions-modal-wrapper .modal-body { background-color: #36393f; height: 440px; width: auto; /*box-shadow: 0 0 0 1px rgba(32,34,37,.6), 0 2px 10px 0 rgba(0,0,0,.2);*/ flex-direction: row; overflow: hidden; display: flex; flex: 1; contain: layout; position: relative; } #permissions-modal-wrapper #permissions-modal { display: flex; contain: layout; flex-direction: column; pointer-events: auto; border: 1px solid rgba(28,36,43,.6); border-radius: 5px; box-shadow: 0 2px 10px 0 rgba(0,0,0,.2); overflow: hidden; } #permissions-modal-wrapper .header { background-color: #35393e; box-shadow: 0 2px 3px 0 rgba(0,0,0,.2); padding: 12px 20px; z-index: 1; color: #fff; font-size: 16px; font-weight: 700; line-height: 19px; } .role-side, .perm-side { flex-direction: column; padding-left: 6px; } .role-scroller, .perm-scroller { contain: layout; flex: 1; min-height: 1px; overflow-y: scroll; } #permissions-modal-wrapper .scroller-title { color: #fff; padding: 8px 0 4px 4px; margin-right: 8px; border-bottom: 1px solid rgba(0,0,0,0.3); display: none; } #permissions-modal-wrapper .role-side { width: auto; min-width: 150px; background: #2f3136; flex: 0 0 auto; overflow: hidden; display: flex; height: 100%; min-height: 1px; position: relative; } #permissions-modal-wrapper .role-scroller { contain: layout; flex: 1; min-height: 1px; overflow-y: scroll; padding-top: 8px; } #permissions-modal-wrapper .role-item { display: flex; border-radius: 2px; padding: 6px; margin-bottom: 5px; cursor: pointer; color: #dcddde; } #permissions-modal-wrapper .role-item:hover { background-color: rgba(0,0,0,0.1); } #permissions-modal-wrapper .role-item.selected { background-color: rgba(0,0,0,0.2); } #permissions-modal-wrapper .perm-side { width: 250px; background-color: #36393f; flex: 0 0 auto; display: flex; height: 100%; min-height: 1px; position: relative; padding-left: 10px; } #permissions-modal-wrapper .perm-item { box-shadow: inset 0 -1px 0 rgba(79,84,92,.3); box-sizing: border-box; height: 44px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-direction: row; justify-content: flex-start; align-items: center; display: flex; } #permissions-modal-wrapper .perm-item.allowed svg { fill: #43B581; } #permissions-modal-wrapper .perm-item.denied svg { fill: #F04747; } #permissions-modal-wrapper .perm-name { display: inline; flex: 1; font-size: 16px; font-weight: 400; overflow: hidden; text-overflow: ellipsis; user-select: text; color: #dcddde; margin-left: 10px; } .member-perms::-webkit-scrollbar-thumb, .member-perms::-webkit-scrollbar-track, #permissions-modal-wrapper *::-webkit-scrollbar-thumb, #permissions-modal-wrapper *::-webkit-scrollbar-track { background-clip: padding-box; border-radius: 7.5px; border-style: solid; border-width: 3px; visibility: hidden; } .member-perms:hover::-webkit-scrollbar-thumb, .member-perms:hover::-webkit-scrollbar-track, #permissions-modal-wrapper *:hover::-webkit-scrollbar-thumb, #permissions-modal-wrapper *:hover::-webkit-scrollbar-track { visibility: visible; } .member-perms::-webkit-scrollbar-track, #permissions-modal-wrapper *::-webkit-scrollbar-track { border-width: initial; background-color: transparent; border: 2px solid transparent; } .member-perms::-webkit-scrollbar-thumb, #permissions-modal-wrapper *::-webkit-scrollbar-thumb { border: 2px solid transparent; border-radius: 4px; cursor: move; background-color: rgba(32,34,37,.6); } .member-perms::-webkit-scrollbar, #permissions-modal-wrapper *::-webkit-scrollbar { height: 8px; width: 8px; } .theme-light #permissions-modal-wrapper #permissions-modal { background: #fff; } .theme-light #permissions-modal-wrapper .modal-body { background: transparent; } .theme-light #permissions-modal-wrapper .header { background: transparent; color: #000; } .theme-light #permissions-modal-wrapper .role-side { background: rgba(0,0,0,.2); } .theme-light #permissions-modal-wrapper .perm-side { background: rgba(0,0,0,.1); } .theme-light #permissions-modal-wrapper .role-item, .theme-light #permissions-modal-wrapper .perm-name { color: #000; }`; this.jumbo = `#permissions-modal-wrapper #permissions-modal { height: 840px; } #permissions-modal-wrapper #permissions-modal .perm-side { width: 500px; } #permissions-modal .perm-scroller { display: flex; flex-wrap: wrap; align-content: flex-start; } #permissions-modal .perm-item { width: 50%; }`; this.listHTML = `