Community Central
Community Central
No edit summary
No edit summary
Line 8: Line 8:
 
*/
 
*/
 
(function(mw, $) {
 
(function(mw, $) {
// Global object
+
// Global object
if (!window.colour) window.colour = {};
+
if (!window.colour) window.colour = {};
   
/**
+
/**
 
* Extend config options
 
* Extend config options
 
*
 
*
Line 18: Line 18:
 
* @return {string} wiki subdomain
 
* @return {string} wiki subdomain
 
*/
 
*/
mw.config.values['wgWikiName'] = (function() {
+
mw.config.values['wgWikiName'] = (function() {
return window.location.toString().split('.wikia.com')[0].slice(7);
+
return window.location.toString().split('.wikia.com')[0].slice(7);
})();
+
})();
   
/**
+
/**
 
* Logging functions
 
* Logging functions
 
*
 
*
Line 32: Line 32:
 
* - loaded: Used to log when external assets are loaded
 
* - loaded: Used to log when external assets are loaded
 
*/
 
*/
const log = {
+
const log = {
  +
/**
/**
 
 
* Logs a script error
 
* Logs a script error
 
*
 
*
Line 42: Line 42:
 
* @return {function}
 
* @return {function}
 
*/
 
*/
error: (function(script, error) {
+
error: (function(script, error) {
const context = '[SCRIPT ERROR]:';
+
const context = '[SCRIPT ERROR]:';
return Function.prototype.bind.call(console.error, console, context);
+
return Function.prototype.bind.call(console.error, console, context);
})(),
+
})(),
   
  +
/**
/**
 
 
* Logs a loaded resource
 
* Logs a loaded resource
 
*
 
*
Line 56: Line 56:
 
* @return {function}
 
* @return {function}
 
*/
 
*/
loaded: (function(res, source, script) {
+
loaded: (function(res, source, script) {
const context = '[LOADED RESOURCE]:';
+
const context = '[LOADED RESOURCE]:';
return Function.prototype.bind.call(console.log, console, context);
+
return Function.prototype.bind.call(console.log, console, context);
  +
})()
})()
 
  +
};
};
 
   
/**
+
/**
 
* YouTube info
 
* YouTube info
 
*
 
*
Line 73: Line 73:
 
* have access to. Please do not attempt to use itas it will not function.
 
* have access to. Please do not attempt to use itas it will not function.
 
*/
 
*/
(function(mw, $, log) {
+
(function(mw, $, log) {
$.get('http://dikdik.life:5253/youtube_api_key')
+
$.get('http://dikdik.life:5253/youtube_api_key')
.then(function(data) {
+
.then(function(data) {
log.loaded('youtube_api_key FROM dikdik.life:5253 IN YouTube Info');
+
log.loaded('youtube_api_key FROM dikdik.life:5253 IN YouTube Info');
   
if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
+
if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
NodeChatDiscussion.prototype.ytInfoCache = {};
+
NodeChatDiscussion.prototype.ytInfoCache = {};
   
NodeChatDiscussion.prototype.ytInfo = function(chat) {
+
NodeChatDiscussion.prototype.ytInfo = function(chat) {
if (mainRoom.isInitialized && !chat.attributes.isInlineAlert) {
+
if (mainRoom.isInitialized && !chat.attributes.isInlineAlert) {
var text = chat.attributes.text,
+
var text = chat.attributes.text,
search = /https?:\/\/(?:www\.|m\.)?youtube\.com[^ ]+v=([^&# ]*)|https?:\/\/(?:www\.)?youtu\.be\/([^&#\? ]*)/im,
+
search = /https?:\/\/(?:www\.|m\.)?youtube\.com[^ ]+v=([^&# ]*)|https?:\/\/(?:www\.)?youtu\.be\/([^&#\? ]*)/im,
  +
apikey = data,
apikey = data,
 
match = text.match(search);
+
match = text.match(search);
   
  +
if (match) {
if (match) {
 
var $link = $("a[href='" + match[0] + "']").last(),
+
var $link = $("a[href='" + match[0] + "']").last(),
id = match[1] ? match[1] : match[2];
+
id = match[1] ? match[1] : match[2];
   
if (this.ytInfoCache.hasOwnProperty(id)) {
+
if (this.ytInfoCache.hasOwnProperty(id)) {
return $link.attr('title', this.ytInfoCache[id]);
+
return $link.attr('title', this.ytInfoCache[id]);
  +
}
}
 
   
  +
$.get(
$.get(
 
'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails&id=' +
+
'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails&id=' +
  +
id +
id +
 
  +
'&key=' +
'&key=' +
 
  +
apikey,
apikey,
 
  +
function(data) {
function(data) {
 
  +
try {
try {
 
data = data['items'][0];
+
data = data['items'][0];
  +
var info =
var info =
 
  +
'[Title]: ' +
'[Title]: ' +
 
data['snippet']['title'] +
+
data['snippet']['title'] +
  +
'\n[Channel]: ' +
'\n[Channel]: ' +
 
data['snippet']['channelTitle'] +
+
data['snippet']['channelTitle'] +
  +
'\n[Views]: ' +
'\n[Views]: ' +
 
data['statistics']['viewCount'];
+
data['statistics']['viewCount'];
mainRoom.viewDiscussion.ytInfoCache[id] = info;
+
mainRoom.viewDiscussion.ytInfoCache[id] = info;
$link.attr('title', info);
+
$link.attr('title', info);
  +
} catch (e) {
} catch (e) {
 
log.error('YouTube Info: Error fetching data from YouTube API.');
+
log.error('YouTube Info: Error fetching data from YouTube API.');
  +
}
}
 
  +
}
}
 
  +
);
);
 
  +
}
}
 
  +
}
}
 
  +
};
};
 
   
mainRoom.model.chats.bind(
+
mainRoom.model.chats.bind(
  +
'afteradd',
'afteradd',
 
$.proxy(mainRoom.viewDiscussion.ytInfo, mainRoom.viewDiscussion)
+
$.proxy(mainRoom.viewDiscussion.ytInfo, mainRoom.viewDiscussion)
  +
);
);
 
  +
}
}
 
  +
})
})
 
.fail(function(error) {
+
.fail(function(error) {
log.error('YouTube Info: ' + error);
+
log.error('YouTube Info: ' + error);
  +
});
});
 
})(mw, $, log);
+
})(mw, $, log);
   
/**
+
/**
 
* Conflictagories
 
* Conflictagories
 
*
 
*
Line 142: Line 142:
 
* WARNING WARNING WARNING WARNING WARNING WARNING
 
* WARNING WARNING WARNING WARNING WARNING WARNING
 
*/
 
*/
(function($, mw) {
+
(function($, mw) {
if (mw.config.get('wgWikiName') !== 'creepypasta') return;
+
if (mw.config.get('wgWikiName') !== 'creepypasta') return;
   
var conflicts = [
+
var conflicts = [
[ 'Monster', 'Ghosts', 'Demon/Devil', 'Beings', 'Gods', 'Cryptids' ],
+
[ 'Monster', 'Ghosts', 'Demon/Devil', 'Beings', 'Gods', 'Cryptids' ],
[ 'Books', 'Diary/Journal', 'Items/Objects' ],
+
[ 'Books', 'Diary/Journal', 'Items/Objects' ],
[ 'Lost Episodes', 'Television' ],
+
[ 'Lost Episodes', 'Television' ],
[ 'Pokemon', 'Zelda', 'Video Games' ],
+
[ 'Pokemon', 'Zelda', 'Video Games' ],
[ 'Holders', 'Ritual' ],
+
[ 'Holders', 'Ritual' ],
[ 'Holders', 'Items/Objects' ],
+
[ 'Holders', 'Items/Objects' ],
[ 'Holders', 'Places' ],
+
[ 'Holders', 'Places' ],
[ 'HPL', 'Lovecraftian', 'Suggested Reading' ]
+
[ 'HPL', 'Lovecraftian', 'Suggested Reading' ]
  +
];
];
 
   
var containsMultiple = function(categories, conflictagories) {
+
var containsMultiple = function(categories, conflictagories) {
var contains = 0;
+
var contains = 0;
   
categories.forEach(function(item) {
+
categories.forEach(function(item) {
if (conflictagories.includes(item)) contains++;
+
if (conflictagories.includes(item)) contains++;
  +
});
});
 
   
return contains > 2;
+
return contains > 2;
  +
};
};
 
   
var getCategories = function(page) {
+
var getCategories = function(page) {
return new Promise(function(resolve, reject) {
+
return new Promise(function(resolve, reject) {
var uri = 'http://creepypasta.wikia.com/api.php',
+
var uri = 'http://creepypasta.wikia.com/api.php',
url = uri + '?action=query&titles=' + encodeURIComponent(page) + '&prop=categories&format=json';
+
url = uri + '?action=query&titles=' + encodeURIComponent(page) + '&prop=categories&format=json';
url += '&cb=' + new Date().toUTCString();
+
url += '&cb=' + new Date().toUTCString();
   
$.get(url)
+
$.get(url)
.then(function(data) {
+
.then(function(data) {
if (data.error) reject(data);
+
if (data.error) reject(data);
   
data = data.query.pages;
+
data = data.query.pages;
   
for (var id in data) {
+
for (var id in data) {
if (typeof data[id].categories !== undefined) resolve(data[id].categories);
+
if (typeof data[id].categories !== undefined) resolve(data[id].categories);
else resolve([ 0 ]);
+
else resolve([ 0 ]);
  +
}
}
 
  +
})
})
 
.fail(function(error) {
+
.fail(function(error) {
reject(error);
+
reject(error);
  +
});
});
 
  +
});
});
 
  +
};
};
 
   
var checkConflictagories = function(pages) {
+
var checkConflictagories = function(pages) {
if (pages.length > -1) {
+
if (pages.length > -1) {
pages.forEach(function(page) {
+
pages.forEach(function(page) {
setTimeout(function() {
+
setTimeout(function() {
getCategories(page).then(function(cats) {
+
getCategories(page).then(function(cats) {
  +
try {
try {
 
cats = cats.map(function(n) {
+
cats = cats.map(function(n) {
return n.title.split(':')[1];
+
return n.title.split(':')[1];
  +
});
});
 
   
conflicts.forEach(function(confSet) {
+
conflicts.forEach(function(confSet) {
if (cats.length > -1 && containsMultiple(cats, confSet)) {
+
if (cats.length > -1 && containsMultiple(cats, confSet)) {
console.log(page + ' has conflictagories!');
+
console.log(page + ' has conflictagories!');
  +
}
}
 
  +
});
});
 
  +
} catch (e) {}
} catch (e) {}
 
  +
});
});
 
  +
}, 1000);
}, 1000);
 
  +
});
});
 
  +
}
}
 
  +
};
};
 
   
var getAllPages = function(cont) {
+
var getAllPages = function(cont) {
var uri = 'http://creepypasta.wikia.com/api.php',
+
var uri = 'http://creepypasta.wikia.com/api.php',
url = uri + '?action=query&list=allpages&apfrom=A&aplimit=500&apnamespace=0&format=json';
+
url = uri + '?action=query&list=allpages&apfrom=A&aplimit=500&apnamespace=0&format=json';
   
if (cont) {
+
if (cont) {
url += '&apfrom=' + cont;
+
url += '&apfrom=' + cont;
  +
}
}
 
   
$.get(url)
+
$.get(url)
.then(function(data) {
+
.then(function(data) {
var pages = data.query.allpages.map(function(n) {
+
var pages = data.query.allpages.map(function(n) {
return n.title;
+
return n.title;
  +
});
});
 
   
checkConflictagories(pages);
+
checkConflictagories(pages);
setTimeout(function() {
+
setTimeout(function() {
getAllPages(data['query-continue'].allpages.apfrom);
+
getAllPages(data['query-continue'].allpages.apfrom);
  +
}, 60000);
}, 60000);
 
  +
})
})
 
.fail(function(err) {
+
.fail(function(err) {
console.log(err.status());
+
console.log(err.status());
  +
});
});
 
  +
};
};
 
   
window.colour.conflictagories = getAllPages;
+
window.colour.conflictagories = getAllPages;
})($, mw);
+
})($, mw);
   
/**
+
/**
* colour.chat
+
* colour.chat
*
+
*
* Literally exists to hold PM blocking code
+
* Literally exists to hold PM blocking code
*/
+
*/
window.colour.chat = {
+
window.colour.chat = {
_blockPM: function(user) {
+
_blockPM: function(user) {
return new Promise(function(resolve, reject) {
+
return new Promise(function(resolve, reject) {
  +
$.ajax({
$.ajax({
 
url: mw.util.wikiScript('index') + '?action=ajax&rs=ChatAjax&method=blockOrBanChat',
+
url: mw.util.wikiScript('index') + '?action=ajax&rs=ChatAjax&method=blockOrBanChat',
type: 'post',
+
type: 'post',
dataType: 'json',
+
dataType: 'json',
  +
data: {
data: {
 
userToBan: user,
+
userToBan: user,
  +
dir: 'add',
dir: 'add',
 
token: mw.user.tokens.get('editToken')
+
token: mw.user.tokens.get('editToken')
  +
}
}
 
  +
})
})
 
.done(function(res) {
+
.done(function(res) {
if (!res.hasOwnProperty('success')) reject(res);
+
if (!res.hasOwnProperty('success')) reject(res);
   
if (res.success === true) resolve(true);
+
if (res.success === true) resolve(true);
else reject(res);
+
else reject(res);
  +
})
})
 
.fail(function(err, stat) {
+
.fail(function(err, stat) {
reject(err, stat);
+
reject(err, stat);
  +
});
});
 
  +
});
});
 
  +
},
},
 
blockPM: function(user) {
+
blockPM: function(user) {
window.colour.chat._blockPM(user).then(
+
window.colour.chat._blockPM(user).then(
function() {
+
function() {
console.log(user + ' was blocked!');
+
console.log(user + ' was blocked!');
  +
},
},
 
function(err, stat) {
+
function(err, stat) {
console.error(err, stats);
+
console.error(err, stats);
  +
}
}
 
  +
);
);
 
  +
}
}
 
  +
};
};
 
   
/**
+
/**
* Blocks PMs on user join
+
* Blocks PMs on user join
*
+
*
* Please consider, like, leaving me alone
+
* Please consider, like, leaving me alone
*/
+
*/
if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
+
if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
mainRoom.socket.bind('join', function(event) {
+
mainRoom.socket.bind('join', function(event) {
var ev = JSON.parse(event.data);
+
var ev = JSON.parse(event.data);
   
colour.chat.blockPM(ev.attrs.name);
+
colour.chat.blockPM(ev.attrs.name);
  +
});
});
 
  +
}
}
 
   
window.colour.mw = mw;
+
window.colour.mw = mw;
window.colour.log = log;
+
window.colour.log = log;
   
log.loaded('COMMUNITY global.js');
+
log.loaded('COMMUNITY global.js');
 
})(mediaWiki, jQuery);
 
})(mediaWiki, jQuery);

Revision as of 23:10, 23 October 2017

/**
 * This page provides wiki-based access to scripts.
 * 
 * Some of this content requires access to an external server to use and as such
 * is unuseable without access. Please do not try to copy this verbatim. If you 
 * are interested in whole or in part please leave a message on my Message Wall
 * and I will see if there is something I can work out for you.
 */
(function(mw, $) {
	// Global object
	if (!window.colour) window.colour = {};

	/**
     * Extend config options
     * 
     * This snippet adds the wgWikiName variable to the mw.config object
     * 
     * @return {string} wiki subdomain
     */
	mw.config.values['wgWikiName'] = (function() {
		return window.location.toString().split('.wikia.com')[0].slice(7);
	})();

	/**
     * Logging functions
     * 
     * These functions provide more terse methods for logging information
     * to the browser console.
     * 
     * Methods:
     *   - error: Used for specific script errors
     *   - loaded: Used to log when external assets are loaded
     */
	const log = {
		/**
         * Logs a script error
         * 
         * Logs a script error with the particular name of the script since
         * all of them are concatenated in one file.
         * 
         * @param {string} script
         * @return {function}
         */
		error: (function(script, error) {
			const context = '[SCRIPT ERROR]:';
			return Function.prototype.bind.call(console.error, console, context);
		})(),

		/**
         * Logs a loaded resource
         * 
         * Logs when a resource has been loaded from an external source
         * 
         * @param {string} res
         * @param {string} script
         * @return {function}
         */
		loaded: (function(res, source, script) {
			const context = '[LOADED RESOURCE]:';
			return Function.prototype.bind.call(console.log, console, context);
		})()
	};

	/**
     * YouTube info
     * 
     * When a YouTube link is posted to chat this script detects it and fetches
     * some basic information about it to display inline.
     * 
     * TODO: Credit [[User:Sactage]]
     * 
     * WARNING: This script relies on access to an external server you will not
     * have access to. Please do not attempt to use itas it will not function.
     */
	(function(mw, $, log) {
		$.get('http://dikdik.life:5253/youtube_api_key')
			.then(function(data) {
				log.loaded('youtube_api_key FROM dikdik.life:5253 IN YouTube Info');

				if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
					NodeChatDiscussion.prototype.ytInfoCache = {};

					NodeChatDiscussion.prototype.ytInfo = function(chat) {
						if (mainRoom.isInitialized && !chat.attributes.isInlineAlert) {
							var text = chat.attributes.text,
								search = /https?:\/\/(?:www\.|m\.)?youtube\.com[^ ]+v=([^&# ]*)|https?:\/\/(?:www\.)?youtu\.be\/([^&#\? ]*)/im,
								apikey = data,
								match = text.match(search);

							if (match) {
								var $link = $("a[href='" + match[0] + "']").last(),
									id = match[1] ? match[1] : match[2];

								if (this.ytInfoCache.hasOwnProperty(id)) {
									return $link.attr('title', this.ytInfoCache[id]);
								}

								$.get(
									'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails&id=' +
										id +
										'&key=' +
										apikey,
									function(data) {
										try {
											data = data['items'][0];
											var info =
												'[Title]: ' +
												data['snippet']['title'] +
												'\n[Channel]: ' +
												data['snippet']['channelTitle'] +
												'\n[Views]: ' +
												data['statistics']['viewCount'];
											mainRoom.viewDiscussion.ytInfoCache[id] = info;
											$link.attr('title', info);
										} catch (e) {
											log.error('YouTube Info: Error fetching data from YouTube API.');
										}
									}
								);
							}
						}
					};

					mainRoom.model.chats.bind(
						'afteradd',
						$.proxy(mainRoom.viewDiscussion.ytInfo, mainRoom.viewDiscussion)
					);
				}
			})
			.fail(function(error) {
				log.error('YouTube Info: ' + error);
			});
	})(mw, $, log);

	/**
     * Conflictagories
     * 
     * Runs a category check against every page on a wiki
     * 
     * WARNING WARNING WARNING WARNING WARNING WARNING
     * DO NOT UNDER ANY CIRCUMSTANCES USE THIS EVER
     * WARNING WARNING WARNING WARNING WARNING WARNING
     */
	(function($, mw) {
		if (mw.config.get('wgWikiName') !== 'creepypasta') return;

		var conflicts = [
			[ 'Monster', 'Ghosts', 'Demon/Devil', 'Beings', 'Gods', 'Cryptids' ],
			[ 'Books', 'Diary/Journal', 'Items/Objects' ],
			[ 'Lost Episodes', 'Television' ],
			[ 'Pokemon', 'Zelda', 'Video Games' ],
			[ 'Holders', 'Ritual' ],
			[ 'Holders', 'Items/Objects' ],
			[ 'Holders', 'Places' ],
			[ 'HPL', 'Lovecraftian', 'Suggested Reading' ]
		];

		var containsMultiple = function(categories, conflictagories) {
			var contains = 0;

			categories.forEach(function(item) {
				if (conflictagories.includes(item)) contains++;
			});

			return contains > 2;
		};

		var getCategories = function(page) {
			return new Promise(function(resolve, reject) {
				var uri = 'http://creepypasta.wikia.com/api.php',
					url = uri + '?action=query&titles=' + encodeURIComponent(page) + '&prop=categories&format=json';
				url += '&cb=' + new Date().toUTCString();

				$.get(url)
					.then(function(data) {
						if (data.error) reject(data);

						data = data.query.pages;

						for (var id in data) {
							if (typeof data[id].categories !== undefined) resolve(data[id].categories);
							else resolve([ 0 ]);
						}
					})
					.fail(function(error) {
						reject(error);
					});
			});
		};

		var checkConflictagories = function(pages) {
			if (pages.length > -1) {
				pages.forEach(function(page) {
					setTimeout(function() {
						getCategories(page).then(function(cats) {
							try {
								cats = cats.map(function(n) {
									return n.title.split(':')[1];
								});

								conflicts.forEach(function(confSet) {
									if (cats.length > -1 && containsMultiple(cats, confSet)) {
										console.log(page + ' has conflictagories!');
									}
								});
							} catch (e) {}
						});
					}, 1000);
				});
			}
		};

		var getAllPages = function(cont) {
			var uri = 'http://creepypasta.wikia.com/api.php',
				url = uri + '?action=query&list=allpages&apfrom=A&aplimit=500&apnamespace=0&format=json';

			if (cont) {
				url += '&apfrom=' + cont;
			}

			$.get(url)
				.then(function(data) {
					var pages = data.query.allpages.map(function(n) {
						return n.title;
					});

					checkConflictagories(pages);
					setTimeout(function() {
						getAllPages(data['query-continue'].allpages.apfrom);
					}, 60000);
				})
				.fail(function(err) {
					console.log(err.status());
				});
		};

		window.colour.conflictagories = getAllPages;
	})($, mw);

	/**
     * colour.chat
     * 
     * Literally exists to hold PM blocking code
     */
	window.colour.chat = {
		_blockPM: function(user) {
			return new Promise(function(resolve, reject) {
				$.ajax({
					url: mw.util.wikiScript('index') + '?action=ajax&rs=ChatAjax&method=blockOrBanChat',
					type: 'post',
					dataType: 'json',
					data: {
						userToBan: user,
						dir: 'add',
						token: mw.user.tokens.get('editToken')
					}
				})
					.done(function(res) {
						if (!res.hasOwnProperty('success')) reject(res);

						if (res.success === true) resolve(true);
						else reject(res);
					})
					.fail(function(err, stat) {
						reject(err, stat);
					});
			});
		},
		blockPM: function(user) {
			window.colour.chat._blockPM(user).then(
				function() {
					console.log(user + ' was blocked!');
				},
				function(err, stat) {
					console.error(err, stats);
				}
			);
		}
	};

	/**
     * Blocks PMs on user join
     * 
     * Please consider, like, leaving me alone
     */
	if (mw.config.get('wgCanonicalSpecialPageName') === 'Chat') {
		mainRoom.socket.bind('join', function(event) {
			var ev = JSON.parse(event.data);

			colour.chat.blockPM(ev.attrs.name);
		});
	}

	window.colour.mw = mw;
	window.colour.log = log;

	log.loaded('COMMUNITY global.js');
})(mediaWiki, jQuery);