|
|
| (3 intermediate revisions by one other user not shown) |
| Line 1: |
Line 1: |
| //<nowiki>
| | dummy |
| /**
| |
| * Interface for events
| |
| *
| |
| * @version 1.1
| |
| * @author JaydenKieran
| |
| * @author Elessar2
| |
| * @author ThePsionic
| |
| *
| |
| */
| |
| | |
| /*global jQuery, mediaWiki, mw, gswiki, rs, OO, moment, ga */
| |
| 'use strict';
| |
| | |
| // TODO: Add castaways?, circus city, Jewels of the Elid,
| |
| // TODO: Cache Vos as well
| |
| | |
| ;(function($, mw, rs){
| |
| var portletLink,
| |
| $popup,
| |
| popup,
| |
| $content,
| |
| settingsForm,
| |
| notifsForm,
| |
| api,
| |
| et_events,
| |
| merchstock,
| |
| notiftimer,
| |
| notifpopup,
| |
| $notifs,
| |
| formConst = false,
| |
| formMade = false;
| |
| | |
| // localStorage key
| |
| var localKey = 'gsw-events-prefs',
| |
| localLast = 'gsw-events-last',
| |
| | |
| // Dailies
| |
| var simple_dailies = [
| |
| { name:'2x Tuesday', id:'doubleexp', link:'2x Tuesday', length:1440, repeat:10080, offset:30, from:'day', img:'' },
| |
| ];
| |
| | |
| // VoS Locations
| |
| var voslocs = { 'Amlodd':['WNW','West-north-west'], 'Crwys':['ENE','East-north-east'], 'Cadarn':['ESE','East-south-east'], 'Hefin':['NNW','North-north-west'],
| |
| 'Iorwerth':['SSW','South-south-west'], 'Ithell':['WSW','West-south-west'], 'Meilyr':['NNE','North-north-east'], 'Trahaearn':['SSE','South-south-east'] };
| |
| | |
| // TM stock items
| |
| var tmsStock = [ {data:'Barrel of bait', label:'Barrel of bait'}, {data:'Tangled fishbowl', label:'Tangled fishbowl'}, {data:'Broken fishing rod', label:'Broken fishing rod'}, {data:'Small goebie burial charm', label:'Small goebie burial charm'},
| |
| {data:'Goebie burial charm', label:'Goebie burial charm'}, {data:'Menaphite gift offering (small)', label:'Menaphite gift offering (small)'}, {data:'Menaphite gift offering (medium)', label:'Menaphite gift offering (medium)'},
| |
| {data:'Unstable air rune', label:'Unstable air rune'}, {data:'Anima crystal', label:'Anima crystal'}, {data:'Slayer VIP Coupon', label:'Slayer VIP Coupon'}, {data:'D&D token (daily)', label:'D&D token (daily)'},
| |
| {data:'Unfocused damage enhancer', label:'Unfocused damage enhancer'}, {data:'Sacred clay', label:'Sacred clay'}, {data:'Shattered anima', label:'Shattered anima'}, {data:'Advanced pulse core', label:'Advanced pulse core'},
| |
| {data:'Livid plant', label:'Livid plant'}, {data:'Gift for the Reaper', label:'Gift for the Reaper'}, {data:'Silverhawk down', label:'Silverhawk down'}, {data:'Large goebie burial charm', label:'Large goebie burial charm'},
| |
| {data:'Message in a bottle', label:'Message in a bottle'}, {data:'Dragonkin lamp', label:'Dragonkin lamp'}, {data:'Dungeoneering Wildcard', label:'Dungeoneering Wildcard'}, {data:'Menaphite gift offering (large)', label:'Menaphite gift offering (large)'},
| |
| {data:'Taijitu', label:'Taijitu'}, {data:'D&D token (weekly)', label:'D&D token (weekly)'}, {data:'D&D token (monthly)', label:'D&D token (monthly)'}, {data:'Starved ancient effigy', label:'Starved ancient effigy'},
| |
| {data:'Harmonic dust', label:'Harmonic dust'}, {data:'Crystal triskelion', label:'Crystal triskelion'}, {data:'Deathtouched dart', label:'Deathtouched dart'}, {data:'Unfocused reward enhancer', label:'Unfocused reward enhancer'}
| |
| ];
| |
| | |
| // Player-owned farm resets
| |
| var pofresets = ['Small Buyer', 'Medium Buyer', 'Large Buyer', 'Easy Request', 'Medium Request', 'Hard Request'];
| |
| | |
| // Spotlight lists
| |
| var dd_spotlights = ['Shooting Star', 'Penguin Hide and Seek', 'Circus', 'Evil Tree'],
| |
| mg_spotlights = ['Pest Control', 'Soul Wars', 'Fist of Guthix', 'Barbarian Assault', 'Conquest', 'Fishing Trawler', 'The Great Orb Project', 'Flash Powder Factory', 'Castle Wars', 'Stealing Creation', 'Cabbage Facepunch Bonanza', 'Heist', 'Soul Wars', 'Barbarian Assault',
| |
| 'Conquest', 'Fist of Guthix', 'Castle Wars', 'Pest Control', 'Soul Wars', 'Fishing Trawler', 'The Great Orb Project', 'Flash Powder Factory', 'Stealing Creation', 'Cabbage Facepunch Bonanza', 'Heist', 'Trouble Brewing', 'Castle Wars'],
| |
| ed_spotlights = ['Temple of Aminishi', 'Dragonkin Laboratory', 'The Shadow Reef'];
| |
| | |
| // PvM tables
| |
| var rax_array = [ 'Minions', 'Acid', 'Darkness' ],
| |
| vorago_rotations = ['Ceiling collapse', 'Scopulus', 'Vitalis', 'Green bomb', 'TeamSplit', 'The End'],
| |
| vorago_hm = {
| |
| 'Ceiling collapse':{pathTen:'TeamSplit / Green bomb', pathElev:'TeamSplit / Vitalis', unlock:'Torso of Omens'},
| |
| 'Scopulus':{pathTen:'Purple bomb / TeamSplit', pathElev:'Purple bomb / Vitalis', unlock:'Helm of Omens'},
| |
| 'Vitalis':{pathTen:'Vitalis / Purple bomb', pathElev:'Vitalis / Bleeds', unlock:'Legs of Omens'},
| |
| 'Green bomb':{pathTen:'Green bomb / Vitalis', pathElev:'Green bomb / TeamSplit', unlock:'Boots of Omens'},
| |
| 'TeamSplit':{pathTen:'TeamSplit / TeamSplit', pathElev:'TeamSplit / Purple bomb', unlock:'Maul of Omens'},
| |
| 'The End':{pathTen:'Purple bomb / Bleeds', pathElev:'Purple bomb / Vitalis', unlock:'Gloves of Omens'}
| |
| },
| |
| rn = { A:'Ahrim', D:'Dharok', G:'Guthan', K:'Karil', T:'Torag', V:'Verac'},
| |
| rots_rotations = [
| |
| [[rn.D,rn.T,rn.V], [rn.K,rn.A,rn.G]],
| |
| [[rn.K,rn.T,rn.G], [rn.A,rn.D,rn.V]],
| |
| [[rn.K,rn.G,rn.V], [rn.A,rn.T,rn.D]],
| |
| [[rn.G,rn.T,rn.V], [rn.K,rn.A,rn.D]],
| |
| [[rn.K,rn.T,rn.V], [rn.A,rn.G,rn.D]],
| |
| [[rn.A,rn.G,rn.D], [rn.K,rn.T,rn.V]],
| |
| [[rn.K,rn.A,rn.D], [rn.G,rn.T,rn.V]],
| |
| [[rn.A,rn.T,rn.D], [rn.K,rn.G,rn.V]],
| |
| [[rn.A,rn.D,rn.V], [rn.K,rn.T,rn.G]],
| |
| [[rn.K,rn.A,rn.G], [rn.T,rn.D,rn.V]],
| |
| [[rn.A,rn.T,rn.G], [rn.K,rn.D,rn.V]],
| |
| [[rn.A,rn.G,rn.V], [rn.K,rn.T,rn.D]],
| |
| [[rn.K,rn.A,rn.T], [rn.G,rn.D,rn.V]],
| |
| [[rn.K,rn.A,rn.V], [rn.D,rn.T,rn.G]],
| |
| [[rn.A,rn.T,rn.V], [rn.K,rn.D,rn.G]],
| |
| [[rn.K,rn.D,rn.G], [rn.A,rn.T,rn.V]],
| |
| [[rn.D,rn.T,rn.G], [rn.K,rn.A,rn.V]],
| |
| [[rn.G,rn.D,rn.V], [rn.K,rn.A,rn.T]],
| |
| [[rn.K,rn.T,rn.D], [rn.A,rn.G,rn.V]],
| |
| [[rn.K,rn.D,rn.V], [rn.A,rn.T,rn.G]]
| |
| ];
| |
| | |
| var self = {
| |
| // Settings
| |
| settings: {
| |
| daily_sort: 'by time',
| |
| notifs: false,
| |
| nobrownotifs: false,
| |
| notiftype: {},
| |
| raven: true,
| |
| et_events: false,
| |
| num_events: 3,
| |
| spots: true,
| |
| mg_spotlight: true,
| |
| dd_spotlight: true,
| |
| ed_spotlight: true,
| |
| show_next: false,
| |
| pvm: false,
| |
| //tms: false,
| |
| //pof: false,
| |
| merch: true,
| |
| farm: true,
| |
| //etlookup: '1970-01-01T01:00:00+00:00',
| |
| //events: []
| |
| dcache: '1970-01-01T01:00:00+00:00',
| |
| cache: {
| |
| events: [],
| |
| tms: {},
| |
| tmsTom: {}
| |
| }
| |
| },
| |
| | |
| // Using service worker notifications?
| |
| swnotif: false,
| |
| | |
| // Last times (for constant updating)
| |
| updatetimer: 0,
| |
| nextvos: '1970-01-01T01:00:00+00:00',
| |
| | |
| // Latest rotations (for notifications)
| |
| lastRot: {
| |
| time: '1970-01-01T01:00:00+00:00',
| |
| wreset: '1970-01-01T01:00:00+00:00',
| |
| mreset: '1970-01-01T01:00:00+00:00',
| |
| vos: '',
| |
| raven: '',
| |
| tms: '',
| |
| vorago: 99,
| |
| araxxor: 99,
| |
| rots: 99,
| |
| mgspot: 99,
| |
| edspot: 99,
| |
| ddspot: 99
| |
| },
| |
| | |
| /**
| |
| * Starts the events gadget
| |
| * @return {undefined}
| |
| */
| |
| init: function () {
| |
| mw.log('Starting Events Interface');
| |
| api = new mw.Api();
| |
|
| |
| // setup moment library
| |
| moment.locale('en-events', {
| |
| relativeTime : {
| |
| parentLocale: "en",
| |
| future: "in %s",
| |
| past: "%s ago",
| |
| s: "secs",
| |
| m: "1m",
| |
| mm: "%dm",
| |
| h: "1h",
| |
| hh: "%dh",
| |
| d: "1d",
| |
| dd: "%dd",
| |
| M: "1mth",
| |
| MM: "%dmths",
| |
| y: "1yr",
| |
| yy: "%dyr"
| |
| }
| |
| });
| |
| | |
| // Event team events
| |
| et_events = [];
| |
| // Travelling merchant stock
| |
| merchstock = { tod:[], tmr:[] };
| |
| | |
| // Check browser supports notifications
| |
| self.supportNotif = rs.canSendBrowserNotifs();
| |
| // TODO: Check if using service worker notifications
| |
| | |
| portletLink = mw.util.addPortletLink(
| |
| 'p-personal',
| |
| '',
| |
| '',
| |
| 'pt-events',
| |
| 'Events',
| |
| null,
| |
| $('#pt-userpage, #pt-anonuserpage')
| |
| );
| |
| | |
| $(portletLink).find('a').addClass('oo-ui-icon-calendar').click(function(e) {
| |
| e.preventDefault();
| |
| var openPopup = function() {
| |
| mw.log('Open events popup');
| |
| self.loadSettings().then(self.loadEvents).then( self.updateAll(), self.updateAll() );
| |
|
| |
| // Disable browser notifications settings if unavailable
| |
| // Done here to avoid a race condition where we disable it and save to localStorage
| |
| // before we actually load the settings
| |
| if (!self.supportNotif) {
| |
| notifsForm.browsnotif.setValue(true);
| |
| notifsForm.browsnotif.setDisabled(true);
| |
| }
| |
| | |
| // Google analytics tracker
| |
| if (typeof ga === 'function') {
| |
| ga('gtag_UA_126479006_1.send', 'event', 'Gadget-events', 'Open', 'Normal');
| |
| }
| |
|
| |
| $('.gsw-events-popup .events-settings').removeClass('slideout').addClass('oo-ui-element-hidden');
| |
| popup.toggle();
| |
| };
| |
| if (!formMade && !formConst) {
| |
| mw.log('Initialise events popup');
| |
| formConst = true;
| |
| mw.loader.using(['oojs-ui-core', 'oojs-ui-windows', 'oojs-ui-widgets']).then(self.initInt).then(openPopup);
| |
| } else if (!formConst) {
| |
| openPopup();
| |
| } else {
| |
| mw.log('Waiting for initialisation to finish');
| |
| }
| |
| });
| |
| | |
| // Load settings and events from localStorage or via api on page load to handle notifs
| |
| self.loadSettings().then(self.loadEvents).then( function () {
| |
| if (self.settings.notifs && !self.swnotif) {
| |
| self.notifs();
| |
| notiftimer = setInterval(self.notifs, 300000);
| |
| }
| |
| }, function () {
| |
| console.warn('Error loading events settings!');
| |
| });
| |
| },
| |
| | |
| /**
| |
| * Initialises the interface (popup and forms)
| |
| * @return {Promise}
| |
| */
| |
| initInt: function () {
| |
| mw.log('Initialising...');
| |
| return new Promise( function (resolve,reject) {
| |
| self.initPopup();
| |
| self.initSettingsForm();
| |
| self.initNotifsForm();
| |
| | |
| $popup = $('<div>').append(
| |
| $content,
| |
| settingsForm.$form
| |
| );
| |
| settingsForm.$form.find('.settings-container').append( notifsForm.$form );
| |
| | |
| popup = new OO.ui.PopupWidget({
| |
| $content: $popup,
| |
| $floatableContainer: $('#pt-events'),
| |
| autoClose: true,
| |
| classes: ['gsw-events-popup oo-ui-labelElement-invisible'],
| |
| hideWhenOutOfView: (rs.isUsingStickyHeader() ? true : false),
| |
| invisibleLabel: true,
| |
| label: 'Events',
| |
| width: 700
| |
| });
| |
| $('body').append(popup.$element);
| |
| popup.on('toggle', function (state) {
| |
| // Start constant update
| |
| clearInterval(self.updatetimer);
| |
| if (state) {
| |
| self.updatetimer = setInterval(self.update, 60000);
| |
| }
| |
| });
| |
| | |
| // For on wiki notifications
| |
| $('body').append($('<div>').attr('id', 'gsw-notifs-anchor'));
| |
| var notifclose = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'close',
| |
| id:'gsw-eventsnotifs-close',
| |
| invisibleLabel: true,
| |
| label: 'Close',
| |
| framed: false
| |
| });
| |
| notifclose.on('click', function () {
| |
| notifpopup.toggle(false);
| |
| });
| |
| $notifs = $('<div>').addClass('event-notifs-container').append(
| |
| notifclose.$element,
| |
| $('<h3>').addClass('oo-ui-element-hidden').text('Event Notifications'),
| |
| $('<ul>').addClass('event-notifications')
| |
| );
| |
| notifpopup = new OO.ui.PopupWidget({
| |
| $content: $notifs,
| |
| $floatableContainer: $('#gsw-notifs-anchor'),
| |
| anchor: false,
| |
| autoClose: true,
| |
| classes: ['gsw-events-notifs oo-ui-labelElement-invisible'],
| |
| hideWhenOutOfView: false,
| |
| invisibleLabel: true,
| |
| label: 'Events Notifications',
| |
| width: 450
| |
| });
| |
| $('body').append(notifpopup.$element);
| |
| | |
| // Mark interface as initialised
| |
| formMade = true;
| |
| formConst = false;
| |
| | |
| resolve();
| |
| } );
| |
| },
| |
| | |
| /**
| |
| * Loads settings from browser localStorage
| |
| * @return {Promise}
| |
| */
| |
| loadSettings: function () {
| |
| mw.log('Loading settings');
| |
| return new Promise( function (resolve, reject) {
| |
| if (!rs.hasLocalStorage()) {
| |
| console.warn('Browser does not support localStorage');
| |
| reject();
| |
| }
| |
| | |
| var prefs = {};
| |
| try {
| |
| prefs = JSON.parse(localStorage.getItem(localKey));
| |
| } catch (err) {
| |
| prefs = {};
| |
| console.warn('Error loading settings (events)');
| |
| }
| |
| for (var p in prefs) {
| |
| self.settings[p] = prefs[p];
| |
| }
| |
| resolve();
| |
| } );
| |
| },
| |
| | |
| /**
| |
| * Loads events team events, travelling merchant stock
| |
| * @return {Promise}
| |
| */
| |
| loadEvents: function ( force ) {
| |
| mw.log('Loading events, travelling merchant stock');
| |
| if ( moment().isBefore( moment(self.settings.dcache).utc().add(1, 'days').startOf('day') ) && !force ) {
| |
| mw.log('Less than a day since last lookup');
| |
| et_events = self.settings.cache.events;
| |
| merchstock = {
| |
| tod: self.settings.cache.tms,
| |
| tmr: self.settings.cache.tmsTom
| |
| };
| |
| return Promise.resolve();
| |
| }
| |
| | |
| // ET events
| |
| var etapi = api.get({
| |
| action: 'ask',
| |
| query: '[[GSWiki:Events Team]]|?Events JSON',
| |
| maxage: '7200',
| |
| smaxage: '7200'
| |
| }).then( function (ret) {
| |
| mw.log('Events team api return:');
| |
| mw.log(ret);
| |
| if (ret.query.results && ret.query.results['GSWiki:Events Team'].printouts['Events JSON']) {
| |
| ret.query.results['GSWiki:Events Team'].printouts['Events JSON'].forEach( function (ev) {
| |
| ev = JSON.parse(ev);
| |
| et_events.push( { name:mw.html.escape(ev.name), date:ev.time, length:Number(ev.length) } );
| |
| });
| |
| } else {
| |
| mw.log('No events team events');
| |
| }
| |
| self.saveSetting('cache.events', et_events);
| |
| }, function (err) {
| |
| console.warn('Error getting Events team events');
| |
| throw err;
| |
| });
| |
| | |
| // Travelling merchant stock
| |
| var tmsapi = api.get({
| |
| action:'parse',
| |
| prop:'text',
| |
| disablelimitreport:1,
| |
| contentmodel:'wikitext',
| |
| text:'{{Travelling_Merchant/api|format=json}}',
| |
| }).then( function (ret) {
| |
| mw.log('Todays travelling merchant stock from api');
| |
| mw.log(ret);
| |
| if (ret.parse && ret.parse.text) {
| |
| var string = ret.parse.text['*'].replace('<div class=\"mw-parser-output\"><p>', '').replace('</p></div>', '');
| |
| var obj = JSON.parse(string);
| |
| mw.log(obj);
| |
| merchstock.tod = obj.items;
| |
| self.saveSetting('cache.tms', obj.items);
| |
| } else {
| |
| throw 'Could not parse tm data for today';
| |
| }
| |
| }, function (err) {
| |
| console.warn('Error getting todays travelling merchant stock');
| |
| console.warn(err);
| |
| throw err;
| |
| });
| |
| // Travelling merchant stock
| |
| var tmsTomapi = api.get({
| |
| action:'parse',
| |
| prop:'text',
| |
| disablelimitreport:1,
| |
| contentmodel:'wikitext',
| |
| text:'{{Travelling_Merchant/api|offset=1|format=json}}',
| |
| }).then( function (ret) {
| |
| mw.log('Tomorrows travelling merchant stock from api');
| |
| mw.log(ret);
| |
| if (ret.parse && ret.parse.text) {
| |
| var string = ret.parse.text['*'].replace('<div class=\"mw-parser-output\"><p>', '').replace('</p></div>', '');
| |
| var obj = JSON.parse(string);
| |
| mw.log(obj);
| |
| merchstock.tmr = obj.items;
| |
| self.saveSetting('cache.tmsTom', obj.items);
| |
| } else {
| |
| throw 'Could not parse tm data for tomorrow';
| |
| }
| |
| }, function (err) {
| |
| console.warn('Error getting tomorrows travelling merchant stock');
| |
| console.warn(err);
| |
| throw err;
| |
| });
| |
|
| |
| // Resolve/reject all
| |
| return Promise.all([ etapi, tmsapi, tmsTomapi ]).then( function () {
| |
| // Success, resolve promise
| |
| self.saveSetting('dcache', moment().format());
| |
| }, function (err) {
| |
| // Error, reject promise
| |
| throw err;
| |
| });
| |
| },
| |
| | |
| /**
| |
| * Saves a setting to localStorage
| |
| * @param {string} name Name (key) of setting to save
| |
| * @return {boolean} If save was successfull
| |
| */
| |
| saveSetting: function (key, value) {
| |
| mw.log('Saving setting: ' + key);
| |
| if ( key.split('.')[0] == 'cache' ) {
| |
| self.settings.cache[key.split('.')[1]] = value;
| |
| } else {
| |
| self.settings[key] = value;
| |
| }
| |
| | |
| if (!rs.hasLocalStorage()) {
| |
| console.warn('Browser does not support localStorage');
| |
| return false;
| |
| }
| |
| | |
| var string = JSON.stringify(self.settings);
| |
| try {
| |
| localStorage.setItem(localKey, string);
| |
| } catch (err) {
| |
| console.warn('Error saving presets to localStorage');
| |
| return false;
| |
| }
| |
| return true;
| |
| },
| |
| | |
| /**
| |
| * Saves a notification setting to localStorage
| |
| * @param {string} key Name (key) of notification setting to save
| |
| * @param {boolean} value Send notifications?
| |
| * @return {boolean} If save was successfull
| |
| */
| |
| saveNotif: function (key, value) {
| |
| mw.log('Saving notification setting: ' + key);
| |
| self.settings.notiftype[key] = value;
| |
| | |
| if (!rs.hasLocalStorage()) {
| |
| console.warn('Browser does not support localStorage');
| |
| return false;
| |
| }
| |
| | |
| var string = JSON.stringify(self.settings);
| |
| try {
| |
| localStorage.setItem(localKey, string);
| |
| } catch (err) {
| |
| console.warn('Error saving presets to localStorage');
| |
| return false;
| |
| }
| |
| return true;
| |
| },
| |
| | |
| /**
| |
| * Generates the events popup
| |
| * @return {undefined}
| |
| */
| |
| initPopup: function () {
| |
| var closeButton = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'close',
| |
| id:'gsw-events-close',
| |
| invisibleLabel: true,
| |
| label: 'Close',
| |
| framed: false
| |
| });
| |
| closeButton.on('click', function () {
| |
| popup.toggle(false);
| |
| });
| |
| | |
| var settingsButton = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'advanced',
| |
| id:'gsw-events-setbut',
| |
| invisibleLabel: true,
| |
| label: 'Settings',
| |
| framed: false
| |
| });
| |
| settingsButton.on('click', function () {
| |
| self.openSettings();
| |
| });
| |
| | |
| // Current UTC time
| |
| var now = moment.utc();
| |
| | |
| $content = $('<div>');
| |
| $content
| |
| .addClass('events-popup')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('header')
| |
| .append(
| |
| closeButton.$element,
| |
| $('<time>')
| |
| .addClass('cur-utc-time')
| |
| .attr({ 'title':now.format('HH:mm D/M/Y'), 'datetime':now.format() })
| |
| .text(now.format('HH:mm') + ' (UTC)'),
| |
| settingsButton.$element
| |
| ),
| |
| $('<div>')
| |
| .addClass('top')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('col col-l')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('dailies section')
| |
| .append(
| |
| $('<h3>').text('Dailies'),
| |
| $('<ul>').addClass('events-list daily-list')
| |
| ),
| |
| $('<div>')
| |
| .addClass('raven section')
| |
| ),
| |
| $('<div>')
| |
| .addClass('col col-r')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('resets section')
| |
| .append(
| |
| $('<h3>').text('Resets'),
| |
| $('<div>')
| |
| .addClass('event-boxes')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('day event-box')
| |
| .append(
| |
| $('<label>').addClass('by-line').text('Day'),
| |
| $('<time>').addClass('event-name countdown-day').text('? hrs')
| |
| ),
| |
| $('<div>')
| |
| .addClass('week event-box')
| |
| .append(
| |
| $('<label>').addClass('by-line').text('Week'),
| |
| $('<time>').addClass('event-name countdown-week').text('? days')
| |
| ),
| |
| $('<div>')
| |
| .addClass('month event-box')
| |
| .append(
| |
| $('<label>').addClass('by-line').text('Month'),
| |
| $('<time>').addClass('event-name countdown-month').text('? days')
| |
| )
| |
| )
| |
| ),
| |
| $('<div>')
| |
| .addClass('voice section')
| |
| .append(
| |
| $('<h3>').html('<a href="/w/Voice_of_Seren" title="Voice of Seren">Voice of Seren</a>'),
| |
| $('<div>')
| |
| .addClass('VoS-time by-line')
| |
| .text(
| |
| 'There was an error loading the Voice of Seren. Please try again.<br/>If this issue persists, please <a href="/w/RS:AR">contact an administrator</a>.'
| |
| ),
| |
| $('<div>')
| |
| .addClass('VoS-container event-boxes'),
| |
| $('<div>')
| |
| .addClass('by-line')
| |
| .append(
| |
| $('<span>').text('Last districts: '),
| |
| $('<span>').addClass('VoS-last').text('not found')
| |
| )
| |
| )
| |
| )
| |
| ),
| |
| $('<div>')
| |
| .addClass('middle events-team'),
| |
| $('<div>')
| |
| .addClass('middle tms-pof'),
| |
| $('<div>')
| |
| .addClass('middle pvm'),
| |
| $('<div>')
| |
| .addClass('spotlights')
| |
| .append(
| |
| $('<div>')
| |
| .addClass('spotlight-spacer empty'),
| |
| $('<div>')
| |
| .addClass('spotlight mg-spotlight'),
| |
| $('<div>')
| |
| .addClass('spotlight-spacer empty'),
| |
| $('<div>')
| |
| .addClass('spotlight ed-spotlight'),
| |
| $('<div>')
| |
| .addClass('spotlight-spacer empty'),
| |
| $('<div>')
| |
| .addClass('spotlight dd-spotlight'),
| |
| $('<div>')
| |
| .addClass('spotlight-spacer')
| |
| )
| |
| );
| |
| },
| |
| | |
| /**
| |
| * Generates the settings popup
| |
| * @return {undefined}
| |
| */
| |
| initSettingsForm: function () {
| |
| settingsForm = {};
| |
| | |
| // Back button
| |
| settingsForm.back = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'close',
| |
| id: 'gsw-events-backbut',
| |
| invisibleLabel: true,
| |
| label: 'Back',
| |
| framed: false
| |
| });
| |
| var closeset = function () {
| |
| self.updateTimes();
| |
| self.updateVos();
| |
| self.updateSpots();
| |
| $('.gsw-events-popup .events-settings').addClass('slideout');
| |
| setTimeout( function () {
| |
| $('.gsw-events-popup .events-settings').removeClass('slideout').addClass('oo-ui-element-hidden');
| |
| }, 500);
| |
| };
| |
| settingsForm.back.on('click', closeset);
| |
| | |
| // Title
| |
| settingsForm.$title = $('<h3>').text('Options');
| |
| | |
| // Dailies sort selector
| |
| settingsForm.sort = new OO.ui.DropdownInputWidget({
| |
| classes: 'sort-selector',
| |
| options: [
| |
| { data:'by time', label:'by time' },
| |
| { data:'by name', label:'by name' }
| |
| ],
| |
| });
| |
| settingsForm.sort.setValue(self.settings.daily_sort);
| |
| settingsForm.sortLay = new OO.ui.FieldLayout(settingsForm.sort, {
| |
| label: 'Sorting'
| |
| });
| |
| settingsForm.sort.on('change', self.saveSetting, ['daily_sort']);
| |
| | |
| // Show browser notifications
| |
| settingsForm.notifs = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Recieve browser notifications',
| |
| value: self.settings.notifs
| |
| });
| |
| settingsForm.notifs.on('change', function (val) {
| |
| self.saveSetting('notifs', val);
| |
| if (val && !self.swnotif) {
| |
| window.clearInterval(notiftimer);
| |
| self.notifs();
| |
| notiftimer = setInterval(self.notifs, 300000);
| |
| } else {
| |
| window.clearInterval(notiftimer);
| |
| }
| |
| });
| |
| settingsForm.notifSets = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'advanced',
| |
| invisibleLabel: true,
| |
| label: 'Notification Settings',
| |
| framed: false
| |
| });
| |
| settingsForm.notifSets.on('click', function () {
| |
| self.openNotifs();
| |
| });
| |
| settingsForm.notifsLay = new OO.ui.ActionFieldLayout(settingsForm.notifs, settingsForm.notifSets, {
| |
| label: 'Notifications',
| |
| help: 'Enable notifications for configured events. Currently in development.'
| |
| });
| |
| | |
| // Show raven spawn
| |
| settingsForm.raven = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Prifddinas Raven',
| |
| value: self.settings.raven
| |
| });
| |
| settingsForm.ravenLay = new OO.ui.FieldLayout(settingsForm.raven, { label: 'Raven' });
| |
| settingsForm.raven.on('change', self.saveSetting, ['raven']);
| |
| | |
| // Show events team events
| |
| settingsForm.events = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show events team events',
| |
| value: self.settings.et_events
| |
| });
| |
| settingsForm.eventsLay = new OO.ui.FieldLayout(settingsForm.events, { label: 'Events Team' });
| |
| settingsForm.events.on('change', function (val) {
| |
| self.saveSetting('et_events', val);
| |
| settingsForm.eventsNum.setDisabled(!val);
| |
| settingsForm.eventsNumLay.toggle(val);
| |
| });
| |
| | |
| // Number of events to display
| |
| settingsForm.eventsNum = new OO.ui.NumberInputWidget({
| |
| min: 0,
| |
| required: true,
| |
| step: 1,
| |
| validate: 'integer',
| |
| value: self.settings.num_events
| |
| });
| |
| settingsForm.eventsNumLay = new OO.ui.FieldLayout(settingsForm.eventsNum, {
| |
| label: 'Number of Events',
| |
| help: 'Number of Events Team events to display, use 0 for infinite'
| |
| });
| |
| settingsForm.eventsNum.on('change', function (val) {
| |
| val = parseInt(val, 10);
| |
| if (isNaN(val)) { val = 1; }
| |
| self.saveSetting('num_events', val);
| |
| });
| |
| // Disable if events turned off
| |
| if (!self.settings.et_events) {
| |
| settingsForm.eventsNum.setDisabled(true);
| |
| settingsForm.eventsNumLay.toggle(false);
| |
| }
| |
| | |
| // Show travelling merchant stock
| |
| settingsForm.tms = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show Travelling Merchant stock',
| |
| value: self.settings.merch
| |
| });
| |
| settingsForm.tmsLay = new OO.ui.FieldLayout(settingsForm.tms, {
| |
| label: 'Travelling Merchant',
| |
| help: 'Display today and tomorrow\'s Travelling Merchant stock'
| |
| });
| |
| settingsForm.tms.on('change', self.saveSetting, ['merch']);
| |
| | |
| // Show player-owned farm resets
| |
| settingsForm.pof = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show player-owned farm resets',
| |
| value: self.settings.farm
| |
| });
| |
| settingsForm.pofLay = new OO.ui.FieldLayout(settingsForm.pof, {
| |
| label: 'Player-owned Farm',
| |
| help: 'Display time to next reset for player-owned farm buyers and requesters'
| |
| });
| |
| settingsForm.pof.on('change', self.saveSetting, ['farm']);
| |
| | |
| // Show spotlights (combined)
| |
| settingsForm.spots = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show D&D, Minigame and ED spotlights',
| |
| value: self.settings.spots
| |
| });
| |
| settingsForm.spotsLay = new OO.ui.FieldLayout(settingsForm.spots, {
| |
| label: 'Spotlights',
| |
| help: 'Show Minigame Spotlight, Featured D&D and Elite Dungeon Spotlight'
| |
| });
| |
| settingsForm.spots.on('change', function (val) {
| |
| self.saveSetting('mg_spotlight', val);
| |
| self.saveSetting('dd_spotlight', val);
| |
| self.saveSetting('ed_spotlight', val);
| |
| });
| |
| | |
| // Show minigame spotlight
| |
| settingsForm.mg = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show minigame spotlight',
| |
| value: self.settings.mg_spotlight
| |
| });
| |
| settingsForm.mgLay = new OO.ui.FieldLayout(settingsForm.mg, { label: 'Minigame Spotlight' });
| |
| settingsForm.mg.on('change', self.saveSetting, ['mg_spotlight']);
| |
| | |
| // Show featured D&D spotlight
| |
| settingsForm.dd = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show featured D&D',
| |
| value: self.settings.dd_spotlight
| |
| });
| |
| settingsForm.ddLay = new OO.ui.FieldLayout(settingsForm.dd, { label: 'Featured D&D' });
| |
| settingsForm.dd.on('change', self.saveSetting, ['dd_spotlight']);
| |
| | |
| // Show elite dungeon spotlight
| |
| settingsForm.ed = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show Elite Dungeon spotlight',
| |
| value: self.settings.ed_spotlight
| |
| });
| |
| settingsForm.edLay = new OO.ui.FieldLayout(settingsForm.ed, { label: 'Elite Dungeon Spotlight' });
| |
| settingsForm.ed.on('change', self.saveSetting, ['ed_spotlight']);
| |
| | |
| // Show next spotlight
| |
| settingsForm.next = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show next spotlight item',
| |
| value: self.settings.show_next
| |
| });
| |
| settingsForm.nextLay = new OO.ui.FieldLayout(settingsForm.next, {
| |
| label: 'Show next',
| |
| help: 'Show next item in spotlight rotations'
| |
| });
| |
| settingsForm.next.on('change', self.saveSetting, ['show_next']);
| |
| | |
| // Show PvM
| |
| settingsForm.pvm = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Show PvM rotations',
| |
| value: self.settings.pvm
| |
| });
| |
| settingsForm.pvmLay = new OO.ui.FieldLayout(settingsForm.pvm, { label: 'PvM Rotations' });
| |
| settingsForm.pvm.on('change', self.saveSetting, ['pvm']);
| |
| | |
| // Force update events and travelling merchant stock
| |
| settingsForm.fupdate = new OO.ui.ButtonWidget({
| |
| label: 'Refresh',
| |
| icon: 'reload',
| |
| title: 'Force refresh of travelling merchant stock and events'
| |
| });
| |
| settingsForm.fupdateLay = new OO.ui.FieldLayout(settingsForm.fupdate, {
| |
| label: 'Force TMS Update',
| |
| help: 'Force the travelling merchant stock and events team events to update regardless of the last update time.'
| |
| });
| |
| settingsForm.fupdate.on('click', function () {
| |
| self.loadEvents(true).then(self.updateAll(), self.updateAll());
| |
| });
| |
| | |
| settingsForm.form = new OO.ui.FieldsetLayout({ classes:'settings-form' });
| |
| settingsForm.form.addItems([
| |
| settingsForm.sortLay,
| |
| settingsForm.notifsLay,
| |
| settingsForm.ravenLay,
| |
| settingsForm.eventsLay,
| |
| settingsForm.eventsNumLay,
| |
| settingsForm.tmsLay,
| |
| settingsForm.pofLay,
| |
| settingsForm.spotsLay,
| |
| settingsForm.nextLay,
| |
| settingsForm.pvmLay,
| |
| settingsForm.fupdateLay
| |
| ]);
| |
| | |
| // Settings form footer
| |
| settingsForm.$footer = $('<div>')
| |
| .addClass('footer')
| |
| .html('<a href="/w/Help_talk:Gadget-events" title="Events gadget discussion">Give us feedback on these timers!</a>');
| |
| | |
| var $setoverlay = $('<div>').addClass('settings-overlay');
| |
| $setoverlay.click( closeset );
| |
| | |
| // Complete form
| |
| settingsForm.$form = $('<div>')
| |
| .addClass('events-settings oo-ui-element-hidden')
| |
| .append(
| |
| $setoverlay,
| |
| $('<div>')
| |
| .addClass('settings-container')
| |
| .append(
| |
| settingsForm.back.$element,
| |
| settingsForm.$title,
| |
| settingsForm.form.$element,
| |
| settingsForm.$footer
| |
| )
| |
| );
| |
| },
| |
| | |
| /**
| |
| * Generates the notifications settings popup
| |
| * @return {undefined}
| |
| */
| |
| initNotifsForm: function () {
| |
| notifsForm = {};
| |
| | |
| // Back button
| |
| notifsForm.back = new OO.ui.ButtonWidget({
| |
| classes: ['oo-ui-labelElement-invisible'],
| |
| icon: 'close',
| |
| id: 'gsw-notifs-backbut',
| |
| invisibleLabel: true,
| |
| label: 'Back',
| |
| framed: false
| |
| });
| |
| notifsForm.back.on('click', function () {
| |
| $('.gsw-events-popup .events-notifs').addClass('slideout');
| |
| setTimeout( function () {
| |
| $('.gsw-events-popup .events-notifs').removeClass('slideout').addClass('oo-ui-element-hidden');
| |
| }, 500);
| |
| });
| |
| | |
| // Title
| |
| notifsForm.$title = $('<h3>').text('Notifications');
| |
| | |
| // Disable browser notifications
| |
| notifsForm.browsnotif = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Disable browser notifications',
| |
| value: self.settings.nobrownotifs
| |
| });
| |
| notifsForm.browsnotif.on('change', self.saveSetting, ['nobrownotifs']);
| |
| notifsForm.browsnotifLay = new OO.ui.FieldLayout(notifsForm.browsnotif, {
| |
| label: 'No Browser Notifs',
| |
| help: 'Disable native browser notifications. While disabled, notifications will instead be displayed in a popup at the top right of the wiki page.'
| |
| });
| |
| | |
| // All Dailies
| |
| notifsForm.dailies = new OO.ui.DropdownInputWidget({
| |
| options: [
| |
| { data:'None', label:'None' },
| |
| { data:'All', label:'All' },
| |
| { data:'Some', label:'Selectively' }
| |
| ],
| |
| title: 'Recieve notifications for dailies',
| |
| });
| |
| notifsForm.dailies.setValue(self.settings.notiftype.dailies);
| |
| notifsForm.dailiesLay = new OO.ui.FieldLayout(notifsForm.dailies, {
| |
| label: 'Dailies',
| |
| help: 'Recieve notifications for dailies such as Guthixian Caches or Sinkholes'
| |
| });
| |
| var toggledailies = function (val) {
| |
| self.saveNotif('dailies', val);
| |
| | |
| if (val == 'Some') {
| |
| notifsForm.dailiesselLay.toggle(true);
| |
| self.saveNotif('alldailies', false);
| |
| } else if (val == 'All') {
| |
| notifsForm.dailiesselLay.toggle(false);
| |
| self.saveNotif('alldailies', true);
| |
| } else {
| |
| notifsForm.dailiesselLay.toggle(false);
| |
| self.saveNotif('alldailies', false);
| |
| }
| |
| };
| |
| notifsForm.dailies.on('change', toggledailies);
| |
| | |
| // Individual Dailies
| |
| notifsForm.dailiessel = new OO.ui.CheckboxMultiselectWidget({ classes: ['notifs-group'] });
| |
| simple_dailies.forEach( function (dd) {
| |
| notifsForm[dd.id] = new OO.ui.CheckboxMultioptionWidget({
| |
| label: dd.name,
| |
| data: dd.name,
| |
| selected: self.settings.notiftype[dd.id]
| |
| });
| |
| | |
| notifsForm[dd.id].on('change', self.saveNotif, [dd.id]);
| |
| | |
| notifsForm.dailiessel.addItems([ notifsForm[dd.id] ]);
| |
| });
| |
| notifsForm.dailiesselLay = new OO.ui.FieldLayout(notifsForm.dailiessel, {
| |
| align: 'top',
| |
| label: 'Individual Dailies',
| |
| help: 'Choose individual dalies to be notified about'
| |
| });
| |
| if (self.settings.notiftype.dailies != 'Some') {
| |
| notifsForm.dailiesselLay.toggle(false);
| |
| }
| |
| | |
| // Raven
| |
| notifsForm.raven = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Prifddinas raven notifications',
| |
| value: self.settings.notiftype.raven
| |
| });
| |
| notifsForm.raven.on('change', self.saveNotif, ['raven']);
| |
| notifsForm.ravenLay = new OO.ui.FieldLayout(notifsForm.raven, {
| |
| label: 'Raven'
| |
| });
| |
| | |
| // Resets
| |
| notifsForm.dreset = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Daily reset notification',
| |
| value: self.settings.notiftype.dreset
| |
| });
| |
| notifsForm.dreset.on('change', self.saveNotif, ['dreset']);
| |
| notifsForm.dresetLay = new OO.ui.FieldLayout(notifsForm.dreset, {
| |
| label: 'Daily Reset'
| |
| });
| |
| notifsForm.wreset = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Weekly reset notification',
| |
| value: self.settings.notiftype.wreset
| |
| });
| |
| notifsForm.wreset.on('change', self.saveNotif, ['wreset']);
| |
| notifsForm.wresetLay = new OO.ui.FieldLayout(notifsForm.wreset, {
| |
| label: 'Weekly Reset'
| |
| });
| |
| notifsForm.mreset = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Monthly reset notification',
| |
| value: self.settings.notiftype.mreset
| |
| });
| |
| notifsForm.mreset.on('change', self.saveNotif, ['mreset']);
| |
| notifsForm.mresetLay = new OO.ui.FieldLayout(notifsForm.mreset, {
| |
| label: 'Monthly Reset'
| |
| });
| |
| | |
| // All Voice of Seren
| |
| notifsForm.vos = new OO.ui.DropdownInputWidget({
| |
| options: [
| |
| { data:'None', label:'None' },
| |
| { data:'All', label:'All' },
| |
| { data:'Some', label:'Some' }
| |
| ],
| |
| title: 'Receive notifications for Voice of Seren',
| |
| });
| |
| notifsForm.vos.setValue(self.settings.notiftype.vos);
| |
| notifsForm.vosLay = new OO.ui.FieldLayout(notifsForm.vos, {
| |
| label: 'Voice of Seren',
| |
| help: 'Receive notifications for Voice of Seren'
| |
| });
| |
| var togglevos = function (val) {
| |
| self.saveNotif('vos', val);
| |
| | |
| if (val == 'Some') {
| |
| notifsForm.vosselLay.toggle(true);
| |
| self.saveNotif('allvos', false);
| |
| } else if (val == 'All') {
| |
| notifsForm.vosselLay.toggle(false);
| |
| self.saveNotif('allvos', true);
| |
| } else {
| |
| notifsForm.vosselLay.toggle(false);
| |
| self.saveNotif('allvos', false);
| |
| }
| |
| };
| |
| notifsForm.vos.on('change', togglevos);
| |
| // Individual VoS
| |
| notifsForm.vossel = new OO.ui.CheckboxMultiselectWidget({ classes: ['notifs-group'] });
| |
| for (var clan in voslocs) {
| |
| notifsForm[clan] = new OO.ui.CheckboxMultioptionWidget({
| |
| label: clan,
| |
| data: clan,
| |
| selected: self.settings.notiftype['vos' + clan]
| |
| });
| |
| | |
| notifsForm[clan].on('change', self.saveNotif, ['vos' + clan]);
| |
| | |
| notifsForm.vossel.addItems([ notifsForm[clan] ]);
| |
| }
| |
| notifsForm.vosselLay = new OO.ui.FieldLayout(notifsForm.vossel, {
| |
| align: 'top',
| |
| label: 'Individual Clan Districts',
| |
| help: 'Choose the Prifddinas clan districts you wish to be notified about when a Voice of Seren is active.'
| |
| });
| |
| if (self.settings.notiftype.vos != 'Some') {
| |
| notifsForm.vosselLay.toggle(false);
| |
| }
| |
| | |
| // Events team events
| |
| notifsForm.etevents = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Events team notifications',
| |
| value: self.settings.notiftype.etevents
| |
| });
| |
| notifsForm.etevents.on('change', self.saveNotif, ['etevents']);
| |
| notifsForm.eteventsLay = new OO.ui.FieldLayout(notifsForm.etevents, {
| |
| label: 'Events Team',
| |
| help: 'Receive notifications for Gemini Station Wiki events team events'
| |
| });
| |
| | |
| // All travelling merchant stock
| |
| notifsForm.tms = new OO.ui.DropdownInputWidget({
| |
| options: [
| |
| { data:'None', label:'None' },
| |
| { data:'All', label:'All' },
| |
| { data:'Some', label:'Some' }
| |
| ],
| |
| title: 'Receive notifications for Travelling Merchant stock',
| |
| });
| |
| notifsForm.tms.setValue(self.settings.notiftype.tms);
| |
| notifsForm.tmsLay = new OO.ui.FieldLayout(notifsForm.tms, {
| |
| label: 'Travelling Merchant',
| |
| help: 'Receive notifications for Travelling Merchant stock'
| |
| });
| |
| var toggletms = function (val) {
| |
| self.saveNotif('tms', val);
| |
| | |
| if (val == 'Some') {
| |
| notifsForm.tmsselLay.toggle(true);
| |
| self.saveNotif('alltms', false);
| |
| } else if (val == 'All') {
| |
| notifsForm.tmsselLay.toggle(false);
| |
| self.saveNotif('alltms', true);
| |
| } else {
| |
| notifsForm.tmsselLay.toggle(false);
| |
| self.saveNotif('alltms', false);
| |
| }
| |
| };
| |
| notifsForm.tms.on('change', toggletms);
| |
| // Specific traveling merchant stock
| |
| notifsForm.tmssel = new OO.ui.MenuTagMultiselectWidget({
| |
| allowArbitrary: false,
| |
| classes: ['notifs-group'],
| |
| options: tmsStock
| |
| });
| |
| var seltms = function (vals) {
| |
| var items = [];
| |
| vals.forEach( function (i) { items.push(i.data); });
| |
| self.saveNotif('tmsitems', items);
| |
| };
| |
| notifsForm.tmssel.on('change', seltms);
| |
| notifsForm.tmsselLay = new OO.ui.FieldLayout(notifsForm.tmssel, {
| |
| align: 'top',
| |
| label: 'Travelling Merchant stock',
| |
| help: 'Choose the Travelling Merchant stock items you would like to be notified about'
| |
| });
| |
| if (self.settings.notiftype.tmsitems) {
| |
| self.settings.notiftype.tmsitems.forEach( function (item) {
| |
| notifsForm.tmssel.addTag(item, item);
| |
| });
| |
| }
| |
| if (self.settings.notiftype.tms != 'Some') {
| |
| notifsForm.tmsselLay.toggle(false);
| |
| }
| |
| | |
| // All PoF Resets
| |
| notifsForm.pof = new OO.ui.DropdownInputWidget({
| |
| options: [
| |
| { data:'None', label:'None' },
| |
| { data:'All', label:'All' },
| |
| { data:'Some', label:'Some' }
| |
| ],
| |
| title: 'Receive notifications for player-owned farm resets',
| |
| });
| |
| notifsForm.pof.setValue(self.settings.notiftype.pof);
| |
| notifsForm.pofLay = new OO.ui.FieldLayout(notifsForm.pof, {
| |
| label: 'Player-owned Farm',
| |
| help: 'Receive notifications for player-owned farm resets'
| |
| });
| |
| var togglepof = function (val) {
| |
| self.saveNotif('pof', val);
| |
| | |
| if (val == 'Some') {
| |
| notifsForm.pofselLay.toggle(true);
| |
| self.saveNotif('allpof', false);
| |
| } else if (val == 'All') {
| |
| notifsForm.pofselLay.toggle(false);
| |
| self.saveNotif('allpof', true);
| |
| } else {
| |
| notifsForm.pofselLay.toggle(false);
| |
| self.saveNotif('allpof', false);
| |
| }
| |
| };
| |
| notifsForm.pof.on('change', togglepof);
| |
| // Individual PoF resets
| |
| notifsForm.pofsel = new OO.ui.CheckboxMultiselectWidget({ classes: ['notifs-group'] });
| |
| pofresets.forEach( function (res) {
| |
| notifsForm[res] = new OO.ui.CheckboxMultioptionWidget({
| |
| label: res,
| |
| data: res,
| |
| selected: self.settings.notiftype['pof' + res]
| |
| });
| |
| | |
| notifsForm[res].on('change', self.saveNotif, ['pof' + res]);
| |
| | |
| notifsForm.pofsel.addItems([ notifsForm[res] ]);
| |
| });
| |
| notifsForm.pofselLay = new OO.ui.FieldLayout(notifsForm.pofsel, {
| |
| align: 'top',
| |
| label: 'Individual PoF resets',
| |
| help: 'Choose the player-owned farm resets you wish to be notified about'
| |
| });
| |
| if (self.settings.notiftype.pof != 'Some') {
| |
| notifsForm.vosselLay.toggle(false);
| |
| }
| |
| | |
| // PVM
| |
| notifsForm.vorago = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Vorago attack notifications',
| |
| value: self.settings.notiftype.vorago
| |
| });
| |
| notifsForm.vorago.on('change', self.saveNotif, ['vorago']);
| |
| notifsForm.voragoLay = new OO.ui.FieldLayout(notifsForm.vorago, {
| |
| label: 'Vorago',
| |
| help: 'Receive notifications about current Vorago attack'
| |
| });
| |
| notifsForm.araxxor = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Araxxor path notifications',
| |
| value: self.settings.notiftype.araxxor
| |
| });
| |
| notifsForm.araxxor.on('change', self.saveNotif, ['araxxor']);
| |
| notifsForm.araxxorLay = new OO.ui.FieldLayout(notifsForm.araxxor, {
| |
| label: 'Araxxor',
| |
| help: 'Receive notifications about open Araxxor paths'
| |
| });
| |
| notifsForm.rots = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Rise of the Six notifications',
| |
| value: self.settings.notiftype.rots
| |
| });
| |
| notifsForm.rots.on('change', self.saveNotif, ['rots']);
| |
| notifsForm.rotsLay = new OO.ui.FieldLayout(notifsForm.rots, {
| |
| label: 'RotS',
| |
| title: 'Rise of the Six',
| |
| help: 'Receive notifications for Rise of the Six rotations'
| |
| });
| |
| | |
| // Spotlights
| |
| notifsForm.mg_spotlight = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Minigame spotlight notifications',
| |
| value: self.settings.notiftype.mg_spotlight
| |
| });
| |
| notifsForm.mg_spotlight.on('change', self.saveNotif, ['mg_spotlight']);
| |
| notifsForm.mg_spotlightLay = new OO.ui.FieldLayout(notifsForm.mg_spotlight, {
| |
| label: 'Minigame Spotlight',
| |
| help: 'Receive notifications for current Minigame Spotlight'
| |
| });
| |
| notifsForm.ed_spotlight = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Elite dungeon spotlight notifications',
| |
| value: self.settings.notiftype.ed_spotlight
| |
| });
| |
| notifsForm.ed_spotlight.on('change', self.saveNotif, ['ed_spotlight']);
| |
| notifsForm.ed_spotlightLay = new OO.ui.FieldLayout(notifsForm.ed_spotlight, {
| |
| label: 'Elite Dungeon Spotlight',
| |
| help: 'Receive notifications for current Elite dungeon spotlight'
| |
| });
| |
| notifsForm.dd_spotlight = new OO.ui.ToggleSwitchWidget({
| |
| title: 'Distraction and diversion of the week notifications',
| |
| value: self.settings.notiftype.dd_spotlight
| |
| });
| |
| notifsForm.dd_spotlight.on('change', self.saveNotif, ['dd_spotlight']);
| |
| notifsForm.dd_spotlightLay = new OO.ui.FieldLayout(notifsForm.dd_spotlight, {
| |
| label: 'Distraction & Diversions',
| |
| help: 'Receive notifications for Distraction and Diversion of the week'
| |
| });
| |
|
| |
| notifsForm.form = new OO.ui.FieldsetLayout({ classes:'notifs-form' });
| |
| notifsForm.form.addItems([
| |
| notifsForm.browsnotifLay,
| |
| notifsForm.dailiesLay,
| |
| notifsForm.dailiesselLay,
| |
| notifsForm.ravenLay,
| |
| notifsForm.dresetLay,
| |
| notifsForm.wresetLay,
| |
| notifsForm.mresetLay,
| |
| notifsForm.vosLay,
| |
| notifsForm.vosselLay,
| |
| notifsForm.tmsLay,
| |
| notifsForm.tmsselLay,
| |
| notifsForm.pofLay,
| |
| notifsForm.pofselLay,
| |
| notifsForm.eteventsLay,
| |
| notifsForm.voragoLay,
| |
| notifsForm.araxxorLay,
| |
| notifsForm.rotsLay,
| |
| notifsForm.mg_spotlightLay,
| |
| notifsForm.ed_spotlightLay,
| |
| notifsForm.dd_spotlightLay
| |
| ]);
| |
| | |
| var $notifoverlay = $('<div>').addClass('notifs-overlay');
| |
| $notifoverlay.click( function () {
| |
| $('.gsw-events-popup .events-notifs').addClass('slideout');
| |
| setTimeout( function () {
| |
| $('.gsw-events-popup .events-notifs').removeClass('slideout').addClass('oo-ui-element-hidden');
| |
| }, 500);
| |
| });
| |
| | |
| // Complete form
| |
| notifsForm.$form = $('<div>')
| |
| .addClass('events-notifs oo-ui-element-hidden')
| |
| .append(
| |
| $notifoverlay,
| |
| $('<div>')
| |
| .addClass('notifs-container')
| |
| .append(
| |
| notifsForm.back.$element,
| |
| notifsForm.$title,
| |
| notifsForm.form.$element
| |
| )
| |
| );
| |
| },
| |
| | |
| /**
| |
| * Updates all events dropdown values (used on opening)
| |
| * @return {undefined}
| |
| */
| |
| updateAll: function () {
| |
| var now = moment.utc();
| |
| $content.find('.cur-utc-time')
| |
| .attr({ 'title':now.format('HH:mm D/M/Y'), 'datetime':now.format() })
| |
| .text(now.format('HH:mm') + ' (UTC)');
| |
| self.updateTimes();
| |
| self.updateSpots();
| |
| if ( now.isAfter(moment(self.nextvos)) ) {
| |
| self.updateVos();
| |
| } else {
| |
| self.updateVostime();
| |
| }
| |
| },
| |
| | |
| /**
| |
| * Continuously updates the values in Events dropdown
| |
| * @return {undefined}
| |
| */
| |
| update: function () {
| |
| self.updateTimes();
| |
| | |
| // Current UTC time
| |
| var now = moment.utc();
| |
| | |
| $content.find('.cur-utc-time')
| |
| .attr({ 'title':now.format('HH:mm D/M/Y'), 'datetime':now.format() })
| |
| .text(now.format('HH:mm') + ' (UTC)');
| |
| | |
| // Check if it's after a new hour, update VoS
| |
| if ( now.isAfter(moment(self.nextvos)) ) {
| |
| self.updateVos();
| |
| } else {
| |
| self.updateVostime();
| |
| }
| |
| | |
| // Check if it's after a new day, update PVM etc
| |
| if ( now.isBetween(moment(now).startOf('day'), moment(now).startOf('day').add(1, 'minutes'), null, '[]') ) {
| |
| self.updateSpots();
| |
| }
| |
| },
| |
| | |
| /**
| |
| * Update time based events in the Events popup
| |
| * Dailies, Resets, Events team events
| |
| * @return {[type]} [description]
| |
| */
| |
| updateTimes: function () {
| |
| // Current UTC time
| |
| var now = moment.utc();
| |
| | |
| // Dailies
| |
| $content.find('.daily-list').empty();
| |
| var dailies_array = [];
| |
| simple_dailies.forEach( function (dd) {
| |
| var next = moment(now).startOf(dd.from).add((dd.offset), 'minutes'),
| |
| nextEnd = moment(next).add(dd.length, 'minutes');
| |
| while (!now.isBefore(nextEnd)) {
| |
| next.add(dd.repeat, 'minutes');
| |
| nextEnd.add(dd.repeat, 'minutes');
| |
| }
| |
| var time_till = 'now!',
| |
| diff_secs = 0,
| |
| title = 'Going on now',
| |
| future = moment(next).add(dd.repeat, 'minutes'),
| |
| ntxt = future.fromNow(true),
| |
| ntitle = future.format('HH:mm') + ' game time, on ' + future.format('MMM D');
| |
| if (now.isBefore(next)) {
| |
| time_till = next.fromNow(true);
| |
| title = next.format('HH:mm') + ' game time, on ' + next.format('MMM D');
| |
| diff_secs = next.diff(now, 'seconds');
| |
| }
| |
| dailies_array.push( {name:dd.name, link:dd.link, txt:time_till, title:title, sort:diff_secs, time:next.format(), ntxt:ntxt, ntime:future.format(), ntitle:ntitle} );
| |
| });
| |
| // Sort Dailies
| |
| if ( self.settings.daily_sort == 'by time') {
| |
| dailies_array.sort( function (a,b) {
| |
| return a.sort - b.sort;
| |
| });
| |
| } else {
| |
| dailies_array.sort( function (a,b) {
| |
| if (a.name < b.name) {
| |
| return -1;
| |
| } else if (a.name > b.name) {
| |
| return 1;
| |
| } else {
| |
| return 0;
| |
| }
| |
| });
| |
| }
| |
| // Print Dailies
| |
| dailies_array.forEach( function (dd) {
| |
| var ddClass = 'daily';
| |
| if (dd.sort === 0) { ddClass += ' now'; }
| |
| $content.find('.daily-list').append(
| |
| $('<li>')
| |
| .addClass(ddClass)
| |
| .append(
| |
| $('<label>').addClass('daily-title').html('<a href="'+dd.link+'" title="'+dd.name+'">'+dd.name+'</a>'),
| |
| $('<time>').addClass('daily-timer').attr({'datetime':dd.time, 'title':dd.title}).text(dd.txt),
| |
| $('<time>').addClass('daily-next').attr({'datetime':dd.ntime, 'title':dd.ntitle}).text(dd.ntxt)
| |
| )
| |
| );
| |
| });
| |
| | |
| // Update resets
| |
| moment.relativeTimeThreshold('d', 31);
| |
| moment.relativeTimeThreshold('h', 24);
| |
| var dailyReset = moment(now).add(1, 'days').startOf('day'),
| |
| dailyTitle = dailyReset.format('MMM D') + ' at ' + dailyReset.format('HH:mm') + ' game time',
| |
| monthlyReset = moment(now).add(1, 'months').startOf('month'),
| |
| monthlyTitle = monthlyReset.format('MMM D') + ' at ' + monthlyReset.format('HH:mm') + ' game time',
| |
| weeklyReset = moment(now).day(3).startOf('day'); // reset is a wednesday
| |
| if (now.isAfter(weeklyReset)) {
| |
| weeklyReset.add(1, 'week');
| |
| }
| |
| var weeklyTitle = weeklyReset.format('MMM D') + ' at ' + weeklyReset.format('HH:mm') + ' game time';
| |
| $content.find('.countdown-day').attr({'datetime':dailyReset.format(), 'title':dailyTitle }).text( dailyReset.fromNow(true) );
| |
| $content.find('.countdown-week').attr({'datetime':weeklyReset.format(), 'title':weeklyTitle }).text( weeklyReset.fromNow(true) );
| |
| $content.find('.countdown-month').attr({'datetime':monthlyReset.format(), 'title':monthlyTitle }).text( monthlyReset.fromNow(true) );
| |
| moment.relativeTimeThreshold('h', 22);
| |
| moment.relativeTimeThreshold('d', 26);
| |
| | |
| // Events team events
| |
| $content.find('.events-team').empty();
| |
| if (self.settings.et_events) {
| |
| $content.find('.events-team').append(
| |
| $('<h3>').html('<a href="GSWiki:Events_Team" title="Events Team events">Events Team</a>'),
| |
| $('<ul>')
| |
| .addClass('events-list etevents-list')
| |
| .append(
| |
| $('<li>').text('No upcoming events')
| |
| )
| |
| );
| |
| var events_array = [];
| |
| et_events.forEach( function (e) {
| |
| var emom = moment(e.date).utc(),
| |
| time = emom.fromNow(true),
| |
| sort = emom.diff(now, 'seconds'),
| |
| dtime = emom.format(),
| |
| title = emom.format('MMM D') + ' at ' + emom.format('HH:mm') + ' game time';
| |
| if (sort >= 0) {
| |
| if (sort < (e.length * 60)) {
| |
| sort = 0;
| |
| time = 'now!';
| |
| }
| |
| events_array.push( {name:e.name, txt:time, sort:sort, dtime:dtime, title:title} );
| |
| } else if (sort > -(e.length * 60)) {
| |
| sort = 0;
| |
| time = 'now!';
| |
| events_array.push( {name:e.name, txt:time, sort:sort, dtime:dtime, title:title} );
| |
| }
| |
| });
| |
| // Sort and trim
| |
| events_array.sort( function (a,b) {
| |
| return a.sort - b.sort;
| |
| });
| |
| if (self.settings.num_events > 0) {
| |
| events_array = events_array.slice(0,self.settings.num_events);
| |
| }
| |
| // Print Events
| |
| if (events_array.length > 0) {
| |
| $content.find('.etevents-list').empty();
| |
| events_array.forEach( function (e) {
| |
| var eClass = 'event';
| |
| if (e.sort === 0) { eClass += ' now'; }
| |
| $content.find('.etevents-list').append(
| |
| $('<li>')
| |
| .addClass(eClass)
| |
| .append(
| |
| $('<label>').addClass('event-title').text(e.name),
| |
| $('<time>').addClass('event-timer').attr({ 'datetime':e.dtime, 'title':e.title }).text(e.txt)
| |
| )
| |
| );
| |
| });
| |
| }
| |
| }
| |
| },
| |
| | |
| /**
| |
| * Update the Voice of Seren values in the Events popup
| |
| * @return {undefined}
| |
| */
| |
| updateVos: function () {
| |
| // Current UTC time
| |
| var now = moment.utc();
| |
| | |
| // Error updating VoS
| |
| var vosError = function (jqXHR, status, error) {
| |
| console.warn('Error loading VoS:\n' + status + ': ' + error);
| |
| $content.find('.VoS-time').empty().append('There was an error loading the Voice of Seren. Please try again later.<br/>If this issue persists, please <a href="/w/RS:AR">contact an administrator</a>.');
| |
| $content.find('.VoS-container').empty();
| |
| $content.find('.VoS-last').empty().append('not found');
| |
| };
| |
| // Update Voice of Seren (VoS)
| |
| var vosSucc = function (vosjson, status, jqXHR) {
| |
| mw.log(vosjson);
| |
| if (!(vosjson.data && vosjson.data[0] && vosjson.data[0].districts)) {
| |
| vosError({}, 'Missing districts', 'returned json did not contain a districts array');
| |
| return;
| |
| }
| |
| | |
| var voschng = moment(now).add(1, 'hours').startOf('hour'),
| |
| chngtitle = voschng.format('MMM D') + ' at ' + voschng.format('HH:mm') + ' game time',
| |
| currvos = vosjson.data[0].districts,
| |
| lastvos = vosjson.data[1].districts;
| |
|
| |
| $content.find('.VoS-time').empty().append(
| |
| $('<time>').addClass('time').attr({ 'datetime':voschng.format(), 'title':chngtitle }).text(voschng.fromNow(true)),
| |
| ' until new districts are active.'
| |
| );
| |
| $content.find('.VoS-container').empty().append(
| |
| $('<div>').addClass('event-box VoS-district').append(
| |
| $('<div>').addClass('VoS-image VoS-'+currvos[0]),
| |
| $('<div>').addClass('VoS-text').append(
| |
| $('<span>').addClass('by-line').attr('title', voslocs[currvos[0]][1]).text(voslocs[currvos[0]][0]),
| |
| $('<label>').addClass('event-name').html('<a href="/w/' + currvos[0] + '_Clan" title="' + currvos[0] + ' Clan">' + currvos[0] + '</a>')
| |
| )
| |
| ),
| |
| $('<div>').addClass('event-box VoS-district').append(
| |
| $('<div>').addClass('VoS-image VoS-'+currvos[1]),
| |
| $('<div>').addClass('VoS-text').append(
| |
| $('<span>').addClass('by-line').attr('title', voslocs[currvos[1]][1]).text(voslocs[currvos[1]][0]),
| |
| $('<label>').addClass('event-name').html('<a href="/w/' + currvos[1] + '_Clan" title="' + currvos[1] + ' Clan">' + currvos[1] + '</a>')
| |
| )
| |
| )
| |
| );
| |
| | |
| $content.find('.VoS-last').empty();
| |
| $content.find('.VoS-last').append(lastvos[0] + ', ' + lastvos[1]);
| |
| | |
| // Set time for next check
| |
| self.nextvos = moment(now).startOf('hour').add(61, 'minutes').format();
| |
| };
| |
| | |
| // Make api Call
| |
| $content.find('.VoS-time').empty().append('Loading current VoS...');
| |
| $content.find('.VoS-container').empty();
| |
| $content.find('.VoS-last').empty().append('Loading last VoS...');
| |
| $.ajax({
| |
| dataType: 'json',
| |
| url: vosurl,
| |
| error: vosError,
| |
| success: vosSucc
| |
| });
| |
| },
| |
| | |
| /**
| |
| * Update the Voice of Seren time display only
| |
| * @return {undefined}
| |
| */
| |
| updateVostime: function () {
| |
| // Next change
| |
| var voschng = moment.utc().add(1, 'hours').startOf('hour'),
| |
| chngtitle = voschng.format('MMM D') + ' at ' + voschng.format('HH:mm') + ' game time';
| |
| // Update time display
| |
| $content.find('.VoS-time').empty().append(
| |
| $('<time>').addClass('time').attr({ 'datetime':voschng.format(), 'title':chngtitle }).text(voschng.fromNow(true)),
| |
| ' until new districts are active.'
| |
| );
| |
| },
| |
| | |
| /**
| |
| * Updates the values that are per day in the Events popup
| |
| * Raven, spotlights (D&D, ED, MiniGame), PVM, Travelling Merchant
| |
| * @return {undefined}
| |
| */
| |
| updateSpots: function () {
| |
| // Current UTC time
| |
| var now = moment.utc();
| |
| | |
| // Update raven
| |
| $content.find('.raven').empty();
| |
| if (self.settings.raven) {
| |
| var $raven = $('<div>').addClass('raven-status by-line now').text('There is a raven currently spawned in Prifddinas.'),
| |
| days_passed = -( moment('0', 'X').utc().add(6, 'days').diff(now, 'days') ),
| |
| days_into = days_passed % 13;
| |
| | |
| if (days_into > 0) {
| |
| var when = moment(now).add((13 - days_into), 'days').startOf('day'),
| |
| whenttl = when.format('MMM D') + ' at ' + when.format('HH:mm') + ' game time';
| |
| $raven = $('<div>').addClass('raven-status by-line').append(
| |
| $('<time>').addClass('time').attr({ 'datetime':when.format(), 'title':whenttl }).text( when.fromNow(true) ),
| |
| ' until the raven spawns in Prifddinas.'
| |
| );
| |
| }
| |
| | |
| $content.find('.raven').append(
| |
| $('<h3>').html('<a href="/w/Raven_(Prifddinas)" title="Prifddinas Raven">Raven</a>'),
| |
| $raven
| |
| );
| |
| }
| |
| | |
| // Travelling Merchant Stock
| |
| var tmsimg = function (item) {
| |
| if (item == 'uim') {
| |
| return '<a href="/w/Uncharted_island_map_(Deep_Sea_Fishing)" title="Uncharted island map (Deep Sea Fishing)"><img alt="Uncharted island map (Deep Sea Fishing).png" src="/images/0/0d/Uncharted_island_map_%28Deep_Sea_Fishing%29.png?93a55"></a>';
| |
| } else if (item == 'Silverhawk down') {
| |
| return '<a href="/w/' + item + '" title="' + item + '"><img alt="' + item +' 5.png" src="' + rs.getFileURL(item + ' 5.png') + '?1234"></a>';
| |
| } else {
| |
| return '<a href="/w/' + item + '" title="' + item + '"><img alt="' + item +'.png" src="' + rs.getFileURL(item + '.png') + '?1234"></a>';
| |
| }
| |
| };
| |
| $content.find('.tms-pof .tms').remove();
| |
| if (self.settings.merch) {
| |
| var $tms = $('<div>').addClass('tms');
| |
| // Stock for today and tomorrow
| |
| $tms.append(
| |
| $('<h3>').html('<a href="/w/Travelling_Merchant\'s_Shop" title="Travelling Merchant\'s Shop">Travelling Merchant\'s Shop</a>'),
| |
| $('<div>').addClass('tms-pof-cols').append(
| |
| $('<div>').addClass('tms-today').append(
| |
| $('<div>').addClass('by-line').text('Today\'s stock'),
| |
| $('<div>').addClass('event-boxes inventory-image').append(
| |
| $('<div>')
| |
| .addClass('event-box')
| |
| .html( tmsimg('uim') )
| |
| )
| |
| ),
| |
| $('<div>').addClass('tms-tomorrow').append(
| |
| $('<div>').addClass('by-line').text('Tomorrow\'s stock'),
| |
| $('<div>').addClass('event-boxes inventory-image').append(
| |
| $('<div>')
| |
| .addClass('event-box')
| |
| .html( tmsimg('uim') )
| |
| )
| |
| )
| |
| )
| |
| );
| |
| merchstock.tod.forEach( function (i) {
| |
| var name = i.name.replace(/&/g, '&');
| |
| $tms.find('.tms-today .event-boxes').append(
| |
| $('<div>')
| |
| .addClass('event-box')
| |
| .html( tmsimg(name) )
| |
| );
| |
| });
| |
| merchstock.tmr.forEach( function (i) {
| |
| var name = i.name.replace(/&/g, '&');
| |
| $tms.find('.tms-tomorrow .event-boxes').append(
| |
| $('<div>')
| |
| .addClass('event-box')
| |
| .html( tmsimg(name) )
| |
| );
| |
| });
| |
| if (self.settings.farm) {
| |
| $tms.addClass('col col-l');
| |
| $content.find('.tms-pof').addClass('usecols');
| |
| } else {
| |
| $tms.find('.tms-pof-cols').addClass('usecols');
| |
| $content.find('.tms-pof').removeClass('usecols');
| |
| }
| |
| $content.find('.tms-pof').append(
| |
| $tms
| |
| );
| |
| }
| |
| | |
| /**
| |
| * Gets the current spotlight item, the next one, and time till next
| |
| * @param {Array.<string>} items Array of the possible spotlights in the correct order
| |
| * @param {number} duration Duration in days of a spotlight item
| |
| * @param {number} offset Offset from 0 Unix time that rotation started in days
| |
| * @return {Array.<string>} An array containing the current item, time till next, and next item
| |
| */
| |
| var spotlights = function (items, duration, offset) {
| |
| // Start rotation from Tuesday 1 January 1970, with an offset
| |
| var days_passed = -( moment('0', 'X').utc().add(offset, 'days').diff(now, 'days') ),
| |
| days_into = days_passed % (duration * items.length),
| |
| rotation = Math.floor(days_into / duration),
| |
| days_till = duration - (days_into % duration),
| |
| when = moment(now).add(days_till, 'days').startOf('day'),
| |
| whenttl = when.format('MMM D') + ' at ' + when.format('HH:mm') + ' game time',
| |
| next = rotation + 1;
| |
| if (next >= items.length) {
| |
| next -= items.length;
| |
| }
| |
| mw.log(items);
| |
| mw.log(days_into);
| |
| mw.log(rotation);
| |
| mw.log(items[rotation]);
| |
| mw.log(days_till);
| |
| mw.log(when.format());
| |
| mw.log(when.fromNow(true));
| |
| mw.log(items[next]);
| |
| return [items[rotation], when.fromNow(true), items[next], when.format(), whenttl];
| |
| };
| |
| | |
| // Player-owned farm
| |
| $content.find('.tms-pof .pof').remove();
| |
| if (self.settings.farm) {
| |
| var small = moment(now).add(1, 'days').startOf('day'),
| |
| smallttl = small.format('MMM D') + ' at ' + small.format('HH:mm') + ' game time',
| |
| med_array = spotlights(['med'], 2, 1),
| |
| large_array = spotlights(['large'], 3, 0),
| |
| medr_array = spotlights(['med'], 3, 0),
| |
| hardreq = moment(now).day(3).startOf('day');
| |
| if (now.isAfter(hardreq)) {
| |
| hardreq.add(1, 'week');
| |
| }
| |
| var hardreqttl = hardreq.format('MMM D') + ' at ' + hardreq.format('HH:mm') + ' game time';
| |
| var $pof = $('<div>').addClass('pof').append(
| |
| $('<h3>').html('<a href="/w/Player-owned_farm" title="Player-owned farm">Player-owned farm</a>'),
| |
| $('<div>').addClass('tms-pof-cols').append(
| |
| $('<div>').addClass('buyers').append(
| |
| $('<div>').addClass('by-line').text('Animal buyers'),
| |
| $('<div>').addClass('event-boxes').append(
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Small'),
| |
| $('<time>').addClass('event-name').attr({'datetime':small.format(), 'title':smallttl}).text( small.fromNow(true) )
| |
| ),
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Medium'),
| |
| $('<time>').addClass('event-name').attr({'datetime':med_array[3], 'title':med_array[4]}).text( med_array[1] )
| |
| ),
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Large'),
| |
| $('<time>').addClass('event-name').attr({'datetime':large_array[3], 'title':large_array[4]}).text( large_array[1] )
| |
| )
| |
| )
| |
| ),
| |
| $('<div>').addClass('requests').append(
| |
| $('<div>').addClass('by-line').text('Requests'),
| |
| $('<div>').addClass('event-boxes').append(
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Easy'),
| |
| $('<time>').addClass('event-name').attr({'datetime':small.format(), 'title':smallttl}).text( small.fromNow(true) )
| |
| ),
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Medium'),
| |
| $('<time>').addClass('event-name').attr({'datetime':medr_array[3], 'title':medr_array[4]}).text( medr_array[1] )
| |
| ),
| |
| $('<div>').addClass('event-box').append(
| |
| $('<label>').addClass('by-line').text('Hard'),
| |
| $('<time>').addClass('event-name').attr({'datetime':hardreq.format(), 'title':hardreqttl}).text( hardreq.fromNow(true) )
| |
| )
| |
| )
| |
| )
| |
| )
| |
| );
| |
| | |
| if (self.settings.merch) {
| |
| $pof.addClass('col col-r');
| |
| $content.find('.tms-pof').addClass('usecols');
| |
| } else {
| |
| $pof.find('.tms-pof-cols').addClass('usecols');
| |
| $content.find('.tms-pof').removeClass('usecols');
| |
| }
| |
| $content.find('.tms-pof').append( $pof );
| |
| }
| |
| | |
| // PvM
| |
| $content.find('.pvm').empty();
| |
| if (self.settings.pvm) {
| |
| var $vorago = $('<div>').addClass('pvm-value vorago-value'),
| |
| $araxxor = $('<div>').addClass('pvm-value araxxor-value'),
| |
| $rots = $('<div>').addClass('pvm-value rots-value');
| |
| | |
| mw.loader.using(['ext.gadget.gsw-util', 'moment', 'mediawiki.api', 'mediawiki.api.messages'], function () {
| |
| $(self.init);
| |
| });
| |
| | |
| // Vorago
| |
| var vorago_array = spotlights( vorago_rotations, 7, 48),
| |
| hm = vorago_hm[vorago_array[0]];
| |
| $vorago.append(
| |
| $('<time>').attr({ 'datetime':vorago_array[3], 'title':vorago_array[4] }).text(vorago_array[1]).addClass('by-line'),
| |
| $('<label>').text(' until next attack rotation.').addClass('by-line'),
| |
| $('<div>').addClass('event-boxes').append(
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[0]) ),
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[1]) ),
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[2]) )
| |
| ),
| |
| $('<div>').addClass('event-boxes').append(
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[3]) ),
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[4]) ),
| |
| $('<div>').addClass('event-box').append( $('<div>').text(vorago_rotations[5]) )
| |
| ),
| |
| $('<ul>')
| |
| .addClass('events-list')
| |
| .append(
| |
| $('<li>').append(
| |
| $('<label>').html('Phase 10'),
| |
| $('<span>').html(hm.pathTen)
| |
| ),
| |
| $('<li>').append(
| |
| $('<label>').html('Phase 11'),
| |
| $('<span>').html(hm.pathElev)
| |
| ),
| |
| $('<li>').append(
| |
| $('<label>').text('Outfit of Omens unlock'),
| |
| $('<span>').text(hm.unlock)
| |
| )
| |
| )
| |
| );
| |
| $vorago.find(".event-box div:contains('" + vorago_array[0] + "')").parent().addClass('now');
| |
| if (self.settings.show_next) {
| |
| $vorago.find('ul').append(
| |
| $('<li>').append(
| |
| $('<label>').addClass('sl-next-label').text('Next'),
| |
| $('<span>').addClass('sl-next').text(vorago_array[2])
| |
| )
| |
| );
| |
| }
| |
| | |
| | |
| }(jQuery, mediaWiki, gswiki));
| |
| //</nowiki>
| |