1
0
Эх сурвалжийг харах

verification for non-Fandom wikis

Verification for non-Fandom wikis using Special:MyPage/Discord
Markus-Rost 5 жил өмнө
parent
commit
327b45eecd
10 өөрчлөгдсөн 157 нэмэгдсэн , 29 устгасан
  1. 139 20
      bot.js
  2. 2 1
      i18n/de.json
  3. 2 1
      i18n/en.json
  4. 2 1
      i18n/fr.json
  5. 2 1
      i18n/nl.json
  6. 2 1
      i18n/pl.json
  7. 2 1
      i18n/pt.json
  8. 2 1
      i18n/ru.json
  9. 2 1
      i18n/tr.json
  10. 2 1
      i18n/zh.json

+ 139 - 20
bot.js

@@ -2162,7 +2162,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 }
 
 function cmd_verify(lang, msg, args, line, wiki) {
-	if ( !( wiki.endsWith( '.gamepedia.com/' ) || wiki.isFandom() ) || msg.channel.type !== 'text' ) return cmd_link(lang, msg, line.split(' ').slice(1).join(' '), wiki);
+	if ( msg.channel.type !== 'text' ) return cmd_link(lang, msg, line.split(' ').slice(1).join(' '), wiki);
 	if ( !msg.guild.me.permissions.has('MANAGE_ROLES') ) {
 		if ( msg.isAdmin() || msg.isOwner() ) {
 			console.log( msg.guild.id + ': Missing permissions - MANAGE_ROLES' );
@@ -2200,9 +2200,15 @@ function cmd_verify(lang, msg, args, line, wiki) {
 			var body = response.body;
 			if ( body && body.warnings ) log_warn(body.warnings);
 			if ( response.statusCode !== 200 || !body || !body.query || !body.query.users ) {
-				console.log( '- ' + response.statusCode + ': Error while getting the user: ' + ( body && body.error && body.error.info ) );
-				embed.setTitle( username.escapeFormatting() ).setColor('#000000').setDescription( lang.verify.error );
-				msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+				if ( wiki.noWiki(response.url) || response.statusCode === 410 ) {
+					console.log( '- This wiki doesn\'t exist!' );
+					msg.reactEmoji('nowiki');
+				}
+				else {
+					console.log( '- ' + response.statusCode + ': Error while getting the user: ' + ( body && body.error && body.error.info ) );
+					embed.setTitle( username.escapeFormatting() ).setColor('#000000').setDescription( lang.verify.error );
+					msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+				}
 				
 				if ( reaction ) reaction.removeEmoji();
 				return;
@@ -2236,7 +2242,7 @@ function cmd_verify(lang, msg, args, line, wiki) {
 			else if ( wiki.isFandom() ) {
 				url = 'https://community.fandom.com/Special:Contributions/' + encodeURIComponent( username ) + '?limit=1';
 			}
-			got.get( url ).then( gbresponse => {
+			if ( url ) return got.get( url ).then( gbresponse => {
 				if ( gbresponse.statusCode !== 200 || !gbresponse.body ) {
 					console.log( '- ' + gbresponse.statusCode + ': Error while getting the global block.' );
 					comment.push(lang.verify.failed_gblock);
@@ -2296,13 +2302,17 @@ function cmd_verify(lang, msg, args, line, wiki) {
 						if ( !( pbody && pbody.status === 404 ) ) {
 							console.log( '- ' + presponse.statusCode + ': Error while getting the Discord tag: ' + ( pbody && ( pbody.error && pbody.error.info || pbody.errormsg || pbody.title ) ) );
 							embed.setColor('#000000').setDescription( lang.verify.error );
-							return msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+							msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+							
+							if ( reaction ) reaction.removeEmoji();
+							return;
 						}
 					}
 					
 					var discordname = '';
 					if ( pbody.profile ) discordname = pbody.profile['link-discord'].escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
 					else if ( pbody.value ) discordname = htmlToPlain( pbody.value ).replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+					if ( discordname.length > 50 ) discordname = discordname.substring(0, 50) + '\u2026';
 					embed.addField( lang.verify.discord, msg.author.tag.escapeFormatting(), true ).addField( lang.verify.wiki, ( discordname || lang.verify.empty ), true );
 					if ( msg.author.tag.escapeFormatting() !== discordname ) {
 						embed.setColor('#FFFF00').setDescription( lang.verify.user_failed.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) );
@@ -2310,7 +2320,10 @@ function cmd_verify(lang, msg, args, line, wiki) {
 						if ( wiki.endsWith( '.gamepedia.com/' ) ) help_link = lang.verify.help_gamepedia;
 						else if ( wiki.isFandom() ) help_link = lang.verify.help_fandom + '/' + username.toTitle(true) + '?c=' + ( msg.guild.id in patreons && patreons[msg.guild.id] !== process.env.prefix ? encodeURIComponent( patreons[msg.guild.id] + ' verify' ) : 'wb' ) + '&ch=' + encodeURIComponent( msg.channel.name ) + '&user=' + encodeURIComponent( msg.author.username ) + '&tag=' + msg.author.discriminator;
 						if ( help_link.length ) embed.addField( lang.verify.notice, lang.verify.help_guide.replaceSave( '%s', help_link ) + '\n' + help_link );
-						return msg.replyMsg( lang.verify.user_failed_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
+						msg.replyMsg( lang.verify.user_failed_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
+						
+						if ( reaction ) reaction.removeEmoji();
+						return;
 					}
 					
 					var roles = [];
@@ -2356,7 +2369,7 @@ function cmd_verify(lang, msg, args, line, wiki) {
 								comment.push(lang.verify.failed_rename);
 							} ));
 						}
-						Promise.all(verify_promise).finally( () => {
+						return Promise.all(verify_promise).finally( () => {
 							if ( msg.showEmbed() ) {
 								if ( roles.length ) embed.addField( lang.verify.qualified, roles.map( role => '<@&' + role + '>' ).join('\n') );
 								if ( missing.length ) embed.setColor('#008800').addField( lang.verify.qualified_error, missing.map( role => '<@&' + role + '>' ).join('\n') );
@@ -2368,17 +2381,20 @@ function cmd_verify(lang, msg, args, line, wiki) {
 								if ( comment.length ) text += '\n\n' + comment.join('\n');
 							}
 							msg.replyMsg( text, {embed,split:true}, false, false );
+							
+							if ( reaction ) reaction.removeEmoji();
 						} );
 					}
-					else {
-						embed.setColor('#FFFF00').setDescription( lang.verify.user_matches.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) );
-						msg.replyMsg( lang.verify.user_matches_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
-					}
+					
+					embed.setColor('#FFFF00').setDescription( lang.verify.user_matches.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) );
+					msg.replyMsg( lang.verify.user_matches_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
+					
+					if ( reaction ) reaction.removeEmoji();
 				}, error => {
 					console.log( '- Error while getting the Discord tag: ' + error );
 					embed.setColor('#000000').setDescription( lang.verify.error );
 					msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
-				} ).finally( () => {
+					
 					if ( reaction ) reaction.removeEmoji();
 				} );
 			}, error => {
@@ -2387,6 +2403,106 @@ function cmd_verify(lang, msg, args, line, wiki) {
 				
 				if ( reaction ) reaction.removeEmoji();
 			} );
+			
+			got.get( wiki + 'api.php?action=query&prop=revisions&rvprop=content|user&rvslots=main&titles=User:' + encodeURIComponent( username ) + '/Discord&format=json', {
+				responseType: 'json'
+			} ).then( mwresponse => {
+				var mwbody = mwresponse.body;
+				if ( mwbody && mwbody.warnings ) log_warn(mwbody.warnings);
+				if ( mwresponse.statusCode !== 200 || !mwbody || mwbody.batchcomplete === undefined || !mwbody.query || !mwbody.query.pages ) {
+					console.log( '- ' + mwresponse.statusCode + ': Error while getting the Discord tag: ' + ( mwbody && mwbody.error && mwbody.error.info ) );
+					embed.setColor('#000000').setDescription( lang.verify.error );
+					msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+					
+					if ( reaction ) reaction.removeEmoji();
+					return;
+				}
+				var revision = Object.values(mwbody.query.pages)[0]?.revisions?.[0];
+				
+				var discordname = '';
+				if ( revision && revision.user === username ) discordname = revision.slots.main['*'].escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+				if ( discordname.length > 50 ) discordname = discordname.substring(0, 50) + '\u2026';
+				embed.addField( lang.verify.discord, msg.author.tag.escapeFormatting(), true ).addField( lang.verify.wiki, ( discordname || lang.verify.empty ), true );
+				if ( msg.author.tag.escapeFormatting() !== discordname ) {
+					embed.setColor('#FFFF00').setDescription( lang.verify.user_failed.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) );
+					embed.addField( lang.verify.notice, lang.verify.help_subpage.replaceSave( '%s', '***`' + msg.author.tag + '`***' ) + '\n' + wiki.toLink('Special:MyPage/Discord', 'action=edit', '', body.query.general) );
+					msg.replyMsg( lang.verify.user_failed_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
+					
+					if ( reaction ) reaction.removeEmoji();
+					return;
+				}
+				
+				var roles = [];
+				var missing = [];
+				var verified = false;
+				var rename = false;
+				var accountage = ( Date.now() - new Date(queryuser.registration) ) / 86400000;
+				rows.forEach( row => {
+					var and_or = 'some';
+					if ( row.usergroup.startsWith( 'AND|' ) ) {
+						row.usergroup = row.usergroup.replace( 'AND|', '' );
+						and_or = 'every';
+					}
+					if ( queryuser.editcount >= row.editcount && row.usergroup.split('|')[and_or]( usergroup => {
+						if ( !queryuser.groupmemberships ) return queryuser.groups.includes( usergroup );
+						if ( !queryuser.groups.includes( 'global_' + usergroup ) || queryuser.groupmemberships.some( member => member.group === usergroup ) ) {
+							return queryuser.groups.includes( usergroup );
+						}
+						return false;
+					} ) && accountage >= row.accountage && row.role.split('|').some( role => !roles.includes( role ) ) ) {
+						verified = true;
+						if ( row.rename ) rename = true;
+						row.role.split('|').forEach( role => {
+							if ( !roles.includes( role ) ) {
+								if ( msg.guild.roles.cache.has(role) && msg.guild.me.roles.highest.comparePositionTo(role) > 0 ) roles.push(role);
+								else if ( !missing.includes( role ) ) missing.push(role);
+							}
+						} );
+					}
+				} );
+				if ( verified ) {
+					embed.setColor('#00FF00').setDescription( lang.verify.user_verified.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) + ( rename ? '\n' + lang.verify.user_renamed : '' ) );
+					var text = lang.verify.user_verified_reply.replaceSave( '%s', username.escapeFormatting() );
+					var verify_promise = [
+						msg.member.roles.add( roles, lang.verify.audit_reason.replaceSave( '%s', username ) ).catch( error => {
+							embed.setColor('#008800');
+							comment.push(lang.verify.failed_roles);
+						} )
+					];
+					if ( rename ) {
+						verify_promise.push(msg.member.setNickname( username.substring(0, 32), lang.verify.audit_reason.replaceSave( '%s', username ) ).catch( error => {
+							embed.setColor('#008800');
+							comment.push(lang.verify.failed_rename);
+						} ));
+					}
+					return Promise.all(verify_promise).finally( () => {
+						if ( msg.showEmbed() ) {
+							if ( roles.length ) embed.addField( lang.verify.qualified, roles.map( role => '<@&' + role + '>' ).join('\n') );
+							if ( missing.length ) embed.setColor('#008800').addField( lang.verify.qualified_error, missing.map( role => '<@&' + role + '>' ).join('\n') );
+							if ( comment.length ) embed.setColor('#008800').addField( lang.verify.notice, comment.join('\n') );
+						}
+						else {
+							if ( roles.length ) text += '\n\n' + lang.verify.qualified + ' ' + roles.map( role => '<@&' + role + '>' ).join(', ');
+							if ( missing.length ) text += '\n\n' + lang.verify.qualified_error + ' ' + missing.map( role => '<@&' + role + '>' ).join(', ');
+							if ( comment.length ) text += '\n\n' + comment.join('\n');
+						}
+						msg.replyMsg( text, {embed,split:true}, false, false );
+						
+						if ( reaction ) reaction.removeEmoji();
+					} );
+				}
+				
+				embed.setColor('#FFFF00').setDescription( lang.verify.user_matches.replaceSave( '%1$s', msg.member.toString() ).replaceSave( '%2$s', '[' + username.escapeFormatting() + '](' + pagelink + ')' ) );
+				msg.replyMsg( lang.verify.user_matches_reply.replaceSave( '%s', username.escapeFormatting() ), {embed}, false, false );
+				
+				if ( reaction ) reaction.removeEmoji();
+			}, error => {
+				console.log( '- Error while getting the Discord tag: ' + error );
+				embed.setColor('#000000').setDescription( lang.verify.error );
+				msg.replyMsg( lang.verify.error_reply, {embed}, false, false ).then( message => message.reactEmoji('error') );
+				
+				if ( reaction ) reaction.removeEmoji();
+			} );
 		}, error => {
 			console.log( '- Error while getting the user: ' + error );
 			embed.setColor('#000000').setDescription( lang.verify.error );
@@ -2631,7 +2747,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						var embed = {};
 						var text = '<' + pagelink + '>\n\n' + gender.join(' ') + '\n' + registration.join(' ') + '\n' + editcount.join(' ') + '\n' + group[0] + ' ' + group.slice(1).join(', ');
 					}
-					if ( wiki.endsWith( '.gamepedia.com/' ) ) got.get( wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json', {
+					if ( wiki.endsWith( '.gamepedia.com/' ) ) got.get( wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now(), {
 						responseType: 'json'
 					} ).then( presponse => {
 						var pbody = presponse.body;
@@ -2640,6 +2756,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						}
 						else {
 							if ( pbody.profile['link-discord'] ) {
+								if ( pbody.profile['link-discord'].length > 50 ) pbody.profile['link-discord'] = pbody.profile['link-discord'].substring(0, 50) + '\u2026';
 								if ( msg.channel.type === 'text' ) var discordmember = msg.guild.members.cache.find( member => {
 									return member.user.tag === pbody.profile['link-discord'].replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
 								} );
@@ -2673,7 +2790,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						
 						if ( reaction ) reaction.removeEmoji();
 					} );
-					else if ( wiki.isFandom() ) got.get( 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '?format=json', {
+					else if ( wiki.isFandom() ) got.get( 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '?format=json&cache=' + Date.now(), {
 						headers: {
 							Accept: 'application/hal+json'
 						},
@@ -2692,6 +2809,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 							var biofield = profile.find( field => field.name === 'bio' );
 							if ( discordfield && discordfield.value ) {
 								discordfield.value = htmlToPlain( discordfield.value ).replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+								if ( discordfield.value.length > 50 ) discordfield.value = discordfield.value.substring(0, 50) + '\u2026';
 								if ( msg.channel.type === 'text' ) var discordmember = msg.guild.members.cache.find( member => {
 									return member.user.tag.escapeFormatting() === discordfield.value;
 								} );
@@ -2990,7 +3108,7 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 						var text = '<' + pagelink + '>\n\n' + gender.join(' ') + '\n' + registration.join(' ') + '\n' + editcount.join(' ') + '\n' + group[0] + ' ' + group.slice(1).join(', ');
 					}
 					
-					got.get( 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '?format=json', {
+					got.get( 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '?format=json&cache=' + Date.now(), {
 						headers: {
 							Accept: 'application/hal+json'
 						},
@@ -3009,6 +3127,7 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 							var biofield = profile.find( field => field.name === 'bio' );
 							if ( discordfield && discordfield.value ) {
 								discordfield.value = htmlToPlain( discordfield.value ).replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+								if ( discordfield.value.length > 50 ) discordfield.value = discordfield.value.substring(0, 50) + '\u2026';
 								if ( msg.channel.type === 'text' ) var discordmember = msg.guild.members.cache.find( member => {
 									return member.user.tag.escapeFormatting() === discordfield.value;
 								} );
@@ -5188,7 +5307,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 	}
 	
 	if ( args[0] === 'enable' && /^\d+$/.test(args.slice(1).join(' ')) ) return client.shard.broadcastEval( `this.guilds.cache.get('${args[1]}')?.name` ).then( results => {
-		var guild = results.find( result => result !== undefined );
+		var guild = results.find( result => result !== null );
 		if ( guild === undefined ) return msg.replyMsg( 'I\'m not on a server with the id `' + args[1] + '`.', {}, true );
 		if ( args[1] in patreons ) return msg.replyMsg( '"' + guild + '" has the patreon features already enabled.', {}, true );
 		db.get( 'SELECT count, COUNT(guild) guilds FROM patreons LEFT JOIN discord ON discord.patreon = patreons.patreon WHERE patreons.patreon = ? GROUP BY patreons.patreon', [msg.author.id], (dberror, row) => {
@@ -5223,7 +5342,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 	} );
 	
 	if ( args[0] === 'disable' && /^\d+$/.test(args.slice(1).join(' ')) ) return client.shard.broadcastEval( `this.guilds.cache.get('${args[1]}')?.name` ).then( results => {
-		var guild = results.find( result => result !== undefined );
+		var guild = results.find( result => result !== null );
 		if ( guild === undefined ) return msg.replyMsg( 'I\'m not on a server with the id `' + args[1] + '`.', {}, true );
 		if ( !( args[1] in patreons ) ) return msg.replyMsg( '"' + guild + '" doesn\'t have the patreon features enabled.', {}, true );
 		db.get( 'SELECT lang, inline FROM discord WHERE guild = ? AND patreon = ?', [args[1], msg.author.id], (dberror, row) => {
@@ -5259,7 +5378,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 			var text = 'you can have up to ' + row.count + ' server.\n\n';
 			if ( row.guilds ) {
 				client.shard.broadcastEval( `'${row.guilds}'.split(',').map( guild => this.guilds.cache.get(guild)?.name )` ).then( results => {
-					var guilds = row.guilds.split(',').map( (guild, i) => '`' + guild + '` ' + ( results.find( result => result[i] !== undefined )?.[i] || '' ) );
+					var guilds = row.guilds.split(',').map( (guild, i) => '`' + guild + '` ' + ( results.find( result => result[i] !== null )?.[i] || '' ) );
 					text += 'Currently you have ' + guilds.length + ' server:\n' + guilds.join('\n');
 					msg.replyMsg( text, {}, true );
 				} );
@@ -5279,7 +5398,7 @@ function cmd_patreon(lang, msg, args, line, wiki) {
 			var text = '<@' + args[1] + '> can have up to ' + row.count + ' server.\n\n';
 			if ( row.guilds ) {
 				client.shard.broadcastEval( `'${row.guilds}'.split(',').map( guild => this.guilds.cache.get(guild)?.name )` ).then( results => {
-					var guilds = row.guilds.split(',').map( (guild, i) => '`' + guild + '` ' + ( results.find( result => result[i] !== undefined )?.[i] || '' ) );
+					var guilds = row.guilds.split(',').map( (guild, i) => '`' + guild + '` ' + ( results.find( result => result[i] !== null )?.[i] || '' ) );
 					text += 'Currently they have ' + guilds.length + ' server:\n' + guilds.join('\n');
 					msg.replyMsg( text, {}, true );
 				} );

+ 2 - 1
i18n/de.json

@@ -151,7 +151,8 @@
 		"qualified_error": "Qualifiziert für, aber konnte nicht hinzugefügt werden:",
 		"help_guide": "Folge [dieser Anleitung](%s) um dein Discord-Tag auf deinem Wiki-Profil hinzuzufügen:",
 		"help_gamepedia": "https://help-de.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Bitte füge dein Discord-Tag (%s) zu deiner Discord-Unterseite im Wiki hinzu:"
 	},
 	"overview": {
 		"inaccurate": "Statistiken können ungenau sein",

+ 2 - 1
i18n/en.json

@@ -146,7 +146,8 @@
 		"qualified_error": "Qualified for, but could not add:",
 		"help_guide": "Follow [this guide](%s) to add your Discord tag to your wiki profile:",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Statistics may be inaccurate",

+ 2 - 1
i18n/fr.json

@@ -148,7 +148,8 @@
 		"qualified_error": "Qualified for, but could not add:",
 		"help_guide": "Follow [this guide](%s) to add your Discord tag to your wiki profile.",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Les statistiques peuvent être inexactes",

+ 2 - 1
i18n/nl.json

@@ -150,7 +150,8 @@
 		"qualified_error": "Qualified for, but could not add:",
 		"help_guide": "Follow [this guide](%s) to add your Discord tag to your wiki profile.",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Statistieken zijn mogelijk inaccuraat",

+ 2 - 1
i18n/pl.json

@@ -151,7 +151,8 @@
 		"qualified_error": "Pozwala na otrzymanie ról, których nie udało się dodać:",
 		"help_guide": "Podążaj za [tym poradnikiem](%s) w celu dodania nazwy użytkownika Discord na profil wiki.",
 		"help_gamepedia": "https://help-pl.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Statystyki mogą być niedokładne",

+ 2 - 1
i18n/pt.json

@@ -151,7 +151,8 @@
 		"qualified_error": "Qualificado para, mas não foi possível adicionar:",
 		"help_guide": "Siga [esse guia](%s) para adicionar seu nome de usuário do Discord ao seu perfil wiki:",
 		"help_gamepedia": "https://help-pt.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Estatísticas podem ser imprecisas",

+ 2 - 1
i18n/ru.json

@@ -148,7 +148,8 @@
 		"qualified_error": "Оценен, но не может быть добавлен:",
 		"help_guide": "Изучите [этот гайд](%s) для добавления пользователя Discord в свой профиль:",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "Статистика может быть неточной ",

+ 2 - 1
i18n/tr.json

@@ -150,7 +150,8 @@
 		"qualified_error": "Qualified for, but could not add:",
 		"help_guide": "Follow [this guide](%s) to add your Discord tag to your wiki profile.",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "İstatistikler yanlış olabilir",

+ 2 - 1
i18n/zh.json

@@ -148,7 +148,8 @@
 		"qualified_error": "符合,但无法添加:",
 		"help_guide": "请根据[此指导](%s)来添加您的Discord用户名至您的wiki资料页。",
 		"help_gamepedia": "https://help.gamepedia.com/Discord",
-		"help_fandom": "https://community.fandom.com/zh/wiki/Special:VerifyUser"
+		"help_fandom": "https://community.fandom.com/zh/wiki/Special:VerifyUser",
+		"help_subpage": "Please add your Discord tag (%s) to your Discord subpage on the wiki:"
 	},
 	"overview": {
 		"inaccurate": "统计信息可能出错",