사용자:Senouis/ES6 관련 연구: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
잔글 (최종 단계)
잔글 (최종)
78번째 줄: 78번째 줄:
var userSearchResult = binarysearch(userlist, documentlist[counter], 0, userlist.length);
var userSearchResult = binarysearch(userlist, documentlist[counter], 0, userlist.length);
if (userSearchResult === -1) {
if (userSearchResult === -1) {
var api = new mw.Api();
console.log(documentlist[counter] + " not exists!");
api.edit("사용자:"+documentlist[counter], (revision) => {return revision.content.concat("\n{{사문동결}}");}).then((result) => {
var api = new mw.Api();
console.log(result);
api.edit("사용자:"+documentlist[counter], (revision) => {return revision.content.concat("\n{{사문동결}}");}).then((result) => {
if (counter < documentlist.length) {
console.log("Edit Success!");
counter++;
if (counter < documentlist.length) {
SetTimeout(editUserDoc, 500);
counter++;
} else {
SetTimeout(editUserDoc, 500);
counter = 0;
} else {
}
counter = 0;
});
}
});
} else if (counter < documentlist.length) {
} else if (counter < documentlist.length) {
console.log(documentlist[counter] + " exists, pass...");
counter++;
counter++;
SetTimeout(editUserDoc, 500);
SetTimeout(editUserDoc, 500);

2023년 11월 14일 (화) 13:08 판

/**
 * 백괴게임 시절 사용자/리버티게임 구 서버 사용자 중 사용자 문서 미회수자의 사용자 문서에 매크로 작업으로 {{사문동결}}을 붙이는 작업용 스크립트
 * 제작자: [[사용자:Senouis]], Licensed under LGPL v2 
 */
// 로직 시작
// 로직 설명: Allusers 미디어위키 쿼리 API로 현재 사용자 이름을 확보하여 userlist에 삽입(너무 늦게 이 매크로를 돌리면 수정이 필요할 수 있음)
var userlist = [];
function makeUserList(){
	var api = new mw.Api();
	api.get({action:"query", list:"allusers",format:"json",aulimit:100})
	.then((result) => {
		for (var elem of result.query["allusers"]){
			userlist.push(elem["name"]);
		}
	});
}

// 로직 설명: 병합 정렬(userlist)
function mergesort(arr, start, end) {
	if (end - start <= 1) {
		return;
	} else {
		var middle = Math.floor( (end - start) / 2 );
		mergesort(arr, start, start + middle);
		mergesort(arr, start + middle, end);
		var temparr1 = arr.slice(start, start + middle);
		var tempidx1 = 0;
		var temparr2 = arr.slice(start+middle, end);
		var tempidx2 = 0;
		for (var idx in arr){
			if (tempidx1 == middle) {
				arr[idx] = temparr2[tempidx2++];
			} else if (tempidx2 == end - start - middle) {
				arr[idx] = temparr1[tempidx1++];
			}
			else if (temparr1[tempidx1] <= temparr2[temparr2]) {
				arr[idx] = temparr1[tempidx1++];
			} else {
				arr[idx] = temparr2[tempidx2++];
			}
		}
	}
}

// 로직 설명: 이진 탐색(userlist), value는 string, index를 찾지 못할 경우 -1 반환
function binarysearch(arr, value, start, end) {
	if (end - start <= 0) {
		if (arr[start] == value) return start;
		return -1;
	}
	var middle = Math.floor((end - start) / 2);
	if (arr[start + middle] == value) {return start + middle;}
	else if (arr [start+middle] > value) {return binarysearch(arr, value, start, start + middle); }
	else {return binarysearch(arr, value, start+middle+1, end);}
}


// 로직 설명: Allpages 쿼리 API의 apnamespace 파라미터에 2(사용자 문서 이름 공간), aplimit 파라미터에 50을 넘기고 API 호출을 하며, rawcontinue 파라미터를 공백이 아닌 문자로 두어 연속적으로 호출하면서 ["query-continue"]["allpages"]["apcontinue"]의 값을 다시 쿼리에 넘겨 결과들을 합칠 수 있도록 처리
// 0.5초 간격의 Allpages 쿼리로 모은 promise에서 then으로 받는 result를 iterate하여 ["query"]["allpages"]["title"]를 전부 읽어서 documentlist에 저장
var documentlist = [];
function makeUserDocList(continuestr=undefined){
	var api = new mw.Api();
	api.get({action:"query", list:"allpages", apnamespace:2, format:"json",aplimit:100, rawcontinue:"", apcontinue:continuestr})
	.then((result) => {
		for (var elem of result.query["allpages"]){
			if (elem["title"].includes('/')) continue;
			documentlist.push(elem["title"].slice(4));
		}
		if(result["query-continue"] !== undefined){
			makeUserDocList(result["query-continue"]["allpages"]["apcontinue"]);
		}
	});
}

// 로직 설명: 1초 간격으로 documentlist의 각 원소가 이름 사용자 문서 중에 userlist에 원소가 없으면 api.edit()을 날림
var counter = 0;
function editUserDoc() {
	var userSearchResult = binarysearch(userlist, documentlist[counter], 0, userlist.length);
	if (userSearchResult === -1) {
		console.log(documentlist[counter] + " not exists!");
		var api = new mw.Api();
		api.edit("사용자:"+documentlist[counter], (revision) => {return revision.content.concat("\n{{사문동결}}");}).then((result) => {
			console.log("Edit Success!");
			if (counter < documentlist.length) {
				counter++;
				SetTimeout(editUserDoc, 500);
			} else {
				counter = 0;
			}
		});
	} else if (counter < documentlist.length) {
		console.log(documentlist[counter] + " exists, pass...");
		counter++;
		SetTimeout(editUserDoc, 500);
	}
}

// 이 아래는 임시로 작성하는 코드 - 위 코드들을 구현하기 위한 중간 단계


// 로직 끝