Răsfoiți Sursa

Update RcGcDb

Added message stacking
Reworked database
Markus-Rost 4 ani în urmă
părinte
comite
60c6c69473
6 a modificat fișierele cu 194 adăugiri și 130 ștergeri
  1. 1 1
      RcGcDb
  2. 3 4
      cmds/eval.js
  3. 41 56
      cmds/rcscript.js
  4. 1 0
      dashboard/oauth.js
  5. 74 62
      dashboard/rcscript.js
  6. 74 7
      database.js

+ 1 - 1
RcGcDb

@@ -1 +1 @@
-Subproject commit 10064be78d6b189de1a7d42d33efd7010d27f2b0
+Subproject commit bd9184ef480f818a6eef7c427eb5808f092c742e

+ 3 - 4
cmds/eval.js

@@ -59,12 +59,12 @@ function database(sql, sqlargs = []) {
  */
 function checkWiki(wiki) {
 	wiki = Wiki.fromInput(wiki);
-	return got.get( wiki + 'api.php?&action=query&meta=siteinfo&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' ).then( response => {
+	return got.get( wiki + 'api.php?&action=query&meta=siteinfo&siprop=general&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' ).then( response => {
 		if ( response.statusCode === 404 && typeof response.body === 'string' ) {
 			let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
 			if ( api ) {
 				wiki = new Wiki(api.split('api.php?')[0], wiki);
-				return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' );
+				return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' );
 			}
 		}
 		return response;
@@ -78,7 +78,6 @@ function checkWiki(wiki) {
 			wiki: wiki.href,
 			activity: [],
 			rcid: 0,
-			wikiid: ( body.query.variables?.find?.( variable => variable?.id === 'wgCityId' )?.['*'] || null ),
 			postid: null
 		}
 		var rc = body.query.recentchanges;
@@ -110,7 +109,7 @@ function checkWiki(wiki) {
 			result.activity.push(`${rc.length} edits in${text}`);
 		}
 		return Promise.all([
-			database('SELECT guild, lang, display, rcid, wikiid, postid FROM rcgcdw WHERE wiki = ?', [result.wiki]).then( rows => {
+			database('SELECT guild, lang, display, rcid, postid FROM rcgcdw WHERE wiki = ?', [result.wiki]).then( rows => {
 				result.rcgcdb = rows;
 			}, error => {
 				result.rcgcdb = error.toString();

+ 41 - 56
cmds/rcscript.js

@@ -29,7 +29,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 	if ( !msg.isAdmin() ) return msg.reactEmoji('❌');
 	if ( msg.defaultSettings ) return help_setup(lang, msg);
 	
-	db.all( 'SELECT configid, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE guild = ? ORDER BY configid ASC', [msg.guild.id], (dberror, rows) => {
+	db.all( 'SELECT configid, webhook, wiki, lang, display, rcid, postid FROM rcgcdw WHERE guild = ? ORDER BY configid ASC', [msg.guild.id], (dberror, rows) => {
 		if ( dberror || !rows ) {
 			console.log( '- Error while getting the RcGcDw: ' + dberror );
 			msg.reactEmoji('error', true);
@@ -63,12 +63,12 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				wikinew = Wiki.fromInput(input);
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
 			}
-			return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general' + ( wikinew.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' ).then( response => {
+			return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' ).then( response => {
 				if ( response.statusCode === 404 && typeof response.body === 'string' ) {
 					let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
 					if ( api ) {
 						wikinew = new Wiki(api.split('api.php?')[0], wikinew);
-						return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general' + ( wikinew.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' );
+						return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
 					}
 				}
 				return response;
@@ -101,8 +101,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 						if ( reaction ) reaction.removeEmoji();
 						return msg.replyMsg( ( block.reason ? lang.get('rcscript.blocked_reason', block.reason) : lang.get('rcscript.blocked') ), {}, true );
 					}
-					var wikiid = body.query.variables?.find?.( variable => variable?.id === 'wgCityId' )?.['*'];
-					if ( wikinew.isFandom(false) && wikiid ) return got.get( 'https://services.fandom.com/discussion/' + wikiid + '/posts?limit=1&format=json&cache=' + Date.now(), {
+					if ( wikinew.isFandom(false) ) return got.get( wikinew + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
 						headers: {
 							Accept: 'application/hal+json'
 						}
@@ -112,7 +111,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 							if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
 							return createWebhook();
 						}
-						return createWebhook(parseInt(wikiid, 10));
+						return createWebhook(true);
 					}, error => {
 						console.log( '- Error while checking for discussions: ' + error );
 						return createWebhook();
@@ -121,22 +120,22 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 
 					/**
 					 * Creates the webhook.
-					 * @param {Number} wikiid - The ID of the wiki.
+					 * @param {Boolean} enableFeeds - If feeds based changes should be enabled.
 					 */
-					function createWebhook(wikiid = null) {
+					function createWebhook(enableFeeds = false) {
 						msg.channel.createWebhook( ( body.query.allmessages[1]['*'] || 'Recent changes' ), {
 							avatar: msg.client.user.displayAvatarURL({format:'png',size:4096}),
 							reason: lang.get('rcscript.audit_reason', wikinew.href)
 						} ).then( webhook => {
 							console.log( '- Webhook successfully created.' );
 							var webhook_lang = new Lang(( allLangs.map[lang.lang] || allLangs.map[body.query.general.lang] || defaultSettings.lang ), 'rcscript.webhook');
-							webhook.send( webhook_lang.get('created', body.query.general.sitename) + '\n<' + wikinew.toLink(body.query.pages['-1'].title) + ( wikiid ? '>\n<' + wikinew + 'f' : '' ) + '>' ).catch(log_error);
+							webhook.send( webhook_lang.get('created', body.query.general.sitename) + '\n<' + wikinew.toLink(body.query.pages['-1'].title) + ( enableFeeds ? '>\n<' + wikinew + 'f' : '' ) + '>' ).catch(log_error);
 							var new_configid = 1;
 							for ( let i of rows.map( row => row.configid ) ) {
 								if ( new_configid === i ) new_configid++;
 								else break;
 							}
-							db.run( 'INSERT INTO rcgcdw(guild, configid, webhook, wiki, lang, display, wikiid) VALUES(?, ?, ?, ?, ?, ?, ?)', [msg.guild.id, new_configid, webhook.id + '/' + webhook.token, wikinew.href, webhook_lang.lang, ( msg.showEmbed() ? 1 : 0 ), wikiid], function (error) {
+							db.run( 'INSERT INTO rcgcdw(guild, configid, webhook, wiki, lang, display, postid) VALUES(?, ?, ?, ?, ?, ?, ?)', [msg.guild.id, new_configid, webhook.id + '/' + webhook.token, wikinew.href, webhook_lang.lang, ( msg.showEmbed() ? 1 : 0 ), ( enableFeeds ? null : '-1' )], function (error) {
 								if ( error ) {
 									console.log( '- Error while adding the RcGcDw: ' + error );
 									if ( reaction ) reaction.removeEmoji();
@@ -221,12 +220,12 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				var wikiinvalid = lang.get('settings.wikiinvalid') + '\n`' + cmd + ' wiki ' + lang.get('rcscript.new_wiki') + '`\n' + lang.get('rcscript.help_wiki');
 				var wikinew = Wiki.fromInput(args[1]);
 				if ( !wikinew ) return msg.replyMsg( wikiinvalid, {}, true );
-				return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general' + ( wikinew.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' ).then( response => {
+				return msg.reactEmoji('⏳', true).then( reaction => got.get( wikinew + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' ).then( response => {
 					if ( response.statusCode === 404 && typeof response.body === 'string' ) {
 						let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
 						if ( api ) {
 							wikinew = new Wiki(api.split('api.php?')[0], wikinew);
-							return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general' + ( wikinew.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' );
+							return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
 						}
 					}
 					return response;
@@ -260,8 +259,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 							if ( reaction ) reaction.removeEmoji();
 							return msg.replyMsg( ( block.reason ? lang.get('rcscript.blocked_reason', block.reason) : lang.get('rcscript.blocked') ), {}, true );
 						}
-						var wikiid = body.query.variables?.find?.( variable => variable?.id === 'wgCityId' )?.['*'];
-						if ( wikinew.isFandom(false) && wikiid ) return got.get( 'https://services.fandom.com/discussion/' + wikiid + '/posts?limit=1&format=json&cache=' + Date.now(), {
+						if ( wikinew.isFandom(false) ) return got.get( wikinew + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
 							headers: {
 								Accept: 'application/hal+json'
 							}
@@ -271,7 +269,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 								if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
 								return updateWiki();
 							}
-							return updateWiki(parseInt(wikiid, 10));
+							return updateWiki(true);
 						}, error => {
 							console.log( '- Error while checking for discussions: ' + error );
 							return updateWiki();
@@ -280,13 +278,13 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 
 						/**
 						 * Changes the wiki.
-						 * @param {Number} wikiid - The ID of the wiki.
+						 * @param {Boolean} enableFeeds - If feeds based changes should be enabled.
 						 */
-						function updateWiki(wikiid = null) {
+						function updateWiki(enableFeeds = false) {
 							msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
-								webhook.send( webhook_lang.get('updated_wiki', body.query.general.sitename) + '\n<' + wikinew.toLink(body.query.pages['-1'].title) + ( wikiid ? '>\n<' + wikinew + 'f' : '' ) + '>' ).catch(log_error);
+								webhook.send( webhook_lang.get('updated_wiki', body.query.general.sitename) + '\n<' + wikinew.toLink(body.query.pages['-1'].title) + ( enableFeeds ? '>\n<' + wikinew + 'f' : '' ) + '>' ).catch(log_error);
 							}, log_error );
-							db.run( 'UPDATE rcgcdw SET wiki = ?, wikiid = ?, rcid = ?, postid = ? WHERE webhook = ?', [wikinew.href, wikiid, null, null, selected_row.webhook], function (error) {
+							db.run( 'UPDATE rcgcdw SET wiki = ?, rcid = ?, postid = ? WHERE webhook = ?', [wikinew.href, null, ( enableFeeds ? null : '-1' ), selected_row.webhook], function (error) {
 								if ( error ) {
 									console.log( '- Error while updating the RcGcDw: ' + error );
 									if ( reaction ) reaction.removeEmoji();
@@ -368,7 +366,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 						} );
 					}
 
-					if ( !selected_row.wikiid ) {
+					if ( selected_row.postid === '-1' ) {
 						return msg.replyMsg( lang.get('rcscript.all_inactive') + '\n\n' + lang.get('rcscript.delete') + '\n`' + cmd + ' delete`', {}, true );
 					}
 					msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
@@ -385,14 +383,14 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 					} );
 				}
 
-				if ( selected_row.wikiid ) {
+				if ( selected_row.postid !== '-1' ) {
 					if ( selected_row.rcid === -1 ) {
 						return msg.replyMsg( lang.get('rcscript.all_inactive') + '\n\n' + lang.get('rcscript.delete') + '\n`' + cmd + ' delete`', {}, true );
 					}
 					msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
 						webhook.send( webhook_lang.get('disabled_feeds') ).catch(log_error);
 					}, log_error );
-					return db.run( 'UPDATE rcgcdw SET wikiid = ?, postid = ? WHERE webhook = ?', [null, null, selected_row.webhook], function (error) {
+					return db.run( 'UPDATE rcgcdw SET postid = ? WHERE webhook = ?', ['-1', selected_row.webhook], function (error) {
 						if ( error ) {
 							console.log( '- Error while updating the RcGcDw: ' + error );
 							msg.replyMsg( lang.get('settings.save_failed'), {}, true );
@@ -403,46 +401,33 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 					} );
 				}
 
-				return msg.reactEmoji('⏳', true).then( reaction => got.get( selected_row.wiki + 'api.php?action=query&meta=siteinfo&siprop=general|variables&format=json' ).then( wiresponse => {
-					var wibody = wiresponse.body;
-					if ( wiresponse.statusCode !== 200 || !wibody?.query?.variables?.some?.( variable => variable?.id === 'wgCityId' )?.['*'] ) {
-						console.log( '- ' + wiresponse.statusCode + ': Error while getting the wiki id: ' + wibody?.error?.info );
+				return msg.reactEmoji('⏳', true).then( reaction => got.get( selected_row.wiki + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
+					headers: {
+						Accept: 'application/hal+json'
+					}
+				} ).then( dsresponse => {
+					var dsbody = dsresponse.body;
+					if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
+						if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
 						if ( reaction ) reaction.removeEmoji();
 						return msg.replyMsg( lang.get('rcscript.no_feeds'), {}, true );
 					}
-					var wikiid = wibody.query.variables.find( variable => variable.id === 'wgCityId' )['*'];
-					return got.get( 'https://services.fandom.com/discussion/' + wikiid + '/posts?limit=1&format=json&cache=' + Date.now(), {
-						headers: {
-							Accept: 'application/hal+json'
-						}
-					} ).then( dsresponse => {
-						var dsbody = dsresponse.body;
-						if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
-							if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
+					msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
+						webhook.send( webhook_lang.get('enabled_feeds', body.query.general.sitename) + '\n<' + selected_row.wiki + 'f>' ).catch(log_error);
+					}, log_error );
+					db.run( 'UPDATE rcgcdw SET postid = ? WHERE webhook = ?', [null, selected_row.webhook], function (error) {
+						if ( error ) {
+							console.log( '- Error while updating the RcGcDw: ' + error );
 							if ( reaction ) reaction.removeEmoji();
-							return msg.replyMsg( lang.get('rcscript.no_feeds'), {}, true );
+							msg.replyMsg( lang.get('settings.save_failed'), {}, true );
+							return error;
 						}
-						msg.client.fetchWebhook(...selected_row.webhook.split('/')).then( webhook => {
-							webhook.send( webhook_lang.get('enabled_feeds', body.query.general.sitename) + '\n<' + selected_row.wiki + 'f>' ).catch(log_error);
-						}, log_error );
-						db.run( 'UPDATE rcgcdw SET wikiid = ?, postid = ? WHERE webhook = ?', [parseInt(wikiid, 10), null, selected_row.webhook], function (error) {
-							if ( error ) {
-								console.log( '- Error while updating the RcGcDw: ' + error );
-								if ( reaction ) reaction.removeEmoji();
-								msg.replyMsg( lang.get('settings.save_failed'), {}, true );
-								return error;
-							}
-							console.log( '- RcGcDw successfully updated.' );
-							if ( reaction ) reaction.removeEmoji();
-							msg.replyMsg( lang.get('rcscript.enabled_feeds') + '\n`' + cmd + '`', {}, true );
-						} );
-					}, error => {
-						console.log( '- Error while checking for discussions: ' + error );
+						console.log( '- RcGcDw successfully updated.' );
 						if ( reaction ) reaction.removeEmoji();
-						return msg.replyMsg( lang.get('rcscript.no_feeds'), {}, true );
+						msg.replyMsg( lang.get('rcscript.enabled_feeds') + '\n`' + cmd + '`', {}, true );
 					} );
 				}, error => {
-					console.log( '- Error while getting the wiki id: ' + error );
+					console.log( '- Error while checking for discussions: ' + error );
 					if ( reaction ) reaction.removeEmoji();
 					return msg.replyMsg( lang.get('rcscript.no_feeds'), {}, true );
 				} ) );
@@ -478,7 +463,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 					text += '\n`' + cmd + ' feeds only` ' + lang.get('rcscript.toggle') + '\n';
 				}
 				if ( new Wiki(selected_row.wiki).isFandom(false) ) {
-					text += '\n' + lang.get('rcscript.feeds') + ' *`' + lang.get('rcscript.' + ( selected_row.wikiid ? 'enabled' : 'disabled' )) + '`*';
+					text += '\n' + lang.get('rcscript.feeds') + ' *`' + lang.get('rcscript.' + ( selected_row.postid === '-1' ? 'disabled' : 'enabled' )) + '`*';
 					text += '\n' + lang.get('rcscript.help_feeds') + '\n`' + cmd + ' feeds` ' + lang.get('rcscript.toggle') + '\n';
 				}
 				text += '\n' + lang.get('rcscript.delete') + '\n`' + cmd + ' delete`\n';
@@ -528,7 +513,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 						if ( only ) row_text += '\n`' + cmd + ' feeds only` ' + lang.get('rcscript.toggle') + '\n';
 					}
 					if ( new Wiki(row.wiki).isFandom(false) ) {
-						row_text += '\n' + lang.get('rcscript.feeds') + ' *`' + lang.get('rcscript.' + ( row.wikiid ? 'enabled' : 'disabled' )) + '`*';
+						row_text += '\n' + lang.get('rcscript.feeds') + ' *`' + lang.get('rcscript.' + ( row.postid === '-1' ? 'disabled' : 'enabled' )) + '`*';
 						if ( only ) row_text += '\n' + lang.get('rcscript.help_feeds') + '\n`' + cmd + ' feeds` ' + lang.get('rcscript.toggle') + '\n';
 					}
 					if ( only ) row_text += '\n' + lang.get('rcscript.delete') + '\n`' + cmd + ' delete`\n';

+ 1 - 0
dashboard/oauth.js

@@ -255,6 +255,7 @@ function dashboard_api(res, input) {
 			result.RcGcDw = body.query.allmessages[0]['*'];
 		}
 		result.customRcGcDw = wiki.toLink('MediaWiki:Custom-RcGcDw', 'action=edit');
+		if ( wiki.isFandom() ) return;
 	}, error => {
 		console.log( '- Dashboard: Error while checking the wiki: ' + error );
 		result.error = true;

+ 74 - 62
dashboard/rcscript.js

@@ -66,8 +66,8 @@ const fieldset = {
  * @param {String} settings.wiki
  * @param {String} settings.lang
  * @param {Number} settings.display
- * @param {Number} [settings.wikiid]
  * @param {Number} [settings.rcid]
+ * @param {String} [settings.postid]
  * @param {import('./util.js').Channel[]} guildChannels - The guild channels
  * @param {String[]} allWikis - The guild wikis
  */
@@ -142,7 +142,7 @@ function createForm($, header, dashboardLang, settings, guildChannels, allWikis)
 	feeds.find('label').eq(0).text(dashboardLang.get('rcscript.form.feeds'));
 	feeds.find('label').eq(1).text(dashboardLang.get('rcscript.form.feeds_only'));
 	if ( /\.(?:fandom\.com|wikia\.org)$/.test(new URL(settings.wiki).hostname) ) {
-		if ( settings.wikiid ) {
+		if ( settings.postid !== '-1' ) {
 			feeds.find('#wb-settings-feeds').attr('checked', '');
 			if ( settings.rcid === -1 ) feeds.find('#wb-settings-feeds-only').attr('checked', '');
 		}
@@ -178,7 +178,7 @@ function createForm($, header, dashboardLang, settings, guildChannels, allWikis)
  * @param {import('./i18n.js')} dashboardLang - The user language
  */
 function dashboard_rcscript(res, $, guild, args, dashboardLang) {
-	db.all( 'SELECT discord.wiki mainwiki, discord.lang mainlang, (SELECT GROUP_CONCAT(DISTINCT wiki) FROM discord WHERE guild = ?) allwikis, webhook, configid, rcgcdw.wiki, rcgcdw.lang, display, wikiid, rcid FROM discord LEFT JOIN rcgcdw ON discord.guild = rcgcdw.guild WHERE discord.guild = ? AND discord.channel IS NULL ORDER BY configid ASC', [guild.id, guild.id], function(dberror, rows) {
+	db.all( 'SELECT discord.wiki mainwiki, discord.lang mainlang, (SELECT GROUP_CONCAT(DISTINCT wiki) FROM discord WHERE guild = ?) allwikis, webhook, configid, rcgcdw.wiki, rcgcdw.lang, display, rcid, postid FROM discord LEFT JOIN rcgcdw ON discord.guild = rcgcdw.guild WHERE discord.guild = ? AND discord.channel IS NULL ORDER BY configid ASC', [guild.id, guild.id], function(dberror, rows) {
 		if ( dberror ) {
 			console.log( '- Dashboard: Error while getting the RcGcDw: ' + dberror );
 			createNotice($, 'error', dashboardLang);
@@ -331,12 +331,12 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 				return res(`/guild/${guild}/rcscript`, 'savefail');
 			}
 			var wiki = Wiki.fromInput(settings.wiki);
-			return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' ).then( fresponse => {
+			return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' ).then( fresponse => {
 				if ( fresponse.statusCode === 404 && typeof fresponse.body === 'string' ) {
 					let api = cheerio.load(fresponse.body)('head link[rel="EditURI"]').prop('href');
 					if ( api ) {
 						wiki = new Wiki(api.split('api.php?')[0], wiki);
-						return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&titles=Special:RecentChanges&format=json' );
+						return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
 					}
 				}
 				return fresponse;
@@ -362,31 +362,28 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 						console.log( `- Dashboard: ${wiki.href} is blocked: ${block.reason}` );
 						return res(`/guild/${guild}/rcscript/new`, 'wikiblocked', body.query.general.sitename, block.reason);
 					}
-					if ( settings.feeds ) {
-						let wikiid = body.query.variables?.find?.( variable => variable?.id === 'wgCityId' )?.['*'];
-						if ( wiki.isFandom(false) && wikiid ) return got.get( 'https://services.fandom.com/discussion/' + wikiid + '/posts?limit=1&format=json&cache=' + Date.now(), {
-							headers: {
-								Accept: 'application/hal+json'
-							}
-						} ).then( dsresponse => {
-							var dsbody = dsresponse.body;
-							if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
-								if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- Dashboard: ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
-								return createWebhook();
-							}
-							return createWebhook(parseInt(wikiid, 10));
-						}, error => {
-							console.log( '- Dashboard: Error while checking for discussions: ' + error );
+					if ( settings.feeds && wiki.isFandom(false) ) return got.get( wiki + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
+						headers: {
+							Accept: 'application/hal+json'
+						}
+					} ).then( dsresponse => {
+						var dsbody = dsresponse.body;
+						if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
+							if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- Dashboard: ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
 							return createWebhook();
-						} );
-					}
+						}
+						return createWebhook(true);
+					}, error => {
+						console.log( '- Dashboard: Error while checking for discussions: ' + error );
+						return createWebhook();
+					} );
 					return createWebhook();
 
 					/**
 					 * Creates the webhook.
-					 * @param {Number} wikiid - The ID of the wiki.
+					 * @param {Boolean} enableFeeds - If feeds based changes should be enabled.
 					 */
-					function createWebhook(wikiid = null) {
+					function createWebhook(enableFeeds = false) {
 						var lang = new Lang(row.lang);
 						var webhook_lang = new Lang(settings.lang, 'rcscript.webhook');
 						sendMsg( {
@@ -395,7 +392,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 							channel: settings.channel,
 							name: ( body.query.allmessages[1]['*'] || 'Recent changes' ),
 							reason: lang.get('rcscript.audit_reason', wiki.href),
-							text: webhook_lang.get('created', body.query.general.sitename) + ( wikiid && settings.feeds_only ? '' : `\n<${wiki.toLink(body.query.pages['-1'].title)}>` ) + ( wikiid ? `\n<${wiki.href}f>` : '' )
+							text: webhook_lang.get('created', body.query.general.sitename) + ( enableFeeds && settings.feeds_only ? '' : `\n<${wiki.toLink(body.query.pages['-1'].title)}>` ) + ( enableFeeds ? `\n<${wiki.href}f>` : '' )
 						} ).then( webhook => {
 							if ( !webhook ) return res(`/guild/${guild}/rcscript/new`, 'savefail');
 							var configid = 1;
@@ -403,7 +400,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 								if ( configid === i ) configid++;
 								else break;
 							}
-							db.run( 'INSERT INTO rcgcdw(guild, configid, webhook, wiki, lang, display, wikiid, rcid) VALUES(?, ?, ?, ?, ?, ?, ?, ?)', [guild, configid, webhook, wiki.href, settings.lang, settings.display, wikiid, ( wikiid && settings.feeds_only ? -1 : null )], function (dberror) {
+							db.run( 'INSERT INTO rcgcdw(guild, configid, webhook, wiki, lang, display, rcid, postid) VALUES(?, ?, ?, ?, ?, ?, ?, ?)', [guild, configid, webhook, wiki.href, settings.lang, settings.display, ( enableFeeds && settings.feeds_only ? -1 : null ), ( enableFeeds ? null : '-1' )], function (dberror) {
 								if ( dberror ) {
 									console.log( '- Dashboard: Error while adding the RcGcDw: ' + dberror );
 									return res(`/guild/${guild}/rcscript/new`, 'savefail');
@@ -415,8 +412,8 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 								text += `\n${lang.get('rcscript.wiki')} <${wiki.href}>`;
 								text += `\n${lang.get('rcscript.lang')} \`${allLangs.names[settings.lang]}\``;
 								text += `\n${lang.get('rcscript.display')} \`${display_types[settings.display]}\``;
-								if ( wikiid && settings.feeds_only ) text += `\n${lang.get('rcscript.rc')} *\`${lang.get('rcscript.disabled')}\`*`;
-								if ( wiki.isFandom(false) ) text += `\n${lang.get('rcscript.feeds')} *\`${lang.get('rcscript.' + ( wikiid ? 'enabled' : 'disabled' ))}\`*`;
+								if ( enableFeeds && settings.feeds_only ) text += `\n${lang.get('rcscript.rc')} *\`${lang.get('rcscript.disabled')}\`*`;
+								if ( wiki.isFandom(false) ) text += `\n${lang.get('rcscript.feeds')} *\`${lang.get('rcscript.' + ( enableFeeds ? 'enabled' : 'disabled' ))}\`*`;
 								text += `\n<${new URL(`/guild/${guild}/rcscript/${configid}`, process.env.dashboard).href}>`;
 								sendMsg( {
 									type: 'notifyGuild', guild, text,
@@ -441,7 +438,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 		return res(`/guild/${guild}/rcscript/new`, 'savefail');
 	} );
 	type = parseInt(type, 10);
-	return db.get( 'SELECT discord.lang mainlang, webhook, rcgcdw.wiki, rcgcdw.lang, display, wikiid, rcid FROM discord LEFT JOIN rcgcdw ON discord.guild = rcgcdw.guild AND configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(curerror, row) {
+	return db.get( 'SELECT discord.lang mainlang, webhook, rcgcdw.wiki, rcgcdw.lang, display, rcid, postid FROM discord LEFT JOIN rcgcdw ON discord.guild = rcgcdw.guild AND configid = ? WHERE discord.guild = ? AND discord.channel IS NULL', [type, guild], function(curerror, row) {
 		if ( curerror ) {
 			console.log( '- Dashboard: Error while checking for RcGcDw: ' + curerror );
 			return res(`/guild/${guild}/rcscript/${type}`, 'savefail');
@@ -524,7 +521,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 						if ( row.rcid === -1 ) {
 							text += `\n${lang.get('rcscript.rc')} *\`${lang.get('rcscript.disabled')}\`*`;
 						}
-						if ( new Wiki(row.wiki).isFandom(false) ) text += `\n${lang.get('rcscript.feeds')} *\`${lang.get('rcscript.' + ( row.wikiid ? 'enabled' : 'disabled' ))}\`*`;
+						if ( new Wiki(row.wiki).isFandom(false) ) text += `\n${lang.get('rcscript.feeds')} *\`${lang.get('rcscript.' + ( row.postid === '-1' ? 'disabled' : 'enabled' ))}\`*`;
 						text += `\n<${new URL(`/guild/${guild}/rcscript`, process.env.dashboard).href}>`;
 						sendMsg( {
 							type: 'notifyGuild', guild, text
@@ -545,15 +542,15 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 				if ( row.lang !== settings.lang ) hasDiff = true;
 				if ( row.display !== settings.display ) hasDiff = true;
 				if ( ( row.rcid !== -1 ) !== !( settings.feeds && settings.feeds_only ) ) hasDiff = true;
-				if ( !row.wikiid !== !settings.feeds ) hasDiff = true;
+				if ( ( row.postid === '-1' ) !== !settings.feeds ) hasDiff = true;
 				if ( !hasDiff ) return res(`/guild/${guild}/rcscript/${type}`, 'save');
 				var wiki = Wiki.fromInput(settings.wiki);
-				return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&format=json' ).then( fresponse => {
+				return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json' ).then( fresponse => {
 					if ( fresponse.statusCode === 404 && typeof fresponse.body === 'string' ) {
 						let api = cheerio.load(fresponse.body)('head link[rel="EditURI"]').prop('href');
 						if ( api ) {
 							wiki = new Wiki(api.split('api.php?')[0], wiki);
-							return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general' + ( wiki.isFandom() ? '|variables' : '' ) + '&format=json' );
+							return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json' );
 						}
 					}
 					return fresponse;
@@ -579,38 +576,53 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 							console.log( `- Dashboard: ${wiki.href} is blocked: ${block.reason}` );
 							return res(`/guild/${guild}/rcscript/${type}`, 'wikiblocked', body.query.general.sitename, block.reason);
 						}
-						if ( settings.feeds ) {
-							let wikiid = body.query.variables?.find?.( variable => variable?.id === 'wgCityId' )?.['*'];
-							if ( wiki.isFandom(false) && wikiid ) return got.get( 'https://services.fandom.com/discussion/' + wikiid + '/posts?limit=1&format=json&cache=' + Date.now(), {
-								headers: {
-									Accept: 'application/hal+json'
-								}
-							} ).then( dsresponse => {
-								var dsbody = dsresponse.body;
-								if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
-									if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- Dashboard: ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
-									return updateWebhook();
-								}
-								return updateWebhook(parseInt(wikiid, 10));
-							}, error => {
-								console.log( '- Dashboard: Error while checking for discussions: ' + error );
+						if ( settings.feeds && wiki.isFandom(false) ) return got.get( wiki + 'wikia.php?controller=DiscussionPost&method=getPosts&limit=1&format=json&cache=' + Date.now(), {
+							headers: {
+								Accept: 'application/hal+json'
+							}
+						} ).then( dsresponse => {
+							var dsbody = dsresponse.body;
+							if ( dsresponse.statusCode !== 200 || !dsbody || dsbody.title ) {
+								if ( dsbody?.title !== 'site doesn\'t exists' ) console.log( '- Dashboard: ' + dsresponse.statusCode + ': Error while checking for discussions: ' + dsbody?.title );
 								return updateWebhook();
-							} );
-						}
+							}
+							return updateWebhook(true);
+						}, error => {
+							console.log( '- Dashboard: Error while checking for discussions: ' + error );
+							return updateWebhook();
+						} );
 						return updateWebhook();
 
 						/**
 						 * Creates the webhook.
-						 * @param {Number} wikiid - The ID of the wiki.
+						 * @param {Boolean} enableFeeds - If feeds based changes should be enabled.
 						 */
-						function updateWebhook(wikiid = null) {
-							var sql = 'UPDATE rcgcdw SET wiki = ?, lang = ?, display = ?, wikiid = ? WHERE webhook = ?';
-							var sqlargs = [wiki.href, settings.lang, settings.display, wikiid];
-							if ( wikiid && settings.feeds_only ) {
-								sql = 'UPDATE rcgcdw SET wiki = ?, lang = ?, display = ?, wikiid = ?, rcid = ? WHERE webhook = ?';
-								sqlargs.push(-1);
+						function updateWebhook(enableFeeds = null) {
+							var sql = 'UPDATE rcgcdw SET wiki = ?, lang = ?, display = ?';
+							var sqlargs = [wiki.href, settings.lang, settings.display];
+							if ( row.wiki !== wiki.href ) {
+								sql += ', rcid = ?, postid = ?';
+								sqlargs.push(( enableFeeds && settings.feeds_only ? -1 : null ), ( enableFeeds ? null : '-1' ));
+							}
+							else {
+								if ( enableFeeds && settings.feeds_only ) {
+									sql += ', rcid = ?';
+									sqlargs.push(-1);
+								}
+								else if ( row.rcid === -1 ) {
+									sql += ', rcid = ?';
+									sqlargs.push(null);
+								}
+								if ( !enableFeeds ) {
+									sql += ', postid = ?';
+									sqlargs.push('-1');
+								}
+								else if ( row.postid === '-1' ) {
+									sql += ', postid = ?';
+									sqlargs.push(null);
+								}
 							}
-							db.run( sql, [...sqlargs, row.webhook], function (dberror) {
+							db.run( sql + ' WHERE webhook = ?', [...sqlargs, row.webhook], function (dberror) {
 								if ( dberror ) {
 									console.log( '- Dashboard: Error while updating the RcGcDw: ' + dberror );
 									return res(`/guild/${guild}/rcscript/${type}`, 'savefail');
@@ -638,13 +650,13 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 									diff.push(lang.get('rcscript.display') + ` ~~\`${display_types[row.display]}\`~~ → \`${display_types[settings.display]}\``);
 									webhook_diff.push(webhook_lang.get('dashboard.display_' + display_types[settings.display]));
 								}
-								if ( ( row.rcid !== -1 ) !== !( wikiid && settings.feeds_only ) ) {
+								if ( ( row.rcid !== -1 ) !== !( enableFeeds && settings.feeds_only ) ) {
 									diff.push(lang.get('rcscript.rc') + ` ~~*\`${lang.get('rcscript.' + ( row.rcid === -1 ? 'disabled' : 'enabled' ))}\`*~~ → *\`${lang.get('rcscript.' + ( settings.feeds_only ? 'disabled' : 'enabled' ))}\`*`);
 									webhook_diff.push(webhook_lang.get('dashboard.' + ( settings.feeds_only ? 'disabled_rc' : 'enabled_rc' )));
 								}
-								if ( !row.wikiid !== !wikiid ) {
-									diff.push(lang.get('rcscript.feeds') + ` ~~*\`${lang.get('rcscript.' + ( row.wikiid ? 'enabled' : 'disabled' ))}\`*~~ → *\`${lang.get('rcscript.' + ( wikiid ? 'enabled' : 'disabled' ))}\`*`);
-									webhook_diff.push(webhook_lang.get('dashboard.' + ( wikiid ? 'disabled_feeds' : 'enabled_feeds' )));
+								if ( ( row.postid === '-1' ) !== !enableFeeds ) {
+									diff.push(lang.get('rcscript.feeds') + ` ~~*\`${lang.get('rcscript.' + ( row.postid === '-1' ? 'disabled' : 'enabled' ))}\`*~~ → *\`${lang.get('rcscript.' + ( enableFeeds ? 'enabled' : 'disabled' ))}\`*`);
+									webhook_diff.push(webhook_lang.get('dashboard.' + ( enableFeeds ? 'enabled_feeds' : 'disabled_feeds' )));
 								}
 								if ( newChannel ) return sendMsg( {
 									type: 'moveWebhook',

+ 74 - 7
database.js

@@ -90,9 +90,8 @@ CREATE TABLE rcgcdw (
                      DEFAULT [${defaultSettings.lang}],
     display  INTEGER NOT NULL
                      DEFAULT [1],
-    wikiid   INTEGER,
     rcid     INTEGER,
-    postid   TEXT,
+    postid   TEXT    DEFAULT [-1],
     UNIQUE (
         guild,
         configid
@@ -124,6 +123,73 @@ CREATE INDEX idx_blocklist_wiki ON blocklist (
 
 COMMIT TRANSACTION;
 PRAGMA user_version = 1;
+`, `
+BEGIN TRANSACTION;
+
+PRAGMA foreign_keys = OFF;
+
+UPDATE rcgcdw SET postid = '-1' WHERE wikiid IS NULL;
+
+CREATE TABLE rcgcdw_temp_table AS SELECT * FROM rcgcdw;
+
+DROP TABLE rcgcdw;
+
+CREATE TABLE rcgcdw (
+    guild    TEXT    NOT NULL
+                     REFERENCES discord (main) ON DELETE CASCADE,
+    configid INTEGER NOT NULL,
+    webhook  TEXT    NOT NULL
+                     UNIQUE,
+    wiki     TEXT    NOT NULL,
+    lang     TEXT    NOT NULL
+                     DEFAULT [${defaultSettings.lang}],
+    display  INTEGER NOT NULL
+                     DEFAULT [1],
+    rcid     INTEGER,
+    postid   TEXT    DEFAULT [-1],
+    UNIQUE (
+        guild,
+        configid
+    )
+);
+
+INSERT INTO rcgcdw (
+    guild,
+    configid,
+    webhook,
+    wiki,
+    lang,
+    display,
+    rcid,
+    postid
+)
+SELECT guild,
+       configid,
+       webhook,
+       wiki,
+       lang,
+       display,
+       rcid,
+       postid
+FROM rcgcdw_temp_table;
+
+DROP TABLE rcgcdw_temp_table;
+
+CREATE INDEX idx_rcgcdw_wiki ON rcgcdw (
+    wiki
+);
+
+CREATE INDEX idx_rcgcdw_webhook ON rcgcdw (
+    webhook
+);
+
+CREATE INDEX idx_rcgcdw_config ON rcgcdw (
+    guild,
+    configid ASC
+);
+
+COMMIT TRANSACTION;
+PRAGMA user_version = 2;
 `];
 
 module.exports = new Promise( (resolve, reject) => {
@@ -138,11 +204,11 @@ module.exports = new Promise( (resolve, reject) => {
 				return reject();
 			}
 			if ( row.user_version > schema.length ) {
-				console.log( '- Invalid database version: ' + row.user_version );
+				console.log( '- Invalid database version: v' + row.user_version );
 				return reject();
 			}
 			if ( row.user_version === schema.length ) {
-				console.log( '- The database is up to date: ' + row.user_version );
+				console.log( '- The database is up to date: v' + row.user_version );
 				db.close( cerror => {
 					if ( cerror ) {
 						console.log( '- Error while closing the database connection: ' + cerror );
@@ -151,16 +217,17 @@ module.exports = new Promise( (resolve, reject) => {
 				} );
 				return resolve();
 			}
-			console.log( '- The database outdated: ' + row.user_version );
+			console.log( '- The database outdated: v' + row.user_version );
 			if ( process.env.READONLY ) return reject();
 			db.exec( schema.filter( (sql, version) => {
-				return ( row.user_version > version );
+				if ( row.user_version === 0 ) return ( version === 0 );
+				return ( row.user_version <= version );
 			} ).join('\n'), exerror => {
 				if ( exerror ) {
 					console.log( '- Error while updating the database: ' + exerror );
 					return reject();
 				}
-				console.log( '- The database has been updated to: ' + schema.length );
+				console.log( '- The database has been updated to: v' + schema.length );
 				db.close( cerror => {
 					if ( cerror ) {
 						console.log( '- Error while closing the database connection: ' + cerror );