מדיה ויקי:Gadget-checkVoteRights.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
/**
* סקריפט לבדיקת זכות הצבעה בדפי משתמש ובדפי הצבעה
* version: 1.4
**/
'use strict';
function checkVoteRight(checkedUsers){
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.checkedUsers = checkedUsers || [];
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();
if (self && self.checkedUsers) {
self.checkedUsers = [];
}
self.buildCvrPicker();
}).one('click', function() {
if (mw.notification && mw.notification.autoHideSeconds) {
mw.notification.autoHideSeconds.medium = 8;
}
});
};
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>').append('תחילת ההצבעה'),
$('<span>').append(' (UTC)'),
$('<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(self.checkedUsers);
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|828',
ucdir: 'newer',
uclimit: 100,
ucstart: startDate.toMwDate(),
ucend: self.datetime.toMwDate()
};
$.getJSON('/w/api.php', param, function(res){
if (!res || !res.query || !res.query.usercontribs) {
return self.updateStatus('שגיאה בבדיקה – ייתכן שהמשתמש "' + self.user + '" לא נמצא במערכת', 'brown');
}
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];
if (self.checkedUsers && Array.isArray(self.checkedUsers)) {
if (self.checkedUsers.includes(self.user)) {
mw.notify($('<div>').html('לתשומת ליבך: כבר בדקת זכות הצבעה עבור <strong>' + self.user + '</strong>. כדאי לבדוק האם נוספה הצבעה כפולה בשוגג, ולהסיר את הכפילות אם זה אכן המצב.'), {type: 'warn', autoHideSeconds: 'medium'});
} else {
self.checkedUsers.push(self.user);
}
}
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() - 365);
if(minSeniority < firstEdit)
return self.updateStatus('נכשל - אין 365 ימי ותק', '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(':'),
year = Number(date[2]),
month = $.inArray(date[1].substr(1), self.heMonths),
day = Number(date[0]),
hours = Number(time[0]),
minutes = Number(time[1]),
isIdt = date[3] === '(IDT)',
format = self.format;
var dateObj = new Date(year, month, day, hours, minutes);
dateObj -= 1000 * 60 * 60 * (isIdt ? 3 : 2);
dateObj = new Date(dateObj);
year = dateObj.getFullYear().toString();
month = format(dateObj.getMonth() + 1);
day = format(dateObj.getDate());
hours = format(dateObj.getHours());
minutes = format(dateObj.getMinutes());
$('.cvr-date').val(day + '/' + month + '/' + year);
$('#cvr-hour option').each(function(){
this.selected = this.value === hours;
});
$('#cvr-minute option').each(function(){
this.selected = this.value === minutes;
});
};
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]);
if (
datetime.getDate() !== Number(date[0]) ||
datetime.getMonth() !== Number(date[1]) - 1 ||
datetime.getFullYear() !== Number(date[2])
) {
mw.notify('חלה שגיאה בלתי צפויה בפענוח התאריך של תחילת ההצבעה.', {type: 'error'});
self.datetime = NaN;
return;
}
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();
});
});