Markus-Rost 4 роки тому
батько
коміт
0130687562

+ 1 - 0
dashboard/index.js

@@ -52,6 +52,7 @@ const files = new Map([
 } ));
 } ));
 
 
 const server = http.createServer( (req, res) => {
 const server = http.createServer( (req, res) => {
+	res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
 	if ( req.method === 'POST' && req.headers['content-type'] === 'application/x-www-form-urlencoded' && req.url.startsWith( '/guild/' ) ) {
 	if ( req.method === 'POST' && req.headers['content-type'] === 'application/x-www-form-urlencoded' && req.url.startsWith( '/guild/' ) ) {
 		let args = req.url.split('/');
 		let args = req.url.split('/');
 		let state = req.headers.cookie?.split('; ')?.filter( cookie => {
 		let state = req.headers.cookie?.split('; ')?.filter( cookie => {

+ 6 - 0
dashboard/oauth.js

@@ -245,6 +245,9 @@ function dashboard_api(res, input) {
 		error: false,
 		error: false,
 		error_code: '',
 		error_code: '',
 		wiki: wiki.href,
 		wiki: wiki.href,
+		base: '',
+		sitename: '',
+		logo: '',
 		MediaWiki: false,
 		MediaWiki: false,
 		RcGcDw: '',
 		RcGcDw: '',
 		customRcGcDw: wiki.toLink('MediaWiki:Custom-RcGcDw', 'action=edit')
 		customRcGcDw: wiki.toLink('MediaWiki:Custom-RcGcDw', 'action=edit')
@@ -277,6 +280,9 @@ function dashboard_api(res, input) {
 		}
 		}
 		wiki.updateWiki(body.query.general);
 		wiki.updateWiki(body.query.general);
 		result.wiki = wiki.href;
 		result.wiki = wiki.href;
+		result.base = body.query.general.base;
+		result.sitename = body.query.general.sitename;
+		result.logo = body.query.general.logo;
 		if ( body.query.general.generator.replace( /^MediaWiki 1\.(\d\d).*$/, '$1' ) >= 30 ) {
 		if ( body.query.general.generator.replace( /^MediaWiki 1\.(\d\d).*$/, '$1' ) >= 30 ) {
 			result.MediaWiki = true;
 			result.MediaWiki = true;
 		}
 		}

+ 12 - 11
dashboard/src/index.css

@@ -120,7 +120,9 @@ a[alt]:hover:after {
 	display: flex;
 	display: flex;
 	justify-content: center;
 	justify-content: center;
 }
 }
-.guild .theme-toggle {
+.form-button:not(.user-select),
+.guild .theme-toggle,
+#lang-dropdown div {
 	cursor: pointer;
 	cursor: pointer;
 }
 }
 .avatar {
 .avatar {
@@ -322,7 +324,6 @@ a[alt]:hover:after {
 	background-color: #e3e5e8;
 	background-color: #e3e5e8;
 }
 }
 #lang-dropdown div {
 #lang-dropdown div {
-	cursor: pointer;
 	margin: 2px;
 	margin: 2px;
 	padding: 4px;
 	padding: 4px;
 	font-size: 90%;
 	font-size: 90%;
@@ -336,11 +337,13 @@ a[alt]:hover:after {
 .theme-light #lang-dropdown div:hover {
 .theme-light #lang-dropdown div:hover {
 	background-color: #f2f3f5;
 	background-color: #f2f3f5;
 }
 }
+.form-button:not(.user-select):hover,
 .description a,
 .description a,
 a .description,
 a .description,
 .notice a {
 .notice a {
 	color: #00b0f4;
 	color: #00b0f4;
 }
 }
+.theme-light .form-button:not(.user-select):hover,
 .theme-light .description a,
 .theme-light .description a,
 .theme-light a .description,
 .theme-light a .description,
 .theme-light .notice a {
 .theme-light .notice a {
@@ -385,15 +388,6 @@ li {
 	-ms-user-select: all;
 	-ms-user-select: all;
 	user-select: all;
 	user-select: all;
 }
 }
-.form-button:not(.user-select) {
-	cursor: pointer;
-}
-.form-button:not(.user-select):hover {
-	color: #00b0f4;
-}
-.theme-light .form-button:not(.user-select):hover {
-	color: #0067e0;
-}
 .widgets {
 .widgets {
 	margin-top: 250px;
 	margin-top: 250px;
 }
 }
@@ -434,6 +428,13 @@ li {
 	background-color: #fcc;
 	background-color: #fcc;
 	border-color: #faa;
 	border-color: #faa;
 }
 }
+.notice strong,
+.notice small {
+	display: block;
+}
+.notice small {
+	color: #777;
+}
 #login-button {
 #login-button {
 	display: flex;
 	display: flex;
 	margin: 20px auto;
 	margin: 20px auto;

+ 76 - 55
dashboard/src/index.js

@@ -30,9 +30,11 @@ for ( var b = 0; b < baseSelect.length; b++ ) {
 			if ( document.location.pathname.split('/')[3] === 'rcscript' ) {
 			if ( document.location.pathname.split('/')[3] === 'rcscript' ) {
 				widgetPath = 'widgets/RcGcDb';
 				widgetPath = 'widgets/RcGcDb';
 			}
 			}
-			langWidget.setAttribute('src', `/src/${widgetPath}/${baseSelect[b].value}.png`);
+			langWidget.src = `/src/${widgetPath}/${baseSelect[b].value}.png`;
+			langWidget.alt = baseSelect[b].selectedOptions.item(0).textContent;
 			baseSelect[b].addEventListener( 'input', function() {
 			baseSelect[b].addEventListener( 'input', function() {
-				langWidget.setAttribute('src', `/src/${widgetPath}/${this.value}.png`);
+				langWidget.src = `/src/${widgetPath}/${this.value}.png`;
+				langWidget.alt = this.selectedOptions.item(0).textContent;
 			} );
 			} );
 		}
 		}
 	}
 	}
@@ -48,12 +50,12 @@ for ( var j = 0; j < addmore.length; j++ ) {
 		var clone = this.previousElementSibling.cloneNode(true);
 		var clone = this.previousElementSibling.cloneNode(true);
 		clone.classList.add('wb-settings-additional-select');
 		clone.classList.add('wb-settings-additional-select');
 		clone.removeAttribute('id');
 		clone.removeAttribute('id');
-		clone.removeAttribute('required');
+		clone.required = false;
 		clone.childNodes.forEach( function(child) {
 		clone.childNodes.forEach( function(child) {
-			child.removeAttribute('hidden');
-			child.removeAttribute('selected');
+			child.hidden = false;
+			child.selected = false;
 		} );
 		} );
-		clone.querySelector('option.defaultSelect').setAttribute('selected', '');
+		clone.querySelector('option.defaultSelect').selected = true;
 		clone.addEventListener( 'input', toggleOption );
 		clone.addEventListener( 'input', toggleOption );
 		this.before(clone);
 		this.before(clone);
 		toggleOption.call(clone);
 		toggleOption.call(clone);
@@ -76,9 +78,9 @@ function toggleOption() {
 		if ( option && option.value ) return false;
 		if ( option && option.value ) return false;
 		else return true;
 		else return true;
 	} ) || allSelect.length >= 10 || allSelect.length >= this.options.length-1 ) {
 	} ) || allSelect.length >= 10 || allSelect.length >= this.options.length-1 ) {
-		button.setAttribute('hidden', '');
+		button.hidden = true;
 	}
 	}
-	else button.removeAttribute('hidden');
+	else button.hidden = false;
 	selected = selected.filter( function(option) {
 	selected = selected.filter( function(option) {
 		if ( option && option.value ) return true;
 		if ( option && option.value ) return true;
 		else return false;
 		else return false;
@@ -87,9 +89,9 @@ function toggleOption() {
 	} );
 	} );
 	options.forEach( function(option) {
 	options.forEach( function(option) {
 		if ( selected.includes( option.value ) && !option.selected ) {
 		if ( selected.includes( option.value ) && !option.selected ) {
-			option.setAttribute('disabled', '');
+			option.disabled = true;
 		}
 		}
-		else if ( option.disabled ) option.removeAttribute('disabled');
+		else if ( option.disabled ) option.disabled = false;
 	} );
 	} );
 }
 }
 
 
@@ -116,9 +118,9 @@ if ( wiki ) {
 			else {
 			else {
 				wikinew = wikinew.replace( /\/(?:api|load|index)\.php(?:|\?.*)$/, '' ).replace( /\/$/, '' );
 				wikinew = wikinew.replace( /\/(?:api|load|index)\.php(?:|\?.*)$/, '' ).replace( /\/$/, '' );
 			}
 			}
-			var readonly = wiki.hasAttribute('readonly');
-			wiki.setAttribute('readonly', '');
-			wikicheck.setAttribute('disabled', '');
+			var readonly = wiki.readOnly;
+			wiki.readOnly = true;
+			wikicheck.disabled = true;
 			fetch( '/api?wiki=' + encodeURIComponent( wikinew ), {
 			fetch( '/api?wiki=' + encodeURIComponent( wikinew ), {
 				method: 'GET',
 				method: 'GET',
 				cache: 'no-cache',
 				cache: 'no-cache',
@@ -136,6 +138,23 @@ if ( wiki ) {
 				}
 				}
 				wikichecknotice.className = 'notice';
 				wikichecknotice.className = 'notice';
 				wikichecknotice.innerHTML = '';
 				wikichecknotice.innerHTML = '';
+				var noticeExtraParts = [];
+				if ( response.sitename ) {
+					var wikiEmbed = document.createElement('a');
+					wikiEmbed.target = '_blank';
+					wikiEmbed.href = response.base;
+					var wikiEmbedDiv = document.createElement('div');
+					wikiEmbed.append(wikiEmbedDiv);
+					var wikiEmbedStrong = document.createElement('strong');
+					wikiEmbedStrong.textContent = response.sitename;
+					var wikiEmbedImg = document.createElement('img');
+					wikiEmbedImg.src = response.logo;
+					wikiEmbedImg.alt = response.sitename;
+					var wikiEmbedSmall = document.createElement('small');
+					wikiEmbedSmall.textContent = response.base;
+					wikiEmbedDiv.append(wikiEmbedStrong, wikiEmbedImg, wikiEmbedSmall);
+					noticeExtraParts.push(document.createElement('hr'), wikiEmbed);
+				}
 				if ( response.error ) {
 				if ( response.error ) {
 					wiki.setCustomValidity(lang('invalid.title'));
 					wiki.setCustomValidity(lang('invalid.title'));
 					wikichecknotice.classList.add('notice-error');
 					wikichecknotice.classList.add('notice-error');
@@ -148,7 +167,7 @@ if ( wiki ) {
 						noticeNote = document.createElement('div');
 						noticeNote = document.createElement('div');
 						noticeNote.textContent = lang('invalid.note_' + response.error_code);
 						noticeNote.textContent = lang('invalid.note_' + response.error_code);
 					}
 					}
-					wikichecknotice.append(noticeTitle, noticeText, noticeNote);
+					wikichecknotice.append(noticeTitle, noticeText, noticeNote, ...noticeExtraParts);
 					return;
 					return;
 				}
 				}
 				if ( !readonly ) wiki.value = response.wiki;
 				if ( !readonly ) wiki.value = response.wiki;
@@ -161,10 +180,10 @@ if ( wiki ) {
 						var noticeText = document.createElement('div');
 						var noticeText = document.createElement('div');
 						noticeText.textContent = lang('outdated.text');
 						noticeText.textContent = lang('outdated.text');
 						var noticeLink = document.createElement('a');
 						var noticeLink = document.createElement('a');
-						noticeLink.setAttribute('target', '_blank');
-						noticeLink.setAttribute('href', 'https://www.mediawiki.org/wiki/MediaWiki_1.30');
+						noticeLink.target = '_blank';
+						noticeLink.href = 'https://www.mediawiki.org/wiki/MediaWiki_1.30';
 						noticeLink.textContent = 'https://www.mediawiki.org/wiki/MediaWiki_1.30';
 						noticeLink.textContent = 'https://www.mediawiki.org/wiki/MediaWiki_1.30';
-						wikichecknotice.append(noticeTitle, noticeText, noticeLink);
+						wikichecknotice.append(noticeTitle, noticeText, noticeLink, ...noticeExtraParts);
 						return;
 						return;
 					}
 					}
 					if ( response.RcGcDw !== document.location.pathname.split('/')[2] ) {
 					if ( response.RcGcDw !== document.location.pathname.split('/')[2] ) {
@@ -172,8 +191,8 @@ if ( wiki ) {
 						var noticeTitle = document.createElement('b');
 						var noticeTitle = document.createElement('b');
 						noticeTitle.textContent = lang('sysmessage.title');
 						noticeTitle.textContent = lang('sysmessage.title');
 						var sysmessageLink = document.createElement('a');
 						var sysmessageLink = document.createElement('a');
-						sysmessageLink.setAttribute('target', '_blank');
-						sysmessageLink.setAttribute('href', response.customRcGcDw);
+						sysmessageLink.target = '_blank';
+						sysmessageLink.href = response.customRcGcDw;
 						var sysmessageCode = document.createElement('code');
 						var sysmessageCode = document.createElement('code');
 						sysmessageCode.textContent = 'MediaWiki:Custom-RcGcDw';
 						sysmessageCode.textContent = 'MediaWiki:Custom-RcGcDw';
 						sysmessageLink.append(sysmessageCode);
 						sysmessageLink.append(sysmessageCode);
@@ -191,13 +210,13 @@ if ( wiki ) {
 						);
 						);
 						var noticeLink = sysmessageLink.cloneNode();
 						var noticeLink = sysmessageLink.cloneNode();
 						noticeLink.textContent = response.customRcGcDw;
 						noticeLink.textContent = response.customRcGcDw;
-						wikichecknotice.append(noticeTitle, noticeText, noticeLink);
+						wikichecknotice.append(noticeTitle, noticeText, noticeLink, ...noticeExtraParts);
 						return;
 						return;
 					}
 					}
 					wikichecknotice.classList.add('notice-success');
 					wikichecknotice.classList.add('notice-success');
 					var noticeTitle = document.createElement('b');
 					var noticeTitle = document.createElement('b');
 					noticeTitle.textContent = lang('valid.title');
 					noticeTitle.textContent = lang('valid.title');
-					wikichecknotice.append(noticeTitle);
+					wikichecknotice.append(noticeTitle, ...noticeExtraParts);
 					return;
 					return;
 				}
 				}
 				wikichecknotice.classList.add('notice-success');
 				wikichecknotice.classList.add('notice-success');
@@ -207,8 +226,8 @@ if ( wiki ) {
 				if ( !/\.(?:gamepedia\.com|fandom\.com|wikia\.org)$/.test(wiki.value.split('/')[2]) ) {
 				if ( !/\.(?:gamepedia\.com|fandom\.com|wikia\.org)$/.test(wiki.value.split('/')[2]) ) {
 					if ( !response.MediaWiki ) {
 					if ( !response.MediaWiki ) {
 						var noticeLink = document.createElement('a');
 						var noticeLink = document.createElement('a');
-						noticeLink.setAttribute('target', '_blank');
-						noticeLink.setAttribute('href', 'https://www.mediawiki.org/wiki/MediaWiki_1.30');
+						noticeLink.target = '_blank';
+						noticeLink.href = 'https://www.mediawiki.org/wiki/MediaWiki_1.30';
 						noticeLink.textContent = 'MediaWiki 1.30';
 						noticeLink.textContent = 'MediaWiki 1.30';
 						var noticeText = document.createElement('div');
 						var noticeText = document.createElement('div');
 						var textSnippets = lang('valid.MediaWiki').split(/\$\d/);
 						var textSnippets = lang('valid.MediaWiki').split(/\$\d/);
@@ -220,11 +239,12 @@ if ( wiki ) {
 						wikichecknotice.append(noticeText);
 						wikichecknotice.append(noticeText);
 					}
 					}
 				}
 				}
+				if ( noticeExtraParts.length ) wikichecknotice.append(...noticeExtraParts);
 			}, function(error) {
 			}, function(error) {
 				console.log(error)
 				console.log(error)
 			} ).finally( function() {
 			} ).finally( function() {
-				if ( !readonly ) wiki.removeAttribute('readonly');
-				wikicheck.removeAttribute('disabled');
+				wiki.readOnly = readonly;
+				wikicheck.disabled = false;
 			} );
 			} );
 		};
 		};
 	}
 	}
@@ -235,24 +255,24 @@ if ( wiki ) {
 		const hidefeedsonly = document.getElementById('wb-settings-feeds-only-hide');
 		const hidefeedsonly = document.getElementById('wb-settings-feeds-only-hide');
 		feeds.addEventListener( 'change', function() {
 		feeds.addEventListener( 'change', function() {
 			if ( this.checked ) {
 			if ( this.checked ) {
-				hidefeedsonly.removeAttribute('style');
-				if ( !hidefeeds.hasAttribute('style') ) feedsonly.removeAttribute('disabled');
+				hidefeedsonly.style.visibility = '';
+				if ( !hidefeeds.style.visibility ) feedsonly.disabled = false;
 			}
 			}
 			else {
 			else {
-				hidefeedsonly.setAttribute('style', 'visibility: hidden;');
-				feedsonly.setAttribute('disabled', '');
+				hidefeedsonly.style.visibility = 'hidden';
+				feedsonly.disabled = true;
 			}
 			}
 		} );
 		} );
 		wiki.addEventListener( 'input', function() {
 		wiki.addEventListener( 'input', function() {
 			if ( this.validity.valid && /\.(?:fandom\.com|wikia\.org)$/.test(this.value.split('/')[2]) ) {
 			if ( this.validity.valid && /\.(?:fandom\.com|wikia\.org)$/.test(this.value.split('/')[2]) ) {
-				hidefeeds.removeAttribute('style');
-				feeds.removeAttribute('disabled');
-				if ( !hidefeedsonly.hasAttribute('style') ) feedsonly.removeAttribute('disabled');
+				hidefeeds.style.visibility = '';
+				feeds.disabled = false;
+				if ( !hidefeedsonly.style.visibility ) feedsonly.disabled = false;
 			}
 			}
 			else {
 			else {
-				hidefeeds.setAttribute('style', 'visibility: hidden;');
-				feeds.setAttribute('disabled', '');
-				feedsonly.setAttribute('disabled', '');
+				hidefeeds.style.visibility = 'hidden';
+				feeds.disabled = true;
+				feedsonly.disabled = true;
 			}
 			}
 		} );
 		} );
 	}
 	}
@@ -276,15 +296,15 @@ if ( usergroup ) {
 		}
 		}
 		var newWidth = usergroup.value.trim().length * 7;
 		var newWidth = usergroup.value.trim().length * 7;
 		if ( newWidth < usergroup.parentElement.clientWidth * 0.75 ) {
 		if ( newWidth < usergroup.parentElement.clientWidth * 0.75 ) {
-			usergroup.setAttribute('style', `min-width: ${newWidth}px;`);
+			usergroup.style.minWidth = newWidth + 'px';
 		}
 		}
 		if ( usergroup.value.includes( ',' ) || usergroup.value.includes( '|' ) ) {
 		if ( usergroup.value.includes( ',' ) || usergroup.value.includes( '|' ) ) {
-			multigroup.removeAttribute('style');
-			multigroup.removeAttribute('disabled');
+			multigroup.style.visibility = '';
+			multigroup.disabled = false;
 		}
 		}
-		else if ( !multigroup.hasAttribute('style') ) {
-			multigroup.setAttribute('style', 'visibility: hidden;');
-			multigroup.setAttribute('disabled', '');
+		else if ( !multigroup.style.visibility ) {
+			multigroup.style.visibility = 'hidden';
+			multigroup.disabled = true;
 		}
 		}
 	} );
 	} );
 }
 }
@@ -295,10 +315,10 @@ if ( postcount.length ) {
 	postcount.forEach( function(radio) {
 	postcount.forEach( function(radio) {
 		radio.addEventListener( 'change', function() {
 		radio.addEventListener( 'change', function() {
 			if ( radio.id === 'wb-settings-postcount-both' ) {
 			if ( radio.id === 'wb-settings-postcount-both' ) {
-				postcountinput.setAttribute('style', 'display: none;');
+				postcountinput.style.display = 'none';
 			}
 			}
 			else {
 			else {
-				postcountinput.removeAttribute('style');
+				postcountinput.style.display = '';
 			}
 			}
 		} );
 		} );
 	} );
 	} );
@@ -331,13 +351,13 @@ if ( addRole && addRoleButton ) addRoleButton.onclick = function() {
 		var selectedRoleInfo = selectedRole.textContent.split(' – ');
 		var selectedRoleInfo = selectedRole.textContent.split(' – ');
 		var newPermissionSpan = document.createElement('span');
 		var newPermissionSpan = document.createElement('span');
 		newPermissionSpan.textContent = ( selectedRoleInfo[1] || selectedRoleInfo[0] );
 		newPermissionSpan.textContent = ( selectedRoleInfo[1] || selectedRoleInfo[0] );
-		newPermissionSpan.setAttribute('title', selectedRoleInfo[0]);
+		newPermissionSpan.title = selectedRoleInfo[0];
 		var newPermissionDiv0 = document.createElement('div');
 		var newPermissionDiv0 = document.createElement('div');
 		newPermissionDiv0.classList.add('wb-settings-permission');
 		newPermissionDiv0.classList.add('wb-settings-permission');
 		var newPermissionInput = document.createElement('input');
 		var newPermissionInput = document.createElement('input');
-		newPermissionInput.setAttribute('type', 'radio');
-		newPermissionInput.setAttribute('name', 'permission-' +  addRole.value);
-		newPermissionInput.setAttribute('required', '');
+		newPermissionInput.type = 'radio';
+		newPermissionInput.name = 'permission-' +  addRole.value;
+		newPermissionInput.required = true;
 		newPermissionDiv0.append(newPermissionInput, document.createElement('label'));
 		newPermissionDiv0.append(newPermissionInput, document.createElement('label'));
 		/** @type {HTMLDivElement} */
 		/** @type {HTMLDivElement} */
 		var newPermissionDiv1 = newPermissionDiv0.cloneNode(true);
 		var newPermissionDiv1 = newPermissionDiv0.cloneNode(true);
@@ -346,20 +366,20 @@ if ( addRole && addRoleButton ) addRoleButton.onclick = function() {
 		newPermissionDiv0.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-0';
 		newPermissionDiv0.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-0';
 		newPermissionDiv1.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-1';
 		newPermissionDiv1.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-1';
 		newPermissionDiv2.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-default';
 		newPermissionDiv2.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-default';
-		newPermissionDiv0.firstElementChild.setAttribute('value', '0');
-		newPermissionDiv1.firstElementChild.setAttribute('value', '1');
-		newPermissionDiv2.firstElementChild.setAttribute('value', '');
-		newPermissionDiv0.lastElementChild.setAttribute('for', 'wb-settings-permission-' + addRole.value + '-0');
-		newPermissionDiv1.lastElementChild.setAttribute('for', 'wb-settings-permission-' + addRole.value + '-1');
-		newPermissionDiv2.lastElementChild.setAttribute('for', 'wb-settings-permission-' + addRole.value + '-default');
+		newPermissionDiv0.firstElementChild.value = '0';
+		newPermissionDiv1.firstElementChild.value = '1';
+		newPermissionDiv2.firstElementChild.value = '';
+		newPermissionDiv0.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-0';
+		newPermissionDiv1.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-1';
+		newPermissionDiv2.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-default';
 		newPermissionDiv0.lastElementChild.textContent = i18nSlashPermission.deny;
 		newPermissionDiv0.lastElementChild.textContent = i18nSlashPermission.deny;
 		newPermissionDiv1.lastElementChild.textContent = i18nSlashPermission.allow;
 		newPermissionDiv1.lastElementChild.textContent = i18nSlashPermission.allow;
 		newPermissionDiv2.lastElementChild.textContent = i18nSlashPermission.default;
 		newPermissionDiv2.lastElementChild.textContent = i18nSlashPermission.default;
-		newPermissionDiv2.firstElementChild.setAttribute('checked', '');
+		newPermissionDiv2.firstElementChild.defaultChecked = true;
 		newPermission.append(newPermissionSpan, newPermissionDiv0, newPermissionDiv1, newPermissionDiv2);
 		newPermission.append(newPermissionSpan, newPermissionDiv0, newPermissionDiv1, newPermissionDiv2);
 		addRole.parentElement.after(newPermission);
 		addRole.parentElement.after(newPermission);
 		selectedRole.remove();
 		selectedRole.remove();
-		addRole.firstElementChild.setAttribute('selected', '');
+		addRole.firstElementChild.selected = true;
 	}
 	}
 };
 };
 
 
@@ -373,6 +393,7 @@ if ( textAreas.length ) {
 	}
 	}
 
 
 	for ( var ta = 0; ta < textAreas.length; ta++ ) {
 	for ( var ta = 0; ta < textAreas.length; ta++ ) {
+		updateTextLength.call(textAreas[ta]);
 		textAreas[ta].addEventListener('keyup', updateTextLength);
 		textAreas[ta].addEventListener('keyup', updateTextLength);
 		textAreas[ta].addEventListener('keydown', allowTabs);
 		textAreas[ta].addEventListener('keydown', allowTabs);
 		textAreas[ta].onclick = function() {
 		textAreas[ta].onclick = function() {

+ 2 - 2
dashboard/verification.js

@@ -319,13 +319,13 @@ function dashboard_verification(res, $, guild, args, dashboardLang) {
 						),
 						),
 						$('<div>').append(
 						$('<div>').append(
 							$('<label for="wb-settings-success">').text(dashboardLang.get('verification.form.success')).append(
 							$('<label for="wb-settings-success">').text(dashboardLang.get('verification.form.success')).append(
-								$('<div>').text(( row?.onsuccess || '' ).length + ' / 1000')
+								$('<div>').html('&nbsp;')
 							),
 							),
 							$('<textarea id="wb-settings-success" name="success" spellcheck="true" maxlength="1000" cols="65">').attr('rows', ( row?.onsuccess || '' ).split('\n').length + 3).attr('placeholder', dashboardLang.get('verification.form.success_placeholder')).text(row?.onsuccess || '')
 							$('<textarea id="wb-settings-success" name="success" spellcheck="true" maxlength="1000" cols="65">').attr('rows', ( row?.onsuccess || '' ).split('\n').length + 3).attr('placeholder', dashboardLang.get('verification.form.success_placeholder')).text(row?.onsuccess || '')
 						),
 						),
 						$('<div>').append(
 						$('<div>').append(
 							$('<label for="wb-settings-match">').text(dashboardLang.get('verification.form.match')).append(
 							$('<label for="wb-settings-match">').text(dashboardLang.get('verification.form.match')).append(
-								$('<div>').text(( row?.onmatch || '' ).length + ' / 1000')
+								$('<div>').html('&nbsp;')
 							),
 							),
 							$('<textarea id="wb-settings-match" name="match" spellcheck="true" maxlength="1000" cols="65">').attr('rows', ( row?.onmatch || '' ).split('\n').length + 3).attr('placeholder', dashboardLang.get('verification.form.match_placeholder')).text(row?.onmatch || '')
 							$('<textarea id="wb-settings-match" name="match" spellcheck="true" maxlength="1000" cols="65">').attr('rows', ( row?.onmatch || '' ).split('\n').length + 3).attr('placeholder', dashboardLang.get('verification.form.match_placeholder')).text(row?.onmatch || '')
 						),
 						),

+ 5 - 1
functions/verify.js

@@ -27,7 +27,7 @@ function verify(lang, channel, member, username, wiki, rows, old_username = '')
 			embed: null
 			embed: null
 		}
 		}
 	};
 	};
-	return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&list=users&usprop=blockinfo|groups|editcount|registration|gender&ususers=' + encodeURIComponent( username ) + '&format=json' ).then( response => {
+	return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&list=users' + ( wiki.isFandom() ? '|usercontribs&ucprop=&uclimit=10&ucuser=' + encodeURIComponent( username ) : '' ) + '&usprop=blockinfo|groups|editcount|registration|gender&ususers=' + encodeURIComponent( username ) + '&format=json' ).then( response => {
 		var body = response.body;
 		var body = response.body;
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( body && body.warnings ) log_warn(body.warnings);
 		if ( response.statusCode !== 200 || body?.batchcomplete === undefined || !body?.query?.users ) {
 		if ( response.statusCode !== 200 || body?.batchcomplete === undefined || !body?.query?.users ) {
@@ -147,6 +147,10 @@ function verify(lang, channel, member, username, wiki, rows, old_username = '')
 					return;
 					return;
 				}
 				}
 				
 				
+				if ( body.query.usercontribs?.length >= queryuser.editcount ) {
+					queryuser.editcount = body.query.usercontribs.length;
+					if ( body.continue?.uccontinue ) queryuser.editcount++;
+				}
 				var roles = [];
 				var roles = [];
 				var missing = [];
 				var missing = [];
 				var verified = false;
 				var verified = false;