MediaWiki:Gadget-userProfile.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
// User profile
// <nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.api']).done(function() {
var config = mw.config.get([
'wgRelevantUserName',
'wgNamespaceNumber',
'wgUserLanguage',
'wgArticleId',
'wgAction',
'wgTitle'
]);
var username = config.wgRelevantUserName;
if (!username || window.loadedHorseUserProfile) return;
window.loadedHorseUserProfile = true;
if (config.wgNamespaceNumber !== -1 && config.wgTitle.includes('/')) return;
var lang = mw.language.bcp47(config.wgUserLanguage);
var dateOptions = {
year: "numeric",
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
timeZone: "UTC",
timeZoneName: "short"
};
var api = new mw.Api();
if (mw.util.isIPAddress(username)) api.get({
action: 'query',
list: ['usercontribs', 'blocks'],
ucuser: username,
ucprop: [],
uclimit: 'max',
bkip: username,
bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
bklimit: 1,
formatversion: 2
}).done(function(data) {
var editcount = data.query.usercontribs.length;
if (data.continue && data.continue.uccontinue) editcount = data.limits.usercontribs + '+';
var user = {
groups: ['*'],
editcount: editcount
};
formatProfile(user, data.query.blocks[0]);
});
else api.get({
action: 'query',
list: ['users', 'blocks'],
ususers: username,
usprop: ['groups', 'editcount', 'registration', 'emailable'],
bkusers: username,
bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
bklimit: 1,
formatversion: 2
}).done(function(data) {
formatProfile(data.query.users[0], data.query.blocks[0]);
});
if (window.loadedHorseUserProfileContribs) return;
window.loadedHorseUserProfileContribs = true;
if (config.wgNamespaceNumber === 2 && !config.wgArticleId && config.wgAction === 'view') {
mw.loader.using(['mediawiki.pager.styles', 'mediawiki.special.changeslist']).then(function() {
var text = '== [[Special:Contributions/' + username + '|{{int:contributions-title|' + username + '}}]] ==\n{{Special:Contributions/' + username + '|limit=20}}';
new mw.Api().parse(text, {
title: 'User:' + config.wgTitle,
wrapoutputclass: 'horse-userprofile-contribs',
disableeditsection: true,
disablelimitreport: true,
uselang: config.wgUserLanguage
}).done(function(parsedText) {
mw.hook('wikipage.content').fire(
$(parsedText).appendTo('#mw-content-text')
);
});
});
}
function formatProfile(user, block) {
user.groups.splice(user.groups.indexOf('*'), 1);
var text = '<div class="horse-userprofile-info">';
if (user.groups.length) {
var groupList = user.groups.map(function(group) {
var grouppage = '{{MediaWiki:grouppage-' + group + '}}';
return [
'{{#ifexist: ' + grouppage + ' | [[' + grouppage + '|{{int:group-' + group + '}}]] | {{int:group-' + group + '}} }}',
'{{#ifexist: ' + grouppage + ' | [[' + grouppage + '|{{int:group-' + group + '-member|' + username + '}}]] | {{int:group-' + group + '-member|' + username + '}} }}'
];
}).reduce(function(prev, cur) {
prev[0].push(cur[0]);
prev[1].push(cur[1]);
return prev;
}, [
[],
[]
]);
text += '\n\n<span>{{int:prefs-memberingroups|' + user.groups.length + '|' + username + '}}</span>\t<span>{{int:prefs-memberingroups-type|' + mw.language.listToText(groupList[0]) + '|' + mw.language.listToText(groupList[1]) + '}}</span>';
}
text += '\n\n<span>{{int:prefs-edits}}</span>\t<span>[[Special:Contribs/' + username + '|' + mw.language.convertNumber(user.editcount) + ']]</span>';
if (user.registration) {
text += '\n\n<span>{{int:prefs-registration}}</span>\t<span>' + mw.language.convertNumber(new Date(user.registration).toLocaleString(lang, dateOptions)) + '</span>';
if (!user.emailable) text += '\n\n<span>{{int:nowikiemailtext|' + username + '}}</span>';
}
text += '\n\n</div>';
if (block && !$('.mw-warning-with-logexcerpt .mw-logevent-loglines > .mw-logline-block').length) {
var notice = 'sp-contributions-blocked-notice';
if (mw.util.isIPAddress(block.user, true)) notice += '-anon';
var logentry = 'logentry-block-block';
var partialBlock = [];
if (block.partial) {
notice += '-partial';
logentry = 'logentry-partialblock-block';
if (block.restrictions.pages) {
var blockpages = block.restrictions.pages.map(function(page) {
return '[[' + page.title + ']]';
});
partialBlock.push('{{int:logentry-partialblock-block-page|' + blockpages.length + '|' + mw.language.listToText(blockpages) + '}}');
}
if (block.restrictions.namespaces) {
var blocknamespaces = block.restrictions.namespaces.map(function(namespace) {
if (!namespace) return '[[Special:AllPages|{{int:blanknamespace}}]]';
return '[[Special:AllPages/{{ns:' + namespace + '}}:|{{ns:' + namespace + '}}]]';
});
partialBlock.push('{{int:logentry-partialblock-block-ns|' + blocknamespaces.length + '|' + mw.language.listToText(blocknamespaces) + '}}');
}
if (block.restrictions.actions) {
var blockactions = block.restrictions.actions.map(function(action) {
return '{{int:ipb-action-' + action + '}}';
});
partialBlock.push('{{int:logentry-partialblock-block-action|' + blockactions.length + '|' + mw.language.listToText(blockactions) + '}}');
}
if (!partialBlock.length) logentry = 'logentry-non-editing-block-block';
}
var blockDate = new Date(block.timestamp);
var blockexpiry = '{{int:infiniteblock}}';
if (!['infinite', 'indefinite', 'infinity', 'never'].includes(block.expiry)) {
var expiry = new Date(block.expiry.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z'));
var duration = expiry - blockDate;
var blockDuration = [];
var factor = 1000;
if (duration % factor === 0) blockDuration = ['duration-seconds', Math.floor(duration / factor)];
factor *= 60;
if (duration % factor === 0) blockDuration = ['duration-minutes', Math.floor(duration / factor)];
factor *= 60;
if (duration % factor === 0) blockDuration = ['duration-hours', Math.floor(duration / factor)];
factor *= 24;
if (duration % factor === 0) blockDuration = ['duration-days', Math.floor(duration / factor)];
if (duration % (factor * 7) === 0) blockDuration = ['duration-weeks', Math.floor(duration / (factor * 7))];
if (duration % (factor * 30) === 0) blockDuration = ['months', Math.floor(duration / (factor * 30))];
factor *= 365;
if (duration % factor === 0) blockDuration = ['duration-years', Math.floor(duration / factor)];
if (duration % (factor * 10) === 0) blockDuration = ['duration-decades', Math.floor(duration / (factor * 10))];
if (duration % (factor * 100) === 0) blockDuration = ['duration-centuries', Math.floor(duration / (factor * 100))];
if (duration % (factor * 1000) === 0) blockDuration = ['duration-millennia', Math.floor(duration / (factor * 1000))];
if (blockDuration.length < 2 || blockDuration[1] > 1000) blockexpiry = mw.language.convertNumber(expiry.toLocaleString(lang, dateOptions));
else blockexpiry = '{{int:' + blockDuration.join('|') + '}}';
}
var blockflags = '';
var blockflaglist = [];
if (block.anononly) blockflaglist.push('{{int:block-log-flags-anononly}}');
if (block.nocreate) blockflaglist.push('{{int:block-log-flags-nocreate}}');
if (!block.autoblock && !mw.util.isIPAddress(block.user, true)) blockflaglist.push('{{int:block-log-flags-noautoblock}}');
if (!block.allowusertalk) blockflaglist.push('{{int:block-log-flags-nousertalk}}');
if (block.noemail) blockflaglist.push('{{int:block-log-flags-noemail}}');
if (block.hidden) blockflaglist.push('{{int:block-log-flags-hiddenname}}');
if (blockflaglist.length) blockflags = '{{int:parentheses|' + blockflaglist.join(mw.msg('comma-separator')) + '}}';
var blockreason = ' <span class="comment">{{int:parentheses|' + block.reason + '}}</span>';
if (!block.reason) blockreason = '';
text += '<div class="horse-userprofile-block mw-warning-with-logexcerpt"><div>\n{{int:' + notice + '|' + username + '}}\n';
text += '<ul class="mw-logevent-loglines"><li class="mw-logline-block">' + mw.language.convertNumber(blockDate.toLocaleString(lang, dateOptions)) + ' {{int:' + logentry + '|[[User:' + block.by + '|' + block.by + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.by + '|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/' + block.by + '|{{int:contribslink}}]]</span></span>|' + block.by;
if (mw.util.isIPAddress(block.user, true)) text += '|[[Special:Contribs/' + block.user + '|' + block.user + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.user + '|{{int:talkpagelinktext}}]]</span></span>';
else text += '|[[User:' + block.user + '|' + block.user + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.user + '|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/' + block.user + '|{{int:contribslink}}]]</span></span>';
text += '|' + block.user + '|' + blockexpiry + '|' + blockflags + '|' + mw.language.listToText(partialBlock) + '}}' + blockreason + '</li></ul></div></div>';
}
api.parse(text, {
disablelimitreport: true,
wrapoutputclass: 'horse-userprofile mw-message-box mw-content-' + ($('#contentSub').attr('dir') || 'ltr'),
uselang: config.wgUserLanguage
}).done(function(parsedText) {
parsedText = parsedText.replace(/\u29FCgroup-([^\u29FC\u29FD]+?)(?:-member)?\u29FD/g, '$1');
mw.hook('wikipage.content').fire(
$(parsedText).appendTo('#contentSub')
);
});
}
});
// </nowiki>