Ver código fonte

Add minimal role setting

Markus-Rost 4 anos atrás
pai
commit
529a5b3bb8
9 arquivos alterados com 88 adições e 42 exclusões
  1. 7 2
      bot.js
  2. 14 11
      cmds/settings.js
  3. 2 1
      cmds/verify.js
  4. 44 16
      dashboard/settings.js
  5. 10 5
      dashboard/verification.js
  6. 6 5
      database.js
  7. 1 0
      i18n/en.json
  8. 2 2
      main.js
  9. 2 0
      util/newMessage.js

+ 7 - 2
bot.js

@@ -230,7 +230,7 @@ client.on( 'message', msg => {
 			}
 			return;
 		}
-		db.get( 'SELECT wiki, lang, inline FROM discord WHERE guild = ? AND (channel = ? OR channel IS NULL) ORDER BY channel DESC', [msg.guild.id, msg.channel.id], (dberror, row) => {
+		db.get( 'SELECT wiki, lang, role, inline FROM discord WHERE guild = ? AND (channel = ? OR channel IS NULL) ORDER BY channel DESC', [msg.guild.id, msg.channel.id], (dberror, row) => {
 			if ( dberror ) {
 				console.log( '- Error while getting the wiki: ' + dberror );
 				if ( permissions.has('SEND_MESSAGES') ) {
@@ -239,7 +239,12 @@ client.on( 'message', msg => {
 				}
 				return dberror;
 			}
-			if ( row ) newMessage(msg, new Lang(row.lang), row.wiki, patreons[msg.guild.id], row.inline);
+			if ( row ) {
+				if ( msg.guild.roles.cache.has(row.role) && msg.guild.roles.cache.get(row.role).comparePositionTo(msg.member.roles.highest) > 0 && !msg.isAdmin() ) {
+					msg.onlyVerifyCommand = true;
+				}
+				newMessage(msg, new Lang(row.lang), row.wiki, patreons[msg.guild.id], row.inline);
+			}
 			else {
 				msg.defaultSettings = true;
 				newMessage(msg, new Lang());

+ 14 - 11
cmds/settings.js

@@ -22,14 +22,17 @@ function cmd_settings(lang, msg, args, line, wiki) {
 	if ( !allSites.length ) getAllSites.update();
 	if ( !msg.isAdmin() ) return msg.reactEmoji('❌');
 	
-	db.all( 'SELECT channel, lang, wiki, prefix, inline FROM discord WHERE guild = ? ORDER BY channel DESC', [msg.guild.id], (error, rows) => {
+	db.all( 'SELECT channel, wiki, lang, role, inline, prefix FROM discord WHERE guild = ? ORDER BY channel DESC', [msg.guild.id], (error, rows) => {
 		if ( error ) {
 			console.log( '- Error while getting the settings: ' + error );
 			msg.reactEmoji('error', true);
 			return error;
 		}
 		var guild = rows.find( row => !row.channel );
-		if ( !guild ) guild = Object.assign({prefix: process.env.prefix}, defaultSettings);
+		if ( !guild ) guild = Object.assign({
+			role: null, inline: null,
+			prefix: process.env.prefix
+		}, defaultSettings);
 		var prefix = guild.prefix;
 		var inlinepage = ( lang.localNames.page || 'page' );
 		var text = lang.get('settings.missing', '`' + prefix + 'settings lang`', '`' + prefix + 'settings wiki`');
@@ -173,8 +176,8 @@ function cmd_settings(lang, msg, args, line, wiki) {
 								if ( reaction ) reaction.removeEmoji();
 								return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + channel.wiki + wikihelp, {embed}, true );
 							}
-							sql = 'INSERT INTO discord(wiki, guild, channel, lang, prefix) VALUES(?, ?, ?, ?, ?)';
-							sqlargs.push(guild.lang, guild.prefix);
+							sql = 'INSERT INTO discord(wiki, guild, channel, lang, role, inline, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
+							sqlargs.push(guild.lang, guild.role, guild.inline, guild.prefix);
 						}
 					}
 					return db.run( sql, sqlargs, function (dberror) {
@@ -195,7 +198,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 						if ( channel || !rows.some( row => row.channel === msg.channel.id ) ) wiki = new Wiki(wikinew);
 						if ( reaction ) reaction.removeEmoji();
 						msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + wikinew + wikihelp, {embed}, true );
-						var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
+						var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
 						if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
 							if ( delerror ) {
 								console.log( '- Error while removing the settings: ' + delerror );
@@ -237,8 +240,8 @@ function cmd_settings(lang, msg, args, line, wiki) {
 					if ( channel.lang === allLangs.map[args[1]] ) {
 						return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[channel.lang] + '`' + langhelp, {files:( msg.uploadFiles() ? [`./i18n/widgets/${channel.lang}.png`] : [] )}, true );
 					}
-					sql = 'INSERT INTO discord(lang, guild, channel, wiki, prefix) VALUES(?, ?, ?, ?, ?)';
-					sqlargs.push(guild.wiki, guild.prefix);
+					sql = 'INSERT INTO discord(lang, guild, channel, wiki, role, inline, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
+					sqlargs.push(guild.wiki, guild.role, guild.inline, guild.prefix);
 				}
 			}
 			return db.run( sql, sqlargs, function (dberror) {
@@ -258,7 +261,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				}
 				if ( channel || !( msg.guild.id in patreons ) || !rows.some( row => row.channel === msg.channel.id ) ) lang = new Lang(allLangs.map[args[1]]);
 				msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[allLangs.map[args[1]]] + '`\n' + lang.get('settings.langhelp', prefix + 'settings ' + prelang) + ' `' + Object.values(allLangs.names).join('`, `') + '`', {files:( msg.uploadFiles() ? [`./i18n/widgets/${allLangs.map[args[1]]}.png`] : [] )}, true );
-				var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
+				var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
 				if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
 					if ( delerror ) {
 						console.log( '- Error while removing the settings: ' + delerror );
@@ -322,8 +325,8 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				sql = 'UPDATE discord SET inline = ? WHERE guild = ? AND channel = ?';
 				sqlargs.push(msg.channel.id);
 				if ( !rows.includes( channel ) ) {
-					sql = 'INSERT INTO discord(inline, guild, channel, wiki, prefix) VALUES(?, ?, ?, ?, ?)';
-					sqlargs.push(guild.wiki, guild.prefix);
+					sql = 'INSERT INTO discord(inline, guild, channel, wiki, lang, role, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
+					sqlargs.push(guild.wiki, guild.lang, guild.role, guild.prefix);
 				}
 			}
 			return db.run( sql, sqlargs, function (dberror) {
@@ -342,7 +345,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 				}
 				toggle = 'inline ' + ( ( channel || guild ).inline ? 'disabled' : 'enabled' );
 				msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang + 'changed') + '\n' + lang.get('settings.' + toggle + '.help', prefix + 'settings ' + prelang + ' toggle', inlinepage), {}, true );
-				var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
+				var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
 				if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
 					if ( delerror ) {
 						console.log( '- Error while removing the settings: ' + delerror );

+ 2 - 1
cmds/verify.js

@@ -18,7 +18,8 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 		if ( msg.isAdmin() ) {
 			console.log( msg.guild.id + ': Missing permissions - MANAGE_ROLES' );
 			msg.replyMsg( lang.get('general.missingperm') + ' `MANAGE_ROLES`' );
-		} else this.LINK(lang, msg, line, wiki);
+		}
+		else if ( !msg.onlyVerifyCommand ) this.LINK(lang, msg, line, wiki);
 		return;
 	}
 	

+ 44 - 16
dashboard/settings.js

@@ -20,6 +20,8 @@ const fieldset = {
 		return `<option id="wb-settings-lang-${lang}" value="${lang}">${allLangs.names[lang]}</option>`
 	} ).join('\n')
 	+ '</select>',
+	role: '<label for="wb-settings-role">Minimal Role:</label>'
+	+ '<select id="wb-settings-role" name="role"></select>',
 	prefix: '<label for="wb-settings-prefix">Prefix:</label>'
 	+ '<input type="text" id="wb-settings-prefix" name="prefix" pattern="^\\s*[^\\s`\\\\]{1,100}\\s*$" required>'
 	+ '<br>'
@@ -40,14 +42,18 @@ const fieldset = {
  * @param {String} settings.channel
  * @param {String} settings.wiki
  * @param {String} settings.lang
+ * @param {String} settings.role
  * @param {Boolean} settings.inline
  * @param {String} settings.prefix
+ * @param {Object[]} guildRoles - The guild roles
+ * @param {String} guildRoles.id
+ * @param {String} guildRoles.name
  * @param {Object[]} guildChannels - The guild channels
  * @param {String} guildChannels.id
  * @param {String} guildChannels.name
  * @param {Number} guildChannels.userPermissions
  */
-function createForm($, header, settings, guildChannels) {
+function createForm($, header, settings, guildRoles, guildChannels = []) {
 	var readonly = ( process.env.READONLY ? true : false );
 	if ( settings.channel && guildChannels.userPermissions === 0 && guildChannels.name === 'UNKNOWN' ) {
 		readonly = true;
@@ -78,6 +84,16 @@ function createForm($, header, settings, guildChannels) {
 		let lang = $('<div>').append(fieldset.lang);
 		lang.find(`#wb-settings-lang-${settings.lang}`).attr('selected', '');
 		fields.push(lang);
+		let role = $('<div>').append(fieldset.role);
+		role.find('#wb-settings-role').append(
+			...guildRoles.map( guildRole => {
+				return $(`<option id="wb-settings-role-${guildRole.id}">`).val(guildRole.id).text(`${guildRole.id} – @${guildRole.name}`)
+			} ),
+			$(`<option id="wb-settings-role-everyone">`).val('').text(`@everyone`),
+		);
+		if ( settings.role ) role.find(`#wb-settings-role-${settings.role}`).attr('selected', '');
+		else role.find(`#wb-settings-role-everyone`).attr('selected', '');
+		fields.push(role);
 		let inline = $('<div>').append(fieldset.inline);
 		if ( !settings.inline ) inline.find('#wb-settings-inline').attr('checked', '');
 		fields.push(inline);
@@ -114,7 +130,7 @@ function createForm($, header, settings, guildChannels) {
  * @param {String[]} args - The url parts
  */
 function dashboard_settings(res, $, guild, args) {
-	db.all( 'SELECT channel, lang, wiki, prefix, inline, patreon FROM discord WHERE guild = ? ORDER BY channel ASC', [guild.id], function(dberror, rows) {
+	db.all( 'SELECT channel, wiki, lang, role, inline, prefix, patreon FROM discord WHERE guild = ? ORDER BY channel ASC', [guild.id], function(dberror, rows) {
 		if ( dberror ) {
 			console.log( '- Dashboard: Error while getting the settings: ' + dberror );
 			$('#text .description').text('Failed to load the settings!');
@@ -129,7 +145,7 @@ function dashboard_settings(res, $, guild, args) {
 			$('.channel#settings').addClass('selected');
 			createForm($, 'Server-wide Settings', Object.assign({
 				prefix: process.env.prefix
-			}, defaultSettings)).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
+			}, defaultSettings), guild.roles).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
 			let body = $.html();
 			res.writeHead(200, {'Content-Length': body.length});
 			res.write( body );
@@ -162,7 +178,7 @@ function dashboard_settings(res, $, guild, args) {
 			createForm($, 'New Channel Overwrite', Object.assign({}, rows.find( row => !row.channel ), {
 				patreon: isPatreon,
 				channel: 'new'
-			}), guild.channels.filter( channel => {
+			}), guild.roles, guild.channels.filter( channel => {
 				return ( hasPerm(channel.userPermissions, 'VIEW_CHANNEL', 'SEND_MESSAGES') && !rows.some( row => row.channel === channel.id ) );
 			} )).attr('action', `/guild/${guild.id}/settings/new`).appendTo('#text');
 		}
@@ -173,11 +189,11 @@ function dashboard_settings(res, $, guild, args) {
 				return row.channel === channel.id;
 			} ), {
 				patreon: isPatreon
-			}), [channel]).attr('action', `/guild/${guild.id}/settings/${channel.id}`).appendTo('#text');
+			}), guild.roles, [channel]).attr('action', `/guild/${guild.id}/settings/${channel.id}`).appendTo('#text');
 		}
 		else {
 			$('.channel#settings').addClass('selected');
-			createForm($, 'Server-wide Settings', rows.find( row => !row.channel )).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
+			createForm($, 'Server-wide Settings', rows.find( row => !row.channel ), guild.roles).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
 		}
 		let body = $.html();
 		res.writeHead(200, {'Content-Length': body.length});
@@ -196,6 +212,7 @@ function dashboard_settings(res, $, guild, args) {
  * @param {String} [settings.channel]
  * @param {String} settings.wiki
  * @param {String} [settings.lang]
+ * @param {String} [settings.role]
  * @param {String} [settings.inline]
  * @param {String} [settings.prefix]
  * @param {String} [settings.prefix_space]
@@ -216,6 +233,9 @@ function update_settings(res, userSettings, guild, type, settings) {
 		if ( settings.channel && !userSettings.guilds.isMember.get(guild).channels.some( channel => {
 			return ( channel.id === settings.channel );
 		} ) ) return res(`/guild/${guild}/settings/${type}?save=failed`);
+		if ( settings.role && !userSettings.guilds.isMember.get(guild).roles.some( role => {
+			return ( role.id === settings.role );
+		} ) ) return res(`/guild/${guild}/settings/${type}?save=failed`);
 	}
 	if ( settings.delete_settings && ( type === 'default' || type === 'new' ) ) {
 		return res(`/guild/${guild}/settings/${type}?save=failed`);
@@ -247,7 +267,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 		if ( type === settings.channel && !hasPerm(response.userPermissions, 'VIEW_CHANNEL', 'SEND_MESSAGES') ) {
 			return res(`/guild/${guild}/settings/${type}?save=failed`);
 		}
-		if ( settings.delete_settings ) return db.get( 'SELECT main.lang mainlang, main.patreon, main.lang mainwiki, main.lang maininline, old.wiki, old.lang, old.inline FROM discord main LEFT JOIN discord old ON main.guild = old.guild AND old.channel = ? WHERE main.guild = ? AND main.channel IS NULL', [type, guild], function(dberror, row) {
+		if ( settings.delete_settings ) return db.get( 'SELECT main.lang mainlang, main.patreon, main.lang mainwiki, main.role mainrole, main.inline maininline, old.wiki, old.lang, old.role, old.inline FROM discord main LEFT JOIN discord old ON main.guild = old.guild AND old.channel = ? WHERE main.guild = ? AND main.channel IS NULL', [type, guild], function(dberror, row) {
 			db.run( 'DELETE FROM discord WHERE guild = ? AND channel = ?', [guild, type], function (delerror) {
 				if ( delerror ) {
 					console.log( '- Dashboard: Error while removing the settings: ' + delerror );
@@ -265,6 +285,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 				if ( row.wiki !== row.mainwiki ) text += `\n${lang.get('settings.currentwiki')} <${row.wiki}>`;
 				if ( row.patreon ) {
 					if ( row.lang !== row.mainlang ) text += `\n${lang.get('settings.currentlang')} \`${allLangs.names[row.lang]}\``;
+					if ( row.role !== row.mainrole ) text += `\n${lang.get('settings.currentrole')} ` + ( row.role ? `<@&${row.role}>` : '@everyone' );
 					if ( row.inline !== row.maininline ) text += `\n${lang.get('settings.currentinline')} ${( row.inline ? '~~' : '' )}\`[[${inlinepage}]]\`${( row.inline ? '~~' : '' )}`;
 				}
 				text += `\n<${new URL(`/guild/${guild}/settings`, process.env.dashboard).href}>`;
@@ -287,7 +308,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 			return fresponse;
 		} ).then( fresponse => {
 			return new Promise( function (resolve, reject) {
-				db.get( 'SELECT lang, wiki, prefix, inline FROM discord WHERE guild = ? AND channel IS NULL', [guild], function(error, row) {
+				db.get( 'SELECT lang, wiki, role, inline, prefix FROM discord WHERE guild = ? AND channel IS NULL', [guild], function(error, row) {
 					if ( error ) {
 						console.log( '- Dashboard: Error while getting the settings: ' + error );
 						reject();
@@ -350,7 +371,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 					settings.prefix = settings.prefix.trim().toLowerCase();
 					if ( settings.prefix_space ) settings.prefix += ' ';
 				}
-				if ( !row ) return db.run( 'INSERT INTO discord(wiki, lang, inline, prefix, guild, main) VALUES(?, ?, ?, ?, ?, ?)', [wiki.href, settings.lang, ( settings.inline ? null : 1 ), ( settings.prefix || process.env.prefix ), guild, guild], function(dberror) {
+				if ( !row ) return db.run( 'INSERT INTO discord(wiki, lang, role, inline, prefix, guild, main) VALUES(?, ?, ?, ?, ?, ?)', [wiki.href, settings.lang, ( settings.role || null ), ( settings.inline ? null : 1 ), ( settings.prefix || process.env.prefix ), guild, guild], function(dberror) {
 					if ( dberror ) {
 						console.log( '- Dashboard: Error while saving the settings: ' + dberror );
 						return res(`/guild/${guild}/settings?save=failed`);
@@ -360,6 +381,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 					var text = lang.get('settings.dashboard.updated', `<@${userSettings.user.id}>`);
 					text += '\n' + lang.get('settings.currentwiki') + ` <${wiki.href}>`;
 					text += '\n' + lang.get('settings.currentlang') + ` \`${allLangs.names[settings.lang]}\``;
+					text += '\n' + lang.get('settings.currentrole') + ( settings.role ? ` <@&${settings.role}>` : ' @everyone' );
 					if ( response.patreon ) {
 						text += '\n' + lang.get('settings.currentprefix') + ` \`${settings.prefix.replace( /\\/g, '\\$&' )}\``;
 					}
@@ -381,11 +403,14 @@ function update_settings(res, userSettings, guild, type, settings) {
 				if ( response.patreon && row.prefix !== settings.prefix ) {
 					diff.push(lang.get('settings.currentprefix') + ` ~~\`${row.prefix.replace( /\\/g, '\\$&' )}\`~~ → \`${settings.prefix.replace( /\\/g, '\\$&' )}\``);
 				}
+				if ( row.role !== ( settings.role || null ) ) {
+					diff.push(lang.get('settings.currentrole') + ` ~~${( row.role ? `<@&${row.role}>` : '@everyone' )}~~ → ${( settings.role ? `<@&${settings.role}>` : '@everyone' )}`);
+				}
 				if ( row.inline !== ( settings.inline ? null : 1 ) ) {
 					let inlinepage = ( lang.localNames.page || 'page' );
 					diff.push(lang.get('settings.currentinline') + ` ${( row.inline ? '~~' : '' )}\`[[${inlinepage}]]\`${( row.inline ? '~~' : '' )} → ${( settings.inline ? '' : '~~' )}\`[[${inlinepage}]]\`${( settings.inline ? '' : '~~' )}`);
 				}
-				if ( diff.length ) return db.run( 'UPDATE discord SET wiki = ?, lang = ?, inline = ?, prefix = ? WHERE guild = ? AND channel IS NULL', [wiki.href, settings.lang, ( settings.inline ? null : 1 ), ( settings.prefix || process.env.prefix ), guild], function(dberror) {
+				if ( diff.length ) return db.run( 'UPDATE discord SET wiki = ?, lang = ?, role = ?, inline = ?, prefix = ? WHERE guild = ? AND channel IS NULL', [wiki.href, settings.lang, ( settings.role || null ), ( settings.inline ? null : 1 ), ( settings.prefix || process.env.prefix ), guild], function(dberror) {
 					if ( dberror ) {
 						console.log( '- Dashboard: Error while saving the settings: ' + dberror );
 						return res(`/guild/${guild}/settings?save=failed`);
@@ -405,11 +430,11 @@ function update_settings(res, userSettings, guild, type, settings) {
 				return res(`/guild/${guild}/settings?save=success`);
 			}
 			if ( !row || !settings.channel || settings.prefix || 
-			( !response.patreon && ( settings.inline || settings.lang ) ) ) {
+			( !response.patreon && ( settings.lang || settings.role || settings.inline ) ) ) {
 				return res(`/guild/${guild}/settings?save=failed`);
 			}
 			if ( row.wiki === wiki.href && ( !response.patreon || 
-			( row.lang === settings.lang && row.inline === ( settings.inline ? null : 1 ) ) ) ) {
+			( row.lang === settings.lang && row.inline === ( settings.inline ? null : 1 ) && row.role === ( settings.role || null ) ) ) ) {
 				if ( type === 'new' ) {
 					return res(`/guild/${guild}/settings/${type}?save=failed`);
 				}
@@ -429,7 +454,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 					} );
 				} );
 			}
-			return db.get( 'SELECT lang, wiki, inline FROM discord WHERE guild = ? AND channel = ?', [guild, settings.channel], function(curerror, channel) {
+			return db.get( 'SELECT lang, wiki, role, inline FROM discord WHERE guild = ? AND channel = ?', [guild, settings.channel], function(curerror, channel) {
 				if ( curerror ) {
 					console.log( '- Dashboard: Error while getting the channel settings: ' + curerror );
 					return res(`/guild/${guild}/settings/${type}?save=failed`);
@@ -442,6 +467,9 @@ function update_settings(res, userSettings, guild, type, settings) {
 				if ( response.patreon && channel.lang !== settings.lang ) {
 					diff.push(lang.get('settings.currentlang') + ` ~~\`${allLangs.names[channel.lang]}\`~~ → \`${allLangs.names[settings.lang]}\``);
 				}
+				if ( response.patreon && channel.role !== ( settings.role || null ) ) {
+					diff.push(lang.get('settings.currentrole') + ` ~~${( channel.role ? `<@&${channel.role}>` : '@everyone' )}~~ → ${( settings.role ? `<@&${settings.role}>` : '@everyone' )}`);
+				}
 				if ( response.patreon && channel.inline !== ( settings.inline ? null : 1 ) ) {
 					let inlinepage = ( lang.localNames.page || 'page' );
 					diff.push(lang.get('settings.currentinline') + ` ${( channel.inline ? '~~' : '' )}\`[[${inlinepage}]]\`${( channel.inline ? '~~' : '' )} → ${( settings.inline ? '' : '~~' )}\`[[${inlinepage}]]\`${( settings.inline ? '' : '~~' )}`);
@@ -449,10 +477,10 @@ function update_settings(res, userSettings, guild, type, settings) {
 				if ( !diff.length ) {
 					return res(`/guild/${guild}/settings/${settings.channel}?save=success`);
 				}
-				let sql = 'UPDATE discord SET wiki = ?, lang = ?, inline = ? WHERE guild = ? AND channel = ?';
-				let sqlargs = [wiki.href, ( settings.lang || channel.lang ), ( response.patreon ? ( settings.inline ? null : 1 ) : channel.inline ), guild, settings.channel];
+				let sql = 'UPDATE discord SET wiki = ?, lang = ?, role = ?, inline = ? WHERE guild = ? AND channel = ?';
+				let sqlargs = [wiki.href, ( settings.lang || channel.lang ), ( response.patreon ? ( settings.role || null ) : channel.role ), ( response.patreon ? ( settings.inline ? null : 1 ) : channel.inline ), guild, settings.channel];
 				if ( channel === row ) {
-					sql = 'INSERT INTO discord(wiki, lang, inline, guild, channel, prefix) VALUES(?, ?, ?, ?, ?, ?)';
+					sql = 'INSERT INTO discord(wiki, lang, role, inline, guild, channel, prefix) VALUES(?, ?, ?, ?, ?, ?)';
 					sqlargs.push(row.prefix);
 				}
 				return db.run( sql, sqlargs, function(dberror) {

+ 10 - 5
dashboard/verification.js

@@ -35,6 +35,7 @@ const fieldset = {
  * @param {Number} settings.editcount
  * @param {Number} settings.accountage
  * @param {Boolean} settings.rename
+ * @param {String} [settings.defaultrole]
  * @param {Object[]} guildChannels - The guild channels
  * @param {String} guildChannels.id
  * @param {String} guildChannels.name
@@ -117,7 +118,10 @@ function createForm($, header, settings, guildChannels, guildRoles) {
 		role.find(`#wb-settings-role .wb-settings-role-${settingsRoles[0]}`).attr('selected', '');
 	}
 	else {
-		role.find('.wb-settings-role-default').attr('selected', '');
+		if ( role.find(`.wb-settings-role-${settings.defaultrole}`).length ) {
+			role.find(`.wb-settings-role-${settings.defaultrole}`).attr('selected', '');
+		}
+		else role.find('.wb-settings-role-default').attr('selected', '');
 		role.find('button.addmore').attr('hidden', '');
 	}
 	fields.push(role);
@@ -169,7 +173,7 @@ function dashboard_verification(res, $, guild, args) {
 		res.write( body );
 		return res.end();
 	}
-	db.all( 'SELECT wiki, configid, verification.channel, role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild WHERE discord.guild = ? AND discord.channel IS NULL ORDER BY configid ASC', [guild.id], function(dberror, rows) {
+	db.all( 'SELECT wiki, discord.role defaultrole, configid, verification.channel, verification.role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild WHERE discord.guild = ? AND discord.channel IS NULL ORDER BY configid ASC', [guild.id], function(dberror, rows) {
 		if ( dberror ) {
 			console.log( '- Dashboard: Error while getting the verifications: ' + dberror );
 			$('#text .description').text('Failed to load the verifications!');
@@ -188,6 +192,7 @@ function dashboard_verification(res, $, guild, args) {
 			return res.end();
 		}
 		var wiki = rows[0].wiki;
+		var defaultrole = rows[0].defaultrole;
 		if ( rows.length === 1 && rows[0].configid === null ) rows.pop();
 		$('#text .description').text(`These are the verifications for "${guild.name}":`);
 		$('#channellist #verification').after(
@@ -211,7 +216,7 @@ function dashboard_verification(res, $, guild, args) {
 			$('.channel#channel-new').addClass('selected');
 			createForm($, 'New Verification', {
 				channel: '', role: '', usergroup: 'user',
-				editcount: 0, accountage: 0, rename: false
+				editcount: 0, accountage: 0, rename: false, defaultrole
 			}, guild.channels, guild.roles).attr('action', `/guild/${guild.id}/verification/new`).appendTo('#text');
 		}
 		else if ( rows.some( row => row.configid.toString() === args[4] ) ) {
@@ -314,7 +319,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 			userSettings.guilds.isMember.delete(guild);
 			return res('/?save=failed');
 		}
-		if ( settings.delete_settings ) return db.get( 'SELECT lang, verification.channel, role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild AND configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(dberror, row) {
+		if ( settings.delete_settings ) return db.get( 'SELECT lang, verification.channel, verification.role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild AND configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(dberror, row) {
 			if ( !dberror && !row?.channel ) return res(`/guild/${guild}/verification?save=success`);
 			db.run( 'DELETE FROM verification WHERE guild = ? AND configid = ?', [guild, type], function (delerror) {
 				if ( delerror ) {
@@ -440,7 +445,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 				} );
 			} );
 		} );
-		return db.get( 'SELECT wiki, lang, verification.channel, role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild AND verification.configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(curerror, row) {
+		return db.get( 'SELECT wiki, lang, verification.channel, verification.role, editcount, usergroup, accountage, rename FROM discord LEFT JOIN verification ON discord.guild = verification.guild AND verification.configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(curerror, row) {
 			if ( curerror ) {
 				console.log( '- Dashboard: Error while checking for verifications: ' + curerror );
 				return res(`/guild/${guild}/verification/${type}?save=failed`);

+ 6 - 5
database.js

@@ -17,20 +17,21 @@ CREATE INDEX idx_patreons_patreon ON patreons (
 );
 
 CREATE TABLE discord (
+    main    TEXT    UNIQUE
+                    CHECK (main = guild),
     guild   TEXT    NOT NULL
                     REFERENCES discord (main) ON DELETE CASCADE,
     channel TEXT,
-    lang    TEXT    NOT NULL
-                    DEFAULT [${defaultSettings.lang}],
     wiki    TEXT    NOT NULL
                     DEFAULT [${defaultSettings.wiki}],
+    lang    TEXT    NOT NULL
+                    DEFAULT [${defaultSettings.lang}],
+    role    TEXT,
+    inline  INTEGER,
     prefix  TEXT    NOT NULL
                     DEFAULT [${process.env.prefix}],
     patreon TEXT    REFERENCES patreons (patreon) ON DELETE SET NULL,
     voice   INTEGER,
-    inline  INTEGER,
-    main    TEXT    UNIQUE
-                    CHECK (main = guild),
     UNIQUE (
         guild,
         channel

+ 1 - 0
i18n/en.json

@@ -541,6 +541,7 @@
         "currentinline": "Inline commands:",
         "currentlang": "Language:",
         "currentprefix": "Prefix:",
+        "currentrole": "Minimal role:",
         "currentwiki": "Default wiki:",
         "dashboard": {
             "channel": "$1 updated the settings for $2.",

+ 2 - 2
main.js

@@ -106,14 +106,14 @@ if ( process.env.dashboard ) {
 											};
 										} ),
 										roles: guild.roles.cache.filter( role => {
-											return ( role.id !== guild.id && !role.managed );
+											return ( role.id !== guild.id );
 										} ).sort( (a, b) => {
 											return b.rawPosition - a.rawPosition;
 										} ).map( role => {
 											return {
 												id: role.id,
 												name: role.name,
-												lower: ( guild.me.roles.highest.comparePositionTo(role) > 0 )
+												lower: ( guild.me.roles.highest.comparePositionTo(role) > 0 && !role.managed )
 											};
 										} )
 									};

+ 2 - 0
util/newMessage.js

@@ -67,6 +67,7 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 		var aliasInvoke = ( lang.aliases[invoke] || invoke );
 		var ownercmd = ( msg.isOwner() && aliasInvoke in ownercmdmap );
 		var pausecmd = ( msg.isAdmin() && pause[msg.guild.id] && aliasInvoke in pausecmdmap );
+		if ( msg.onlyVerifyCommand && !( aliasInvoke === 'verify' || pausecmd || ownercmd ) ) return;
 		if ( channel.isGuild() && pause[msg.guild.id] && !( pausecmd || ownercmd ) ) {
 			return console.log( msg.guild.id + ': Paused' );
 		}
@@ -98,6 +99,7 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 		}
 		return cmdmap.LINK(lang, msg, line, wiki);
 	} );
+	if ( msg.onlyVerifyCommand ) return;
 	
 	if ( ( !channel.isGuild() || !pause[msg.guild.id] ) && !noInline && ( cont.includes( '[[' ) || cont.includes( '{{' ) ) ) {
 		var links = [];