사용자:BANIP/플러그인/랭킹시스템

리버티게임, 모두가 만들어가는 자유로운 게임
< 사용자:BANIP
백괴게임>BANIP님의 2018년 2월 2일 (금) 13:42 판 (nowiki 추가)
요령 => 아래 변수들의 첫번째 인자들을 내용에 맞게 자르고 붙여넣어주세요

!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 윗부분은 만지지 마시오 절대로!!!!!!!!!!!!!!!!!






!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!!

		 // 이부부분에 코드 입력 //
/**
  * @param 
  		{string} documentTitle 랭킹정보가 있는 문서의 제목.
  		{function} sortCallback 랭킹을 정렬할때 기준으로 사용하는 함수
  		    {any} prev 랭킹 정렬 기준으로 사용할 왼쪽의 값
  		   	{any} next 랭킹 정렬 기준으로 사용할 오른쪽의 값
  		{object} api MediaWikiapi의 인스턴스, 없어도 됨.

  	@return {Object}
  		{function} get 랭킹정보를 object형태로 획득
  		{function} update 랭킹정보 업데이트
  			{object} updateInfo 업데이트할 사용자 정보
  			{function} updateCriteria 사용자정보의 업데이트 기준
  			@param {any} rankingScore 랭킹에서 사용중인 스코어
  				   {any} thisScore 사용자 스코어
  			@return{bool} true가 반환되면 업데이트
  			{object} alternateKeys 랭킹에서 보여지는 대체 키
*/
return function(documentTitle, sortCallback, api){
    function forEach(object, callback){
        for(var key in object){
            var variable = object[key];
            callback(variable,key);
        }
    }

	function getRankingJSON(rankingDoc) {
		console.log(rankingDoc)
		if(!rankingDoc) return {};
	    var regexp = /\<includeonly\>(.*)\<\/includeonly\>/;
	    var stringRanking = regexp.exec(rankingDoc)[1];
	    return JSON.parse(stringRanking);
	}

	function updateDoc(rankingJSON, api, alternateKeys) {
		//alternateKeys가 반영된 개개인의 랭킹정보 획득
		function getOutputJSON(json){
			var result = {};
			forEach(json,function(value,key){
				key = alternateKeys[key] || key;
				result[key] = value;
			})
			return result;
		}

		//보여지는 형태의 랭킹정보 획득
		function getOutputString(json){
			var name = json.name;
			var result = "* '''" + name + "''' : ";
			forEach(json,function(value,key){
				if(key === "name") return;
				key = alternateKeys[key] || key;
				result += key + ": " + value + ", ";
			})

			return result
		}

	    var stringRanking = JSON.stringify(rankingJSON);
	    var result = "<includ" + "eonly>" + stringRanking + "</inclu" + "deonly>\n";
	    result += "<onlyin" + "clude>\n";

		var rankingList = Object.keys(rankingJSON);
	    rankingList.sort(sortCallback);
	    rankingList.forEach(function(key) {
	    	var json = rankingJSON[key];
	       	var outputJSON = getOutputJSON(json);
	       	result += getOutputString(outputJSON)
	    });

	    result += "</only" + "include>";
	    api.changeDocument("백괴슬라이드/랭킹", "백괴슬라이드 점수 갱신", result, true);
	    return result;
	}

	function updateUserScore(rankingJSON, thisScore, updateCriteria) {
		updateCriteria = updateCriteria || function(rankingScore, thisScore){
			return rankingScore.score < thisScore.score;
		}

	    var userName = thisScore.name;
	    var rankingScore = rankingJSON[userName];

	    if (!rankingScore || updateCriteria(rankingScore, thisScore)) {
	        rankingJSON[userName] = thisScore;
	    }
	}

	api = api || MediaWikiAPI();
	var userName = mw.config.get("wgUserName");
	var rankingDoc = api.getDocument( documentTitle );
	var rankingJSON = getRankingJSON(rankingDoc);

	var actions = {
		get:function(){
			return rankingJSON;
		},
		update:function(updateInfo,updateCriteria,alternateKeys){
			rankingJSON = actions.get();
			updateUserScore(rankingJSON, updateInfo,updateCriteria);
			updateDoc(rankingJSON, api, alternateKeys);
		}
	}
	return actions;
    }