사용자:BANIP/플러그인/랭킹시스템: 두 판 사이의 차이
백괴게임>BANIP 잔글 (유저와 유저사이에 간격추가) |
잔글 ("사용자:BANIP/플러그인/랭킹시스템" 문서를 보호했습니다: 방문이 많거나 리버티게임 프로젝트에서 중요한 문서: 실제 게임에서 사용하는 플러그인 코드는 자동 인증된 사용자부터 편집 가능하게 할 예정 + 추후 저자 보호로 수준을 올리는 것을 논의할 것 ([편집=자동 인증된 사용자만 허용] (무기한) [이동=자동 인증된 사용자만 허용] (무기한))) |
||
(사용자 3명의 중간 판 8개는 보이지 않습니다) | |||
6번째 줄: | 6번째 줄: | ||
{{#vardefine:name|RankingSystem}} | {{#vardefine:name|RankingSystem}} | ||
{{#vardefine:creat|BANIP}} | {{#vardefine:creat|BANIP}} | ||
{{#vardefine:version|1.0 | {{#vardefine:version|1.1.0}} | ||
{{#vardefine:descript|랭킹시스템 라이브러리}} | {{#vardefine:descript|랭킹시스템 라이브러리}} | ||
{{#vardefine:local|true}} | {{#vardefine:local|true}} | ||
32번째 줄: | 32번째 줄: | ||
{object} alternateKeys 랭킹에서 보여지는 대체 키 | {object} alternateKeys 랭킹에서 보여지는 대체 키 | ||
*/ | */ | ||
return function(documentTitle, sortCallback, api) { | return function(documentTitle, sortCallback, api) { | ||
function forEach(object, callback) { | function forEach(object, callback) { | ||
41번째 줄: | 42번째 줄: | ||
function getRankingJSON(rankingDoc) { | function getRankingJSON(rankingDoc) { | ||
if (!rankingDoc) return {}; | if (!rankingDoc) return {}; | ||
var regexp = | var includeOnlyString = "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); | ||
76번째 줄: | 77번째 줄: | ||
result += "<onlyin" + "clude>\n"; | result += "<onlyin" + "clude>\n"; | ||
var rankingList = Object. | 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) { | rankingList.forEach(function(key) { | ||
var json = rankingJSON[key]; | var json = rankingJSON[key]; | ||
85번째 줄: | 90번째 줄: | ||
result += "</only" + "include>"; | result += "</only" + "include>"; | ||
var reply = documentTitle.replace(new RegExp("\/.*"),"") + " 점수 갱신"; | |||
api.changeDocument(documentTitle, reply, result, true); | |||
return result; | return result; | ||
} | } | ||
123번째 줄: | 129번째 줄: | ||
!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!! | !!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!! | ||
</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; }