Browse Source

Better button responses

Markus-Rost 4 years ago
parent
commit
394c85693e

+ 50 - 34
bot.js

@@ -212,6 +212,9 @@ String.prototype.hasPrefix = function(prefix, flags = '') {
 const fs = require('fs');
 var slash = {};
 var buttons = {};
+var buttonsMap = {
+	verify_again: 'verify'
+};
 fs.readdir( './interactions', (error, files) => {
 	if ( error ) return error;
 	files.filter( file => file.endsWith('.js') ).forEach( file => {
@@ -220,6 +223,11 @@ fs.readdir( './interactions', (error, files) => {
 		if ( command.hasOwnProperty('button') ) buttons[command.name] = command.button;
 	} );
 } );
+/*
+!test eval msg.client.api.applications(msg.client.user.id).commands.post( {
+	data: require('../interactions/commands.json')[0]
+} )
+*/
 
 client.ws.on( 'INTERACTION_CREATE', interaction => {
 	if ( interaction.version !== 1 ) return;
@@ -228,16 +236,18 @@ client.ws.on( 'INTERACTION_CREATE', interaction => {
 		interaction.user = interaction.member.user;
 		interaction.member.permissions = new Discord.Permissions(+interaction.member.permissions);
 	}
-	if ( interaction.type === 2 ) return slash_command(interaction);
-	if ( interaction.type === 3 ) return message_button(interaction);
+	var channel = client.channels.cache.get(interaction.channel_id);
+	if ( interaction.type === 2 ) return slash_command(interaction, channel);
+	if ( interaction.type === 3 ) return message_button(interaction, channel);
 } );
 
-/*
-!test eval msg.client.api.applications(msg.client.user.id).commands.post( {
-	data: require('../interactions/commands.json')[0]
-} )
-*/
-function slash_command(interaction) {
+/**
+ * Handle slash commands.
+ * @param {Object} interaction - The interaction.
+ * @param {Discord.Client} interaction.client - The client of the interaction.
+ * @param {Discord.TextChannel} [channel] - The channel for the interaction.
+ */
+function slash_command(interaction, channel) {
 	if ( !slash.hasOwnProperty(interaction.data.name) ) {
 		console.log( '- Slash: Unknown command: ' + ( isDebug ? JSON.stringify(interaction, null, '\t') : interaction.data.name ) );
 		return client.api.interactions(interaction.id, interaction.token).callback.post( {
@@ -253,7 +263,6 @@ function slash_command(interaction) {
 			}
 		} ).catch(log_error);
 	}
-	var channel = client.channels.cache.get(interaction.channel_id);
 	if ( !interaction.guild_id ) {
 		return slash[interaction.data.name](interaction, new Lang(), new Wiki(), channel);
 	}
@@ -276,35 +285,42 @@ function slash_command(interaction) {
 	} );
 }
 
-function message_button(interaction) {
-	if ( interaction.data.component_type === 2 && interaction.data.custom_id === 'verify_again' && interaction.guild_id ) {
-		if ( !interaction?.message?.embeds?.[0]?.title ) {
-			interaction.message.allowed_mentions = {
-				users: [interaction.user.id]
-			};
-			interaction.message.components = [];
-			return client.api.interactions(interaction.id, interaction.token).callback.post( {
+/**
+ * Handle message components.
+ * @param {Object} interaction - The interaction.
+ * @param {Discord.Client} interaction.client - The client of the interaction.
+ * @param {Discord.TextChannel} [channel] - The channel for the interaction.
+ */
+function message_button(interaction, channel) {
+	if ( interaction.data.component_type !== 2 ) return;
+	var cmd = ( buttonsMap.hasOwnProperty(interaction.data.custom_id) ? buttonsMap[interaction.data.custom_id] : interaction.data.custom_id );
+	if ( !buttons.hasOwnProperty(cmd) ) {
+		console.log( '- Button: Unknown command: ' + ( isDebug ? JSON.stringify(interaction, null, '\t') : interaction.data.custom_id ) );
+		return client.api.interactions(interaction.id, interaction.token).callback.post( {
+			data: {type: 6}
+		} ).then( () => {
+			client.api.webhooks(interaction.application_id, interaction.token).post( {
 				data: {
-					type: 7,
-					data: interaction.message
+					content: '<:error:440871715938238494> [Unknown Button!](<' + process.env.invite + '>) <:error:440871715938238494>',
+					allowed_mentions: {
+						parse: []
+					},
+					flags: 64
 				}
 			} ).catch(log_error);
-		}
-		if ( !interaction.message.content.startsWith( '<@' + ( interaction.member?.nick ? '!' : '' ) + interaction.user.id + '>, ' ) ) {
-			return client.api.interactions(interaction.id, interaction.token).callback.post( {
-				data: {type: 6}
-			} ).catch(log_error);
-		}
-		var channel = client.channels.cache.get(interaction.channel_id);
-		db.query( 'SELECT wiki, lang FROM discord WHERE guild = $1 AND (channel = $2 OR channel = $3 OR channel IS NULL) ORDER BY channel DESC NULLS LAST LIMIT 1', [interaction.guild_id, interaction.channel_id, '#' + channel?.parentID] ).then( ({rows:[row]}) => {
-			return buttons.verify(interaction, new Lang(( row?.lang || channel?.guild?.preferredLocale )), new Wiki(row?.wiki), channel);
-		}, dberror => {
-			console.log( '- Button: Error while getting the wiki: ' + dberror );
-			return client.api.interactions(interaction.id, interaction.token).callback.post( {
-				data: {type: 6}
-			} ).catch(log_error);
-		} );
+		}, log_error);
+	}
+	if ( !interaction.guild_id ) {
+		return buttons[cmd](interaction, new Lang(), new Wiki(), channel);
 	}
+	db.query( 'SELECT wiki, lang FROM discord WHERE guild = $1 AND (channel = $2 OR channel = $3 OR channel IS NULL) ORDER BY channel DESC NULLS LAST LIMIT 1', [interaction.guild_id, interaction.channel_id, '#' + channel?.parentID] ).then( ({rows:[row]}) => {
+		return buttons[cmd](interaction, new Lang(( row?.lang || channel?.guild?.preferredLocale )), new Wiki(row?.wiki), channel);
+	}, dberror => {
+		console.log( '- Button: Error while getting the wiki: ' + dberror );
+		return client.api.interactions(interaction.id, interaction.token).callback.post( {
+			data: {type: 6}
+		} ).catch(log_error);
+	} );
 }
 
 client.on( 'message', msg => {

+ 2 - 2
dashboard/i18n/de.json

@@ -31,7 +31,7 @@
     },
     "indexjs": {
         "invalid": {
-            "note_http": "Die angegebene Website nutzt kein HTTPS!",
+            "note_http": "Die angegebene Website besitzt kein gültiges TLS/SSL-Zertifikat! Aus Sicherheitsgründen werden nur Wikis die HTTPS nutzen unterstützt.",
             "note_private": "Das angegebene Wiki ist privat!",
             "note_timeout": "Der angegebene Link hat zu lange gebraucht um zu antworten!",
             "text": "Die URL konnte nicht zu einer gültigen MediaWiki-Seite aufgelöst werden!",
@@ -120,7 +120,7 @@
             "title": "Einstellungen gespeichert!"
         },
         "savefail": {
-            "note_http": "Die angegebene Website nutzt kein HTTPS!",
+            "note_http": "Die angegebene Website besitzt kein gültiges TLS/SSL-Zertifikat! Aus Sicherheitsgründen werden nur Wikis die HTTPS nutzen unterstützt.",
             "note_private": "Das angegebene Wiki ist privat!",
             "note_timeout": "Der angegebene Link hat zu lange gebraucht um zu antworten!",
             "text": "Die Einstellungen konnten nicht gespeichert werden, bitte versuche es erneut.",

+ 2 - 0
i18n/de.json

@@ -590,6 +590,7 @@
         "special": "Inhalt der Spezialseite:"
     },
     "settings": {
+        "button": "Nutze das Dashboard",
         "channel current": "dies sind die aktuellen Einstellungen für diesen Kanal:",
         "channel lang": "die Sprache für diesen Kanal ist:",
         "channel langchanged": "du hast die Sprache für diesen Kanal geändert zu:",
@@ -785,6 +786,7 @@
     },
     "verify": {
         "audit_reason": "Verifziert als „$1“",
+        "button_again": "Erneut prüfen",
         "discord": "{{GENDER:$1|Discord-Benutzer|Discord-Benutzerin}}:",
         "empty": "*leer*",
         "error": "Die Verifizierung schlug fehl aufgrund eines Fehlers.",

+ 2 - 1
i18n/en.json

@@ -590,7 +590,7 @@
         "special": "Content of this special page:"
     },
     "settings": {
-        "button": "Try the Dashboard",
+        "button": "Use the Dashboard",
         "channel current": "these are the current settings for this channel:",
         "channel lang": "the language for this channel is:",
         "channel langchanged": "you changed the language for this channel to:",
@@ -787,6 +787,7 @@
     "verify": {
         "audit_reason": "Verified as \"$1\"",
         "button_again": "Check again",
+        "button_wrong_user": "You can't check this verification again, this is a verification of $1!",
         "discord": "Discord user:",
         "empty": "*empty*",
         "error": "The verification failed due to an error.",

BIN
i18n/widgets/bn.png


BIN
i18n/widgets/de.png


BIN
i18n/widgets/en.png


BIN
i18n/widgets/es.png


BIN
i18n/widgets/fr.png


BIN
i18n/widgets/hi.png


BIN
i18n/widgets/it.png


BIN
i18n/widgets/ja.png


BIN
i18n/widgets/ko.png


BIN
i18n/widgets/nl.png


BIN
i18n/widgets/pl.png


BIN
i18n/widgets/pt-br.png


BIN
i18n/widgets/ru.png


BIN
i18n/widgets/sv.png


BIN
i18n/widgets/th.png


BIN
i18n/widgets/tr.png


BIN
i18n/widgets/uk.png


BIN
i18n/widgets/vi.png


BIN
i18n/widgets/zh-hans.png


BIN
i18n/widgets/zh-hant.png


+ 43 - 7
interactions/verify.js

@@ -165,6 +165,34 @@ function slash_verify(interaction, lang, wiki, channel) {
  * @param {import('discord.js').TextChannel} [channel] - The channel for the interaction.
  */
  function button_verify(interaction, lang, wiki, channel) {
+	var username = interaction?.message?.embeds?.[0]?.title;
+	if ( !username || !channel?.guild || !interaction.message?.mentions?.[0]?.id ) {
+		interaction.message.allowed_mentions = {
+			users: [interaction.user.id]
+		};
+		interaction.message.components = [];
+		return interaction.client.api.interactions(interaction.id, interaction.token).callback.post( {
+			data: {
+				type: 7,
+				data: interaction.message
+			}
+		} ).catch(log_error);
+	}
+	if ( interaction.user.id !== interaction.message.mentions[0].id ) {
+		return interaction.client.api.interactions(interaction.id, interaction.token).callback.post( {
+			data: {type: 6}
+		} ).then( () => {
+			interaction.client.api.webhooks(interaction.application_id, interaction.token).post( {
+				data: {
+					content: lang.get('verify.button_wrong_user', `<@${interaction.message.mentions[0].id}>`),
+					allowed_mentions: {
+						parse: []
+					},
+					flags: 64
+				}
+			} ).catch(log_error);
+		}, log_error);
+	}
 	return db.query( 'SELECT role, editcount, postcount, usergroup, accountage, rename FROM verification WHERE guild = $1 AND channel LIKE $2 ORDER BY configid ASC', [interaction.guild_id, '%|' + interaction.channel_id + '|%'] ).then( ({rows}) => {
 		if ( !rows.length || !channel.guild.me.permissions.has('MANAGE_ROLES') ) {
 			return interaction.client.api.interactions(interaction.id, interaction.token).callback.post( {
@@ -184,7 +212,6 @@ function slash_verify(interaction, lang, wiki, channel) {
 			}
 		} ).then( () => {
 			return channel.guild.members.fetch(interaction.user.id).then( member => {
-				var username = interaction.message.embeds[0].title;
 				console.log( interaction.guild_id + ': Button: ' + interaction.data.custom_id + ' ' + username );
 				return verify(lang, channel, member, username, wiki, rows).then( result => {
 					var message = {
@@ -193,6 +220,11 @@ function slash_verify(interaction, lang, wiki, channel) {
 						allowed_mentions,
 						components: []
 					};
+					if ( result.reaction ) {
+						if ( result.reaction === 'nowiki' ) message.content = lang.get('interaction.nowiki');
+						else message.content = reply + lang.get('verify.error_reply');
+						message.embeds = [];
+					}
 					if ( result.add_button ) message.components.push({
 						type: 1,
 						components: [
@@ -206,12 +238,16 @@ function slash_verify(interaction, lang, wiki, channel) {
 							}
 						]
 					});
-					if ( result.reaction ) {
-						if ( result.reaction === 'nowiki' ) message.content = lang.get('interaction.nowiki');
-						else message.content = reply + lang.get('verify.error_reply');
-						message.embeds = [];
-					}
 					return sendMessage(interaction, message, channel, false).then( msg => {
+						interaction.client.api.webhooks(interaction.application_id, interaction.token).post( {
+							data: {
+								content: message.content,
+								embeds: message.embeds,
+								allowed_mentions,
+								components: [],
+								flags: 64
+							}
+						} ).catch(log_error);
 						if ( !result.logging.channel || !channel.guild.channels.cache.has(result.logging.channel) ) return;
 						if ( msg ) {
 							if ( result.logging.embed ) result.logging.embed.addField(msg.url, '<#' + channel.id + '>');
@@ -236,7 +272,7 @@ function slash_verify(interaction, lang, wiki, channel) {
 					allowed_mentions
 				}, channel);
 			} );
-		} ).catch(log_error);
+		}, log_error);
 	}, dberror => {
 		console.log( '- Error while getting the verifications: ' + dberror );
 		return interaction.client.api.interactions(interaction.id, interaction.token).callback.post( {