사용자:BANIP/플러그인/랭킹시스템: 두 판 사이의 차이
백괴게임>BANIP (새로운플러그인생성) |
백괴게임>BANIP 잔글 (nowiki 추가) |
||
13번째 줄: | 13번째 줄: | ||
{{#vardefine:code| | {{#vardefine:code| | ||
// 이부부분에 코드 입력 // | // 이부부분에 코드 입력 // | ||
/** | <nowiki>/** | ||
* @param | * @param | ||
{string} documentTitle 랭킹정보가 있는 문서의 제목. | {string} documentTitle 랭킹정보가 있는 문서의 제목. | ||
31번째 줄: | 31번째 줄: | ||
{object} alternateKeys 랭킹에서 보여지는 대체 키 | {object} alternateKeys 랭킹에서 보여지는 대체 키 | ||
*/ | */ | ||
return function(documentTitle, sortCallback, api){ | |||
function forEach(object, callback){ | function forEach(object, callback){ | ||
for(var key in object){ | for(var key in object){ | ||
117번째 줄: | 117번째 줄: | ||
} | } | ||
return actions; | return actions; | ||
}</nowiki> | |||
}} | }} | ||
2018년 2월 2일 (금) 13:42 판
// 이부부분에 코드 입력 // /** * @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; }