Browse Source

Improve usage logging

Markus-Rost 4 năm trước cách đây
mục cha
commit
273b66320f

+ 2 - 1
cmds/test.js

@@ -55,6 +55,7 @@ function cmd_test(lang, msg, args, line, wiki) {
 					}
 				}
 				else if ( ( msg.isAdmin() || msg.isOwner() ) && !wiki.isFandom() ) {
+					logging(wiki, msg.guild?.id, 'test');
 					if ( body.query.general.generator.replace( /^MediaWiki 1\.(\d\d).*$/, '$1' ) < 30 ) {
 						console.log( '- This wiki is using ' + body.query.general.generator + '.' );
 						notice.push(lang.get('test.MediaWiki', '[MediaWiki 1.30](https://www.mediawiki.org/wiki/MediaWiki_1.30)', body.query.general.generator));
@@ -68,6 +69,7 @@ function cmd_test(lang, msg, args, line, wiki) {
 						notice.push(lang.get('test.PageImages', '[PageImages](https://www.mediawiki.org/wiki/Extension:PageImages)'));
 					}
 				}
+				else logging(wiki, msg.guild?.id, 'test');
 				embed.addField( wiki, ping );
 				if ( notice.length ) embed.addField( lang.get('test.notice'), notice.join('\n') );
 			}, error => {
@@ -83,7 +85,6 @@ function cmd_test(lang, msg, args, line, wiki) {
 				}
 				embed.addField( wiki, ping );
 			} ).finally( () => {
-				logging(wiki, 'test');
 				if ( msg.isOwner() ) return msg.client.shard.fetchClientValues('ws.status').then( values => {
 					return '```css\n' + values.map( (status, id) => '[' + id + ']: ' + ( wsStatus[status] || status ) ).join('\n') + '\n```';
 				}, error => {

+ 2 - 2
cmds/verify.js

@@ -57,7 +57,7 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 					msg.reactEmoji('nowiki');
 				}
 				else if ( body?.error?.code === 'us400' ) { // special catch for Fandom
-					if ( !old_username ) logging(wiki, 'verification');
+					if ( !old_username ) logging(wiki, msg.guild?.id, 'verification');
 					embed.setTitle( ( old_username || username ).escapeFormatting() ).setColor('#0000FF').setDescription( lang.get('verify.user_missing', ( old_username || username ).escapeFormatting()) );
 					msg.replyMsg( lang.get('verify.user_missing_reply', ( old_username || username ).escapeFormatting()), {embed}, false, false );
 				}
@@ -71,7 +71,7 @@ function cmd_verify(lang, msg, args, line, wiki, old_username = '') {
 				return;
 			}
 			wiki.updateWiki(body.query.general);
-			if ( !old_username ) logging(wiki, 'verification');
+			if ( !old_username ) logging(wiki, msg.guild?.id, 'verification');
 			var queryuser = body.query.users[0];
 			embed.setAuthor( body.query.general.sitename );
 			if ( body.query.users.length !== 1 || queryuser.missing !== undefined || queryuser.invalid !== undefined ) {

+ 1 - 1
cmds/wiki/diff.js

@@ -169,7 +169,7 @@ function gamepedia_diff_send(lang, msg, args, wiki, reaction, spoiler, compare)
 		}
 		else if ( body.query.pages && !body.query.pages['-1'] ) {
 			wiki.updateWiki(body.query.general);
-			logging(wiki, 'diff');
+			logging(wiki, msg.guild?.id, 'diff');
 			var pages = Object.values(body.query.pages);
 			if ( pages.length !== 1 ) {
 				msg.sendChannel( spoiler + '<' + wiki.toLink('Special:Diff/' + ( args[1] ? args[1] + '/' : '' ) + args[0]) + '>' + spoiler );

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

@@ -156,7 +156,7 @@ function fandom_diff_send(lang, msg, args, wiki, reaction, spoiler, compare) {
 		}
 		else if ( body.query.pages && !body.query.pages['-1'] ) {
 			wiki.updateWiki(body.query.general);
-			logging(wiki, 'diff', 'legacy');
+			logging(wiki, msg.guild?.id, 'diff', 'legacy');
 			var pages = Object.values(body.query.pages);
 			if ( pages.length !== 1 ) {
 				msg.sendChannel( spoiler + '<' + wiki.toLink('Special:Diff/' + ( args[1] ? args[1] + '/' : '' ) + args[0]) + '>' + spoiler );

+ 6 - 6
cmds/wiki/fandom/general.js

@@ -89,15 +89,15 @@ function fandom_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '',
 		}
 		wiki.updateWiki(body.query.general);
 		if ( aliasInvoke === 'search' ) {
-			logging(wiki, 'search', 'legacy');
+			logging(wiki, msg.guild?.id, 'search', 'legacy');
 			return fn.search(lang, msg, full_title.split(' ').slice(1).join(' '), wiki, body.query, reaction, spoiler);
 		}
 		if ( aliasInvoke === 'discussion' && !querystring.toString() && !fragment ) {
-			logging(wiki, 'discussion', 'legacy');
+			logging(wiki, msg.guild?.id, 'discussion', 'legacy');
 			return fn.discussion(lang, msg, wiki, args.join(' '), body.query.general.sitename, reaction, spoiler);
 		}
 		if ( body.query.pages ) {
-			logging(wiki, 'general', 'legacy');
+			logging(wiki, msg.guild?.id, 'general', 'legacy');
 			var querypages = Object.values(body.query.pages);
 			var querypage = querypages[0];
 			if ( body.query.redirects && body.query.redirects[0].from.split(':')[0] === body.query.namespaces['-1']['*'] && body.query.specialpagealiases.filter( sp => ['Mypage','Mytalk','MyLanguage'].includes( sp.realname ) ).map( sp => sp.aliases[0] ).includes( body.query.redirects[0].from.split(':').slice(1).join(':').split('/')[0].replace( / /g, '_' ) ) ) {
@@ -411,7 +411,7 @@ function fandom_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '',
 				console.log( '- Aborted, paused.' );
 				return;
 			}
-			logging(wiki, 'interwiki', 'legacy');
+			logging(wiki, msg.guild?.id, 'interwiki', 'legacy');
 			var iw = new URL(body.query.interwiki[0].url.replace( /\\/g, '%5C' ).replace( /@(here|everyone)/g, '%40$1' ), wiki);
 			querystring.forEach( (value, name) => {
 				iw.searchParams.append(name, value);
@@ -451,7 +451,7 @@ function fandom_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '',
 			if ( reaction ) reaction.removeEmoji();
 		}
 		else if ( body.query.redirects ) {
-			logging(wiki, 'general', 'legacy');
+			logging(wiki, msg.guild?.id, 'general', 'legacy');
 			var pagelink = wiki.toLink(body.query.redirects[0].to, querystring, ( fragment || body.query.redirects[0].tofragment || '' ));
 			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( body.query.redirects[0].to.escapeFormatting() ).setURL( pagelink ).setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png') );
 			
@@ -460,7 +460,7 @@ function fandom_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '',
 			if ( reaction ) reaction.removeEmoji();;
 		}
 		else {
-			logging(wiki, 'general', 'legacy');
+			logging(wiki, msg.guild?.id, 'general', 'legacy');
 			var pagelink = wiki.toLink(body.query.general.mainpage, querystring, fragment);
 			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( body.query.general.mainpage.escapeFormatting() ).setURL( pagelink ).setThumbnail( wiki.toLink('Special:FilePath/Wiki-wordmark.png') );
 			

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

@@ -33,7 +33,7 @@ function fandom_overview(lang, msg, wiki, reaction, spoiler) {
 		}
 		else got.get( 'https://community.fandom.com/api/v1/Wikis/Details?ids=' + body.query.wikidesc.id + '&format=json&cache=' + Date.now() ).then( ovresponse => {
 			wiki.updateWiki(body.query.general);
-			logging(wiki, 'overview', 'legacy');
+			logging(wiki, msg.guild?.id, 'overview', 'legacy');
 			var ovbody = ovresponse.body;
 			if ( ovresponse.statusCode !== 200 || !ovbody || ovbody.exception || !ovbody.items || !ovbody.items[body.query.wikidesc.id] ) {
 				console.log( '- ' + ovresponse.statusCode + ': Error while getting the wiki details: ' + ( ovbody && ovbody.exception && ovbody.exception.details ) );

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

@@ -28,7 +28,7 @@ function fandom_random(lang, msg, wiki, reaction, spoiler) {
 		}
 		else {
 			wiki.updateWiki(body.query.general);
-			logging(wiki, 'random', 'legacy');
+			logging(wiki, msg.guild?.id, 'random', 'legacy');
 			var querypage = Object.values(body.query.pages)[0];
 			var pagelink = wiki.toLink(querypage.title);
 			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );

+ 211 - 211
cmds/wiki/general.js

@@ -62,7 +62,7 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 	var args = title.split(' ').slice(1);
 	
 	if ( !msg.notMinecraft && wiki.href === lang.get('minecraft.link') && ( minecraft.hasOwnProperty(aliasInvoke) || invoke.startsWith( '/' ) ) ) {
-		logging(wiki, 'minecraft');
+		logging(wiki, msg.guild?.id, 'minecraft', ( minecraft.hasOwnProperty(aliasInvoke) ? aliasInvoke : 'command' ));
 		minecraft.WIKI = this;
 		if ( minecraft.hasOwnProperty(aliasInvoke) ) minecraft[aliasInvoke](lang, msg, args, title, cmd, querystring, fragment, reaction, spoiler);
 		else minecraft.SYNTAX(lang, msg, invoke.substring(1), args, title, cmd, querystring, fragment, reaction, spoiler);
@@ -110,18 +110,17 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 		}
 		wiki.updateWiki(body.query.general);
 		if ( aliasInvoke === 'search' ) {
-			logging(wiki, 'search');
+			logging(wiki, msg.guild?.id, 'search');
 			return fn.search(lang, msg, full_title.split(' ').slice(1).join(' '), wiki, body.query, reaction, spoiler);
 		}
 		if ( aliasInvoke === 'diff' && args.join('') && !querystring.toString() && !fragment ) {
 			return fn.diff(lang, msg, args, wiki, reaction, spoiler);
 		}
 		if ( aliasInvoke === 'discussion' && wiki.isFandom(false) && !querystring.toString() && !fragment ) {
-			logging(wiki, 'discussion');
+			logging(wiki, msg.guild?.id, 'discussion');
 			return fn.discussion(lang, msg, wiki, args.join(' '), body.query.general.sitename, reaction, spoiler);
 		}
 		if ( body.query.pages ) {
-			logging(wiki, 'general');
 			var querypages = Object.values(body.query.pages);
 			var querypage = querypages[0];
 			if ( body.query.redirects && body.query.redirects[0].from.split(':')[0] === body.query.namespaces['-1']['*'] && body.query.specialpagealiases.filter( sp => ['Mypage','Mytalk','MyLanguage'].includes( sp.realname ) ).map( sp => sp.aliases[0] ).includes( body.query.redirects[0].from.split(':').slice(1).join(':').split('/')[0].replace( / /g, '_' ) ) ) {
@@ -136,11 +135,11 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 			if ( ( querypage.ns === 2 || querypage.ns === 202 || querypage.ns === 1200 ) && ( !querypage.title.includes( '/' ) || /^[^:]+:(?:(?:\d{1,3}\.){3}\d{1,3}\/\d{2}|(?:[\dA-F]{1,4}:){7}[\dA-F]{1,4}\/\d{2,3})$/.test(querypage.title) ) ) {
 				var userparts = querypage.title.split(':');
 				querypage.noRedirect = noRedirect;
-				fn.user(lang, msg, userparts[0] + ':', userparts.slice(1).join(':'), wiki, querystring, fragment, querypage, contribs, reaction, spoiler);
+				return fn.user(lang, msg, userparts[0] + ':', userparts.slice(1).join(':'), wiki, querystring, fragment, querypage, contribs, reaction, spoiler);
 			}
-			else if ( querypage.ns === -1 && querypage.title.startsWith( contribs ) && querypage.title.length > contribs.length ) {
+			if ( querypage.ns === -1 && querypage.title.startsWith( contribs ) && querypage.title.length > contribs.length ) {
 				var username = querypage.title.split('/').slice(1).join('/');
-				got.get( wiki + 'api.php?action=query&titles=User:' + encodeURIComponent( username ) + '&format=json' ).then( uresponse => {
+				return got.get( wiki + 'api.php?action=query&titles=User:' + encodeURIComponent( username ) + '&format=json' ).then( uresponse => {
 					var ubody = uresponse.body;
 					if ( uresponse.statusCode !== 200 || !ubody || ubody.batchcomplete === undefined || !ubody.query ) {
 						console.log( '- ' + uresponse.statusCode + ': Error while getting the user: ' + ( ubody && ubody.error && ubody.error.info ) );
@@ -172,7 +171,8 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					if ( reaction ) reaction.removeEmoji();
 				} );
 			}
-			else if ( wiki.isMiraheze() && querypage.ns === 0 && /^Mh:[a-z\d]+:/.test(querypage.title) ) {
+			if ( wiki.isMiraheze() && querypage.ns === 0 && /^Mh:[a-z\d]+:/.test(querypage.title) ) {
+				logging(wiki, msg.guild?.id, 'interwiki', 'miraheze');
 				var iw_parts = querypage.title.split(':');
 				var iw = new Wiki('https://' + iw_parts[1] + '.miraheze.org/w/');
 				var iw_link = iw.toLink(iw_parts.slice(2).join(':'), querystring, fragment);
@@ -185,115 +185,115 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 					if ( message && selfcall === maxselfcall ) message.reactEmoji('⚠️');
 				} );
 				if ( reaction ) reaction.removeEmoji();
+				return;
 			}
-			else if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) {
-				got.get( wiki + 'api.php?action=query&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + querypage.ns + '|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
-					var srbody = srresponse.body;
-					if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
-					if ( srresponse.statusCode !== 200 || !srbody || srbody.batchcomplete === undefined ) {
-						console.log( '- ' + srresponse.statusCode + ': Error while getting the search results: ' + ( srbody && srbody.error && srbody.error.info ) );
-						msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
+			if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) return got.get( wiki + 'api.php?action=query&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + querypage.ns + '|' + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
+				var srbody = srresponse.body;
+				if ( srbody && srbody.warnings ) log_warn(srbody.warnings);
+				if ( srresponse.statusCode !== 200 || !srbody || srbody.batchcomplete === undefined ) {
+					console.log( '- ' + srresponse.statusCode + ': Error while getting the search results: ' + ( srbody && srbody.error && srbody.error.info ) );
+					msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
+					return;
+				}
+				if ( !srbody.query ) {
+					msg.reactEmoji('🤷');
+				}
+				else {
+					querypage = Object.values(srbody.query.pages)[0];
+					var pagelink = wiki.toLink(querypage.title, querystring, fragment);
+					var text = '';
+					var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
+					if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
+						var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
+						if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
+						embed.setTitle( displaytitle );
+					}
+					if ( querypage.extract ) {
+						var extract = extract_desc(querypage.extract, fragment);
+						embed.backupDescription = extract[0];
+						if ( extract[1].length && extract[2].length ) {
+							embed.backupField = {name: extract[1], value: extract[2]};
+						}
+					}
+					if ( querypage.pageprops && querypage.pageprops.description ) {
+						var description = htmlToPlain( querypage.pageprops.description );
+						if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
+						embed.backupDescription = description;
+					}
+					if ( querypage.ns === 6 ) {
+						var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
+						if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
+						else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
+					}
+					else if ( querypage.title === body.query.general.mainpage ) {
+						embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
+					}
+					else if ( querypage.pageimage && querypage.original ) {
+						embed.setThumbnail( querypage.original.source );
+					}
+					else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
+						embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
+					}
+					else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
+					
+					var prefix = ( msg.channel.isGuild() && patreons[msg.guild.id] || process.env.prefix );
+					var linksuffix = ( querystring.toString() ? '?' + querystring : '' ) + ( fragment ? '#' + fragment : '' );
+					if ( title.replace( /[_-]/g, ' ' ).toLowerCase() === querypage.title.replace( /-/g, ' ' ).toLowerCase() ) {
+						text = '';
+					}
+					else if ( !srbody.continue ) {
+						text = '\n' + lang.get('search.infopage', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`');
 					}
 					else {
-						if ( !srbody.query ) {
-							msg.reactEmoji('🤷');
+						text = '\n' + lang.get('search.infosearch', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`', '`' + prefix + cmd + ( lang.localNames.search || 'search' ) + ' ' + title + linksuffix + '`');
+					}
+					
+					if ( querypage.categoryinfo ) {
+						var category = [lang.get('search.category.content')];
+						if ( querypage.categoryinfo.size === 0 ) {
+							category.push(lang.get('search.category.empty'));
 						}
-						else {
-							querypage = Object.values(srbody.query.pages)[0];
-							var pagelink = wiki.toLink(querypage.title, querystring, fragment);
-							var text = '';
-							var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
-							if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
-								var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
-								if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
-								embed.setTitle( displaytitle );
-							}
-							if ( querypage.extract ) {
-								var extract = extract_desc(querypage.extract, fragment);
-								embed.backupDescription = extract[0];
-								if ( extract[1].length && extract[2].length ) {
-									embed.backupField = {name: extract[1], value: extract[2]};
-								}
-							}
-							if ( querypage.pageprops && querypage.pageprops.description ) {
-								var description = htmlToPlain( querypage.pageprops.description );
-								if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
-								embed.backupDescription = description;
-							}
-							if ( querypage.ns === 6 ) {
-								var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
-								if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
-								else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
-							}
-							else if ( querypage.title === body.query.general.mainpage ) {
-								embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
-							}
-							else if ( querypage.pageimage && querypage.original ) {
-								embed.setThumbnail( querypage.original.source );
-							}
-							else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
-								embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
-							}
-							else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
-							
-							var prefix = ( msg.channel.isGuild() && patreons[msg.guild.id] || process.env.prefix );
-							var linksuffix = ( querystring.toString() ? '?' + querystring : '' ) + ( fragment ? '#' + fragment : '' );
-							if ( title.replace( /[_-]/g, ' ' ).toLowerCase() === querypage.title.replace( /-/g, ' ' ).toLowerCase() ) {
-								text = '';
-							}
-							else if ( !srbody.continue ) {
-								text = '\n' + lang.get('search.infopage', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`');
-							}
-							else {
-								text = '\n' + lang.get('search.infosearch', '`' + prefix + cmd + ( lang.localNames.page || 'page' ) + ' ' + title + linksuffix + '`', '`' + prefix + cmd + ( lang.localNames.search || 'search' ) + ' ' + title + linksuffix + '`');
-							}
-							
-							if ( querypage.categoryinfo ) {
-								var category = [lang.get('search.category.content')];
-								if ( querypage.categoryinfo.size === 0 ) {
-									category.push(lang.get('search.category.empty'));
-								}
-								if ( querypage.categoryinfo.pages > 0 ) {
-									category.push(lang.get('search.category.pages', querypage.categoryinfo.pages.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.pages));
-								}
-								if ( querypage.categoryinfo.files > 0 ) {
-									category.push(lang.get('search.category.files', querypage.categoryinfo.files.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.files));
-								}
-								if ( querypage.categoryinfo.subcats > 0 ) {
-									category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.subcats));
-								}
-								if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
-								else text += '\n\n' + category.join('\n');
-							}
+						if ( querypage.categoryinfo.pages > 0 ) {
+							category.push(lang.get('search.category.pages', querypage.categoryinfo.pages.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.pages));
+						}
+						if ( querypage.categoryinfo.files > 0 ) {
+							category.push(lang.get('search.category.files', querypage.categoryinfo.files.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.files));
+						}
+						if ( querypage.categoryinfo.subcats > 0 ) {
+							category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.subcats));
+						}
+						if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
+						else text += '\n\n' + category.join('\n');
+					}
 
-							if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
-								try {
-									var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
-									parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href, wiki.articleURL.href);
-								}
-								catch ( error ) {
-									console.log( '- Failed to parse the infobox: ' + error );
-								}
-							}
-				
-							msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), fragment) );
+					if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+						try {
+							var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
+							parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href, wiki.articleURL.href);
+						}
+						catch ( error ) {
+							console.log( '- Failed to parse the infobox: ' + error );
 						}
 					}
-				}, error => {
-					console.log( '- Error while getting the search results: ' + error );
-					msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
-				} ).finally( () => {
-					if ( reaction ) reaction.removeEmoji();
-				} );
-			}
-			else if ( querypage.ns === -1 ) {
+		
+					msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), fragment) );
+				}
+			}, error => {
+				console.log( '- Error while getting the search results: ' + error );
+				msg.sendChannelError( spoiler + '<' + wiki.toLink('Special:Search', {search:title}) + '>' + spoiler );
+			} ).finally( () => {
+				logging(wiki, msg.guild?.id, 'general', 'search');
+				if ( reaction ) reaction.removeEmoji();
+			} );
+			if ( querypage.ns === -1 ) {
 				var pagelink = wiki.toLink(querypage.title, querystring, fragment);
 				var embed =  new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
 				var specialpage = body.query.specialpagealiases.find( sp => body.query.namespaces['-1']['*'] + ':' + sp.aliases[0].replace( /\_/g, ' ' ) === querypage.title.split('/')[0] );
 				specialpage = ( specialpage ? specialpage.realname : querypage.title.replace( body.query.namespaces['-1']['*'] + ':', '' ).split('/')[0] ).toLowerCase();
-				fn.special_page(lang, msg, querypage.title, specialpage, embed, wiki, reaction, spoiler);
+				return fn.special_page(lang, msg, querypage.title, specialpage, embed, wiki, reaction, spoiler);
 			}
-			else if ( querypage.ns === -2 ) {
+			if ( querypage.ns === -2 ) {
+				logging(wiki, msg.guild?.id, 'general', 'media');
 				var filepath = body.query.specialpagealiases.find( sp => sp.realname === 'Filepath' );
 				var pagelink = wiki.toLink(body.query.namespaces['-1']['*'] + ':' + ( filepath?.aliases?.[0] || 'FilePath' ) + querypage.title.replace( body.query.namespaces['-2']['*'] + ':', '/' ), querystring, fragment);
 				var embed =  new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setDescription( '[' + lang.get('search.media') + '](' + wiki.toLink(querypage.title, '', '', true) + ')' );
@@ -303,83 +303,84 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} );
 				
 				if ( reaction ) reaction.removeEmoji();
+				return;
 			}
-			else {
-				var pagelink = wiki.toLink(querypage.title, querystring, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
-				var text = '';
-				var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
-				if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
-					var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
-					if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
-					embed.setTitle( displaytitle );
-				}
-				if ( querypage.extract ) {
-					var extract = extract_desc(querypage.extract, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
-					embed.backupDescription = extract[0];
-					if ( extract[1].length && extract[2].length ) {
-						embed.backupField = {name: extract[1], value: extract[2]};
-					}
-				}
-				if ( querypage.pageprops && querypage.pageprops.description ) {
-					var description = htmlToPlain( querypage.pageprops.description );
-					if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
-					embed.backupDescription = description;
-				}
-				if ( querypage.ns === 6 ) {
-					var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
-					if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
-					else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
+			logging(wiki, msg.guild?.id, 'general');
+			var pagelink = wiki.toLink(querypage.title, querystring, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
+			var text = '';
+			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );
+			if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
+				var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
+				if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
+				embed.setTitle( displaytitle );
+			}
+			if ( querypage.extract ) {
+				var extract = extract_desc(querypage.extract, ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ));
+				embed.backupDescription = extract[0];
+				if ( extract[1].length && extract[2].length ) {
+					embed.backupField = {name: extract[1], value: extract[2]};
 				}
-				else if ( querypage.title === body.query.general.mainpage ) {
-					embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
+			}
+			if ( querypage.pageprops && querypage.pageprops.description ) {
+				var description = htmlToPlain( querypage.pageprops.description );
+				if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
+				embed.backupDescription = description;
+			}
+			if ( querypage.ns === 6 ) {
+				var pageimage = ( querypage?.original?.source || wiki.toLink('Special:FilePath/' + querypage.title, {version:Date.now()}) );
+				if ( msg.showEmbed() && /\.(?:png|jpg|jpeg|gif)$/.test(querypage.title.toLowerCase()) ) embed.setImage( pageimage );
+				else if ( msg.uploadFiles() ) embed.attachFiles( [{attachment:pageimage,name:( spoiler ? 'SPOILER ' : '' ) + querypage.title}] );
+			}
+			else if ( querypage.title === body.query.general.mainpage ) {
+				embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
+			}
+			else if ( querypage.pageimage && querypage.original ) {
+				embed.setThumbnail( querypage.original.source );
+			}
+			else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
+				embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
+			}
+			else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
+			if ( querypage.categoryinfo ) {
+				var category = [lang.get('search.category.content')];
+				if ( querypage.categoryinfo.size === 0 ) {
+					category.push(lang.get('search.category.empty'));
 				}
-				else if ( querypage.pageimage && querypage.original ) {
-					embed.setThumbnail( querypage.original.source );
+				if ( querypage.categoryinfo.pages > 0 ) {
+					category.push(lang.get('search.category.pages', querypage.categoryinfo.pages.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.pages));
 				}
-				else if ( querypage.pageprops && querypage.pageprops.page_image_free ) {
-					embed.setThumbnail( wiki.toLink('Special:FilePath/' + querypage.pageprops.page_image_free, {version:Date.now()}) );
+				if ( querypage.categoryinfo.files > 0 ) {
+					category.push(lang.get('search.category.files', querypage.categoryinfo.files.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.files));
 				}
-				else embed.setThumbnail( new URL(body.query.general.logo, wiki).href );
-				if ( querypage.categoryinfo ) {
-					var category = [lang.get('search.category.content')];
-					if ( querypage.categoryinfo.size === 0 ) {
-						category.push(lang.get('search.category.empty'));
-					}
-					if ( querypage.categoryinfo.pages > 0 ) {
-						category.push(lang.get('search.category.pages', querypage.categoryinfo.pages.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.pages));
-					}
-					if ( querypage.categoryinfo.files > 0 ) {
-						category.push(lang.get('search.category.files', querypage.categoryinfo.files.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.files));
-					}
-					if ( querypage.categoryinfo.subcats > 0 ) {
-						category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.subcats));
-					}
-					if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
-					else text += '\n\n' + category.join('\n');
+				if ( querypage.categoryinfo.subcats > 0 ) {
+					category.push(lang.get('search.category.subcats', querypage.categoryinfo.subcats.toLocaleString(lang.get('dateformat')), querypage.categoryinfo.subcats));
 				}
+				if ( msg.showEmbed() ) embed.addField( category[0], category.slice(1).join('\n') );
+				else text += '\n\n' + category.join('\n');
+			}
 
-				if ( !( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ) && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
-					try {
-						var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
-						parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href, wiki.articleURL.href);
-					}
-					catch ( error ) {
-						console.log( '- Failed to parse the infobox: ' + error );
-					}
+			if ( !( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' ) && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+				try {
+					var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
+					parse_infobox(infobox, embed, new URL(body.query.general.logo, wiki).href, wiki.articleURL.href);
+				}
+				catch ( error ) {
+					console.log( '- Failed to parse the infobox: ' + error );
 				}
-				
-				msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' )) );
-				
-				if ( reaction ) reaction.removeEmoji();
 			}
+			
+			msg.sendChannel( spoiler + '<' + pagelink + '>' + text + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, ( querypage.title === body.query.general.mainpage ? '' : new URL(body.query.general.logo, wiki).href ), ( fragment || ( body.query.redirects && body.query.redirects[0].tofragment ) || '' )) );
+			
+			if ( reaction ) reaction.removeEmoji();
+			return;
 		}
-		else if ( body.query.interwiki ) {
+		if ( body.query.interwiki ) {
 			if ( msg.channel.isGuild() && pause[msg.guild.id] ) {
 				if ( reaction ) reaction.removeEmoji();
 				console.log( '- Aborted, paused.' );
 				return;
 			}
-			logging(wiki, 'interwiki');
+			logging(wiki, msg.guild?.id, 'interwiki');
 			var iw = new URL(body.query.interwiki[0].url.replace( /\\/g, '%5C' ).replace( /@(here|everyone)/g, '%40$1' ), wiki);
 			querystring.forEach( (value, name) => {
 				iw.searchParams.append(name, value);
@@ -417,54 +418,53 @@ function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reaction, spoiler = '
 				if ( message && selfcall === maxselfcall ) message.reactEmoji('⚠️');
 			} );
 			if ( reaction ) reaction.removeEmoji();
+			return;
 		}
-		else {
-			logging(wiki, 'general');
-			var querypage = {title: body.query.general.mainpage, contentmodel: 'wikitext'};
-			var pagelink = wiki.toLink(querypage.title, querystring, fragment);
-			var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
-			got.get( wiki + 'api.php?action=query' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=info|pageprops|extracts&ppprop=description|displaytitle|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&titles=' + encodeURIComponent( querypage.title ) + '&format=json' ).then( mpresponse => {
-				var mpbody = mpresponse.body;
-				if ( mpbody && mpbody.warnings ) log_warn(body.warnings);
-				if ( mpresponse.statusCode !== 200 || !mpbody || mpbody.batchcomplete === undefined || !mpbody.query ) {
-					console.log( '- ' + mpresponse.statusCode + ': Error while getting the main page: ' + ( mpbody && mpbody.error && mpbody.error.info ) );
-					return;
-				}
-				querypage = Object.values(mpbody.query.pages)[0];
-				if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
-					var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
-					if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
-					embed.setTitle( displaytitle );
+		logging(wiki, msg.guild?.id, 'general');
+		var querypage = {title: body.query.general.mainpage, contentmodel: 'wikitext'};
+		var pagelink = wiki.toLink(querypage.title, querystring, fragment);
+		var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink ).setThumbnail( new URL(body.query.general.logo, wiki).href );
+		got.get( wiki + 'api.php?action=query' + ( noRedirect ? '' : '&redirects=true' ) + '&prop=info|pageprops|extracts&ppprop=description|displaytitle|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&titles=' + encodeURIComponent( querypage.title ) + '&format=json' ).then( mpresponse => {
+			var mpbody = mpresponse.body;
+			if ( mpbody && mpbody.warnings ) log_warn(body.warnings);
+			if ( mpresponse.statusCode !== 200 || !mpbody || mpbody.batchcomplete === undefined || !mpbody.query ) {
+				console.log( '- ' + mpresponse.statusCode + ': Error while getting the main page: ' + ( mpbody && mpbody.error && mpbody.error.info ) );
+				return;
+			}
+			querypage = Object.values(mpbody.query.pages)[0];
+			if ( querypage.pageprops && querypage.pageprops.displaytitle ) {
+				var displaytitle = htmlToDiscord( querypage.pageprops.displaytitle );
+				if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
+				embed.setTitle( displaytitle );
+			}
+			if ( querypage.extract ) {
+				var extract = extract_desc(querypage.extract, fragment);
+				embed.backupDescription = extract[0];
+				if ( extract[1].length && extract[2].length ) {
+					embed.backupField = {name: extract[1], value: extract[2]};
 				}
-				if ( querypage.extract ) {
-					var extract = extract_desc(querypage.extract, fragment);
-					embed.backupDescription = extract[0];
-					if ( extract[1].length && extract[2].length ) {
-						embed.backupField = {name: extract[1], value: extract[2]};
-					}
+			}
+			if ( querypage.pageprops && querypage.pageprops.description ) {
+				var description = htmlToPlain( querypage.pageprops.description );
+				if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
+				embed.backupDescription = description;
+			}
+			if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
+				try {
+					var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
+					parse_infobox(infobox, embed, '', wiki.articleURL.href);
 				}
-				if ( querypage.pageprops && querypage.pageprops.description ) {
-					var description = htmlToPlain( querypage.pageprops.description );
-					if ( description.length > 1000 ) description = description.substring(0, 1000) + '\u2026';
-					embed.backupDescription = description;
+				catch ( error ) {
+					console.log( '- Failed to parse the infobox: ' + error );
 				}
-				if ( !fragment && !embed.fields.length && querypage.pageprops && querypage.pageprops.infoboxes ) {
-					try {
-						var infobox = JSON.parse(querypage.pageprops.infoboxes)?.[0];
-						parse_infobox(infobox, embed, '', wiki.articleURL.href);
-					}
-					catch ( error ) {
-						console.log( '- Failed to parse the infobox: ' + error );
-					}
-				}
-			}, error => {
-				console.log( '- Error while getting the main page: ' + error );
-			} ).finally( () => {
-				msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, '', fragment) );
-				
-				if ( reaction ) reaction.removeEmoji();
-			} );
-		}
+			}
+		}, error => {
+			console.log( '- Error while getting the main page: ' + error );
+		} ).finally( () => {
+			msg.sendChannel( spoiler + '<' + pagelink + '>' + spoiler, {embed} ).then( message => parse_page(message, querypage, embed, wiki, '', fragment) );
+			
+			if ( reaction ) reaction.removeEmoji();
+		} );
 	}, error => {
 		if ( interwiki ) msg.sendChannel( spoiler + ' ' + interwiki + ' ' + spoiler );
 		else if ( wiki.noWiki(error.message) ) {

+ 1 - 1
cmds/wiki/overview.js

@@ -38,7 +38,7 @@ function gamepedia_overview(lang, msg, wiki, reaction, spoiler) {
 			return;
 		}
 		wiki.updateWiki(body.query.general);
-		logging(wiki, 'overview');
+		logging(wiki, msg.guild?.id, 'overview');
 		var version = [lang.get('overview.version'), body.query.general.generator];
 		var creation_date = null;
 		var created = [lang.get('overview.created'), lang.get('overview.unknown')];

+ 1 - 1
cmds/wiki/random.js

@@ -32,7 +32,7 @@ function gamepedia_random(lang, msg, wiki, reaction, spoiler) {
 			return;
 		}
 		wiki.updateWiki(body.query.general);
-		logging(wiki, 'random');
+		logging(wiki, msg.guild?.id, 'random');
 		var querypage = Object.values(body.query.pages)[0];
 		var pagelink = wiki.toLink(querypage.title);
 		var embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( querypage.title.escapeFormatting() ).setURL( pagelink );

+ 3 - 0
cmds/wiki/user.js

@@ -26,6 +26,7 @@ getAllSites.then( sites => allSites = sites );
 function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragment, querypage, contribs, reaction, spoiler) {
 	if ( !allSites.length ) getAllSites.update();
 	if ( /^(?:(?:\d{1,3}\.){3}\d{1,3}(?:\/\d{2})?|(?:[\dA-F]{1,4}:){7}[\dA-F]{1,4}(?:\/\d{2,3})?)$/.test(username) ) return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&list=blocks&bkprop=user|by|timestamp|expiry|reason&bkip=' + encodeURIComponent( username ) + '&format=json' ).then( response => {
+		logging(wiki, msg.guild?.id, 'user', 'ip');
 		var body = response.body;
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.blocks || fragment ) {
@@ -183,12 +184,14 @@ function gamepedia_user(lang, msg, namespace, username, wiki, querystring, fragm
 			if ( reaction ) reaction.removeEmoji();
 		} );
 	}, error => {
+		logging(wiki, msg.guild?.id, 'user', 'ip');
 		console.log( '- Error while getting the search results: ' + error );
 		msg.sendChannelError( spoiler + '<' + wiki.toLink(( querypage.noRedirect ? namespace : contribs ) + username, querystring, fragment) + '>' + spoiler );
 		
 		if ( reaction ) reaction.removeEmoji();
 	} );
 
+	logging(wiki, msg.guild?.id, 'user');
 	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);

+ 1 - 0
functions/special_page.js

@@ -127,6 +127,7 @@ function special_page(lang, msg, title, specialpage, embed, wiki, reaction, spoi
 		overwrites[specialpage](this, lang, msg, wiki, reaction, spoiler, args, embed);
 		return;
 	}
+	logging(wiki, msg.guild?.id, 'general', 'special');
 	if ( specialpage === 'recentchanges' && msg.isAdmin() ) {
 		embed.addField( lang.get('rcscript.title'), lang.get('rcscript.ad', ( patreons[msg?.guild?.id] || process.env.prefix ), '[RcGcDw](https://gitlab.com/piotrex43/RcGcDw)') );
 	}

+ 4 - 4
util/logging.js

@@ -13,11 +13,11 @@ usageLog.on( 'error', (error) => {
 /**
  * Log wikis by usage.
  * @param {import('./wiki.js')} wiki - The wiki.
- * @param {String[]} notes - The notes about the usage.
- * @returns {Boolean}
+ * @param {String} [guild] - The guild.
+ * @param {String[]} [notes] - The notes about the usage.
  */
-function logging(wiki, ...notes) {
-	return usageLog.write( `${new Date().toISOString()}\t${wiki.href}\t${notes.join('\t')}\n`, 'utf8' );
+function logging(wiki, guild = 'DM', ...notes) {
+	usageLog.write( [new Date().toISOString(), wiki.href, guild, ...notes].join('\t') + '\n', 'utf8' );
 }
 
 module.exports = logging;

+ 14 - 4
util/newMessage.js

@@ -166,12 +166,13 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 				return;
 			}
 			wiki.updateWiki(body.query.general);
-			logging(wiki, 'inline');
+			logging(wiki, msg.guild?.id, 'inline');
 			if ( body.query.normalized ) {
 				body.query.normalized.forEach( title => links.filter( link => link.title === title.from ).forEach( link => link.title = title.to ) );
 			}
 			if ( body.query.interwiki ) {
 				body.query.interwiki.forEach( interwiki => links.filter( link => link.title === interwiki.title ).forEach( link => {
+					logging(wiki, msg.guild?.id, 'inline', 'interwiki');
 					link.url = ( link.section ? interwiki.url.split('#')[0] + Wiki.toSection(link.section) : interwiki.url );
 				} ) );
 			}
@@ -183,15 +184,20 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 				querypages.filter( page => page.missing !== undefined && page.known === undefined ).forEach( page => links.filter( link => link.title === page.title ).forEach( link => {
 					if ( ( page.ns === 2 || page.ns === 202 ) && !page.title.includes( '/' ) ) return;
 					if ( wiki.isMiraheze() && page.ns === 0 && /^Mh:[a-z\d]+:/.test(page.title) ) {
+						logging(wiki, msg.guild?.id, 'inline', 'interwiki');
 						var iw_parts = page.title.split(':');
 						var iw = new Wiki('https://' + iw_parts[1] + '.miraheze.org/w/');
 						link.url = iw.toLink(iw_parts.slice(2).join(':'), '', link.section);
 						return;
 					}
+					logging(wiki, msg.guild?.id, 'inline', 'redlink');
 					link.url = wiki.toLink(link.title, 'action=edit&redlink=1');
 				} ) );
 			}
-			if ( links.length ) msg.sendChannel( links.map( link => link.spoiler + '<' + ( link.url || wiki.toLink(link.title, '', link.section) ) + '>' + link.spoiler ).join('\n'), {split:true} );
+			if ( links.length ) msg.sendChannel( links.map( link => {
+				if ( !link.url ) logging(wiki, msg.guild?.id, 'inline');
+				return link.spoiler + '<' + ( link.url || wiki.toLink(link.title, '', link.section) ) + '>' + link.spoiler;
+			} ).join('\n'), {split:true} );
 		}, error => {
 			if ( wiki.noWiki(error.message) ) {
 				console.log( '- This wiki doesn\'t exist!' );
@@ -234,11 +240,15 @@ function newMessage(msg, lang, wiki = defaultSettings.wiki, prefix = process.env
 					if ( embed.template || !body.query.variables || !body.query.variables.some( variable => variable.toUpperCase() === embed.title ) ) missing.push(embed);
 				} ) );
 				if ( missing.length ) {
-					logging(wiki, 'inline', 'template');
-					msg.sendChannel( missing.map( embed => embed.spoiler + '<' + ( embed.template || wiki.toLink(embed.title, 'action=edit&redlink=1') ) + '>' + embed.spoiler ).join('\n'), {split:true} );
+					msg.sendChannel( missing.map( embed => {
+						if ( embed.template ) logging(wiki, msg.guild?.id, 'inline', 'template');
+						else logging(wiki, msg.guild?.id, 'inline', 'redlink');
+						return embed.spoiler + '<' + ( embed.template || wiki.toLink(embed.title, 'action=edit&redlink=1') ) + '>' + embed.spoiler;
+					} ).join('\n'), {split:true} );
 				}
 			}
 			if ( embeds.length ) embeds.forEach( embed => msg.reactEmoji('⏳').then( reaction => {
+				logging(wiki, msg.guild?.id, 'inline', 'embed');
 				check_wiki.general(lang, msg, embed.title, wiki, '', reaction, embed.spoiler, new URLSearchParams(), embed.section);
 			} ) );
 		}, error => {