// ==UserScript==
// @name Steam 工作坊模组辅助脚本
// @namespace http://tampermonkey.net/
// @version 1.1
// @description 专门用来汇出与汇入工作坊模组清单的脚本!
// @author LaysDragon镭锶龙
// @match https://steamcommunity.com/id/*/myworkshopfiles/*
// @require https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.19.1/URI.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/lz-string/1.4.4/lz-string.min.js
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @grant none
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
window.URI = URI;
var $NJ = $;
window.$NJ = $;
$.noConflict()
//var URI = URI;
//var saveAs = saveAs;
if(typeof URI().query(true).appid === 'undefined' || URI().query(true).appid === "0"){
return;
}
//$NJ("head").append ('');
$NJ('.rightDetailsBlock:eq(1)').prepend('
');
$NJ('.rightDetailsBlock:eq(1)').prepend($NJ(' 汇入模组清单 ').click(startImport));
$NJ('.rightDetailsBlock:eq(1)').prepend($NJ(' 汇出模组清单 ').click(startExport));
$NJ('body').append($NJ(`
请填入存档字串或者JSON字串
`)); let $FileRead = $NJ('',{'type':'file'}); $FileRead.change(handleFileSelect) $Body.append($FileRead); let $TextArea = $NJ('' , { 'class': 'newmodal_prompt_textarea' } ); $Body.append( $NJ('', {'class': 'newmodal_prompt_with_textarea gray_bevel fullwidth ' } ).append( $TextArea ) ); var deferred = new jQuery.Deferred(); var fnOK = function() { deferred.resolve( $TextArea.val() ); }; var fnCancel = function() { deferred.reject(); }; let $okButton = $NJ('', {type: 'submit', 'class': 'btn_green_white_innerfade btn_medium' } ).append( $NJ( '' ).text( '确定' ) ); $okButton.click( function(){ importing($TextArea.val()); Modal.Dismiss(); } ); deferred.always( function() { Modal.Dismiss(); } ); let $CancelButton = _BuildDialogButton( '取消' ); $CancelButton.click( fnCancel); let Modal = _BuildDialog( '汇入模组清单', $Body, [$okButton, $CancelButton ],fnCancel ); deferred.promise( Modal ); Modal.Show(); } } function tryParseJson(str) { try { var obj = JSON.parse(str); } catch (e) { return {success:false}; } return {success:true,data:obj}; } function importing(data){ try{ if(typeof data === "string"){ var data = tryParseData(data); } setImportListData(data); if(data.appid!==getAppID()){ throw new Error(`该存档字串游戏为 ${data.name}(${data.appid}) 不符合当前游戏 ${getAppName()}(${getAppID()})!`); return; } ShowConfirmDialog('清空模组列表','请问是否要清空现有的模组列表?','清空','保留') .done( function(){ setFlag('TASK_CLEAR_IMPORT'); startExport(); }) .fail( function(){ SubscribeAll(data.mods,getAppID()); }); }catch(e){ ShowAlertDialog('错误',e.message); } } function tryParseData(text){ if(text.trim()===''){ throw new Error('字串不能为空!'); return; } text = text.trim(); let data = tryParseJson(text); if(data.success){ return data.data; }else{ try{ let data = JSON.parse(LZString.decompressFromBase64(text)); return data; }catch (e) { throw new Error('字串解析错误!'); return; } } } function saveListText(data){ let text = data.mods.map(item=>`${item.name} https://steamcommunity.com/sharedfiles/filedetails/?id=${item.id}`).join('\r\n'); saveText(text,`${getUserID()} ${getAppName()}(${getAppID()}) ${data.date} ${data.mods.length}个模组 清单.txt`); } function saveJson(data){ let text = JSON.stringify(data); saveText(text,`${getUserID()} ${getAppName()}(${getAppID()}) ${data.date} ${data.mods.length}个模组 JSON.json`); } function saveText(text,filename){ let dialog = ShowBlockingWaitDialog('匯出資料','脚本正在生成檔案中,请稍后...') setTimeout(()=>dialog.Dismiss(),3000); let data = new Blob([text], {type: 'text/plain;charset=utf-8'}); saveAs(data, filename); } function timeout(time){ return new Promise(function(resolve, reject) { setTimeout(resolve,time); }); } function SubscribeAll(mods, appID ){ let progressText = $NJ(''); progressText.append('正在进行订阅程序...'); let progressTextUpdated = $NJ(`${mods[0].name}(0/${mods.length})`); progressText.append(progressTextUpdated); let progress = ShowBlockingWaitDialog('处理中',progressText) var p = Promise.resolve(); mods.forEach((mod,index) => p = p.then(() => timeout(100)).then(()=>SubscribeItem(mod,appID)).then(()=>progressTextUpdated.text((index+1)>=mods.length?`訂閱完成,共计${mods.length}个模组`:`${mods[index+1].name}(${index+1}/${mods.length})`)) ); p.catch(function(e){ progress.Dissmiss(); ShowAlertDialog( '錯誤', '訂閱時發生錯誤:'+e.message ); }); p.then(function(){ progress.Dismiss(); ShowAlertDialog( '成功', `訂閱完成,共计${mods.length}个模组` ).done( function(){ location.href = URI().search(function(data) { data.p = 1; return data; }).toString(); }); }); } function SubscribeItem( mod, appID ) { return new Promise(function(resolve, reject) { $('PublishedFileSubscribe').id.value = mod.id; $('PublishedFileSubscribe').appid.value = appID; $('PublishedFileSubscribe').request( { onSuccess: resolve } ); }); } function UnsubscribeAll() { var confirmDialog = ShowConfirmDialog( '全部取消訂閱?', '您確定要取消所有 Starbound 的訂閱嗎?本次的模组共${data.mods.length}个${getFlag('TASK_CLEAR_IMPORT')?',清空前请妥善保存模组存档资料':''}
`)); //$Body.append( $NJ(`模組清单json
`)); //let $TextArea = $NJ('' ); //$TextArea.text( JSON.stringify(data) ); //$TextArea.click(function(){this.select();}) //$Body.append( $NJ('', {'class': 'newmodal_prompt_with_textarea gray_bevel fullwidth ' } ).append( $TextArea ) ); $Body.append( $NJ(`存档字串,直接复制即可使用
`)); let $TextArea = $NJ('' , { 'class': 'newmodal_prompt_textarea', 'readonly':true } ); $TextArea.text( LZString.compressToBase64(JSON.stringify(data))); $TextArea.click(function(){this.select();}) $Body.append( $NJ('', {'class': 'newmodal_prompt_with_textarea gray_bevel fullwidth ' } ).append( $TextArea ) ); let $copyButton = $NJ('', {type: 'submit', 'class': 'btn_green_white_innerfade btn_medium' } ).append( $NJ( '' ).text( '复制' ) ); $copyButton.click( function(){ $TextArea.select(); document.execCommand('copy'); ShowAlertDialog('成功','字串已复制到剪贴簿!'); } ); let $listButton = $NJ('', {type: 'submit', 'class': 'btn_green_white_innerfade btn_medium' } ).append( $NJ( '' ).text( getFlag('TASK_CLEAR_IMPORT')?'备份列表':'儲存列表' ) ); $listButton.click( function(){ saveListText(data); } ); let $jsonButton = $NJ('', {type: 'submit', 'class': 'btn_green_white_innerfade btn_medium' } ).append( $NJ( '' ).text( getFlag('TASK_CLEAR_IMPORT')?'备份JSON':'儲存JSON' ) ); $jsonButton.click( function(){ saveJson(data); } ); let buttonList = [$copyButton, $listButton, $jsonButton ]; if(getFlag('TASK_CLEAR_IMPORT')){ let $continueClearImportButton = $NJ('', {type: 'submit', 'class': 'btn_darkred_white_innerfade btn_medium' } ).append( $NJ( '' ).text( '清除所有并继续导入' ) ); $continueClearImportButton.click( function(){ clearImportTask(); Modal.Dismiss(); } ); buttonList.push($continueClearImportButton) } let Modal = _BuildDialog( getFlag('TASK_CLEAR_IMPORT')?'模组列表备份完成':'模组列表收集完成', $Body,buttonList,function(){ Modal.Dismiss();;} ); Modal.Show(); clearFlag('TASK_CLEAR_IMPORT'); } } }else{ console.error('strange status'+ getStatus()); } })();