מדיה ויקי:Gadget-checkVoteRights.js
קפיצה לניווט
קפיצה לחיפוש
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload), או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh), או ללחוץ על צירוף המקשים Ctrl-F5.
- אופרה: ללחוץ על Ctrl-F5.
/** * סקריפט לבדיקת זכות הצבעה בדפי משתמש ובדפי הצבעה * נכתב על ידי קובי כרמל * version: 1.4 **/ 'use strict'; function checkVoteRight(){ var self = this, namespaceNumber = mw.config.get('wgNamespaceNumber'); /** VARIABLES **/ this.datetime = new Date(); // Date datetime details this.heMonths = ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר']; // Object Array Hebrew months this.result = ''; // jQuery DOM Object this.user = ''; // String username this.voteStart = $('li:contains(תאריך תחילת ההצבעה)'); // jQuery DOM Object for vote pages /** METHODS **/ Date.prototype.toMwDate = function(){ // converting to mw timestamp var format = self.format; return this.getFullYear() + format(this.getMonth() + 1) + format(this.getDate()) + format(this.getHours()) + format(this.getMinutes()) + '00'; } this.addLink = function(){ self.dpInit(); var pl = mw.util.addPortletLink('p-tb', null, 'בדיקת זכות הצבעה', 't-checkvoterights') $(pl).click(function(e) { e.preventDefault(); self.buildCvrPicker(); }); } this.buildCvrPicker = function(){ if($('#cvr-dialog').length) return self.fillTime(), $('#cvr-dialog').show(); var content = [ $('<span>', {id: 'cvr-before'}), $('<span>', {id: 'cvr-after'}), $('<div>', {id: 'cvr-titlebar'}).append( 'בחר תאריך ושעה:', $('<span>', {id: 'cvr-close', 'class': 'ui-icon ui-icon-closethick', title: 'סגירה'}).click(function(){ $('#cvr-dialog').remove() }) ), $('<div>', {'class': 'cvr-row'}).append( $('<label>').text('תאריך:'), $('<input>', {'class': 'cvr-date'}).attr('maxlength', 10) ), $('<div>', {'class': 'cvr-row'}).append( $('<label>').text('שעה:'), $('<select>', {id: 'cvr-hour'}), $('<select>', {id: 'cvr-minute'}) ), $('<div>', {id: 'cvr-result'}), $('<div>', {id: 'cvr-exec'}).html( $('<button>') .text('בדיקה') .click(function(){ if(namespaceNumber == 1 || namespaceNumber == 4){ // not a user (talk) page self.buildForVote(); $('#cvr-dialog').hide(); } else self.checkOne(); }) ) ]; $('body').append($('<div>', {id: 'cvr-dialog'}).append(content)); $('#cvr-dialog').css({ top: $('#t-checkvoterights').offset().top - 37.5, left: $('#content').outerWidth() - $('#cvr-dialog').outerWidth() }) $('.cvr-date').datepicker(); $('.cvr-date').keypress(function(event){ if(event.which == 8 || event.which == 47) // Backspace or Slash return; var val = this.value; if(val.length == 2 || val.length == 5) this.value += '/'; }); self.fillTime(); } this.buildForVote = function(){ $('.cvr-usersign').remove(); self.links = mw.util.$content.find('a[href^="/wiki/%D7%9E%D7%A9%D7%AA%D7%9E%D7%A9"], a[href^="/w/index.php?title=%D7%9E%D7%A9%D7%AA%D7%9E%D7%A9"]'); self.links.before( $('<span>', {'class': 'cvr-usersign'}).append( ' (', $('<a>') .text('±') .click(function(){ var check = new checkVoteRight(); check.checkInVote($(this)); }), ') ' ) ) } this.check = function(){ self.setDateTime(); if(isNaN(self.datetime)) return self.updateStatus('יש להזין תאריך תקין', 'red'); self.updateStatus('בודק מספר עריכות...', 'orange'); var startDate = new Date(self.datetime); startDate.setDate(startDate.getDate() - 90); var param = { action: 'query', format: 'json', list: 'usercontribs', ucuser: self.user, ucprop: 'timestamp', ucnamespace: '0|6|8|10|12|14|100', ucdir: 'newer', uclimit: 100, ucstart: startDate.toMwDate(), ucend: self.datetime.toMwDate() } $.getJSON('/w/api.php', param, function(res){ var contribs = res.query.usercontribs; if(contribs.length < 100) // no 100 edits return self.updateStatus('נכשל - אין 100 עריכות', 'red'); self.checkSeniority(); }) } this.checkInVote = function(elem){ self.result = elem; self.user = decodeURI(elem.parent().next().attr('href').split(':')[1]).replace(/[?&].*/g, ''); /* get a valid username by avoiding redirects */ var getUser = new mw.Api(); getUser.get( { action: 'query', titles: 'שיחת משתמש:' + self.user, redirects: true } ).done( function ( data ) { self.user = data.query.pages[Object.keys(data.query.pages)[0]]['title'].split(':')[1]; self.check(); } ); } this.checkOne = function(){ self.result = $('#cvr-result'); self.user = mw.config.get( 'wgTitle' ); self.check(); } this.checkSeniority = function(){ self.updateStatus('בודק ותק...', 'orange'); var param = { action: 'query', format: 'json', list: 'usercontribs', ucuser: self.user, ucprop: 'timestamp', ucdir: 'newer', uclimit: 1 } $.getJSON('/w/api.php', param, function(res){ var firstEdit = new Date(res.query.usercontribs[0].timestamp), minSeniority = new Date(self.datetime); minSeniority.setDate(minSeniority.getDate() - 30); if(minSeniority < firstEdit) return self.updateStatus('נכשל - אין 30 ימי ותק', 'red'); self.updateStatus('עבר', 'green'); }); } this.dpInit = function(){ /* Hebrew initialisation for the UI Datepicker extension Written by Amir Hardon (ahardon at gmail dot com). */ $.datepicker.regional['he'] = { closeText: 'סגור', prevText: '<הקודם', nextText: 'הבא>', currentText: 'היום', monthNames: self.heMonths, monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני', 'יולי','אוג','ספט','אוק','נוב','דצמ'], dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], weekHeader: 'Wk', dateFormat: 'dd/mm/yy', firstDay: 0, isRTL: true, showMonthAfterYear: false, yearSuffix: '' }; $.datepicker.setDefaults($.datepicker.regional['he']); } this.fillInVote = function(){ var datetime = self.voteStart.text().split(':').splice(1,3).join(':').split(','), date = $.trim(datetime[1]).split(' '), time = $.trim(datetime[0]).split(':'), format = self.format; $('.cvr-date').val([format(date[0]), format($.inArray(date[1].substr(1), self.heMonths) + 1), date[2]].join('/')); $('#cvr-hour option').each(function(){ this.selected = this.value == time[0]; }) $('#cvr-minute option').each(function(){ this.selected = this.value == time[1]; }) } this.fillTime = function(){ for(var h = 0; h < 24; h++) $('#cvr-hour').append($('<option>').text(self.format(h))); for(var m = 0; m < 60; m++) $('#cvr-minute').append($('<option>').text(self.format(m))); if(namespaceNumber == 4 && self.voteStart.length) // vote page with starting time self.fillInVote(); } this.format = function(str){ var num = '00' + str; return num.substr(num.length - 2); } this.setDateTime = function(){ var date = $('.cvr-date').val().split('/'), datetime = new Date(); datetime.setYear(date[2]); datetime.setMonth(date[1] - 1); datetime.setDate(date[0]); datetime.setHours($('#cvr-hour').val()); datetime.setMinutes($('#cvr-minute').val()); self.datetime = datetime; } this.updateStatus = function(result, color){ self.result .text(result) .css('color', color); } } $(function(){ var namespaceNumber = mw.config.get('wgNamespaceNumber'); if(namespaceNumber >= 1 && namespaceNumber <= 4) mw.loader.using('jquery.ui', function(){ var check = new checkVoteRight(); check.addLink(); }) });