Jump to content

User:DreamRimmer/NotifyBotOP.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>
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 [[User:DreamRimmer/NotifyBotOP|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);
            });
        });
    }
});
//</nowiki>