사용자:BANIP/플러그인/랭킹시스템: 두 판 사이의 차이
백괴게임>BANIP 잔글 (nowiki 추가) |
잔글 ("사용자:BANIP/플러그인/랭킹시스템" 문서를 보호했습니다: 방문이 많거나 리버티게임 프로젝트에서 중요한 문서: 실제 게임에서 사용하는 플러그인 코드는 자동 인증된 사용자부터 편집 가능하게 할 예정 + 추후 저자 보호로 수준을 올리는 것을 논의할 것 ([편집=자동 인증된 사용자만 허용] (무기한) [이동=자동 인증된 사용자만 허용] (무기한))) |
||
(사용자 3명의 중간 판 11개는 보이지 않습니다) | |||
6번째 줄: | 6번째 줄: | ||
{{#vardefine:name|RankingSystem}} | {{#vardefine:name|RankingSystem}} | ||
{{#vardefine:creat|BANIP}} | {{#vardefine:creat|BANIP}} | ||
{{#vardefine:version|1. | {{#vardefine:version|1.1.0}} | ||
{{#vardefine:descript|랭킹시스템 라이브러리}} | {{#vardefine:descript|랭킹시스템 라이브러리}} | ||
{{#vardefine:local|true}} | {{#vardefine:local|true}} | ||
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){ | |||
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) { | |||
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; | |||
} | |||
</nowiki> | |||
}} | }} | ||
!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!! | !!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!! | ||
</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년 8월 13일 (화) 16:40 기준 최신판
이 플러그인에 대한 설명문서는 사용자: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; }