İçeriğe atla

MediaWiki:Gadget-FixEcho.js

Deltarune Wiki sitesinden

Not: Yayımladıktan sonra değişiklikleri görmeniz için tarayıcınızın önbelleğini temizlemeniz gerekebilir.

  • Firefox / Safari: Shift tuşuna basılıyken Yeniden Yükle'ye tıklayın ya da Ctrl-F5 ya da Ctrl-R tıklayın (Mac için ⌘-R)
  • Google Chrome: Ctrl-Shift-R'ye basın. (Mac için ⌘-Shift-R)
  • Edge: Ctrl basılıyken Yenile'ye tıklayın ya da Ctrl-F5'e basın.
const ECHO_GET_ACTIONS = ['notifications', 'unreadnotificationpages'];
const ECHO_POST_ACTIONS = ['echomarkread'];

function inferWikiUrl(wikiId) {
	if (typeof wikiId !== 'string') {
		return;
	}
	const [lang, wiki] = wikiId.split('_');
	if (!lang || !wiki) {
		return;
	}
	const devPrefix = window.location.host.includes('dev') ? 'dev.' : '';
	const langPrefix = (lang === 'en') ? '' : `${lang}.`;
	// <nowiki>
	return `https://${devPrefix}${langPrefix}${wiki}.wiki`;
	// </nowiki>
}

let circuitBreaker = false;

const originalAjax = mw.Api.prototype.ajax;
mw.Api.prototype.ajax = function(parameters, ajaxOptions) {
	// OVERRIDEN BY THE FixEcho GADGET!
	if (circuitBreaker) {
		circuitBreaker = false;
		return originalAjax.call(this, parameters, ajaxOptions);
	}
	if (typeof parameters !== 'object') {
		return originalAjax.call(this, parameters, ajaxOptions);
	}
	const isGet =
		ajaxOptions.type === 'GET' &&
		parameters.action === 'query' &&
		ECHO_GET_ACTIONS.includes(parameters.meta);
	const isPost =
		ajaxOptions.type === 'POST' &&
		ECHO_POST_ACTIONS.includes(parameters.action);
	if (!isGet && !isPost) {
		return originalAjax.call(this, parameters, ajaxOptions);
	}
	const wikiParam = isGet ?
		(parameters.notwikis || parameters.unpwikis) :
		parameters.wikis;
	if (!wikiParam) {
		return originalAjax.call(this, parameters, ajaxOptions);
	}
	const wikiId = Array.isArray(wikiParam) ? wikiParam[0] : wikiParam;
	const wikiUrl = inferWikiUrl(wikiId);
	if (!wikiUrl) {
		return originalAjax.call(this, parameters, ajaxOptions);
	}
	const newApi = new mw.ForeignApi(`${wikiUrl}/api.php`);
	circuitBreaker = true;
	return newApi.getToken('csrf').then(token => newApi.ajax(
		Object.assign(parameters, {token}),
		ajaxOptions
	));
};

document.addEventListener('click', event => {
	const target = event.target
		.closest('a.mw-echo-ui-notificationItemWidget-unread');
	if (
		!target ||
		!target.href ||
		event.ctrlKey ||
		event.shiftKey ||
		event.metaKey ||
		event.altKey
	) {
		return;
	}
	const url = new URL(target.href);
	if (url.pathname.startsWith('/d/')) {
		const api = new mw.echo.api.EchoApi();
		api.markItemsRead(
			[Number(url.searchParams.get('markasread'))],
			url.searchParams.get('markasreadwiki'),
			true
		);
	}
});
Konu ekle