User:BrandonXLF/UpdateNotifications.js

/*** Update Notifications ***/

// Updates the alert and notification counts every few seconds // Documentation at en:w:User:BrandonXLF/UpdateNotifications // By en:w:User:BrandonXLF

$(function {	var crossWiki = mw.user.options.get('echo-cross-wiki-notifications'),		shownTime = Date.now;

function updateIcon(id, data) { $('#' + id + ' a') .toggleClass('mw-echo-unseen-notifications', data.latest > data.seen) .toggleClass('mw-echo-notifications-badge-all-read', !data.count) .attr('data-counter-num', data.count) .attr('data-counter-text', data.count); }

function updateCount(status) { if (!window.noUpdateNotificationNotice && (status.alert.latest > shownTime || status.message.latest > shownTime)) { shownTime = Date.now; mw.notify('New notification received!'); }

updateIcon('pt-notifications-alert', status.alert); updateIcon('pt-notifications-notice', status.message); }

function getData { new mw.Api.get({			action: 'query',			format: 'json',			meta: 'notifications',			notprop: 'list|count|seenTime',			notlimit: 1,			notgroupbysection: true,			notalertunreadfirst: true,			notmessageunreadfirst: true,			notcrosswikisummary: crossWiki		}).then(function(res) {			var info = res.query.notifications,				status = {					alert: {						seen: Date.parse(info.alert.seenTime),						latest: info.alert.list[0].timestamp.utcunix,						count: info.alert.rawcount					},					message: {						seen: Date.parse(info.message.seenTime),						latest: info.message.list[0].timestamp.utcunix,						count: info.message.rawcount					}				};

localStorage.setItem('update-notifications-status', JSON.stringify(status)); updateCount(status); });	}

window.addEventListener('storage', function(e) {		if (e.key == 'update-notifications-status') updateCount(JSON.parse(e.newValue));	});

setInterval(function {		var lastRequestTime = +localStorage.getItem('update-notifications-last-request-time'),			now = Date.now;

if (now - lastRequestTime >= 4900) { localStorage.setItem('update-notifications-last-request-time', now); getData; }	}, 5000); });