User:Moonythedwarf/handyman-usernames.js

let uns = {};

uns.UsernameReviewModel = function HmnUnsUsernameReviewModel(config) { config = config || {}; // V8 hates me for this OO.EventEmitter.call(this); OO.EmitterList.call(this); this.connect(this, {		// N/A	}); this.aggregate({		reportUsername: "report_username",		watchUserContributions: "watch_user_contribs",		unwatchUserContributions: "unwatch_user_contribs",	}); this.timer = setInterval( => {this.emit("update");}, config.interval || 1000); };

OO.initClass(uns.UsernameReviewModel); OO.mixinClass(uns.UsernameReviewModel, OO.EventEmitter); OO.mixinClass(uns.UsernameReviewModel, OO.EmitterList);

uns.UsernameReviewUILayout = function HmnUnsUsernameReviewUI(config, model) { config = config || {};

uns.UsernameReviewUILayout.parent.call(this, {		expanded: false	}); this.upperSect = $(" "); this.lowerSect = $(" "); this.$element.append(this.upperSect, this.lowerSect); };

OO.inheritClass(uns.UsernameReviewUILayout, OO.ui.PanelLayout);

uns.UsernameReviewUIControls = function HmnUnsUsernameReviewUIControls(config, model) { config = config || {}; uns.UsernameReviewUIControls.parent.call(this, config); OO.EventEmitter.call(this); this.base = new OO.ui.PanelLayout({		expanded: false,		padded: true,		framed: true	}); this.$element.append(this.base.$element); };

OO.inheritClass(uns.UsernameReviewUIControls, OO.ui.Widget); OO.mixinClass(uns.UsernameReviewUIControls, OO.EventEmitter);

uns.UsernameReviewUINameFeed = function HmnUnsUsernameReviewUINameFeed(config, model) { config = config || {}; this.slots = []; this.max_listing = config.max_names || 100; uns.UsernameReviewUINameFeed.parent.call(this, config); OO.EventEmitter.call(this); OO.ui.mixin.GroupElement.call(this); model.connect(this, {		update: "update"	}); this.connect(this, {		change: "list_change"	}); this.config = config; this.model = model; };

OO.inheritClass(uns.UsernameReviewUINameFeed, OO.ui.Layout); OO.mixinClass(uns.UsernameReviewUINameFeed, OO.EventEmitter); OO.mixinClass(uns.UsernameReviewUINameFeed, OO.ui.mixin.GroupElement);

uns.UsernameReviewUINameFeed.prototype.update = function { if (document.hasFocus) { uns.query_user_list(this.max_listing, (events) => {			let items = [];

for (let i of events) { items.push(new uns.UsernameFeedItem({ username: i.user, time: new Date(i.timestamp) }));			}			this.addItems(items); }, (err) => { mw.notify("retrying in a few seconds"); });	} };

uns.UsernameReviewUINameFeed.prototype.list_change = function(list) { // short circuit out. This seems to be the only sane way to do this that isn't prodding OOUI internals for some reason. if (list.length > this.max_listing) { this.removeItems(list.slice(this.max_listing)); return; }	//TODO: efficiency this.$element.empty; for (let i of list) { this.$element.append(i.$element); } };

uns.UsernameFeedItem = function HmnUnsUsernameFeedItem(config, model) { config = config || {}; uns.UsernameFeedItem.parent.call(this); this.report_button = new OO.ui.ButtonWidget({		label: "Report to UAA",		framed: false,		title: "Report to UAA",		flags: "destructive"	}) this.layout = new OO.ui.HorizontalLayout({		items: [			new OO.ui.LabelWidget({label: `(${config.time.getUTCHours}:${config.time.getUTCMinutes.toString.padStart(2, '0')})`}),			new OO.ui.LabelWidget({label: $("", {				text: config.username,				href: `/wiki/User:${config.username}`			})}),			this.report_button,		]	}); this.$element.append(this.layout.$element); };

OO.inheritClass(uns.UsernameFeedItem, OO.ui.Widget); OO.mixinClass(uns.UsernameReviewUINameFeed, OO.EventEmitter);

uns.api = new mw.Api;

uns.query_user_list = function(entries, donecb, failcb) { let starttime = uns.starttime; if (!starttime) { let d = new Date(Date.now); starttime = d.getUTCFullYear + '-' + (d.getUTCMonth + 1).toString.padStart(2, '0') + '-' +(d.getUTCDate).toString.padStart(2, '0') + 'T' + (d.getUTCHours).toString.padStart(2, '0') + ':' + (d.getUTCMinutes).toString.padStart(2, '0') + ':' + (d.getUTCSeconds).toString.padStart(2, '0') + 'Z'; }	mw.notify(starttime); uns.starttime = starttime; uns.api.abort; uns.api.get({		action: "query",		format: "json",		list: "logevents",		letype: "newusers",		lelimit: entries.toString,		lestart: starttime,		ledir: 'older',		lecontinue: uns.cont || undefined,	}).fail(failcb).done((r) => {		if (r.query.logevents[0]) {			uns.last_timestamp = r.query.logevents[0].timestamp;		}		uns.cont = r.continue.lecontinue;		donecb(r.query.logevents);	}); };

uns.build_usernamefeed_ui = function { let cfg = {}; window.handyman.ui = {}; window.handyman.ui.models = {}; window.handyman.ui.models.unrevmodel = new uns.UsernameReviewModel; window.handyman.ui.layout = new uns.UsernameReviewUILayout(cfg, window.handyman.ui.models.unrevmodel); window.handyman.ui.controls = new uns.UsernameReviewUIControls(cfg, window.handyman.ui.models.unrevmodel); window.handyman.ui.feed = new uns.UsernameReviewUINameFeed(cfg, window.handyman.ui.models.unrevmodel); window.handyman.ui.layout.upperSect.append(window.handyman.ui.controls.$element); window.handyman.ui.layout.lowerSect.append(window.handyman.ui.feed.$element); $("#mw-content-text").append(window.handyman.ui.layout.$element); };

window.handyman.uns = uns;