ソースを参照

add fallback for timezone

Markus-Rost 4 年 前
コミット
f1ee907c87

+ 2 - 0
bot.js

@@ -329,10 +329,12 @@ global.log_error = function(error, isBig = false, type = '') {
 const common_warnings = {
 	main: [
 		'Unrecognized parameters: piprop, explaintext, exsectionformat, exlimit.',
+		'Unrecognized parameters: explaintext, exsectionformat, exlimit.',
 		'Unrecognized parameter: piprop.'
 	],
 	query: [
 		'Unrecognized values for parameter "prop": pageimages, extracts.',
+		'Unrecognized value for parameter "prop": extracts.',
 		'Unrecognized value for parameter "prop": pageimages.'
 	]
 }

+ 11 - 1
cmds/wiki/diff.js

@@ -182,7 +182,17 @@ function gamepedia_diff_send(lang, msg, args, wiki, reaction, spoiler, compare)
 			var diff = revisions[0].revid;
 			var oldid = ( revisions[1] ? revisions[1].revid : 0 );
 			var editor = [lang.get('diff.info.editor'), ( revisions[0].userhidden !== undefined ? lang.get('diff.hidden') : revisions[0].user )];
-			var timestamp = [lang.get('diff.info.timestamp'), new Date(revisions[0].timestamp).toLocaleString(lang.get('dateformat'), Object.assign({timeZone: body.query.general.timezone}, timeoptions))];
+			try {
+				var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+					timeZone: body.query.general.timezone
+				}, timeoptions));
+			}
+			catch ( error ) {
+				var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+					timeZone: 'UTC'
+				}, timeoptions));
+			}
+			var timestamp = [lang.get('diff.info.timestamp'), dateformat.format(new Date(revisions[0].timestamp))];
 			var difference = revisions[0].size - ( revisions[1] ? revisions[1].size : 0 );
 			var size = [lang.get('diff.info.size'), lang.get('diff.info.bytes', ( difference > 0 ? '+' : '' ) + difference.toLocaleString(lang.get('dateformat')), difference)];
 			var comment = [lang.get('diff.info.comment'), ( revisions[0].commenthidden !== undefined ? lang.get('diff.hidden') : ( revisions[0].comment ? toFormatting(revisions[0].comment, msg.showEmbed(), wiki, title) : lang.get('diff.nocomment') ) )];

+ 11 - 1
cmds/wiki/fandom/diff.js

@@ -169,7 +169,17 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
 				var diff = revisions[0].revid;
 				var oldid = ( revisions[1] ? revisions[1].revid : 0 );
 				var editor = [lang.get('diff.info.editor'), ( revisions[0].userhidden !== undefined ? lang.get('diff.hidden') : revisions[0].user )];
-				var timestamp = [lang.get('diff.info.timestamp'), new Date(revisions[0].timestamp).toLocaleString(lang.get('dateformat'), Object.assign({timeZone: body.query.general.timezone}, timeoptions))];
+				try {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: body.query.general.timezone
+					}, timeoptions));
+				}
+				catch ( error ) {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: 'UTC'
+					}, timeoptions));
+				}
+				var timestamp = [lang.get('diff.info.timestamp'), dateformat.format(new Date(revisions[0].timestamp))];
 				var difference = revisions[0].size - ( revisions[1] ? revisions[1].size : 0 );
 				var size = [lang.get('diff.info.size'), lang.get('diff.info.bytes', ( difference > 0 ? '+' : '' ) + difference.toLocaleString(lang.get('dateformat')), difference)];
 				var comment = [lang.get('diff.info.comment'), ( revisions[0].commenthidden !== undefined ? lang.get('diff.hidden') : ( revisions[0].comment ? toFormatting(revisions[0].comment, msg.showEmbed(), wiki, title) : lang.get('diff.nocomment') ) )];

+ 11 - 1
cmds/wiki/fandom/overview.js

@@ -51,7 +51,17 @@ function fandom_overview(lang, msg, wiki, reaction, spoiler) {
 					let merge = body.query.allmessages[2]['*'].split('/');
 					crossover.push('<https://' + merge[0] + '.fandom.com/' + ( merge[1] ? merge[1] + '/' : '' ) + '>');
 				}
-				var created = [lang.get('overview.created'), new Date(site.creation_date).toLocaleString(lang.get('dateformat'), Object.assign({timeZone: body.query.general.timezone}, timeoptions))];
+				try {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: body.query.general.timezone
+					}, timeoptions));
+				}
+				catch ( error ) {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: 'UTC'
+					}, timeoptions));
+				}
+				var created = [lang.get('overview.created'), dateformat.format(new Date(site.creation_date))];
 				var articles = [lang.get('overview.articles'), body.query.statistics.articles.toLocaleString(lang.get('dateformat'))];
 				var pages = [lang.get('overview.pages'), body.query.statistics.pages.toLocaleString(lang.get('dateformat'))];
 				var edits = [lang.get('overview.edits'), body.query.statistics.edits.toLocaleString(lang.get('dateformat'))];

+ 24 - 6
cmds/wiki/fandom/user.js

@@ -75,17 +75,26 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 			}
 			else {
 				if ( !querypage.noRedirect || ( querypage.missing === undefined && querypage.ns !== -1 ) ) namespace = contribs;
-				var localtimeoptions = Object.assign({timeZone: body.query.general.timezone}, timeoptions);
+				try {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: body.query.general.timezone
+					}, timeoptions));
+				}
+				catch ( error ) {
+					var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+						timeZone: 'UTC'
+					}, timeoptions));
+				}
 				var blocks = body.query.blocks.map( block => {
 					var isBlocked = false;
-					var blockedtimestamp = new Date(block.timestamp).toLocaleString(lang.get('dateformat'), localtimeoptions);
+					var blockedtimestamp = dateformat.format(new Date(block.timestamp));
 					var blockexpiry = block.expiry;
 					if ( ['infinite', 'indefinite', 'infinity', 'never'].includes(blockexpiry) ) {
 						blockexpiry = lang.get('user.block.until_infinity');
 						isBlocked = true;
 					} else if ( blockexpiry ) {
 						if ( Date.parse(blockexpiry) > Date.now() ) isBlocked = true;
-						blockexpiry = new Date(blockexpiry).toLocaleString(lang.get('dateformat'), localtimeoptions);
+						blockexpiry = dateformat.format(new Date(blockexpiry));
 					}
 					if ( isBlocked ) return {
 						header: lang.get('user.block.header', block.user, 'unknown').escapeFormatting(),
@@ -240,8 +249,17 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 						default: 
 							gender.push(lang.get('user.gender.unknown'));
 					}
-					var localtimeoptions = Object.assign({timeZone: body.query.general.timezone}, timeoptions);
-					var registration = [lang.get('user.info.registration'), new Date(queryuser.registration).toLocaleString(lang.get('dateformat'), localtimeoptions)];
+					try {
+						var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+							timeZone: body.query.general.timezone
+						}, timeoptions));
+					}
+					catch ( error ) {
+						var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+							timeZone: 'UTC'
+						}, timeoptions));
+					}
+					var registration = [lang.get('user.info.registration'), dateformat.format(new Date(queryuser.registration))];
 					var editcount = [lang.get('user.info.editcount'), queryuser.editcount.toLocaleString(lang.get('dateformat'))];
 					var groups = queryuser.groups;
 					var group = [lang.get('user.info.group', groups.length)];
@@ -267,7 +285,7 @@ function fandom_user(lang, msg, namespace, username, wiki, querystring, fragment
 						isBlocked = true;
 					} else if ( blockexpiry ) {
 						var blockexpirydate = blockexpiry.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z' );
-						blockexpiry = new Date(blockexpirydate).toLocaleString(lang.get('dateformat'), localtimeoptions);
+						blockexpiry = dateformat.format(new Date(blockexpirydate));
 						if ( Date.parse(blockexpirydate) > Date.now() ) isBlocked = true;
 					}
 					var blockedby = queryuser.blockedby;

+ 19 - 9
cmds/wiki/overview.js

@@ -42,10 +42,19 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 		var version = [lang.get('overview.version'), body.query.general.generator];
 		var creation_date = null;
 		var created = [lang.get('overview.created'), lang.get('overview.unknown')];
-		var localtimeoptions = Object.assign({timeZone: body.query.general.timezone}, timeoptions);
+		try {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: body.query.general.timezone
+			}, timeoptions));
+		}
+		catch ( error ) {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: 'UTC'
+			}, timeoptions));
+		}
 		if ( body.query.logevents?.[0]?.timestamp ) {
 			creation_date = new Date(body.query.logevents[0].timestamp);
-			created[1] = creation_date.toLocaleString(lang.get('dateformat'), localtimeoptions);
+			created[1] = dateformat.format(creation_date);
 		}
 		var language = [lang.get('overview.lang'), body.query.languages.find( language => {
 			return language.code === body.query.general.lang;
@@ -55,6 +64,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 		var pages = [lang.get('overview.pages'), body.query.statistics.pages.toLocaleString(lang.get('dateformat'))];
 		var edits = [lang.get('overview.edits'), body.query.statistics.edits.toLocaleString(lang.get('dateformat'))];
 		var users = [lang.get('overview.users'), body.query.statistics.activeusers.toLocaleString(lang.get('dateformat'))];
+		var admins = [lang.get('overview.admins'), body.query.statistics.admins.toLocaleString(lang.get('dateformat'))];
 		var license = [lang.get('overview.license'), lang.get('overview.unknown')];
 		if ( body.query.rightsinfo.url ) {
 			let licenseurl = body.query.rightsinfo.url
@@ -122,7 +132,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 				official[1] = lang.get('overview.' + ( site.official_wiki ? 'yes' : 'no' ));
 				if ( site.created && creation_date > new Date(parseInt(site.created + '000', 10)) ) {
 					creation_date = new Date(parseInt(site.created + '000', 10));
-					created[1] = creation_date.toLocaleString(lang.get('dateformat'), localtimeoptions);
+					created[1] = dateformat.format(creation_date);
 				}
 				if ( site.wiki_crossover ) crossover[1] = '<https://' + site.wiki_crossover + '/>';
 				if ( site.wiki_description ) {
@@ -146,7 +156,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 				founder[1] = site.founding_user_id;
 				if ( site.creation_date && creation_date > new Date(site.creation_date) ) {
 					creation_date = new Date(site.creation_date);
-					created[1] = creation_date.toLocaleString(lang.get('dateformat'), localtimeoptions);
+					created[1] = dateformat.format(creation_date);
 				}
 				if ( site.desc ) {
 					description[1] = site.desc.escapeFormatting();
@@ -172,7 +182,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 					}, error => {
 						console.log( '- Error while getting the wiki founder: ' + error );
 						founder[1] = 'ID: ' + founder[1];
-					} ) : founder[1] = ( wiki.isGamepedia() ? null : lang.get('overview.none') ) ),
+					} ) : founder[1] = ( founder[1] === undefined || wiki.isGamepedia() ? null : lang.get('overview.none') ) ),
 					got.get( wiki + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
 						headers: {
 							Accept: 'application/hal+json'
@@ -208,7 +218,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 					if ( posts[1] ) embed.addField( posts[0], posts[1], true );
 					if ( walls[1] ) embed.addField( walls[0], walls[1], true );
 					if ( comments[1] ) embed.addField( comments[0], comments[1], true );
-					embed.addField( users[0], users[1], true );
+					embed.addField( users[0], users[1], true ).addField( admins[0], admins[1], true );
 					if ( manager[1] ) embed.addField( manager[0], '[' + manager[1] + '](' + wiki.toLink('User:' + manager[1], '', '', true) + ') ([' + lang.get('overview.talk') + '](' + wiki.toLink('User talk:' + manager[1], '', '', true) + '))', true );
 					if ( founder[1] ) embed.addField( founder[0], founder[1], true );
 					if ( crossover[1] ) {
@@ -231,7 +241,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 					if ( posts[1] ) text += '\n' + posts.join(' ');
 					if ( walls[1] ) text += '\n' + walls.join(' ');
 					if ( comments[1] ) text += '\n' + comments.join(' ');
-					text += '\n' + users.join(' ');
+					text += '\n' + users.join(' ') + '\n' + admins.join(' ');
 					if ( manager[1] ) text += '\n' + manager.join(' ');
 					if ( founder[1] ) text += '\n' + founder.join(' ');
 					if ( crossover[1] ) text += '\n' + crossover.join(' ');
@@ -253,13 +263,13 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 		if ( msg.showEmbed() ) {
 			embed.addField( version[0], version[1], true ).addField( language[0], language[1], true );
 			if ( rtl[1] ) embed.addField( rtl[0], rtl[1], true );
-			embed.addField( created[0], created[1], true ).addField( articles[0], articles[1], true ).addField( pages[0], pages[1], true ).addField( edits[0], edits[1], true ).addField( users[0], users[1], true ).addField( license[0], license[1], true ).addField( misermode[0], misermode[1], true ).setFooter( lang.get('overview.inaccurate') );
+			embed.addField( created[0], created[1], true ).addField( articles[0], articles[1], true ).addField( pages[0], pages[1], true ).addField( edits[0], edits[1], true ).addField( users[0], users[1], true ).addField( admins[0], admins[1], true ).addField( license[0], license[1], true ).addField( misermode[0], misermode[1], true ).setFooter( lang.get('overview.inaccurate') );
 			if ( readonly[1] ) embed.addField( readonly[0], readonly[1] );
 		}
 		else {
 			text += '\n' + version.join(' ') + '\n' + language.join(' ');
 			if ( rtl[1] ) text += '\n' + rtl.join(' ');
-			text += '\n' + created.join(' ') + '\n' + articles.join(' ') + '\n' + pages.join(' ') + '\n' + edits.join(' ') + '\n' + users.join(' ') + '\n' + license.join(' ') + '\n' + misermode.join(' ');
+			text += '\n' + created.join(' ') + '\n' + articles.join(' ') + '\n' + pages.join(' ') + '\n' + edits.join(' ') + '\n' + users.join(' ') + '\n' + admins.join(' ') + '\n' + license.join(' ') + '\n' + misermode.join(' ');
 			if ( readonly[1] ) text += '\n\n' + ( readonly[0] === '\u200b' ? readonly[1] : readonly.join('\n') );
 			text += '\n\n*' + lang.get('overview.inaccurate') + '*';
 		}

+ 25 - 7
cmds/wiki/user.js

@@ -87,17 +87,26 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 			return;
 		}
 		if ( !querypage.noRedirect || ( querypage.missing === undefined && querypage.ns !== -1 ) ) namespace = contribs;
-		var localtimeoptions = Object.assign({timeZone: body.query.general.timezone}, timeoptions);
+		try {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: body.query.general.timezone
+			}, timeoptions));
+		}
+		catch ( error ) {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: 'UTC'
+			}, timeoptions));
+		}
 		var blocks = body.query.blocks.map( block => {
 			var isBlocked = false;
-			var blockedtimestamp = new Date(block.timestamp).toLocaleString(lang.get('dateformat'), localtimeoptions);
+			var blockedtimestamp = dateformat.format(new Date(block.timestamp));
 			var blockexpiry = block.expiry;
 			if ( ['infinite', 'indefinite', 'infinity', 'never'].includes(blockexpiry) ) {
 				blockexpiry = lang.get('user.block.until_infinity');
 				isBlocked = true;
 			} else if ( blockexpiry ) {
 				if ( Date.parse(blockexpiry) > Date.now() ) isBlocked = true;
-				blockexpiry = new Date(blockexpiry).toLocaleString(lang.get('dateformat'), localtimeoptions);
+				blockexpiry = dateformat.format(new Date(blockexpiry));
 			}
 			if ( isBlocked ) return {
 				header: lang.get('user.block.header', block.user, 'unknown').escapeFormatting(),
@@ -264,8 +273,17 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 			default: 
 				gender.push(lang.get('user.gender.unknown'));
 		}
-		var localtimeoptions = Object.assign({timeZone: body.query.general.timezone}, timeoptions);
-		var registration = [lang.get('user.info.registration'), new Date(queryuser.registration).toLocaleString(lang.get('dateformat'), localtimeoptions)];
+		try {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: body.query.general.timezone
+			}, timeoptions));
+		}
+		catch ( error ) {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: 'UTC'
+			}, timeoptions));
+		}
+		var registration = [lang.get('user.info.registration'), dateformat.format(new Date(queryuser.registration))];
 		var editcount = [lang.get('user.info.editcount'), queryuser.editcount.toLocaleString(lang.get('dateformat'))];
 		var groups = queryuser.groups.filter( group => !usergroups.ignored.includes( group ) );
 		var globalgroups = [];
@@ -334,14 +352,14 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 				}
 			}
 			var isBlocked = false;
-			var blockedtimestamp = new Date(queryuser.blockedtimestamp).toLocaleString(lang.get('dateformat'), localtimeoptions);
+			var blockedtimestamp = dateformat.format(new Date(queryuser.blockedtimestamp));
 			var blockexpiry = queryuser.blockexpiry;
 			if ( ['infinite', 'indefinite', 'infinity', 'never'].includes(blockexpiry) ) {
 				blockexpiry = lang.get('user.block.until_infinity');
 				isBlocked = true;
 			} else if ( blockexpiry ) {
 				var blockexpirydate = blockexpiry.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z' );
-				blockexpiry = new Date(blockexpirydate).toLocaleString(lang.get('dateformat'), localtimeoptions);
+				blockexpiry = dateformat.format(new Date(blockexpirydate));
 				if ( Date.parse(blockexpirydate) > Date.now() ) isBlocked = true;
 			}
 			var blockedby = queryuser.blockedby;

+ 5 - 4
functions/parse_page.js

@@ -180,16 +180,17 @@ function parse_page(msg, content, embed, wiki, reaction, {title, contentmodel, p
 				'div.section > table > tbody > tr',
 				'h2.pi-header',
 				'div.pi-data',
-				'table.infobox-rows > tbody > tr'
+				'table.infobox-rows > tbody > tr',
+				'div.infobox-rows:not(.subinfobox) > div.infobox-row'
 			].join(', '));
 			let tdLabel = true;
 			for ( let i = 0; i < rows.length; i++ ) {
 				if ( embed.fields.length >= 25 || embed.length > 5400 ) break;
 				let row = rows.eq(i);
-				if ( row.is('tr, div.pi-data') ) {
-					let label = row.children(( tdLabel ? 'td, ' : '' ) + 'th, h3.pi-data-label').eq(0);
+				if ( row.is('tr, div.pi-data, div.infobox-row') ) {
+					let label = row.children(( tdLabel ? 'td, ' : '' ) + 'th, h3.pi-data-label, div.infobox-cell-header').eq(0);
 					label.find(removeClasses.join(', ')).remove();
-					let value = row.children('td, div.pi-data-value').eq(( label.is('td') ? 1 : 0 ));
+					let value = row.children('td, div.pi-data-value, div.infobox-cell-data').eq(( label.is('td') ? 1 : 0 ));
 					value.find(removeClasses.join(', ')).remove();
 					if ( !label.is('td') && label.html()?.trim() && value.html()?.trim() ) tdLabel = false;
 					label = htmlToPlain(label).trim().split('\n')[0];

+ 11 - 1
functions/special_page.js

@@ -32,7 +32,17 @@ const queryfunctions = {
 		return '[' + result.title.replace( / /g, '_' ).escapeFormatting() + '](' + wiki.toLink(result.title, 'redirect=no', '', true) + ')' + ( result.databaseResult && result.databaseResult.b_title && result.databaseResult.c_title ? ' → ' + result.databaseResult.b_title.escapeFormatting() + ' → ' + result.databaseResult.c_title.escapeFormatting() : '' );
 	} ).join('\n'),
 	timestamp: (query, wiki, lang) => query.querypage.results.map( result => {
-		return new Date(result.timestamp).toLocaleString(lang.get('dateformat'), Object.assign({timeZone: query.general.timezone}, timeoptions)).escapeFormatting() + ': [' + result.title.escapeFormatting() + '](' + wiki.toLink(result.title, '', '', true) + ')';
+		try {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: body.query.general.timezone
+			}, timeoptions));
+		}
+		catch ( error ) {
+			var dateformat = new Intl.DateTimeFormat(lang.get('dateformat'), Object.assign({
+				timeZone: 'UTC'
+			}, timeoptions));
+		}
+		return dateformat.format(new Date(result.timestamp)).escapeFormatting() + ': [' + result.title.escapeFormatting() + '](' + wiki.toLink(result.title, '', '', true) + ')';
 	} ).join('\n'),
 	media: (query, wiki, lang) => query.querypage.results.map( result => {
 		var ms = result.title.split(';');

+ 12 - 0
util/default.json

@@ -201,6 +201,18 @@
 			"articlePath": "/wiki/",
 			"scriptPath": "/w/"
 		},
+		{
+			"name": "wiki.openstreetmap.org",
+			"regex": "(wiki\\.openstreetmap\\.org)",
+			"articlePath": "/wiki/",
+			"scriptPath": "/w/"
+		},
+		{
+			"name": "pluralpedia.org",
+			"regex": "((?:www\\.)?pluralpedia\\.org)",
+			"articlePath": "/w/",
+			"scriptPath": "/"
+		},
 		{
 			"name": "librewiki.net",
 			"regex": "(librewiki\\.net)",