ميدياويكى:Gadget-Userinfo.js
ملحوظه: بعد التسييف، ممكن تحتاج تفضى كاش البراوزر بتاعك عشان تشوف التغييرات اللى عملتها، بالطريقه دى:
- فايرفوكس وسفارى: دوس ⇧ Shift مع Reload او Ctrl-F5 او Ctrl-R (اللى هو: Command-R على ماكنتوش)
- جوجل كروم: دوس Ctrl-Shift-R (اللى هو: Command-Shift-R على ماكنتوش)
- انترنت اكسبلورر: دوس Ctrl مع Refresh فى نفس الوقت، او Ctrl-F5
- كونكرر: دوس Reload او F5
- اوبرا: فضى الكاش من Tools → Preferences
// Gadget-userinfo
function UserinfoJsFormatQty(qty,singular,plural){
return String(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,") + "\u00a0" + (qty == 1 ? singular : plural);
}
function getDeletedContribs(user){
var contribs = 0;
$.ajax({
type:'GET',
url:'https://xtools.wmcloud.org/api/user/simple_editcount/arz.wikipedia/'+user+'/0',
data:'',
async:false,
dataType:'json',
success:function(data){
contribs=data.deleted_edit_count;
},
});
return contribs;
}
function UserinfoJsFormatDateRel(old){
var age = new Date().getTime() - old.getTime();
var ageNumber,ageRemainder,ageWords;
if(age < 60000){// less than one minute old
ageNumber = Math.floor(age / 1000);
ageWords = UserinfoJsFormatQty(ageNumber, "ثانيه", "ثوانى");
} else if(age < 3600000){// less than one hour old
ageNumber = Math.floor(age / 60000);
ageWords = UserinfoJsFormatQty(ageNumber, "دقيقه", "دقايق");
} else if(age < 86400000){// less than one day old
ageNumber = Math.floor(age / 3600000);
ageWords = UserinfoJsFormatQty(ageNumber, "ساعه", "ساعات");
ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);
} else if(age < 604800000){ // less than one week old
ageNumber = Math.floor(age / 86400000);
ageWords = UserinfoJsFormatQty(ageNumber, "يوم", "ايام");
} else if(age < 2592000000){ // less than one month old
ageNumber = Math.floor(age / 604800000);
ageWords = UserinfoJsFormatQty(ageNumber,"اسبوع","اسابيع");
} else if(age < 31536000000){ // less than one year old
ageNumber = Math.floor(age / 2592000000);
ageWords = UserinfoJsFormatQty(ageNumber,"شهر","شهور");
} else{ // one year or older
ageNumber = Math.floor(age / 31536000000);
ageWords=UserinfoJsFormatQty(ageNumber,"سنه","سنين");
ageRemainder=Math.floor((age - ageNumber * 31536000000) / 2592000000);
if(ageRemainder){ageWords += " " + UserinfoJsFormatQty(ageRemainder, "شهر", "شهور");}
}
return ageWords;
}
// If on a user or user talk page, and not a subpage.
if((mw.config.get("wgNamespaceNumber")== 2 || mw.config.get("wgNamespaceNumber") == 3) && !(/\//.test(mw.config.get("wgTitle")))){
mw.loader.using(['mediawiki.util'],function(){$(function(){// add a hook
var et = encodeURIComponent(mw.config.get("wgTitle"));// Request the user's information from the API.
$.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers="+et+"&ucuser="+et+"&meta=allmessages&amfilter=grouppage")
.done(function(query) {
if(!query.query){return;} // Avoid JS errors
query = query.query;
var user, invalid, missing, groups, groupPages={}, editcount, registration, blocked, gender, lastEdited;
try{
user = query.users[0];
invalid = typeof user.invalid != "undefined";
missing = typeof user.missing != "undefined";
groups = (typeof user.groups == "object") ? user.groups : [];
editcount = (typeof user.editcount == "number") ? user.editcount : null;
registration = (typeof user.registration == "string") ?
new Date(user.registration) : null;
blocked = typeof user.blockedby != "undefined";
gender = (typeof user.gender == "string") ? user.gender : null;
lastEdited = (typeof query.usercontribs[0] == "object") &&
(typeof query.usercontribs[0].timestamp == "string") ?
new Date(query.usercontribs[0].timestamp) : null;
for (var am=0; am<query.allmessages.length; am++) {
groupPages[query.allmessages[am]["name"].replace("grouppage-","")] = query.allmessages[am]["*"].replace("{{ns:project}}:","Project:");
}
}catch(e){return; // Not much to do if the server is returning an error (e.g. if the username is malformed).
}
var statusText=""; var ipUser=false; var ipv4User=false; var ipv6User=false;
if(blocked) {// User status
statusText += "<a href=\""+mw.config.get("wgScriptPath")+"/index.php?title=Special:Log&page="+ encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2]+":"+user.name)+"&type=block\">الممنوعين و</a>";
$("#firstHeading").append("<div style='display: inline;color:red;font-weight:900;'>(حساب ممنوع)</div>");
}
if (missing){
statusText+= "اسماء مش متسجله";
} else if(invalid){
ipv4User=mw.util.isIPv4Address(user.name);
ipv6User=mw.util.isIPv6Address(user.name);
ipUser=ipv4User || ipv6User;
if (ipv4User){statusText += "anonymous IPv4 user";
}else if (ipv6User){statusText+="anonymous IPv6 user";
}else{statusText += "invalid username";
}
} else {
var friendlyGroupNames = {
'*': false,
'user': false,
'checkuser':"مدققين المستخدم",
'bureaucrat':"البيروقراطيين",
'autoconfirmed': false,
sysop:"الإداريين",
editor:"المحررين",
'autopatrol':"المراجعين التلقائيين",
accountcreator:"منشئى الحسابات",
"import":"المستوردين",
transwiki:"المستوردين عبر الويكى",
"ipblock-exempt":"المستثنين من المنع",
oversight:"النظار",
"bot":"البوتات",
"registered user":"المسجلين",
"patroller":"المراجعين",
"reviewer":"المراجعين",
"rollbacker":"المسترجعين",
confirmed:"المؤكدين",
abusefilter:"معدلى مرشح الإساءة",
"autoreview":"المراجعين التلقائيين",
"epcoordinator":"منسقى المقرر",
"eponline":"سفراء الوب",
"epcampus":"سفراء الجامعه",
"epinstructor":"مدرسى المقرر",
"uploader":"رافعى الملفات",
"interface-admin":"إداريى الواجهه",
"flow-bot":"بوتات النقاشات الهيكليه"
};
var friendlyGroups=[];
for(var i = 0; i < groups.length; ++i){
var s = groups[i];
if(friendlyGroupNames.hasOwnProperty(s)){
if(friendlyGroupNames[s]){friendlyGroups.push("<a href='/wiki/"+encodeURIComponent( groupPages[s] ) + "'>"+friendlyGroupNames[s]+"</a>");}
}else{
friendlyGroups.push("<a href='/wiki/"+encodeURIComponent(groupPages[s])+"'>"+s+"</a>");
}
}
switch(friendlyGroups.length) {
case 0:
if(blocked){statusText+="مستخدم";
}else{statusText+="المسجلين";} break;
case 1:
statusText+=friendlyGroups[0]; break;
case 2:
statusText += friendlyGroups[0]+" و"+friendlyGroups[1]; break;
default:
statusText += friendlyGroups.slice(0, -1).join(" و")+" و"+friendlyGroups[friendlyGroups.length - 1]; break;
}
}
if(registration){
statusText+=", و التسجيل كان من "+"<a href='"+mw.config.get("wgScriptPath")+"/index.php?title=Special:ListUsers&limit=1&username="+et+"'>"+UserinfoJsFormatDateRel(registration)+"</a>";
}
if(editcount !== null){ // Edit count
statusText+=", و عدد التعديلات "+"<a href=\"//tools.wmflabs.org/xtools-ec/?user="+encodeURIComponent(user.name)+"&project=arz.wikipedia.org&uselang=arz\">"+
UserinfoJsFormatQty(editcount,"","")+"</a> <span style='color:#bf360c;font-weight:900;font-size:9pt!important'>محذوف ("+getDeletedContribs(encodeURIComponent(user.name))+")</span>";
}
if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1))>= 0){// Prefix status text with correct article
statusText="من "+statusText;
}else{
statusText="من "+statusText;
}
statusText+=".";// Add full stop to status text
if(lastEdited){
statusText+=" آخر تعديل من <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Special:Contributions/"+encodeURIComponent(user.name))+"\">"+UserinfoJsFormatDateRel(lastEdited)+"</a>.";
}
// Show the correct gender symbol
var fh = document.getElementById("firstHeading")||document.getElementById("section-0");
// Add classes for blocked, registered, and anonymous users
var newClasses=[];
if(blocked){newClasses.push("ps-blocked");}
if(ipUser){newClasses.push("ps-anonymous");
}else if(invalid){newClasses.push("ps-invalid");
}else{newClasses.push("ps-registered");}
fh.className+=(fh.className.length ? " ":"")+groups.map(function(s){
return "ps-group-"+s;
}).concat(newClasses).join(" ");
var genderSpan=document.createElement("span");
genderSpan.id="ps-gender-"+(gender || "unknown");
genderSpan.style.paddingLeft="0.25em";
genderSpan.style.fontWeight="bold";
genderSpan.style.fontFamily='"Tahoma", "sans-serif"';
genderSpan.style.fontSize="75%";
var genderSymbol;
switch(gender) {
case "male": genderSymbol="\u2642"; break;
case "female": genderSymbol="\u2640"; break;
default: genderSymbol="";break;
}
genderSpan.appendChild(document.createTextNode(genderSymbol));
fh.appendChild(genderSpan);
var ss=document.getElementById("siteSub");
if(!ss){
ss=document.createElement("div");
ss.id="siteSub";
ss.innerHTML="";
var bc=document.getElementById("bodyContent");
bc.insertBefore(ss,bc.firstChild);
}
ss.innerHTML='<span id="ps-userinfo" style="font-size:10pt;padding:5px;">'+statusText+'</span> ';
ss.style.display="block";
ss.style.paddingBottom="5px";
ss.style.border="1px dotted #eeeeee";
ss.style.background="#fafafa";
});
}); });
}
// End Gadget-userinfo -------------------------------------------------------