사용자:Senouis/common.js

리버티게임, 모두가 만들어가는 자유로운 게임
< 사용자:Senouis
imported>Senouis님의 2023년 5월 30일 (화) 02:25 판 (OK, 생성 1차 시도 갑니다!)

참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
  • 오페라: Ctrl-F5를 입력.
/** 플러그인 autosave***************************
* 자동저장 시스템을 위한 플러그인
* 버전 => 2.0.2
* 작성자 : [[사용자:Manymaster|Manymaster]] 
* JSON => autosave = {"name":"autosave","descript":"자동저장 시스템을 위한 플러그인","version":"2.0.2","local":false,"creat":"Manymaster","state":"틀:자동저장/플러그인","executable":true}; 
*/ 
function plugin_autosave(){
		 
/* 작동 가능한 네임스페이스 */
var safeNameSpace = [""];
/* autosave 편집모드가 아닐 경우 플러그인 종료 */
var searchParams = geturlSearch(location);
var isEditMode = searchParams.action === "edit";
var isAutosaveMode = searchParams.autosave === "1";
if (!(isEditMode && isAutosaveMode)) return "";

/* 자동 저장하기에 안전한 네임스페이스가 아닌 경우 플러그인 종료 */
var thisNamespaceNumber = mw.config.get("wgNamespaceNumber");
var nameSpaceIds = mw.config.get("wgNamespaceIds");
var isSafeNameSpace = safeNameSpace
    .map(function (namespace) { return nameSpaceIds[namespace]; })
    .some(function (nsNumber) { return nsNumber == thisNamespaceNumber; });
if (!(isSafeNameSpace)) return "";

/* 자동 인증된 사용자가 아닌 경우 플러그인 종료 */
var userGroups = mw.config.get('wgUserGroups');
var autocheck = 0;
if (userGroups) {
    for (var i = 0; i < userGroups.length; i++) {
        if (userGroups[i] === 'autoconfirmed') {
            autocheck++;
        }
    }
}
if (autocheck != 1) return "";

/* 지정된 단락에서 불러오기 */
var savetempDom = $(".game-autosave");
if ($(".game-autosave").length === 0)
    throw new Error("autosave => game-autosave를 클래스명으로 가진 돔을 찾을 수 없습니다.");
var savetemp = $(".game-autosave").html();

/* 문제가 되는 문자열 치환 */
savetemp = savetemp.replace(/(<([^>]+)>)/ig, "");
savetemp = savetemp.replace(/\n+/gi, "\n");
savetemp = savetemp.replace("\n", "");
savetemp = savetemp.replace(/&lt;/gi, "<");
savetemp = savetemp.replace(/&gt;/gi, ">");

/* 기록, 저장하고 빠져나오기 */
$("#wpTextbox1").val(savetemp);
$("#wpSave").click();
return;

/** 이 플러그인 제작을 도와주신 분들
 * Ver 2 제작자: [[사용자:BANIP|BANIP]]
 * 원 코드 작성자: [[사용자:*devunt]]
*/ 

		
}
$( plugin_autosave );
/* autosave 끝 */

/** Javascript 기반 게임별 game.json 하위 문서 생성 매크로
 * [[리버티게임:게임 목록]]에서 전체 게임 목록을 열고 기능을 사용
 * 원 제작자: [[사용자:Hsl0|Hsl0]]
 * 1차 수정자: [[사용자:Senouis]]
 */
 function scrapMetadata(category) {
    return $('#gamelist-' + category + ' li').map(function() {
        var elem = this;
        var $status = $(this).find('.old-gameicon-status');
        var nameElement = this.querySelector('.old-gameicon-name a');
		
		if (!nameElement) return;
		
		if (nameElement.classList && nameElement.classList.contains("new")) {
			console.warn('존재하지 않는 게임 건너뜀');
			return;
		}
		
        if(!$status.length) {
            console.warn('유효하지 않은 게임아이콘:', elem);
            return;
        }

        if($status.is('.old-gameicon-noautomigration')) {
            console.info('건너뜀:', nameElement.innerText, elem);
            return;
        }
		
        var data = $status.data();
        data = {
            progress: data.progress === ""? null : data.progress,
            editpolicy: data.edit === ""? null : data.edit,
            platform: data.platform === ""? null : data.tech,
            rating: data.rating === ""? null : data.rating,
            genre: category
        };

        var url = new URL(nameElement.href);
        var title;

        if(url.pathname === '/w/index.php') title = url.searchParams.get('title');
        else if(url.pathname.startsWith('/wiki/')) title = url.pathname.slice(6);
        else {
            console.error('잘못된 링크:', nameElement, data, elem);
            throw new TypeError('게임 링크가 잘못되었습니다. 수동으로 미리 처리하십시오.');
        }
        title = decodeURIComponent(title);
        data.title = title;
        console.log("Game ", title, "Detected");
        data.name = nameElement.innerText;
        if(data.title.includes('/')) console.warn('하위 문서:', data.title, data, elem);
        if(new mw.Title(data.title).getNamespacePrefix() !== '') console.warn('다른 이름공간:', data.title, data, elem);

        var maker = $(this).find('.old-gameicon-maker');

        data.contributor = maker.find('.old-gameicon-helper a').map(function() {
            var url = new URL(this.href);
            if(url.searchParams.has('title')) return url.searchParams.get('title').slice(4).split('/')[0].replace(/_/g, ' ');
            else return decodeURIComponent(url.pathname.slice(6)).slice(4).split('/')[0].replace(/_/g, ' ');
        }).toArray();
        if(!data.contributor.length) data.contributor = null;
        else if(data.contributor.length === 1) data.contributor = data.contributor[0];
        if(maker.find('.old-gameicon-helper:not(:has(a))').length) {
            console.error('조력자 없음:', data.title, data, elem);
            throw new TypeError('존재하지만 링크가 걸리지 않아 수집할 수 없는 조력자 발견. 수동으로 미리 처리하십시오.');
        }

        data.author = maker.find('a:not(.old-gameicon-helper a)').map(function() {
            var url = new URL(this.href);
            if(url.searchParams.has('title')) return new mw.Title(url.searchParams.get('title'));
            else return new mw.Title(decodeURI(url.pathname.slice(6)));
        }).toArray().map(function(title) {
            if(title.getNamespacePrefix() !== '사용자:')
                console.warn('사용자가 아닌 개발자:', title.getPrefixedText(), data.title, data, elem);
            return title.getRelativeText(mw.config.get('wgNamespaceIds')['사용자']);
        }).filter(function(user) {
            return user;
        });
        if(data.author.length === 1) data.author = data.author[0];
        else if(!data.author || !data.author.length) console.warn('개발자 없음:', data.title, data, elem);
        else if(new Set(data.author).size !== data.author.length) {
            console.warn('중복된 개발자:', data.author, data.title, data, elem);
            data.author = Array.from(new Set(data.author));
            if(data.author.length === 1) data.author = data.author[0];
        }

        switch(data.editpolicy) {
            case 0: data.editpolicy = 'closed'; break;
            case 1: data.editpolicy = 'limited'; break;
            case 2: data.editpolicy = 'open'; break;
            case 3:
                data.editpolicy = null;
                data.abandon = true;
                break;
        }

        switch(data.platform) {
            case "링크":
            case "CGI":
            case "DB":
            case "JS":
            case "Lua":
            case "루아":
                data.platform = 'web';
                break;
            case "윈도우":
                data.platform = "windows";
                break;
            case "기타":
                data.platform = "other";
                break;
        }

        if(data.rating === '전체') data.rating = 'all';
        else if(data.rating === '평가용') data.rating = 'test';
        data.rating = {
            libertygame: {
                age: data.rating
            }
        };

        data.elem = elem;

        return data;
    });
}
function compareMetadata(a, b) {
    return a.progress === b.progress && a.editpolicy === b.editpolicy && a.platform === b.platform && a.rating === b.rating && a.contributor === b.contributor && a.author === b.author && a.name === b.name && a.abandon === b.abandon;
}
function mergeMetadata(datas) {
    var datamap = {};

    for(var elem1 in datas) {
    	var list = datas[elem1];
    	if ($.isNumeric(elem1)) {
	        for(var elem2 in list) {
	        	var data = list[elem2];
	        	if ($.isNumeric(elem2)) {
		            if(datamap[data.title]) {
		                var category = datamap[data.title].genre;
						console.log(elem2," idx element is  ",category);
		                if(category.includes(data.category)) {
		                    console.warn('같은 카테고리 중복 등록:', data.title, data.category, datamap[data.title], data, data.elem);
		                }
		
		                if(!compareMetadata(datamap[data.title], data)) {
		                    console.error('데이터 불일치:', data.title, datamap[data.title], data, data.elem);
		                    throw new TypeError('데이터가 일치하지 않는 중복 등록된 게임 발견. 수동으로 미리 처리하십시오.');
		                }
		
		                if(typeof category === 'string') category = [category, data.genre];
		                else category.push(data.genre);
		
		                datamap[data.title].genre = category;
		            } else {datamap[data.title] = data;}
		            
		            delete data.elem;
		            delete data.title;
		
		            if(!data.contributor) delete data.contributor;
		        }
	        }
    	}
    }

    return datamap;
}

function saveMetadata(map) {
    var api = new mw.Api();
    var tasks = [];
    
    for(var title in map) {
    	// json 문서 생성 요청
    	
        tasks.push(api.create(title + '/game.json', {
            summary: "게임 메타데이터 생성",
            bot: true,
            watchlist: "nochange",
            contentformat: "application/json",
            contentmodel: "json"
        }, JSON.stringify(map[title]))).then(console.log(title));
        
    }
}
function createMetadata() {
    var categories = ["adv", "owd", "ral", "rod", "esc", "trp", "act", "puz", "qiz", "brd", "mus", "mlt", "prd", "csu", "wst", "rpg", "sim"];
    var datas = [];

    for(var idx in categories) {
    	var category = categories[idx];
        console.group('카테고리:', category);
        var thisData = scrapMetadata(category);
        datas.push(thisData);
        if(!thisData.length) console.warn('수집된 데이터 없음:', category, thisData);
        console.log('수집된 데이터:', category, thisData.length, thisData);
        console.groupEnd();
    }
	
    return mergeMetadata(datas);
}
/* game.json 매크로 끝 */