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