사용자:Senouis/ES6 관련 연구: 두 판 사이의 차이
잔글 (최종) |
(241026 보호 설정 매크로 추가) |
||
(같은 사용자의 중간 판 2개는 보이지 않습니다) | |||
84번째 줄: | 84번째 줄: | ||
if (counter < documentlist.length) { | if (counter < documentlist.length) { | ||
counter++; | counter++; | ||
setTimeout(editUserDoc, 500); | |||
} else { | } else { | ||
counter = 0; | counter = 0; | ||
92번째 줄: | 92번째 줄: | ||
console.log(documentlist[counter] + " exists, pass..."); | console.log(documentlist[counter] + " exists, pass..."); | ||
counter++; | counter++; | ||
setTimeout(editUserDoc, 500); | |||
} else { | |||
console.log("edit process ended"); | |||
counter = 0; | |||
} | } | ||
} | } | ||
99번째 줄: | 102번째 줄: | ||
// | // 백괴게임 시절 사용자/리버티게임 구 서버 사용자 중 사용자 문서 미회수자의 사용자 문서에 매크로 작업으로 {{사문동결}}을 붙이는 작업용 스크립트 끝 | ||
/** | |||
* 게임 평가 파싱 정보 구하기(GPLv2) | |||
*/ | |||
let targetlist = []; | |||
let ratingslist = []; | |||
function crawlingSectionRatings() { | |||
let api = new mw.Api(); | |||
api.get({ | |||
action: "query", | |||
list: "categorymembers", | |||
cmtitle: "분류:리버티게임", | |||
cmtype: "page", | |||
cmnamespace: 0, | |||
cmlimit: 500 | |||
}).then((result) => { | |||
for (const value of result.query.categorymembers){ | |||
fetch('https://libertyga.me/index.php?action=raw&title=토론:' + value.title).then((result)=>{ | |||
return result.text(); | |||
}).then((result)=>{ | |||
result = result.split("\n"); | |||
console.log(result); | |||
let elem = {"1":0, "2":0, "3":0, "4":0, "5":0}; | |||
let point = 6; | |||
if (!result.includes("== 이 게임 평가하기 ==") && !result.includes("== 평가 ==")&& !result.includes("== 게임 평가하기 ==")){ | |||
console.log("토론 문서에 평가가 없는 게임이 존재합니다."); | |||
return; | |||
} | |||
for (let i = 0 ; i < result.length; i++){ | |||
console.log(result[i]); | |||
if (result[i] === "=== 죽여준다 (Awesome!) ==="){ | |||
point=5; | |||
} else if (result[i] === "=== 기대이상 (Cool~) ==="){ | |||
point=4; | |||
} else if (result[i] === "=== 보통 (Normal) ==="){ | |||
point=3; | |||
} else if (result[i] === "=== 후지다 (Bad) ==="){ | |||
point=2; | |||
} else if (result[i] === "=== 국회의원 같다 (Disgusting) ==="){ | |||
point=1; | |||
} else if (result[i][1] === "=" && result[i][2] !== "=" && point === 1){ | |||
break; // 평가 문단을 벗어남 | |||
} else if (result[i] === "") { // 빈 줄 | |||
continue; | |||
} else if (point <= 5) { | |||
splitedline = result[i].split("#"); | |||
if (splitedline.length > 2 && result[i][1] === "#") continue; // 2단계 이상의 문자열로 간주 | |||
else if (splitedline[1] === "" || splitedline[1] === " ") continue; // 빈 평가 | |||
elem[point.toString()] += 1; | |||
} | |||
} | |||
ratingslist.push(elem); | |||
}); | |||
} | |||
}); | |||
} | |||
/** | |||
* 게임 평가 파싱 정보 구하기 끝 | |||
*/ | |||
/** | |||
* 리버티게임에서 특정 분류, 특정 이름공간의 문서들을 가져와 보호 설정을 '자동 인증된 사용자'로 변경하는 코드(퍼블릭 라이선스) | |||
*/ | |||
let timerInstance; | |||
let counter = 0; | |||
async function crawlAndProtect() { | |||
const api = new mw.Api(); | |||
const authorRequest = await api.get({ | |||
action: "query", | |||
list: "allpages", | |||
apnamespace: 0, | |||
apprtype: 'edit|move', | |||
apprlevel: 'author', | |||
aplimit: 500, | |||
format: "json", | |||
}); | |||
const authorProtected = authorRequest.query.allpages.map((value) => value.title); | |||
const getResult = await api.get({ | |||
action: "query", | |||
generator: "categorymembers", | |||
gcmtitle: "분류:리버티게임", | |||
gcmtype: "page", | |||
gcmnamespace: 0, | |||
gcmlimit: 500, | |||
prop: "info", | |||
format: "json", | |||
}); | |||
const titleArray = Object.values(getResult.query.pages).filter((value) => authorProtected.includes(value.title)).map((value) => value.title); | |||
console.log(titleArray); | |||
timerInstance = setInterval( () => { | |||
api.postWithToken('csrf', { | |||
action: 'protect', | |||
title: titleArray[counter], | |||
protections: "edit=autoconfirmed|move=autoconfirmed", | |||
expiry: "infinite", | |||
reason: 'AuthorProtect 전체 적용 설정의 문제로 인해 자동 인증된 사용자 이상의 권한으로 보호 설정 변경', | |||
format: "json", | |||
}).done((postResult) => { | |||
console.log(`Protect ${postResult.protect.title}`); | |||
}); | |||
if (counter >= titleArray.length) { | |||
clearInterval(timerInstance); | |||
counter = 0; | |||
} else { | |||
counter++; | |||
} | |||
}, 100); | |||
} | |||
$(crawlAndProtect); | |||
/** | |||
* 리버티게임에서 특정 분류, 특정 이름공간의 문서들을 가져와 보호 설정을 '자동 인증된 사용자'로 변경하는 코드 끝 | |||
*/ |
2024년 10월 26일 (토) 18:42 기준 최신판
/**
* 백괴게임 시절 사용자/리버티게임 구 서버 사용자 중 사용자 문서 미회수자의 사용자 문서에 매크로 작업으로 {{사문동결}}을 붙이는 작업용 스크립트
* 제작자: [[사용자: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);
} else {
console.log("edit process ended");
counter = 0;
}
}
// 이 아래는 임시로 작성하는 코드 - 위 코드들을 구현하기 위한 중간 단계
// 백괴게임 시절 사용자/리버티게임 구 서버 사용자 중 사용자 문서 미회수자의 사용자 문서에 매크로 작업으로 {{사문동결}}을 붙이는 작업용 스크립트 끝
/**
* 게임 평가 파싱 정보 구하기(GPLv2)
*/
let targetlist = [];
let ratingslist = [];
function crawlingSectionRatings() {
let api = new mw.Api();
api.get({
action: "query",
list: "categorymembers",
cmtitle: "분류:리버티게임",
cmtype: "page",
cmnamespace: 0,
cmlimit: 500
}).then((result) => {
for (const value of result.query.categorymembers){
fetch('https://libertyga.me/index.php?action=raw&title=토론:' + value.title).then((result)=>{
return result.text();
}).then((result)=>{
result = result.split("\n");
console.log(result);
let elem = {"1":0, "2":0, "3":0, "4":0, "5":0};
let point = 6;
if (!result.includes("== 이 게임 평가하기 ==") && !result.includes("== 평가 ==")&& !result.includes("== 게임 평가하기 ==")){
console.log("토론 문서에 평가가 없는 게임이 존재합니다.");
return;
}
for (let i = 0 ; i < result.length; i++){
console.log(result[i]);
if (result[i] === "=== 죽여준다 (Awesome!) ==="){
point=5;
} else if (result[i] === "=== 기대이상 (Cool~) ==="){
point=4;
} else if (result[i] === "=== 보통 (Normal) ==="){
point=3;
} else if (result[i] === "=== 후지다 (Bad) ==="){
point=2;
} else if (result[i] === "=== 국회의원 같다 (Disgusting) ==="){
point=1;
} else if (result[i][1] === "=" && result[i][2] !== "=" && point === 1){
break; // 평가 문단을 벗어남
} else if (result[i] === "") { // 빈 줄
continue;
} else if (point <= 5) {
splitedline = result[i].split("#");
if (splitedline.length > 2 && result[i][1] === "#") continue; // 2단계 이상의 문자열로 간주
else if (splitedline[1] === "" || splitedline[1] === " ") continue; // 빈 평가
elem[point.toString()] += 1;
}
}
ratingslist.push(elem);
});
}
});
}
/**
* 게임 평가 파싱 정보 구하기 끝
*/
/**
* 리버티게임에서 특정 분류, 특정 이름공간의 문서들을 가져와 보호 설정을 '자동 인증된 사용자'로 변경하는 코드(퍼블릭 라이선스)
*/
let timerInstance;
let counter = 0;
async function crawlAndProtect() {
const api = new mw.Api();
const authorRequest = await api.get({
action: "query",
list: "allpages",
apnamespace: 0,
apprtype: 'edit|move',
apprlevel: 'author',
aplimit: 500,
format: "json",
});
const authorProtected = authorRequest.query.allpages.map((value) => value.title);
const getResult = await api.get({
action: "query",
generator: "categorymembers",
gcmtitle: "분류:리버티게임",
gcmtype: "page",
gcmnamespace: 0,
gcmlimit: 500,
prop: "info",
format: "json",
});
const titleArray = Object.values(getResult.query.pages).filter((value) => authorProtected.includes(value.title)).map((value) => value.title);
console.log(titleArray);
timerInstance = setInterval( () => {
api.postWithToken('csrf', {
action: 'protect',
title: titleArray[counter],
protections: "edit=autoconfirmed|move=autoconfirmed",
expiry: "infinite",
reason: 'AuthorProtect 전체 적용 설정의 문제로 인해 자동 인증된 사용자 이상의 권한으로 보호 설정 변경',
format: "json",
}).done((postResult) => {
console.log(`Protect ${postResult.protect.title}`);
});
if (counter >= titleArray.length) {
clearInterval(timerInstance);
counter = 0;
} else {
counter++;
}
}, 100);
}
$(crawlAndProtect);
/**
* 리버티게임에서 특정 분류, 특정 이름공간의 문서들을 가져와 보호 설정을 '자동 인증된 사용자'로 변경하는 코드 끝
*/