Greasy Fork 支持简体中文。

autoSetting

try to take over the world!

/*
 * @Description: autoSetting
 * @Version: 1.0.1
 * @Author: lax
 * @Date: 2021-06-15 10:50:14
 * @LastEditors: lax
 * @LastEditTime: 2021-06-17 22:48:48
 * @FilePath: \autoSetting\src\index.js
 */
// ==UserScript==
// @name         autoSetting
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  try to take over the world!
// @author       lax
// @match        http://*.world-of-dungeons.org/wod/spiel/hero/skillconf_nojs.php*
// @match        http://*.world-of-dungeons.org/wod/spiel/hero/skillconfig.php*
// @grant        none
// ==/UserScript==

(function() {
	"use strict";

	// 挑战 key
	const CHALLENGE = "wod_plugin_challenge";

	// buff key
	const BUFF = "wod_plugin_buff";

	// xml loader
	const xml = new DOMParser();

	// storage
	const lib = window.localStorage;

	// 设置 地城\决斗\一般\说明
	const settingType = document.querySelectorAll("#wod-orders > div");

	// 地城
	const dungeon = settingType[0];

	// 设置名称
	const SETTING_NAME = document.querySelector("#wod-orders h1").innerHTML;

	// 保存按钮集合
	const SAVE_BUTTON = Array.from(
		document.querySelectorAll("input[value=保存]")
	);

	// 重置此页面上的设置
	const reloadSetting = dungeon.querySelector(
		"input[value=重置此页面上的设置]"
	);

	// 设置数据form对象
	const form = document.querySelector(
		"form[action='/wod/spiel/hero/skillconfig.php']"
	);

	SAVE_BUTTON.map(bt => {
		bt.addEventListener("click", () => {
			if (SETTING_NAME.includes("挑战层")) saveSetting(CHALLENGE);
			if (SETTING_NAME.includes("buff层")) saveSetting(BUFF);
		});
	});

	generateSaveButton("挑战", CHALLENGE);
	generateSaveButton("buff", BUFF);

	function saveSetting(name) {
		const config = getSettingConfig();
		lib.setItem(name, config.data);
	}

	function getSettingConfig() {
		const WOD_CFG = window.WOD_CFG;
		const xs = new XmlSerializer();
		WOD_CFG.serialize(xs);
		return xs;
	}

	function generateSaveButton(name, key) {
		const bt = createButton(name);
		bt.addEventListener("click", () => {
			const item = lib.getItem(key);
			if (!item) alert(`无法读取,请先创建或保存${name}设置!`);

			const source = xml.parseFromString(item, "text/xml");
			// 读取挑战层设置的默认设置,该设置将被视为挑战层的设置
			const template = source.getElementsByTagName("level")[0];

			// 当前设置的层数
			const LEVEL = document.querySelector(
				"#wod-orders div .wod-tabs li[class=selected]"
			).innerHTML;
			const level = LEVEL === "默认" ? 0 : Number(LEVEL);

			// 读取当前层数设置
			const setting = xml.parseFromString(getSettingConfig().data, "text/xml");
			const oldLevel = setting.getElementsByTagName("level")[level];

			let parentNode;
			if (LEVEL === "默认") {
				parentNode = setting.getElementsByTagName("standard")[0];
			} else {
				parentNode = setting.getElementsByTagName("levels")[0];
				template.setAttribute("overwrite_standard", "true");
			}
			parentNode.replaceChild(template, oldLevel);

			const xmlString = new XMLSerializer().serializeToString(setting);

			post({ data: xmlString, level });
		});
	}

	function post({ data, level }) {
		form.querySelector("input[name=data]").value = base64_encode(data);
		form.querySelector("input[name=action]").value = "save";
		form.querySelector("input[name=profile]").value = getProfileId();
		form.querySelector("input[name=SELECTED_TAB]").value =
			"wod-orders-tab-dungeon";
		form.querySelector("input[name=SELECTED_LVL]").value = level;
		form.querySelector("input[name=SELECTED_DUEL]").value = "hero";

		form.submit();
	}

	function getProfileId() {
		const WOD_CFG = window.WOD_CFG;
		return WOD_CFG.ui_orders.profileDropdown.getSelectedProfile().id;
	}

	function createButton(name) {
		const bt = document.createElement("input");
		bt.type = "button";
		bt.value = name;
		reloadSetting.parentNode.insertBefore(bt, reloadSetting);
		return bt;
	}

	/**
	 * 设置拖拽
	 */

	// 设置区域
	const settingBox = Array.from(
		document.querySelectorAll(".wod-list .wod-list-items")
	);

	const before = settingBox[1];
	const around = settingBox[3];
	console.log(before);
	console.log(around);

	addChangeListener(before);
	addChangeListener(around);

	document
		.querySelector("#wod-orders div .wod-tabs li[class=selected]")
		.click();

	function addChangeListener(el) {
		// 允许其中元素可以拖拽
		el.style.position = "relative";
		const callback = function(mutationsList) {
			mutationsList.map(mutation => {
				if (mutation.type === "childList" && mutation.addedNodes.length) {
					listenerDrag(mutation.addedNodes);
				}
			});
		};

		const observer = new MutationObserver(callback);
		const config = { childList: true };

		observer.observe(el, config);
	}

	let ing = null;

	function listenerDrag(el) {
		const items = Array.from(el);

		items.map(each => {
			if (!each.parentNode) return;
			const down = each.parentNode.parentNode.querySelector("img[title=向下]");

			const up = each.parentNode.parentNode.querySelector("img[title=向上]");

			each.setAttribute("draggable", "true");

			each.addEventListener("dragstart", e => {
				ing = e;
			});
			each.addEventListener("dragover", e => {
				e.preventDefault();
				const target = e.target;
				if (
					target.nodeName === "DIV" &&
					target.classList.contains("wod-list-item") &&
					target !== ing.target
				) {
					if (target.previousSibling === ing.target) {
						down.click();
					} else if (target.nextSibling === ing.target) {
						up.click();
					}
				}
			});
		});
	}
})();