사용자:BANIP/플러그인/랭킹시스템: 두 판 사이의 차이

리버티게임(개발), 모두가 만들어가는 자유로운 게임
둘러보기로 이동 검색으로 이동
백괴게임>BANIP
(새로운플러그인생성)
 
잔글 (판 14개를 가져왔습니다: 백괴슬라이드/플러그인 테스트)
 
(사용자 4명의 중간 판 13개는 보이지 않습니다)
6번째 줄: 6번째 줄:
{{#vardefine:name|RankingSystem}}
{{#vardefine:name|RankingSystem}}
{{#vardefine:creat|BANIP}}
{{#vardefine:creat|BANIP}}
{{#vardefine:version|1.0.0}}
{{#vardefine:version|1.1.0}}
{{#vardefine:descript|랭킹시스템 라이브러리}}
{{#vardefine:descript|랭킹시스템 라이브러리}}
{{#vardefine:local|true}}
{{#vardefine:local|true}}
13번째 줄: 13번째 줄:
{{#vardefine:code|
{{#vardefine:code|
  // 이부부분에 코드 입력 //
  // 이부부분에 코드 입력 //
<nowiki>
/**
/**
   * @param  
   * @param  
32번째 줄: 33번째 줄:
*/
*/


     function forEach(object, callback){
return function(documentTitle, sortCallback, api) {
         for(var key in object){
     function forEach(object, callback) {
         for (var key in object) {
             var variable = object[key];
             var variable = object[key];
             callback(variable,key);
             callback(variable, key);
         }
         }
     }
     }


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


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


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


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


    var stringRanking = JSON.stringify(rankingJSON);
        var rankingList = Object.entries(rankingJSON).sort(function(prev,next){
    var result = "<includ" + "eonly>" + stringRanking + "</inclu" + "deonly>\n";
          return sortCallback(prev[1],next[1])
    result += "<onlyin" + "clude>\n";
        }).map(function(value){
          return value[0]
        });


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


    result += "</only" + "include>";
        result += "</only" + "include>";
    api.changeDocument("백괴슬라이드/랭킹", "백괴슬라이드 점수 갱신", result, true);
        var reply = documentTitle.replace(new RegExp("\/.*"),"") + " 점수 갱신";
    return result;
        api.changeDocument(documentTitle, reply, result, true);
}
        return result;
    }


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


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


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


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


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


!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!!
{{플러그인/preset/css}}
</div>{{#switch: {{{1|화면}}}
</div>{{#switch: {{{1|화면}}}
|dump =  
|dump =  
|화면 =  
|화면 = {{플러그인/preset/각주}}
<p<includeonly></includeonly>re class="script" data-name="{{#var:name}}"  
<p<includeonly></includeonly>re class="script" data-name="{{#var:name}}"  
    data-create="{{#var:creat}}"  
    data-create="{{#var:creat}}"  

2024년 11월 14일 (목) 02:11 기준 최신판

요령 => 아래 변수들의 첫번째 인자들을 내용에 맞게 자르고 붙여넣어주세요

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






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

이 플러그인에 대한 설명문서는 사용자:BANIP/플러그인/랭킹시스템/설명문서에서 만들 수 있습니다.

		 // 이부부분에 코드 입력 //

/**
  * @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) {
        if (!rankingDoc) return {};
        var includeOnlyString = "includeonly"
        var regexp = new RegExp("\<" + includeOnlyString + "\>(.*)\<\/" + includeOnlyString + "\>");
        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 + ", ";
            })
            result += "\n"
            return result
        }

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

        var rankingList = Object.entries(rankingJSON).sort(function(prev,next){
          return sortCallback(prev[1],next[1])
        }).map(function(value){
          return value[0]
        });

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

        result += "</only" + "include>";
        var reply = documentTitle.replace(new RegExp("\/.*"),"") + " 점수 갱신";
        api.changeDocument(documentTitle, reply, 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;
}