User:JJPMaster/welcome.js

// <nowiki>
// Adapted from OneClickWelcomer gadget
function isIPwb(username) {
	const regex = /(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-fA-F\d]{1,4}:){7}(?:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,2}|:)|(?:[a-fA-F\d]{1,4}:){4}(?:(?::[a-fA-F\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,3}|:)|(?:[a-fA-F\d]{1,4}:){3}(?:(?::[a-fA-F\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,4}|:)|(?:[a-fA-F\d]{1,4}:){2}(?:(?::[a-fA-F\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,5}|:)|(?:[a-fA-F\d]{1,4}:){1}(?:(?::[a-fA-F\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/gm;    
	if (regex.test(username)) {  
		return true;
	}  
	return false;
}
$(() => {
	var porty;
	var porty2;
	var userIP = false;
	$("#bodyContent").append(`
	<div id="welDialog">
		What welcome message would you like to add? <br />
		<select name="welName" id="welName">
			<option>Select the welcome message</option>
			<option id="Welcome">Welcome</option>
			<option id="Bigwelcome">Welcome (with useful links)</option>
			<option id="Classwelcome">Welcome (Wiki Ed)</option>
			<option id="Welcomeback">Welcome back</option>
			<option id="Cookbookwelcome">Welcome (Cookbook)</option>
			<option id="Cookwelcome">Welcome (Cookbook, simplified)</option>
			<option id="Welcome-belated">Welcome (belated)</option>
	    </select><br />
	    <textarea id="welMessage" name="welMessage"></textarea><br />
	    <button type="button" class="welUser">Welcome user</button>
    </div>
	<div id="welDialogIP">
		What welcome message would you like to add for this anonymous user? <br />
		<select name="welNameIP" id="welNameIP">
			<option>Select the welcome message</option>
			<option id="Welcome-anon">Welcome (anonymous)</option>
			<option id="Joinus">Welcome (anonymous, encouraging)</option>
	    </select><br />
	    <textarea id="welMessageIP" name="welMessageIP"></textarea><br />
	    <button type="button" class="welUser">Welcome user</button>
    </div>
	`);
	(async () => {
		if (await waitForPreferences()) {
			for (var [i, j] of Object.entries(Luna.myPreferences.welcome)) {
			    $("#welName").append(`<option id="${i}">${j}</option>`);
			}
			for (var [k, l] of Object.entries(Luna.myPreferences.welcomeIP)) {
			    $("#welNameIP").append(`<option id="${k}">${l}</option>`);
			}
		}
		else {
		    console.error("Luna: Preferences never fully loaded.");
		}
	})();
	$("#welDialog").hide();
	$("#welDialogIP").hide();
	if (mw.config.get("wgRelevantUserName") !== null) {
		if(isIPwb(mw.config.get("wgRelevantUserName"))) {
			porty = mw.util.addPortletLink('luna-actions', '#', 'Welcome (IP)', 'luna-welcome-ip', 'Welcome this anonymous user');
			userIP = true;
		}
		porty2 = mw.util.addPortletLink('luna-actions', '#', 'Welcome', 'luna-welcome', 'Welcome this user');
	}
	else return;
	$(porty).click(() => $("#welDialogIP").dialog({ title: "Welcome this anonymous user", width: "auto", height: "auto" } ));
	$(porty2).click(() => $("#welDialog").dialog({ title: "Welcome this user", width: "auto", height: "auto" } ));
	$(".welUser").click(function() {
		var mySelect = userIP ? document.getElementById("welNameIP") : document.getElementById("welName");
		var critValue = userIP ? mySelect.options[welNameIP.selectedIndex].id : mySelect.options[welName.selectedIndex].id;
		var welMsg = userIP ? document.getElementById("welMessageIP").value : document.getElementById("welMessage").value;
		
		if(critValue == "Select the welcome message") alert("You must select a welcome message.");
		else {
			var params = {
				action: 'edit',
				appendtext: `\n{{subst:${critValue}|1=${welMsg}}}\n~~~~`,
				title: `User_talk:${mw.config.get("wgRelevantUserName")}`,
				summary: `Welcoming user with {{${critValue}}}`,
				tags: "Luna",
				format: 'json'
			},
			api = new mw.Api();
		
			api.postWithToken( 'csrf', params ).done( function ( data ) {
				console.log( data );
			} );
			mw.notify("Luna:\nThe welcome message has been added. Redirecting to the user's talk page...");
			setTimeout(() => {
			if (mw.config.get("wgPageName") == `User_talk:${mw.config.get("wgRelevantUserName")}`) window.location.reload();
			else window.location.href = window.location.href.replace(mw.config.get("wgPageName"), `User_talk:${mw.config.get("wgRelevantUserName")}`);
		}, 2000);

		}
	});
});
// </nowiki>