123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- import Lang from '../util/i18n.js';
- import { got, db, slashCommands, sendMsg, createNotice, hasPerm } from './util.js';
- const fieldset = {
- role: '<label for="wb-settings-addrole">Role:</label>'
- + '<select id="wb-settings-addrole" name="role"></select>'
- + '<button type="button" id="wb-settings-addrole-add">Add</button>'
- + '<hr>',
- permission: '<span title="@UNKNOWN">@UNKNOWN:</span>'
- + '<div class="wb-settings-permission">'
- + '<input type="radio" id="wb-settings-permission-0" name="permission" value="0" required>'
- + '<label for="wb-settings-permission-0" class="wb-settings-permission-deny radio-label">Deny</label>'
- + '</div><div class="wb-settings-permission">'
- + '<input type="radio" id="wb-settings-permission-1" name="permission" value="1" required>'
- + '<label for="wb-settings-permission-1" class="wb-settings-permission-allow radio-label">Allow</label>'
- + '</div><div class="wb-settings-permission">'
- + '<input type="radio" id="wb-settings-permission-default" name="permission" value="" required>'
- + '<label for="wb-settings-permission-default" class="wb-settings-permission-default radio-label">Default</label>'
- + '</div>',
- save: '<input type="submit" id="wb-settings-save" name="save_settings">'
- };
- /**
- * Create a settings form
- * @param {import('cheerio').default} $ - The response body
- * @param {slashCommands[0]} slashCommand - The slash command
- * @param {import('./i18n.js').default} dashboardLang - The user language
- * @param {Object[]} permissions - The current permissions
- * @param {String} permissions.id
- * @param {Number} permissions.type
- * @param {Boolean} permissions.permission
- * @param {String} guildId - The guild id
- * @param {import('./util.js').Role[]} guildRoles - The guild roles
- */
- function createForm($, slashCommand, dashboardLang, permissions, guildId, guildRoles) {
- var readonly = ( process.env.READONLY ? true : false );
- var fields = [];
- if ( !readonly ) {
- $('<script>').text(`const i18nSlashPermission = ${JSON.stringify({
- allow: dashboardLang.get('slash.form.allow'),
- deny: dashboardLang.get('slash.form.deny'),
- default: dashboardLang.get('slash.form.default')
- })};`).insertBefore('script#indexjs');
- let role = $('<div>').append(fieldset.role);
- role.find('label').text(dashboardLang.get('slash.form.role'));
- role.find('#wb-settings-addrole').append(
- $(`<option id="wb-settings-channel-default" selected hidden>`).val('').text(dashboardLang.get('slash.form.select_role')),
- ...guildRoles.filter( guildRole => !permissions.some( perm => perm.id === guildRole.id ) ).map( guildRole => {
- return $(`<option id="wb-settings-addrole-${guildRole.id}">`).val(guildRole.id).text(`${guildRole.id} – @${guildRole.name}`)
- } ),
- ( permissions.some( perm => perm.id === guildId ) ? '' : $(`<option id="wb-settings-addrole-${guildId}">`).val(guildId).text(`@everyone`) )
- );
- role.find('#wb-settings-addrole-add').text(dashboardLang.get('slash.form.add'));
- fields.push(role);
- }
- let perms = permissions.sort( (a, b) => {
- if ( a.id === guildId ) return 1;
- if ( b.id === guildId ) return -1;
- return guildRoles.findIndex( guildRole => guildRole.id === a.id ) - guildRoles.findIndex( guildRole => guildRole.id === b.id );
- } ).map( perm => {
- let permission = $('<div>').append(fieldset.permission);
- let span = permission.find('span').attr('title', perm.id);
- if ( perm.id === guildId ) span.text('@everyone').attr('title', '@everyone');
- else span.text(`@${( guildRoles.find( guildRole => guildRole.id === perm.id )?.name || 'UNKNOWN' )}`);
- permission.find('input[name="permission"]').attr('name', `permission-${perm.id}`);
- permission.find('input#wb-settings-permission-0').attr('id', `wb-settings-permission-${perm.id}-0`);
- permission.find('label[for="wb-settings-permission-0"]').attr('for', `wb-settings-permission-${perm.id}-0`);
- permission.find('input#wb-settings-permission-1').attr('id', `wb-settings-permission-${perm.id}-1`);
- permission.find('label[for="wb-settings-permission-1"]').attr('for', `wb-settings-permission-${perm.id}-1`);
- permission.find('input#wb-settings-permission-default').attr('id', `wb-settings-permission-${perm.id}-default`);
- permission.find('label[for="wb-settings-permission-default"]').attr('for', `wb-settings-permission-${perm.id}-default`);
- permission.find(`#wb-settings-permission-${perm.id}-${( perm.permission ? '1' : '0' )}`).attr('checked', '');
- return permission;
- } );
- fields.push(...perms);
- fields.push($(fieldset.save).val(dashboardLang.get('general.save')));
- var form = $('<fieldset>').append(
- $('<legend>').text(( slashCommand.default_permission ? dashboardLang.get('slash.form.default_allow') : dashboardLang.get('slash.form.default_deny') )),
- ...fields);
- if ( readonly ) {
- form.find('input').attr('readonly', '');
- form.find('input[type="radio"]:not(:checked), option').attr('disabled', '');
- form.find('input[type="submit"]').remove();
- }
- form.find('label.wb-settings-permission-deny').text(dashboardLang.get('slash.form.deny'));
- form.find('label.wb-settings-permission-allow').text(dashboardLang.get('slash.form.allow'));
- form.find('label.wb-settings-permission-default').text(dashboardLang.get('slash.form.default'));
- return $('<form id="wb-settings" method="post" enctype="application/x-www-form-urlencoded">').append(
- $('<h2>').html(dashboardLang.get('slash.form.entry', true, $('<code>').text('/' + slashCommand.name))),
- form
- );
- }
- /**
- * Let a user change slashs
- * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
- * @param {import('./util.js').Guild} guild - The current guild
- * @param {String[]} args - The url parts
- * @param {import('./i18n.js').default} dashboardLang - The user language
- */
- function dashboard_slash(res, $, guild, args, dashboardLang) {
- let suffix = ( args[0] === 'owner' ? '?owner=true' : '' );
- $('#channellist #slash').after(
- ...slashCommands.filter( slashCommand => slashCommand.id ).map( slashCommand => {
- return $('<a class="channel">').attr('id', `channel-${slashCommand.id}`).append(
- $('<img>').attr('src', '/src/channel.svg'),
- $('<div>').text(slashCommand.name)
- ).attr('title', slashCommand.name).attr('href', `/guild/${guild.id}/slash/${slashCommand.id}${suffix}`);
- } )
- );
- if ( args[4] ) {
- let slashCommand = slashCommands.find( slashCommand => args[4] === slashCommand.id );
- if ( slashCommand ) return got.get( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild.id}/commands/${slashCommand.id}/permissions`, {
- headers: {
- Authorization: `Bot ${process.env.token}`
- },
- timeout: {
- request: 10000
- }
- } ).then( response=> {
- var permissions = [];
- if ( response.statusCode !== 200 || !response.body ) {
- if ( response.statusCode !== 404 || response.body?.message !== 'Unknown application command permissions' ) {
- if ( response.statusCode === 403 && response.body?.message === 'Missing Access' ) {
- createNotice($, 'noslash', dashboardLang, [guild.id]);
- }
- else {
- console.log( '- Dashboard: ' + response.statusCode + ': Error while getting the slash command permissions: ' + response.body?.message );
- createNotice($, 'error', dashboardLang);
- }
- $('#text .description').html(dashboardLang.get('slash.explanation'));
- $('.channel#slash').addClass('selected');
- return;
- }
- else if ( slashCommand.name === 'verify' ) return db.query( 'SELECT 1 FROM verification WHERE guild = $1 LIMIT 1', [guild.id] ).then( ({rows}) => {
- if ( rows.length ) {
- $('<p>').html(dashboardLang.get('slash.desc', true, $('<code>').text(guild.name))).appendTo('#text .description');
- $(`.channel#channel-${slashCommand.id}`).addClass('selected');
- createForm($, slashCommand, dashboardLang, permissions, guild.id, guild.roles).attr('action', `/guild/${guild.id}/slash/${slashCommand.id}`).appendTo('#text');
- return;
- }
- res.writeHead(302, {Location: `/guild/${guild.id}/verification/new${suffix}` + ( suffix ? '&' : '?' ) + 'slash=noverify'});
- res.end();
- return true;
- }, dberror => {
- console.log( '- Dashboard: Error while checking for verifications: ' + dberror );
- res.writeHead(302, {Location: `/guild/${guild.id}/verification/new${suffix}` + ( suffix ? '&' : '?' ) + 'slash=noverify'});
- res.end();
- return true;
- } );
- }
- else permissions = response.body.permissions;
- $('<p>').html(dashboardLang.get('slash.desc', true, $('<code>').text(guild.name))).appendTo('#text .description');
- $(`.channel#channel-${slashCommand.id}`).addClass('selected');
- createForm($, slashCommand, dashboardLang, permissions, guild.id, guild.roles).attr('action', `/guild/${guild.id}/slash/${slashCommand.id}`).appendTo('#text');
- }, error => {
- console.log( '- Dashboard: Error while getting the slash command permissions: ' + error );
- createNotice($, 'error', dashboardLang);
- $('#text .description').html(dashboardLang.get('slash.explanation'));
- $('.channel#slash').addClass('selected');
- } ).then( isRedirected => {
- if ( isRedirected ) return;
- let body = $.html();
- res.writeHead(200, {'Content-Length': Buffer.byteLength(body)});
- res.write( body );
- return res.end();
- } );
- }
- $('#text .description').html(dashboardLang.get('slash.explanation'));
- $('.channel#slash').addClass('selected');
- let body = $.html();
- res.writeHead(200, {'Content-Length': Buffer.byteLength(body)});
- res.write( body );
- return res.end();
- }
- /**
- * Change slashs
- * @param {Function} res - The server response
- * @param {import('./util.js').Settings} userSettings - The settings of the user
- * @param {String} guild - The id of the guild
- * @param {String} type - The setting to change
- * @param {Object} settings - The new settings
- */
- function update_slash(res, userSettings, guild, type, settings) {
- if ( !slashCommands.some( slashCommand => slashCommand.id === type ) ) {
- return res(`/guild/${guild}/slash`, 'savefail');
- }
- if ( !settings.save_settings ) {
- return res(`/guild/${guild}/slash/${type}`, 'savefail');
- }
- let roles = userSettings.guilds.isMember.get(guild).roles;
- var permissions = Object.keys(settings).filter( perm => roles.some( role => ( 'permission-' + role.id === perm ) ) || perm === 'permission-' + guild ).map( perm => {
- return {
- id: perm.replace( 'permission-', '' ), type: 1,
- permission: ( settings[perm] === '1' ? true : false )
- };
- } );
- sendMsg( {
- type: 'getMember',
- member: userSettings.user.id,
- guild: guild
- } ).then( response => {
- if ( !response ) {
- userSettings.guilds.notMember.set(guild, userSettings.guilds.isMember.get(guild));
- userSettings.guilds.isMember.delete(guild);
- return res(`/guild/${guild}`, 'savefail');
- }
- if ( response === 'noMember' || !hasPerm(response.userPermissions, 'MANAGE_GUILD') ) {
- userSettings.guilds.isMember.delete(guild);
- return res('/', 'savefail');
- }
- var commandName = slashCommands.find( slashCommand => slashCommand.id === type )?.name;
- return got.get( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild}/commands/${type}/permissions`, {
- headers: {
- Authorization: `Bot ${process.env.token}`
- },
- timeout: {
- request: 10000
- }
- } ).then( response=> {
- if ( response.statusCode !== 200 || !response.body ) {
- if ( response.statusCode === 403 && response.body?.message === 'Missing Access' ) {
- res(`/guild/${guild}/slash/${type}`, 'noslash', guild);
- return Promise.reject();
- }
- else if ( response.statusCode !== 404 || response.body?.message !== 'Unknown application command permissions' ) {
- console.log( '- Dashboard: ' + response.statusCode + ': Error while getting the old slash command permissions: ' + response.body?.message );
- }
- else if ( commandName === 'verify' ) return db.query( 'SELECT 1 FROM verification WHERE guild = $1 LIMIT 1', [guild] ).then( ({rows}) => {
- if ( rows.length ) return [];
- res(`/guild/${guild}/verification/new`, 'noverify');
- return Promise.reject();
- }, dberror => {
- console.log( '- Dashboard: Error while checking for verifications: ' + dberror );
- res(`/guild/${guild}/verification/new`, 'noverify');
- return Promise.reject();
- } );
- return [];
- }
- return response.body.permissions;
- }, error => {
- console.log( '- Dashboard: Error while getting the old slash command permissions: ' + error );
- return [];
- } ).then( oldPermissions => {
- return got.put( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild}/commands/${type}/permissions`, {
- headers: {
- Authorization: `Bot ${process.env.token}`
- },
- json: {permissions},
- timeout: {
- request: 10000
- }
- } ).then( response=> {
- if ( response.statusCode !== 200 || !response.body ) {
- console.log( '- Dashboard: ' + response.statusCode + ': Error while saving the slash command permissions: ' + response.body?.message );
- return res(`/guild/${guild}/slash/${type}`, 'savefail');
- }
- res(`/guild/${guild}/slash/${type}`, 'save');
- var changes = [
- ...permissions.map( perm => {
- var oldPerm = oldPermissions.find( oldPerm => oldPerm.id === perm.id );
- if ( !oldPerm ) return {
- role: ( perm.id === guild ? '@everyone' : `<@&${perm.id}>` ),
- old: 'default',
- new: ( perm.permission ? 'allow' : 'deny' )
- };
- if ( perm.permission === oldPerm.permission ) return null;
- return {
- role: ( perm.id === guild ? '@everyone' : `<@&${perm.id}>` ),
- old: ( oldPerm.permission ? 'allow' : 'deny' ),
- new: ( perm.permission ? 'allow' : 'deny' )
- };
- } ).filter( change => change ),
- ...oldPermissions.filter( oldPerm => !permissions.some( perm => perm.id === oldPerm.id ) ).map( oldPerm => {
- return {
- role: ( oldPerm.id === guild ? '@everyone' : `<@&${oldPerm.id}>` ),
- old: ( oldPerm.permission ? 'allow' : 'deny' ),
- new: 'default'
- };
- } )
- ];
- if ( !changes.length ) return;
- return db.query( 'SELECT lang FROM discord WHERE guild = $1 AND channel IS NULL', [guild] ).then( ({rows:[channel]}) => {
- var lang = new Lang(channel?.lang);
- var text = lang.get('interaction.dashboard.updated', `<@${userSettings.user.id}>`, '/' + commandName);
- text += '\n' + changes.map( change => {
- return change.role + ': ~~`' + lang.get('interaction.dashboard.perm_' + change.old) + '`~~ → `' + lang.get('interaction.dashboard.perm_' + change.new) + '`';
- } ).join('\n');
- text += `\n<${new URL(`/guild/${guild}/slash/${type}`, process.env.dashboard).href}>`;
- sendMsg( {
- type: 'notifyGuild', guild, text
- } ).catch( error => {
- console.log( '- Dashboard: Error while notifying the guild: ' + error );
- } );
- }, dberror => {
- console.log( '- Dashboard: Error while notifying the guild: ' + dberror );
- } );
- }, error => {
- console.log( '- Dashboard: Error while saving the slash command permissions: ' + error );
- return res(`/guild/${guild}/slash/${type}`, 'savefail');
- } );
- }, error => {
- if ( error ) {
- console.log( '- Dashboard: Error while getting the old slash command permissions: ' + error );
- return res(`/guild/${guild}/slash/${type}`, 'savefail');
- }
- } );
- }, error => {
- console.log( '- Dashboard: Error while getting the member: ' + error );
- return res(`/guild/${guild}/slash/${type}`, 'savefail');
- } );
- }
- export {
- dashboard_slash as get,
- update_slash as post
- };
|