User:PleaseStand/userinfo.js
Appearance
From Wikipedia, the free encyclopedia
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump.
This code will be executed when previewing this page.
This code will be executed when previewing this page.
This user script seems to have a documentation page at User:PleaseStand/userinfo.
// based on http://en.wikipedia.org/wiki/User:Fran Rogers/dimorphism.js // and on http://en.wikipedia.org/wiki/User:Splarka/sysopdectector.js functionUserinfoJsFormatQty(qty,singular,plural){ returnString(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g,"$&,")+"\u00a0"+(qty==1?singular:plural); } functionUserinfoJsFormatDateRel(old){ // The code below requires the computer's clock to be set correctly. varage=newDate().getTime()-old.getTime(); varageNumber,ageRemainder,ageWords; if(age<60000){ // less than one minute old ageNumber=Math.floor(age/1000); ageWords=UserinfoJsFormatQty(ageNumber,"second","seconds"); }elseif(age<3600000){ // less than one hour old ageNumber=Math.floor(age/60000); ageWords=UserinfoJsFormatQty(ageNumber,"minute","minutes"); }elseif(age<86400000){ // less than one day old ageNumber=Math.floor(age/3600000); ageWords=UserinfoJsFormatQty(ageNumber,"hour","hours"); ageRemainder=Math.floor((age-ageNumber*3600000)/60000); }elseif(age<604800000){ // less than one week old ageNumber=Math.floor(age/86400000); ageWords=UserinfoJsFormatQty(ageNumber,"day","days"); }elseif(age<2592000000){ // less than one month old ageNumber=Math.floor(age/604800000); ageWords=UserinfoJsFormatQty(ageNumber,"week","weeks"); }elseif(age<31536000000){ // less than one year old ageNumber=Math.floor(age/2592000000); ageWords=UserinfoJsFormatQty(ageNumber,"month","months"); }else{ // one year or older ageNumber=Math.floor(age/31536000000); ageWords=UserinfoJsFormatQty(ageNumber,"year","years"); ageRemainder= Math.floor((age-ageNumber*31536000000)/2592000000); if(ageRemainder){ ageWords+=" "+ UserinfoJsFormatQty(ageRemainder,"month","months"); } } returnageWords; } // 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")))){ // add a hook to... mw.loader.using(['mediawiki.util'],function(){$(function(){ // Request the user's information from the API. // Note that this is allowed to be up to 5 minutes old. varet=encodeURIComponent(mw.config.get("wgTitle")); $.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&refix=grouppage-&amincludelocal=1") .done(function(query){ // When response arrives extract the information we need. if(!query.query){return;}// Suggested by Gary King to avoid JS errors --PS 2010年08月25日 query=query.query; varuser,invalid,missing,groups,groupPages={},editcount,registration,blocked,gender,lastEdited; try{ user=query.users[0]; invalid=typeofuser.invalid!="undefined"; missing=typeofuser.missing!="undefined"; groups=(typeofuser.groups=="object")?user.groups:[]; editcount=(typeofuser.editcount=="number")?user.editcount:null; registration=(typeofuser.registration=="string")? newDate(user.registration):null; blocked=typeofuser.blockedby!="undefined"; gender=(typeofuser.gender=="string")?user.gender:null; lastEdited=(typeofquery.usercontribs[0]=="object")&& (typeofquery.usercontribs[0].timestamp=="string")? newDate(query.usercontribs[0].timestamp):null; for(varam=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). } // Format the information for on-screen display varstatusText=""; varipUser=false; varipv4User=false; varipv6User=false; // User status if(blocked){ statusText+="<a href=\""+mw.config.get("wgScriptPath")+ "/index.php?title=Special:Log&page="+ encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2]+":"+user.name)+ "&type=block\">blocked</a> "; } if(missing){ statusText+="username not registered"; }elseif(invalid){ ipv4User=mw.util.isIPv4Address(user.name); ipv6User=mw.util.isIPv6Address(user.name); ipUser=ipv4User||ipv6User; if(ipv4User){ statusText+="anonymous IPv4 user"; }elseif(ipv6User){ statusText+="anonymous IPv6 user"; }else{ statusText+="invalid username"; } }else{ // User is registered and may be in a privileged group. Below we have a list of user groups. // Only need the ones different from the software's name (or ones to exclude), though. varfriendlyGroupNames={ // Exclude implicit user group information provided by MW 1.17 --PS 2010年02月17日 '*':false, 'user':false, 'autoconfirmed':false, sysop:"administrator", accountcreator:"account creator", 'import':"importer", transwiki:"transwiki importer", 'ipblock-exempt':"IP block exemption", confirmed:"confirmed user", abusefilter:"edit filter manager", 'abusefilter-helper':"edit filter helper", autoreviewer:"autopatrolled user", filemover:"file mover", 'massmessage-sender':"mass message sender", templateeditor:"template editor", extendedconfirmed:"extended confirmed user", extendedmover:"page mover", reviewer:"pending changes reviewer", suppress:"oversighter", patroller:"new page reviewer", copyviobot:"copyright violation bot", eventcoordinator:"event coordinator", 'interface-admin':"interface administrator", temp:"temporary user" }; varfriendlyGroups=[]; for(vari=0;i<groups.length;++i){ vars=groups[i]; vart=friendlyGroupNames.hasOwnProperty(s)?friendlyGroupNames[s]:s; if(t){ if(groupPages.hasOwnProperty(s)){ friendlyGroups.push("<a href=\"/wiki/"+encodeURIComponent(groupPages[s])+"\">"+t+"</a>"); }else{ friendlyGroups.push(t); } } } switch(friendlyGroups.length){ case0: // User not in a privileged group // Changed to "registered user" by request of [[User:Svanslyck]] // --PS 2010年05月16日 // statusText += "user"; if(blocked){ statusText+="user"; }else{ statusText+="registered user"; } break; case1: statusText+=friendlyGroups[0]; break; case2: statusText+=friendlyGroups[0]+" and "+friendlyGroups[1]; break; default: statusText+=friendlyGroups.slice(0,-1).join(", ")+ ", and "+friendlyGroups[friendlyGroups.length-1]; break; } } // Registration date if(registration){ varfirstLoggedUser=newDate("22:16, 7 September 2005");// When the [[Special:Log/newusers]] was first activated if(registration>=firstLoggedUser){ statusText+=", <a href='"+mw.config.get("wgScriptPath")+ "/index.php?title=Special:Log&type=newusers&dir=prev&limit=1&user="+ et+"'>"+UserinfoJsFormatDateRel(registration)+"</a> old"; }else{ statusText+=", <a href='"+mw.config.get("wgScriptPath")+ "/index.php?title=Special:ListUsers&limit=1&username="+ et+"'>"+UserinfoJsFormatDateRel(registration)+"</a> old"; } } // Edit count if(editcount!==null){ statusText+=", with "+ "<a href=\"//tools.wmflabs.org/xtools-ec/?user="+ encodeURIComponent(user.name)+ "&project=en.wikipedia.org&uselang=en\">"+ UserinfoJsFormatQty(editcount,"edit","edits")+"</a>"; } // Prefix status text with correct article if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1))>=0){ statusText="An "+statusText; }else{ statusText="A "+statusText; } // Add full stop to status text statusText+="."; // Last edited --PS 2010年06月27日 // Added link to contributions page --PS 2010年07月03日 if(lastEdited){ statusText+=" Last edited <a href=\""+mw.config.get("wgArticlePath").replace("1ドル","Special:Contributions/"+encodeURIComponent(user.name))+"\">"+UserinfoJsFormatDateRel(lastEdited)+" ago</a>."; } // Show the correct gender symbol varfh=document.getElementById("firstHeading")|| document.getElementById("section-0"); if(!fh)return;// e.g. Minerva user talk pages // Add classes for blocked, registered, and anonymous users varnewClasses=[]; if(blocked){ newClasses.push("ps-blocked"); } if(ipUser){ newClasses.push("ps-anonymous"); }elseif(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(" "); vargenderSpan=document.createElement("span"); genderSpan.id="ps-gender-"+(gender||"unknown"); genderSpan.style.paddingLeft="0.25em"; genderSpan.style.fontFamily='"Lucida Grande", "Lucida Sans Unicode", "sans-serif"'; genderSpan.style.fontSize="75%"; vargenderSymbol; switch(gender){ case"male":genderSymbol="\u2642";break; case"female":genderSymbol="\u2640";break; default:genderSymbol="";break; } genderSpan.appendChild(document.createTextNode(genderSymbol)); fh.appendChild(genderSpan); // Now show the other information. Non-standard? Yes, but it gets the job done. // Add a period after the tagline when doing so. --PS 2010年07月03日 varss=document.getElementById("siteSub"); if(!ss){ ss=document.createElement("div"); ss.id="siteSub"; ss.innerHTML="From Wikipedia, the free encyclopedia"; varbc=document.getElementById("bodyContent"); bc.insertBefore(ss,bc.firstChild); } ss.innerHTML='<span id="ps-userinfo">'+statusText+'</span> '+ss.innerHTML+'.'; ss.style.display="block"; }); });}); }