فهرست منبع

Avoid broken edit counts

Markus-Rost 4 سال پیش
والد
کامیت
f60f5fb0ce
2فایلهای تغییر یافته به همراه115 افزوده شده و 107 حذف شده
  1. 50 39
      cmds/verify.js
  2. 65 68
      cmds/wiki/gamepedia/user.js

+ 50 - 39
cmds/verify.js

@@ -1,6 +1,5 @@
 const cheerio = require('cheerio');
 const {MessageEmbed} = require('discord.js');
-const {htmlToPlain} = require('../util/functions.js');
 const toTitle = require('../util/wiki.js').toTitle;
 var db = require('../util/database.js');
 
@@ -129,46 +128,59 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 			}, error => {
 				console.log( '- Error while getting the global block: ' + error );
 				comment.push(lang.get('verify.failed_gblock'));
-			} ).then( async () => {
-				// async check for editcount on Gamepedia and Fandom,
-				// workaround for https://gitlab.com/hydrawiki/hydra/-/issues/5054
-				if ( wiki.isGamepedia() || ( wiki.isFandom() && body.query.general.generator.startsWith( 'MediaWiki 1.3' ) ) ) await got.get( wiki + 'api.php?action=query&list=usercontribs&ucprop=&uclimit=500&ucuser=' + encodeURIComponent( username ) + '&format=json' ).then( ucresponse => {
+			} ).then( () => {
+				var discordname = '';
+				got.get( wiki + 'wikia.php?controller=UserProfile&method=getUserData&userId=' + queryuser.userid + '&format=json&cache=' + Date.now(), {
+					throwHttpErrors: true
+				} ).then( ucresponse => {
 					var ucbody = ucresponse.body;
-					if ( ucbody?.warnings ) log_warn(ucbody.warnings);
-					if ( ucresponse.statusCode !== 200 || !ucbody?.query?.usercontribs ) {
-						return console.log( '- ' + ucresponse.statusCode + ': Error while working around the edit count: ' + ucbody?.error?.info );
-					}
-					if ( !ucbody.continue || ucbody.query.usercontribs.length > queryuser.editcount ) {
-						queryuser.editcount = ucbody.query.usercontribs.length;
+					if ( ucresponse.statusCode !== 200 || !ucbody?.userData?.id ) {
+						console.log( '- ' + ucresponse.statusCode + ': Error while working around the edit count.' );
+						return Promise.reject();
 					}
-				}, ucerror => {
-					console.log( '- Error while working around the edit count: ' + ucerror );
-				} );
-				
-				var options = {};
-				if ( wiki.isGamepedia() ) {
-					url = wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now();
-				}
-				else if ( wiki.isFandom() ) {
-					url = 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '/attr/discordHandle?format=json&cache=' + Date.now();
-					options.headers = {Accept: 'application/hal+json'};
-				}
-				got.get( url, options ).then( presponse => {
-					var pbody = presponse.body;
-					if ( presponse.statusCode !== 200 || !pbody || pbody.error || pbody.errormsg || pbody.title || !( pbody.profile || pbody.value !== undefined ) ) {
-						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.get('verify.error') );
-							msg.replyMsg( lang.get('verify.error_reply'), {embed}, false, false ).then( message => message.reactEmoji('error') );
-							
-							if ( reaction ) reaction.removeEmoji();
-							return;
+					queryuser.editcount = ucbody.userData.localEdits;
+					discordname = ucbody.userData.discordHandle.escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+					
+					if ( wiki.isGamepedia() ) return got.get( wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now() ).then( presponse => {
+						var pbody = presponse.body;
+						if ( presponse.statusCode !== 200 || !pbody || pbody.error || pbody.errormsg || !pbody.profile ) {
+							console.log( '- ' + presponse.statusCode + ': Error while getting the Discord tag: ' + ( pbody?.error?.info || pbody?.errormsg ) );
+							return Promise.reject();
 						}
+						if ( pbody.profile['link-discord'] ) discordname = pbody.profile['link-discord'].escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+					}, error => {
+						console.log( '- Error while getting the Discord tag: ' + error );
+						return Promise.reject();
+					} );
+				}, ucerror => {
+					if ( body.query.general.generator.startsWith( 'MediaWiki 1.3' ) ) {
+						console.log( '- Error while working around the edit count: ' + ucerror );
 					}
-					
-					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' );
+
+					var url = '';
+					var options = {};
+					if ( wiki.isGamepedia() ) {
+						url = wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now();
+					}
+					else if ( wiki.isFandom() ) {
+						url = 'https://services.fandom.com/user-attribute/user/' + queryuser.userid + '/attr/discordHandle?format=json&cache=' + Date.now();
+						options.headers = {Accept: 'application/hal+json'};
+					}
+					return got.get( url, options ).then( presponse => {
+						var pbody = presponse.body;
+						if ( presponse.statusCode !== 200 || !pbody || pbody.error || pbody.errormsg || pbody.title || !( pbody?.userData?.id || pbody.profile || pbody.value !== undefined ) ) {
+							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 ) ) );
+								return Promise.reject();
+							}
+						}
+						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 = pbody.value.escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+					}, error => {
+						console.log( '- Error while getting the Discord tag: ' + error );
+						return Promise.reject();
+					} );
+				} ).then( () => {
 					if ( discordname.length > 50 ) discordname = discordname.substring(0, 50) + '\u2026';
 					embed.addField( lang.get('verify.discord', ( msg.author.tag.escapeFormatting() === discordname ? queryuser.gender : 'unknown' )), msg.author.tag.escapeFormatting(), true ).addField( lang.get('verify.wiki', queryuser.gender), ( discordname || lang.get('verify.empty') ), true );
 					if ( msg.author.tag.escapeFormatting() !== discordname ) {
@@ -243,8 +255,7 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 					msg.replyMsg( lang.get('verify.user_matches_reply', username.escapeFormatting(), queryuser.gender), {embed}, false, false );
 					
 					if ( reaction ) reaction.removeEmoji();
-				}, error => {
-					console.log( '- Error while getting the Discord tag: ' + error );
+				}, () => {
 					embed.setColor('#000000').setDescription( lang.get('verify.error') );
 					msg.replyMsg( lang.get('verify.error_reply'), {embed}, false, false ).then( message => message.reactEmoji('error') );
 					

+ 65 - 68
cmds/wiki/gamepedia/user.js

@@ -314,63 +314,80 @@ 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.isGamepedia() ) return got.get( wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now() ).then( presponse => {
+			if ( wiki.isFandom() ) return got.get( wiki + 'wikia.php?controller=UserProfile&method=getUserData&userId=' + queryuser.userid + '&format=json&cache=' + Date.now() ).then( presponse => {
 				var pbody = presponse.body;
-				if ( presponse.statusCode !== 200 || !pbody || pbody.error || pbody.errormsg || !pbody.profile ) {
-					console.log( '- ' + presponse.statusCode + ': Error while getting the user profile: ' + ( pbody && ( pbody.error && pbody.error.info || pbody.errormsg ) ) );
+				if ( presponse.statusCode !== 200 || !pbody || !pbody.userData || !pbody.userData.id ) {
+					console.log( '- ' + presponse.statusCode + ': Error while getting the user profile.' );
 					return;
 				}
-				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.isGuild() ) 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' );
-					} );
-					var discordname = [lang.get('user.info.discord'),pbody.profile['link-discord'].escapeFormatting()];
-					if ( discordmember ) discordname[1] = discordmember.toString();
-					
-					if ( msg.showEmbed() ) embed.addField( discordname[0], discordname[1], true );
-					else text += '\n' + discordname.join(' ');
-				}
-				if ( pbody.profile['favwiki'] ) {
-					var favwiki = [lang.get('user.info.favwiki'),allSites.find( site => site.md5_key === pbody.profile['favwiki'] )];
-					if ( favwiki[1] ) {
-						if ( msg.showEmbed() ) embed.addField( favwiki[0], '[' + favwiki[1].wiki_display_name + '](<https://' + favwiki[1].wiki_domain + '/>)', true );
-						else text += '\n' + favwiki[0] + ' <https://' + favwiki[1].wiki_domain + '/>';
-					}
-				}
-			}, error => {
-				console.log( '- Error while getting the user profile: ' + error );
-			} ).finally( () => {
 				if ( msg.showEmbed() ) {
-					if ( isBlocked ) {
-						block.text = block.text.replaceSave( /\$3/g, '[' + block.by.escapeFormatting() + '](' + wiki.toLink('User:' + block.by, '', '', true) + ')' );
-						if ( block.reason ) block.text = block.text.replaceSave( /\$4/g, toMarkdown(block.reason, wiki) );
-						embed.addField( block.header, block.text );
+					embed.spliceFields(0, 1, {
+						name: editcount[0],
+						value: '[' + pbody.userData.localEdits + '](' + wiki.toLink(contribs + username, '', '', true) + ')',
+						inline: true
+					});
+					if ( pbody.userData.avatar && pbody.userData.avatar !== 'https://static.wikia.nocookie.net/663e53f7-1e79-4906-95a7-2c1df4ebbada/thumbnail/width/400/height/400' ) {
+						embed.setThumbnail( pbody.userData.avatar.replace( '/thumbnail/width/400/height/400', '' ) );
+					}
+					if ( pbody.userData.bio && !embed.description ) {
+						let bio = pbody.userData.bio.escapeFormatting();
+						if ( bio.length > 2000 ) bio = bio.substring(0, 2000) + '\u2026';
+						embed.setDescription( bio );
 					}
 				}
 				else {
-					if ( isBlocked ) {
-						block.text = block.text.replaceSave( /\$3/g, block.by.escapeFormatting() );
-						if ( block.reason ) block.text = block.text.replaceSave( /\$4/g, toPlaintext(block.reason) );
-						text += '\n\n**' + block.header + '**\n' + block.text;
-					}
+					let splittext = text.split('\n');
+					splittext.splice(4, 1, editcount[0] + ' ' + pbody.userData.localEdits);
+					text = splittext.join('\n');
 				}
-				
-				if ( msg.channel.isGuild() && msg.guild.id in patreons ) {
-					if ( msg.showEmbed() ) embed.addField( '\u200b', '<a:loading:641343250661113886> **' + lang.get('user.info.loading') + '**' );
-					else text += '\n\n<a:loading:641343250661113886> **' + lang.get('user.info.loading') + '**';
-					
-					msg.sendChannel( spoiler + text + spoiler, {embed} ).then( message => global_block(lang, message, username, text, embed, wiki, spoiler, queryuser.gender) );
+				var discord = '';
+				if ( pbody.userData.discordHandle ) {
+					discord = pbody.userData.discordHandle.escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+					if ( discord.length > 50 ) discord = discord.substring(0, 50) + '\u2026';
 				}
-				else msg.sendChannel( spoiler + text + spoiler, {embed} );
-				
-				if ( reaction ) reaction.removeEmoji();
-			} );
-			else if ( wiki.isFandom() ) return got.get( wiki + 'wikia.php?controller=UserProfile&method=getUserData&userId=' + queryuser.userid + '&format=json&cache=' + Date.now() ).then( presponse => {
-				var pbody = presponse.body;
-				if ( presponse.statusCode !== 200 || !pbody || !pbody.userData || !pbody.userData.id ) {
-					console.log( '- ' + presponse.statusCode + ': Error while getting the user profile.' );
-					return;
+				if ( wiki.isGamepedia() ) return got.get( wiki + 'api.php?action=profile&do=getPublicProfile&user_name=' + encodeURIComponent( username ) + '&format=json&cache=' + Date.now() ).then( cpresponse => {
+					var cpbody = cpresponse.body;
+					if ( cpresponse.statusCode !== 200 || !cpbody || cpbody.error || cpbody.errormsg || !cpbody.profile ) {
+						console.log( '- ' + cpresponse.statusCode + ': Error while getting the user profile: ' + ( cpbody && ( cpbody.error && cpbody.error.info || cpbody.errormsg ) ) );
+						return;
+					}
+					if ( cpbody.profile['link-discord'] ) {
+						discord = cpbody.profile['link-discord'].escapeFormatting().replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
+						if ( discord.length > 50 ) discord = discord.substring(0, 50) + '\u2026';
+					}
+					if ( discord ) {
+						if ( msg.channel.isGuild() ) {
+							var discordmember = msg.guild.members.cache.find( member => {
+								return member.user.tag.escapeFormatting() === discord;
+							} );
+						}
+						var discordname = [lang.get('user.info.discord'),discord];
+						if ( discordmember ) discordname[1] = discordmember.toString();
+						
+						if ( msg.showEmbed() ) embed.addField( discordname[0], discordname[1], true );
+						else text += '\n' + discordname.join(' ');
+					}
+					if ( cpbody.profile['favwiki'] ) {
+						var favwiki = [lang.get('user.info.favwiki'),allSites.find( site => site.md5_key === cpbody.profile['favwiki'] )];
+						if ( favwiki[1] ) {
+							if ( msg.showEmbed() ) embed.addField( favwiki[0], '[' + favwiki[1].wiki_display_name + '](<https://' + favwiki[1].wiki_domain + '/>)', true );
+							else text += '\n' + favwiki[0] + ' <https://' + favwiki[1].wiki_domain + '/>';
+						}
+					}
+				}, error => {
+					console.log( '- Error while getting the user profile: ' + error );
+				} );
+				if ( discord ) {
+					if ( msg.channel.isGuild() ) {
+						var discordmember = msg.guild.members.cache.find( member => {
+							return member.user.tag.escapeFormatting() === discord;
+						} );
+					}
+					let discordname = [lang.get('user.info.discord'),discord];
+					if ( discordmember ) discordname[1] = discordmember.toString();
+					
+					if ( msg.showEmbed() ) embed.addField( discordname[0], discordname[1], true );
+					else text += '\n' + discordname.join(' ');
 				}
 				if ( pbody.userData.posts ) {
 					if ( msg.showEmbed() ) embed.spliceFields(1, 0, {
@@ -384,26 +401,6 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 						text = splittext.join('\n');
 					}
 				}
-				if ( pbody.userData.discordHandle ) {
-					let discord = pbody.userData.discordHandle.replace( /^\s*([^@#:]{2,32}?)\s*#(\d{4,6})\s*$/, '$1#$2' );
-					if ( discord.length > 50 ) discord = discord.substring(0, 50) + '\u2026';
-					if ( msg.channel.isGuild() ) var discordmember = msg.guild.members.cache.find( member => {
-						return member.user.tag.escapeFormatting() === discord;
-					} );
-					let discordname = [lang.get('user.info.discord'),discord];
-					if ( discordmember ) discordname[1] = discordmember.toString();
-					
-					if ( msg.showEmbed() ) embed.addField( discordname[0], discordname[1], true );
-					else text += '\n' + discordname.join(' ');
-				}
-				if ( msg.showEmbed() ) {
-					if ( pbody.userData.avatar ) embed.setThumbnail( pbody.userData.avatar.replace( '/thumbnail/width/400/height/400', '' ) );
-					if ( pbody.userData.bio && !embed.description ) {
-						let bio = pbody.userData.bio.escapeFormatting();
-						if ( bio.length > 2000 ) bio = bio.substring(0, 2000) + '\u2026';
-						embed.setDescription( bio );
-					}
-				}
 			}, error => {
 				console.log( '- Error while getting the user profile: ' + error );
 			} ).finally( () => {