User:DreamRimmer/NotifyBotOP.js
//
mw.loader.using(['mediawiki.util', 'oojs-ui'], function () {
if (mw.config.get('wgPageName').startsWith('Wikipedia:Bots/Requests_for_approval/')) {
mw.util.addPortletLink('p-cactions', '#', 'Notify bot operator', 'ca-notify-bot-operator', 'Notify bot operator');
var getOp = function () {
return new mw.Api().get({
action: 'query',
prop: 'revisions',
titles: mw.config.get('wgPageName'),
rvprop: 'content',
format: 'json'
}).then(data => {
var content = Object.values(data.query.pages)[0].revisions[0]['*'];
var match = content.match(/\{\{botop\|(.*?)\}\}/);
return match ? match[1].trim() : null;
});
};
$(document).on('click', '#ca-notify-bot-operator', function (e) {
e.preventDefault();
getOp().then(botOp => {
if (!botOp) return alert('Could not find bot operator username.');
function Dialog(config) {
Dialog.super.call(this, config);
}
OO.inheritClass(Dialog, OO.ui.ProcessDialog);
Dialog.static.name = 'notifyBotDialog';
Dialog.static.title = 'Notify Bot Operator';
Dialog.static.actions = [
{ action: 'accept', label: 'Notify', flags: ['primary', 'progressive'] },
{ action: 'cancel', label: 'Cancel', flags: 'safe' }
];
Dialog.prototype.initialize = function () {
Dialog.super.prototype.initialize.apply(this, arguments);
this.options = {
'Trial approved': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' is approved for a trial. Thanks!',
'Approved for extended trial': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' is approved for an extended trial. Thanks!',
'On hold': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was put on hold. Thanks!',
'Request Expired': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was marked as expired. Thanks!',
'Withdrawn by operator': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was marked as withdrawn. Thanks!',
'Denied': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was denied. Thanks!',
'Revoked': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was revoked. Thanks!',
'Approved': 'Hello {{subst:BASEPAGENAME}}, your BRFA at ' + mw.config.get('wgPageName') + ' was approved. Best regards,'
};
this.radioSelect = new OO.ui.RadioSelectWidget({
items: Object.keys(this.options).map(key => new OO.ui.RadioOptionWidget({ data: key, label: key }))
});
var fieldset = new OO.ui.FieldsetLayout({ label: 'Select Notification Status', padded: true });
fieldset.addItems([new OO.ui.FieldLayout(this.radioSelect, { align: 'top' })]);
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.content.$element.append(fieldset.$element);
this.$body.append(this.content.$element);
this.actions.setMode('edit');
};
Dialog.prototype.getActionProcess = function (action) {
if (action === 'accept') {
return new OO.ui.Process(() => {
var selected = this.radioSelect.findSelectedItem();
if (!selected) return alert('Please select a notification status.'), OO.ui.Process.reject();
var msg = this.options[selected.getData()];
return new mw.Api().postWithEditToken({
action: 'edit',
title: 'User talk:' + botOp,
appendtext: '\n== Your BRFA ==\n' + msg + ' ~~~~',
summary: 'Notifying bot operator (using NotifyBotOP.js)'
}).then(() => {
return new Promise(resolve => setTimeout(() => {
this.close({ action });
alert('Notification sent successfully!');
window.location.reload();
resolve();
}, 4000));
}).catch(err => { alert('Failed to send notification: ' + err); throw err; });
});
}
if (action === 'cancel') return new OO.ui.Process(() => this.close({ action }));
return Dialog.super.prototype.getActionProcess.call(this, action);
};
var wm = new OO.ui.WindowManager();
$(document.body).append(wm.$element);
var dlg = new Dialog({ size: 'medium' });
wm.addWindows([dlg]);
wm.openWindow(dlg);
});
});
}
});
//