Procházet zdrojové kódy

Add support for CentralAuth

Markus-Rost před 4 roky
rodič
revize
1158f97067
9 změnil soubory, kde provedl 129 přidání a 42 odebrání
  1. 1 1
      RcGcDb
  2. 11 1
      cmds/verify.js
  3. 1 1
      cmds/wiki/fandom/user.js
  4. 63 16
      cmds/wiki/user.js
  5. 2 2
      functions/global_block.js
  6. 2 1
      i18n/en.json
  7. 7 7
      util/database.js
  8. 30 12
      util/default.json
  9. 12 1
      util/wiki.js

+ 1 - 1
RcGcDb

@@ -1 +1 @@
-Subproject commit 44d38c4cd1ba7e51c23dcd94bb25fe1f967cbdd8
+Subproject commit 5cdd84e4f98e119b2760aa6c71a996b910562670

+ 11 - 1
cmds/verify.js

@@ -268,7 +268,7 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 				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' ).then( mwresponse => {
+			got.get( wiki + 'api.php?action=query' + ( wiki.hasCentralAuth() ? '&meta=globaluserinfo&guiprop=groups&guiuser=' + encodeURIComponent( username ) : '' ) + '&prop=revisions&rvprop=content|user&rvslots=main&titles=User:' + encodeURIComponent( username ) + '/Discord&format=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 ) {
@@ -279,6 +279,16 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 					if ( reaction ) reaction.removeEmoji();
 					return;
 				}
+				if ( wiki.hasCentralAuth() ) {
+					if ( mwbody.query.globaluserinfo.locked !== undefined ) {
+						embed.setColor('#FF0000').setDescription( lang.get('verify.user_gblocked', '[' + username.escapeFormatting() + '](' + pagelink + ')', queryuser.gender) );
+						msg.replyMsg( lang.get('verify.user_gblocked_reply', username.escapeFormatting(), queryuser.gender), {embed}, false, false );
+						
+						if ( reaction ) reaction.removeEmoji();
+						return;
+					}
+					queryuser.groups.push(...mwbody.query.globaluserinfo.groups);
+				}
 				var revision = Object.values(mwbody.query.pages)[0]?.revisions?.[0];
 				
 				var discordname = '';

+ 1 - 1
cmds/wiki/fandom/user.js

@@ -242,7 +242,7 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 					var registration = [lang.get('user.info.registration'), new Date(queryuser.registration).toLocaleString(lang.get('dateformat'), timeoptions)];
 					var editcount = [lang.get('user.info.editcount'), queryuser.editcount];
 					var groups = queryuser.groups;
-					var group = [lang.get('user.info.group')];
+					var group = [lang.get('user.info.group', groups.length)];
 					for ( var i = 0; i < usergroups.sorted.length; i++ ) {
 						let usergroup = usergroups.sorted[i];
 						if ( usergroup === '__CUSTOM__' ) {

+ 63 - 16
cmds/wiki/user.js

@@ -177,7 +177,7 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 		if ( reaction ) reaction.removeEmoji();
 	} );
 
-	got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-Wiki_Manager&amenableparser=true&siprop=general&prop=revisions&rvprop=content|user&rvslots=main&titles=User:' + encodeURIComponent( username ) + '/Discord&list=users&usprop=blockinfo|groups|editcount|registration|gender&ususers=' + encodeURIComponent( username ) + '&format=json' ).then( response => {
+	got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo' + ( wiki.hasCentralAuth() ? '|globaluserinfo&guiprop=groups|editcount|merged&guiuser=' + encodeURIComponent( username ) + '&' : '' ) + '&ammessages=custom-Wiki_Manager&amenableparser=true&siprop=general&prop=revisions&rvprop=content|user&rvslots=main&titles=User:' + encodeURIComponent( username ) + '/Discord&list=users&usprop=blockinfo|groups|editcount|registration|gender&ususers=' + encodeURIComponent( username ) + '&format=json' ).then( response => {
 		var body = response.body;
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.users || !body.query.users[0] ) {
@@ -238,21 +238,33 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 		var registration = [lang.get('user.info.registration'), new Date(queryuser.registration).toLocaleString(lang.get('dateformat'), timeoptions)];
 		var editcount = [lang.get('user.info.editcount'), queryuser.editcount];
 		var groups = queryuser.groups.filter( group => !usergroups.ignored.includes( group ) );
-		var groupnames = groups;
-		got.get( wiki + 'api.php?action=query&meta=allmessages&amenableparser=true&amincludelocal=true&amargs=' + encodeURIComponent( username ) + '&amlang=' + lang.lang + '&ammessages=' + groups.map( group => `group-${group}|group-${group}-member` ).join('|') + '&format=json' ).then( gresponse => {
+		var globalgroups = [];
+		if ( wiki.isFandom() ) {
+			globalgroups = groups.filter( group => usergroups.global.includes( group ) );
+			groups = groups.filter( group => !usergroups.global.includes( group ) );
+		}
+		else if ( wiki.hasCentralAuth() ) {
+			globalgroups = body.query.globaluserinfo.groups.filter( group => !usergroups.ignored.includes( group ) );
+		}
+		var groupnames = [];
+		groupnames.push(...groups);
+		groupnames.push(...globalgroups);
+		got.get( wiki + 'api.php?action=query&meta=allmessages&amenableparser=true&amincludelocal=true&amargs=' + encodeURIComponent( username ) + '&amlang=' + lang.lang + '&ammessages=' + groupnames.map( group => `group-${group}|group-${group}-member` ).join('|') + '&format=json' ).then( gresponse => {
 			var gbody = gresponse.body;
 			if ( gbody && gbody.warnings ) log_warn(gbody.warnings);
 			if ( gresponse.statusCode !== 200 || !gbody || gbody.batchcomplete === undefined || !gbody?.query?.allmessages?.length ) {
 				console.log( '- ' + gresponse.statusCode + ': Error while getting the group names: ' + gbody?.error?.info );
 				return;
 			}
-			groupnames = groups.map( group => {
+			groupnames = groupnames.map( group => {
 				return ( gbody.query.allmessages.find( message => message.normalizedname === `group-${group}-member` )['*'] || gbody.query.allmessages.find( message => message.normalizedname === `group-${group}` )['*'] || group );
 			} );
 		}, error => {
 			console.log( '- Error while getting the group names: ' + error );
 		} ).finally( () => {
-			var group = [lang.get('user.info.group')];
+			var group = [lang.get('user.info.group', ( groups.filter( usergroup => {
+				return !['autoconfirmed', 'user'].includes( usergroup )
+			} ).length || 1 ))];
 			for ( var i = 0; i < usergroups.sorted.length; i++ ) {
 				let usergroup = usergroups.sorted[i];
 				if ( usergroup === '__CUSTOM__' ) {
@@ -263,15 +275,31 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 					} ));
 				}
 				else if ( groups.includes( usergroup ) && ( group.length === 1 || !['autoconfirmed', 'user'].includes( usergroup ) ) ) {
-					let thisSite = allSites.find( site => site.wiki_domain === wiki.hostname );
-					if ( usergroup === 'wiki_manager' && thisSite && thisSite.wiki_managers.includes( username ) ) {
-						group.push('**' + groupnames[groups.indexOf(usergroup)] + '**');
-					}
-					else if ( usergroup === 'wiki-manager' && ( body.query.allmessages[0]['*'] === username || thisSite && thisSite.wiki_managers.includes( username ) ) ) {
-						group.push('**' + groupnames[groups.indexOf(usergroup)] + '**');
+					group.push(groupnames[groups.indexOf(usergroup)]);
+				}
+			}
+			var globalgroup = [lang.get('user.info.globalgroup', globalgroups.length)];
+			if ( globalgroup.length ) {
+				for ( var i = 0; i < usergroups.global.length; i++ ) {
+					let usergroup = usergroups.global[i];
+					if ( usergroup === '__CUSTOM__' ) {
+						globalgroup.push(...globalgroups.filter( customgroup => {
+							return !usergroups.global.includes( customgroup );
+						} ).map( customgroup => {
+							return groupnames[globalgroups.indexOf(customgroup) + groups.length];
+						} ));
 					}
-					else {
-						group.push(groupnames[groups.indexOf(usergroup)]);
+					else if ( globalgroups.includes( usergroup ) ) {
+						let thisSite = allSites.find( site => site.wiki_domain === wiki.hostname );
+						if ( usergroup === 'wiki_manager' && thisSite && thisSite.wiki_managers.includes( username ) ) {
+							globalgroup.push('**' + groupnames[globalgroups.indexOf(usergroup) + groups.length] + '**');
+						}
+						else if ( usergroup === 'wiki-manager' && ( body.query.allmessages[0]['*'] === username || thisSite && thisSite.wiki_managers.includes( username ) ) ) {
+							globalgroup.push('**' + groupnames[globalgroups.indexOf(usergroup) + groups.length] + '**');
+						}
+						else {
+							globalgroup.push(groupnames[globalgroups.indexOf(usergroup) + groups.length]);
+						}
 					}
 				}
 			}
@@ -298,7 +326,15 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 			var pagelink = wiki.toLink(namespace + username, querystring, fragment);
 			if ( msg.showEmbed() ) {
 				var text = '<' + pagelink + '>';
-				var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( username.escapeFormatting() ).setURL( pagelink ).addField( editcount[0], '[' + editcount[1] + '](' + wiki.toLink(contribs + username, '', '', true) + ')', true ).addField( group[0], group.slice(1).join(',\n'), true ).addField( gender[0], gender[1], true ).addField( registration[0], registration[1], true );
+				var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( username.escapeFormatting() ).setURL( pagelink ).addField( editcount[0], '[' + editcount[1] + '](' + wiki.toLink(contribs + username, '', '', true) + ')', true );
+				if ( wiki.hasCentralAuth() ) {
+					embed.addField( lang.get('user.info.globaleditcount'), '[' + body.query.globaluserinfo.editcount + '](' + wiki.toLink('Special:CentralAuth/' + username, '', '', true) + ')', true ).addField( lang.get('user.info.wikisedited'), '[' + body.query.globaluserinfo.merged.filter( mergedWiki => mergedWiki.editcount ).length + '](' + wiki.toLink('Special:CentralAuth/' + username, '', '', true) + ')', true );
+				}
+				embed.addField( group[0], group.slice(1).join(',\n'), true );
+				if ( globalgroup.length > 1 ) {
+					embed.addField( globalgroup[0], globalgroup.slice(1).join(',\n'), true );
+				}
+				embed.addField( gender[0], gender[1], true ).addField( registration[0], registration[1], true );
 				
 				if ( querypage.pageprops && querypage.pageprops.description ) {
 					var description = htmlToPlain( querypage.pageprops.description );
@@ -312,7 +348,14 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 			}
 			else {
 				var embed = {};
-				var text = '<' + pagelink + '>\n\n' + gender.join(' ') + '\n' + registration.join(' ') + '\n' + editcount.join(' ') + '\n' + group[0] + ' ' + group.slice(1).join(', ');
+				var text = '<' + pagelink + '>\n\n' + gender.join(' ') + '\n' + registration.join(' ') + '\n' + editcount.join(' ');
+				if ( wiki.hasCentralAuth() ) {
+					text += '\n' + lang.get('user.info.globaleditcount') + ' ' + body.query.globaluserinfo.editcount + '\n' + lang.get('user.info.wikisedited') + ' ' + body.query.globaluserinfo.merged.filter( mergedWiki => mergedWiki.editcount ).length;
+				}
+				text += '\n' + group[0] + ' ' + group.slice(1).join(', ');
+				if ( globalgroup.length > 1 ) {
+					text += '\n' + globalgroup[0] + ' ' + globalgroup.slice(1).join(', ');
+				}
 			}
 			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;
@@ -456,8 +499,12 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 					text += '\n\n**' + block.header + '**\n' + block.text;
 				}
 			}
+			if ( wiki.hasCentralAuth() && body.query.globaluserinfo.locked !== undefined ) {
+				if ( msg.showEmbed() ) embed.addField( '\u200b', '**' + lang.get('user.gblock.header', username, gender).escapeFormatting() + '**' );
+				else text += '\n\n**' + lang.get('user.gblock.header', username, gender).escapeFormatting() + '**';
+			}
 			
-			msg.sendChannel( spoiler + text + spoiler, {embed} ).then( message => global_block(lang, message, username, text, embed, wiki, spoiler, queryuser.gender) );
+			msg.sendChannel( spoiler + text + spoiler, {embed} );
 			
 			if ( reaction ) reaction.removeEmoji();
 		} );

+ 2 - 2
functions/global_block.js

@@ -40,11 +40,11 @@ function global_block(lang, msg, username, text, embed, wiki, spoiler, gender) {
 			else {
 				let $ = cheerio.load(body);
 				if ( $('#mw-content-text .errorbox').length ) {
-					if ( msg.showEmbed() ) embed.addField( lang.get('user.gblock.disabled'), '\u200b' );
+					if ( msg.showEmbed() ) embed.addField( '\u200b', '**' + lang.get('user.gblock.disabled') + '**' );
 					else text += '\n\n**' + lang.get('user.gblock.disabled') + '**';
 				}
 				else if ( $('.mw-warning-with-logexcerpt').length && !$(".mw-warning-with-logexcerpt .mw-logline-block").length ) {
-					if ( msg.showEmbed() ) embed.addField( lang.get('user.gblock.header', username, gender).escapeFormatting(), '\u200b' );
+					if ( msg.showEmbed() ) embed.addField( '\u200b', '**' + lang.get('user.gblock.header', username, gender).escapeFormatting() + '**' );
 					else text += '\n\n**' + lang.get('user.gblock.header', username, gender).escapeFormatting() + '**';
 				}
 			}

+ 2 - 1
i18n/en.json

@@ -640,7 +640,8 @@
             "favwiki": "Favorite wiki:",
             "gender": "Gender:",
             "globaleditcount": "Global edit count:",
-            "group": "Group:",
+            "globalgroup": "Global {{PLURAL:$1|group|groups}}:",
+            "group": "{{PLURAL:$1|Group|Groups}}:",
             "loading": "Loading global statistics…",
             "postcount": "Discussion posts:",
             "registration": "Registration date:",

+ 7 - 7
util/database.js

@@ -77,13 +77,6 @@ function getSettings(trysettings = 1) {
 						}
 						console.log( '- ' + shardId + ': Created the discord channel index.' );
 					} );
-					db.run( 'PRAGMA foreign_keys = ON;', [], function (fkerror) {
-						if ( fkerror ) {
-							console.log( '- ' + shardId + ': Error while enabling the foreign key constraint: ' + fkerror );
-							return fkerror;
-						}
-						console.log( '- ' + shardId + ': Enabled the foreign key constraint.' );
-					} );
 					if ( trysettings < 10 ) {
 						trysettings++;
 						getSettings(trysettings);
@@ -154,6 +147,13 @@ function getSettings(trysettings = 1) {
 			}
 			return dberror;
 		}
+		db.run( 'PRAGMA foreign_keys = ON;', [], function (fkerror) {
+			if ( fkerror ) {
+				console.log( '- ' + shardId + ': Error while enabling the foreign key constraint: ' + fkerror );
+				return fkerror;
+			}
+			console.log( '- ' + shardId + ': Enabled the foreign key constraint.' );
+		} );
 		console.log( '- ' + shardId + ': Patreons successfully loaded.' );
 		getVoice();
 	} );

+ 30 - 12
util/default.json

@@ -54,18 +54,6 @@
 			"*"
 		],
 		"sorted": [
-			"global_bot",
-			"hydra_staff",
-			"wiki_manager",
-			"grasp",
-			"bot-global",
-			"staff",
-			"wiki-manager",
-			"helper",
-			"content-team-member",
-			"soap",
-			"global-discussions-moderator",
-			"vanguard",
 			"bot",
 			"checkuser",
 			"bureaucrat",
@@ -83,6 +71,36 @@
 			"rollback",
 			"autoconfirmed",
 			"user"
+		],
+		"global": [
+			"global_bot",
+			"hydra_staff",
+			"wiki_manager",
+			"grasp",
+			"founder",
+			"global-bot",
+			"bot-global",
+			"flood",
+			"staff",
+			"sysadmin",
+			"steward",
+			"wiki-manager",
+			"global-interface-editor",
+			"helper",
+			"global-sysop",
+			"globalsysop",
+			"content-team-member",
+			"ombuds",
+			"soap",
+			"global-discussions-moderator",
+			"vanguard",
+			"__CUSTOM__",
+			"interwiki-admin",
+			"global-deleter",
+			"abusefilter-maintainer",
+			"abusefilter-helper",
+			"global-rollbacker",
+			"global-ipblock-exempt"
 		]
 	},
 	"wikiProjects": [

+ 12 - 1
util/wiki.js

@@ -25,6 +25,7 @@ class Wiki extends URL {
 		}
 		this.articlepath = articlepath;
 		this.mainpage = '';
+		this.centralauth = 'local';
 	}
 
 	/**
@@ -55,14 +56,16 @@ class Wiki extends URL {
 	 * @param {String} siteinfo.scriptpath - Scriptpath of the wiki.
 	 * @param {String} siteinfo.articlepath - Articlepath of the wiki.
 	 * @param {String} siteinfo.mainpage - Main page of the wiki.
+	 * @param {String} siteinfo.centralidlookupprovider - Central auth of the wiki.
 	 * @returns {Wiki}
 	 */
-	updateWiki({server, servername, scriptpath, articlepath, mainpage}) {
+	updateWiki({server, servername, scriptpath, articlepath, mainpage, centralidlookupprovider}) {
 		if ( servername ) this.hostname = servername;
 		else this.hostname = server.replace( /^(?:https?:)?\/\//, '' );
 		this.pathname = scriptpath + '/';
 		this.articlepath = articlepath;
 		this.mainpage = mainpage;
+		this.centralauth = centralidlookupprovider;
 		return this;
 	}
 
@@ -84,6 +87,14 @@ class Wiki extends URL {
 		return this.hostname.endsWith( '.gamepedia.com' );
 	}
 
+	/**
+	 * Check for CentralAuth.
+	 * @returns {Boolean}
+	 */
+	hasCentralAuth() {
+		return this.centralauth === 'CentralAuth';
+	}
+
 	/**
 	 * Check if a wiki is missing.
 	 * @param {String} [message] - Error message or response url.