// ==UserScript==
// @name NGA优化摸鱼体验插件-标记备份
// @namespace https://github.com/DelCrona/Mark_LocalBackup
// @version 1.0.3
// @author DelCrona
// @description 适用范围:不想使用webdav且标记数量巨大
// @license MIT
// @match *://bbs.nga.cn/*
// @match *://ngabbs.com/*
// @match *://nga.178.com/*
// @match *://g.nga.cn/*
// @require https://cdn.staticfile.org/blueimp-md5/2.19.0/js/md5.min.js
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @run-at document-start
// @inject-into content
// ==/UserScript==
(function (registerPlugin) {
'use strict';
registerPlugin({
name: 'LocalBackup', // 插件唯一KEY
title: '本地备份', // 插件名称
desc: '将标记列表备份到本地/上传', // 插件说明
settings: [{
key: 'textInput',
title: '重要提示:使用前请先用本体功能备份标记',
desc: ''
}, {
key: 'numberInput',
title: '上传功能上传非标记文件会导致标记直接损坏!',
desc: ''
}, {
key: 'checkBox',
title: '请务必确认文件是否为标记文件.json!',
desc: ''
}, {
key: 'checkBox',
title: '覆盖上传同理,使用前优先备份!',
desc: ''
},{
key: 'desc',
title: '备份文件:自动下载标记文件',
desc: ''
}, {
key: 'desc2',
title: '覆盖上传标记:上传后直接覆盖原标记',
desc: ''
}, {
key: 'desc3',
title: '合并上传标记:将现存标记和上传标记合并',
desc: ''
}],
buttons: [ {
title: '备份标记',
action: 'backup'
},{
title: '覆盖上传标记',
action: 'loadFile'
},{
title: '合并上传标记',
action: 'mergeFile'
}],
beforeSaveSettingFunc(setting) {
// console.log(setting)
// return 值则不会保存,并抛出错误
// return '拦截'
},
preProcFunc() {
},
initFunc() {
/*
console.log('已运行: initFunc()')
console.log('插件ID: ', this.pluginID)
console.log('插件配置: ', this.pluginSettings)
console.log('主脚本: ', this.mainScript)
console.log('主脚本引用库: ', this.mainScript.libs)
*/
},
postProcFunc() {
},
renderThreadsFunc($el) {
},
renderFormsFunc($el) {
},
renderAlwaysFunc() {
// console.log('循环运行: renderAlwaysFunc()')
},
async backup(){
function formatDate(date) {
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = date.getMinutes();
var year = date.getFullYear();
month = month.toString().padStart(2, '0');
day = day.toString().padStart(2, '0');
hours = hours.toString().padStart(2, '0');
minutes = minutes.toString().padStart(2, '0');
year = year.toString();
return year + month + day + hours + minutes;
}
var fDate = formatDate(new Date());
const markList = this.mainScript.getModule('MarkAndBan').markList;
const markListStr = JSON.stringify(markList);
var filename = "NGA_marklist_"+ fDate;
const mimeType = "application/json";
// 模拟下载功能导出列表
const blob = new Blob([markListStr], {type: mimeType});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
},
async loadFile(){
// 创建一个隐藏的上传按钮
const _this = this;
var uploadButton = document.createElement('input');
uploadButton.type = 'file';
uploadButton.style.display = 'none';
uploadButton.id = 'hiddenFileInput'; // 为上传按钮设置一个ID,方便后续操作
// 将隐藏的上传按钮添加到DOM中
document.body.appendChild(uploadButton);
// 为上传按钮添加change事件监听器
uploadButton.addEventListener('change', function() {
// 获取用户选择的文件
var file = this.files[0];
if (file) {
// 读取文件内容
const markList = _this.mainScript.getModule('MarkAndBan').markList;
const markListStr = JSON.stringify(markList);
var reader = new FileReader();
reader.onload = function(event) {
// 文件读取完成后,输出文件内容
// console.log('文件内容:', event.target.result);
const markUpload = event.target.result;
// 在这里可以对文件内容进行进一步处理,例如显示在网页上或发送到服务器
if (md5(markUpload) !== md5(markListStr)){
const markListStr = markUpload;
const markList = JSON.parse(markListStr);
_this.mainScript.getModule('MarkAndBan').markList = markList;
_this.mainScript.setValue("hld__NGA_mark_list", markListStr);
_this.mainScript.popNotification('标记名单列表已还原');
}
// 清理资源
reader = null;
};
// 以文本格式读取文件内容
reader.readAsText(file);
}
// 移除上传按钮
document.body.removeChild(uploadButton);
});
// 模拟点击上传按钮
uploadButton.click();
},
async mergeFile(){
const _this = this;
var uploadButton = document.createElement('input');
uploadButton.type = "file";
uploadButton.style.display = "none";
uploadButton.id = 'hiddenFileInput'; // 为上传按钮设置一个ID,方便后续操作
document.body.appendChild(uploadButton);
uploadButton.addEventListener('change', function() {
// 获取用户选择的文件
var file = this.files[0];
if (file) {
// 读取文件内容
const fileA = _this.mainScript.getModule('MarkAndBan').markList;
const markListStr = JSON.stringify(fileA);
var reader = new FileReader();
reader.onload = function(event) {
// 文件读取完成后,输出文件内容
// console.log('文件内容:', event.target.result);
const markUpload = event.target.result;
// 在这里可以对文件内容进行进一步处理,例如显示在网页上或发送到服务器
if (md5(markUpload) !== md5(markListStr)){
const fileB = JSON.parse(markUpload);
var mergedJSON = fileA;
fileB.forEach(function(objB){
var matchObj = mergedJSON.findIndex(function(objA){
return objA.uid === objB.uid;
});
if (matchObj !== -1){
objB.marks.forEach(function(markB){
var existMark = mergedJSON[matchObj].marks.find(function(markA){
return (markA.mark === markB.mark && markA.bg_color === markB.bg_color);
});
if (!existMark){
mergedJSON[matchObj].marks.push(markB);
}
})
} else {
mergedJSON.push(objB);
}
})
const mergedJSONStr = JSON.stringify(mergedJSON);
_this.mainScript.getModule('MarkAndBan').markList = mergedJSON;
_this.mainScript.setValue("hld__NGA_mark_list", mergedJSONStr);
_this.mainScript.popNotification('标记名单列表已合并');
}
// 清理资源
reader = null;
};
// 以文本格式读取文件内容
reader.readAsText(file);
}
// 移除上传按钮
document.body.removeChild(uploadButton);
});
uploadButton.click();
}
})
})(function(plugin) {
plugin.meta = GM_info.script
unsafeWindow.ngaScriptPlugins = unsafeWindow.ngaScriptPlugins || []
unsafeWindow.ngaScriptPlugins.push(plugin)
});