// ==UserScript==
// @name 原神Wiki地图工具助手
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 隐藏地图中已经标记的点
// @author You
// @match https://wiki.biligame.com/ys/%E5%8E%9F%E7%A5%9E%E5%9C%B0%E5%9B%BE%E5%B7%A5%E5%85%B7*
// @grant none
// @require https://cdn.staticfile.org/jquery/3.3.0/jquery.min.js
// @require https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js
// @downloadURL none
// ==/UserScript==
function run() {
// “设置界面”是否已经显示
var g_is_setting_shown = false;
// 需要隐藏的选项
var g_marked_hidden_categories = new Set();
// info,error自动清除 定时器ID
var g_info_timer = -1;
var g_error_timer = -1;
function isEmpty(e) {
return e==null || e.length==0;
}
function init() {
// 从cookie读取配置
var cookie_YsHelper_markedHiddenCategories = $.cookie('YsHelper_markedHiddenCategories');
if (!isEmpty(cookie_YsHelper_markedHiddenCategories)) {
g_marked_hidden_categories = new Set(cookie_YsHelper_markedHiddenCategories.split(','));
}
// 添加按钮
const export_icon = '';
const import_icon = '';
const setting_icon = '';
var btn_export = '' + export_icon + '';
var btn_import = '' + import_icon + '';
var btn_setting = '' + setting_icon + '';
$('.mapMenu').after('');
$('.mapMenu').after('
' + btn_export + btn_import + btn_setting + '
');
$('.mapMenu').after('');
$('.mapMenu').after('');
$('#local_file').change(function(e){
var reader = new FileReader();
var file = e.target.files[0];
reader.readAsText(file);
reader.onload = function () {
try {
var data = JSON.parse(reader.result);
if (!(data instanceof Array)) {
return error('输入文件格式错误');
}
$.cookie('last_marked', getMarked());
var marked = JSON.stringify(data);
console.log(marked);
setMarked(marked);
infoReloadPage('读取成功');
} catch(err) {
console.log(err);
return error('输入文件格式错误, 无法解析');
}
};
reader.onerror = function(){
error('读取本地文件失败 (' + reader.error + ')');
}
e.target.value='';
});
info('欢迎使用!');
}
function info(msg, timeout) {
if (msg != '') {
$('#ys-helper-error-msg').html('');
msg = '原神助手[提示]:' + msg;
clearTimeout(g_info_timer);
if (timeout == null) {
timeout = 5000;
}
if (timeout > 0) {
g_info_timer = setTimeout(function(){info('');}, timeout);
}
}
$('#ys-helper-info-msg').html(msg);
}
function error(msg, timeout) {
if (msg != '') {
$('#ys-helper-info-msg').html('');
msg = '原神助手[错误]:' + msg;
clearTimeout(g_error_timer);
if (timeout == null) {
timeout = 10000;
}
if (timeout > 0) {
g_error_timer = setTimeout(function(){error('');}, timeout);
}
}
$('#ys-helper-error-msg').html(msg);
}
function infoReloadPage(prefix, suffix) {
var msg = '';
if (prefix && prefix != '') {
msg += prefix + ', ';
}
msg += '请【刷新】本页面';
if (suffix && suffix != '') {
msg += ', ' + suffix;
}
return info(msg, 0);
}
function showSetting() {
$('.ys-helper-btn-upload').show();
$('.ys-helper-btn-download').show();
$('.select-item').css('flex', '0 0 45%');
$(".select-item").each(function(){
var categoryid = $(this).attr('categoryid');
var $cbHidden = $('');
$(this).before($cbHidden);
});
}
function hideSetting() {
$('.ys-helper-btn-upload').hide();
$('.ys-helper-btn-download').hide();
$('.select-item').css('flex', '0 0 50%');
$('.cb-marked-hidden').remove();
}
function isMarkedHidden(categoryid) {
return g_marked_hidden_categories.has(categoryid);
}
function setMarkedHidden(categoryid, hidden) {
if (hidden) {
g_marked_hidden_categories.add(categoryid);
}
else {
g_marked_hidden_categories.delete(categoryid);
if (isShown(categoryid)) {
clickIcon(categoryid, 2);
}
}
saveSetting();
}
function saveSetting() {
$.cookie('YsHelper_markedHiddenCategories', Array.from(g_marked_hidden_categories).toString());
}
function isChecked(categoryid) {
return $('input[type="checkbox"][categoryid="' + categoryid + '"]').prop('checked');
}
window.YsHelper_showSetting = function() {
if (g_is_setting_shown) {
hideSetting();
g_is_setting_shown = false;
}
else {
showSetting();
g_is_setting_shown = true;
}
}
window.YsHelper_checkStateChanged = function(categoryid) {
var checked = isChecked(categoryid);
setMarkedHidden(categoryid, checked);
}
function getMarked() {
return localStorage.wikiYsOpacData;
}
function setMarked(marked) {
localStorage.wikiYsOpacData = marked;
}
function getIconSrcByCategoryid(categoryid) {
return $('.select-item[categoryid="' + categoryid + '"]').find('.list-img')[0].currentSrc;
}
function removeParam(url) {
var idx = url.indexOf('?');
return idx==-1 ? url : url.substr(0, idx);
}
function clickIcon(categoryid, times) {
times = times ? times : 1;
var $el = $('.select-item[categoryid="' + categoryid + '"]')[0];
for (var i = 0; i < times; ++i) {
$el.click();
}
}
function isShown(categoryid) {
return $('.select-item[categoryid="' + categoryid + '"]').hasClass('item-active');
}
function showIcon(categoryid) {
var $elem = $('.select-item[categoryid="' + categoryid + '"]');
if (!$elem.hasClass('item-active')) {
$elem[0].click();
}
}
function hideIcon(categoryid) {
var $elem = $('.select-item[categoryid="' + categoryid + '"]');
if ($elem.hasClass('item-active')) {
$elem[0].click();
}
}
function hideMarkedIcon(categoryid) {
var $img = $('img');
var count = 0;
var iconSrc = removeParam(getIconSrcByCategoryid(categoryid));
for (var i = 0; i < $img.length; ++i) {
if (removeParam($img[i].src) == iconSrc && $img[i].id != '') {
var yst = $img[i];
if (yst.style.opacity != '1') {
yst.parentNode.removeChild(yst);
count++;
}
}
}
if (count > 0) {
console.log(name + ': ' + count);
}
return count;
}
function saveToFile(content, filename) {
let downLink = document.createElement('a');
downLink.download = filename;
let blob = new Blob([content])
downLink.href = URL.createObjectURL(blob)
document.body.appendChild(downLink)
downLink.click()
document.body.removeChild(downLink)
}
window.YsHelper_import = function() {
return $("#local_file").trigger("click");
}
window.YsHelper_export = function() {
var marked = getMarked();
if (isEmpty(marked)) {
return error('当前没有任何已标记的点');
}
var filename = '原神wiki_地图工具_标记点_' + getTimeStr(new Date()) + '.txt';
return saveToFile(marked, filename);
}
function getTimeStr(time) {
var date = new Date(time);
var year = date.getFullYear(),
month = date.getMonth()+1,
day = date.getDate(),
hour = date.getHours(),
min = date.getMinutes(),
sec = date.getSeconds();
var str = year + '' +
(month < 10? '0' + month : month) + '' +
(day < 10? '0' + day : day) + '_' +
(hour < 10? '0' + hour : hour) + '' +
(min < 10? '0' + min : min) + '' +
(sec < 10? '0' + sec : sec);
return str;
}
function refreshMap() {
var $items = $('.select-item');
for (var i = 0; i < $items.length; ++i) {
var $item = $items.eq(i);
if ($item.hasClass('item-active')) {
var categoryid = $items.eq(i).attr('categoryid');
clickIcon(categoryid, 2);
}
}
}
/**************************************************/
/* */
/* ready */
/* */
/**************************************************/
init();
setInterval(function(){
for (var categoryid of g_marked_hidden_categories) {
hideMarkedIcon(categoryid);
}
}, 1000);
}
(function() {
'use strict';
run();
})();