// ==UserScript==
// @name Kaikeba Wiki Helper
// @namespace http://tampermonkey.net/
// @version 0.2
// @description Wiki Helper
// @author WumaCoder
// @match http://wiki.kaikeba.com/pages/*
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
(function () {
"use strict";
const ADAY = 24 * 1000 * 60 * 60;
const formData = defineState({
index: 0,
baseDate: Date.parse("2021-04-26 00:00:00"),
title: (self) =>
`gk-web-${self.form_num}-dbk-${self.form_date.replace(/-/gim, "")}`,
tags: (self) => [
self.form_teacher,
"web",
`web-${self.form_num}`,
"跟课课时",
"web学科",
],
form_date: (self) =>
new Date(self.baseDate + ADAY * self.index)
.toLocaleDateString(undefined, {
year: "numeric",
month: "2-digit",
day: "2-digit",
})
.replace(/\//gim, "-"),
form_name: "web全栈架构师", // 课程
form_num: 29, // 班次
form_type: "大班课", // 类型
form_knob: "课节", // 课节
form_teacher: "讲师", // 讲师
form_group: "教研", // 教研
form_helpTeacher: "助教", // 助教
form_subTeacher: "班主任", // 班班
form_startDate: "20:30", // 开始
form_endDate: "22:30", // 结束
form_totalTime: 2, // 总时长
form_resultTime: "2:00", // 结算时长
form_manNum: 90, // 峰值人数
form_manActive: 12, //课程互动
form_messageActive: 15, // 公屏互动
form_to24h: "/",
form_to48h: "/",
form_liveErr: "/",
form_note: "/",
});
console.log(formData);
buildUI();
setTimeout(() => {
document
.querySelector("#rte-button-publish")
.addEventListener("click", () => {
save();
nextBaseDate();
});
}, 1000);
function buildUI() {
const ui = `
<button @click="add">Add Day</button>
<button @click="dec">Dec Day</button>
<button @click="reset">Reset</button>
<button @click="state">State</button>
<button @click="writeForm">Write</button>
<button @click="save">Save</button>
`;
UI(ui, {
add() {
formData.state.index += 1;
},
dec() {
formData.state.index -= 1;
},
reset() {
formData.reset();
},
state() {
alert("请查看控制台");
console.log(formData);
},
writeForm() {
writeTitle();
writeTable();
writeTags();
},
save() {
save();
},
});
}
function save() {
let i = 0;
const els = document
.querySelector("iframe")
.contentWindow.document.querySelectorAll(".confluenceTd");
for (const key in formData.state) {
if (key.startsWith("form_")) {
const el = els[i];
if (key === "form_date") {
formData.state.baseDate = Date.parse(el.innerText + " 00:00:00");
formData.state.index = 0;
} else {
formData.state[key] = el.innerHTML;
}
i++;
}
}
}
function nextBaseDate() {
let f = 2;
while (1) {
const date = (formData.state.baseDate += ADAY * f);
const week = new Date(date).getDay();
if (week >= 1 && week <= 5) {
break;
} else {
f = 1;
}
}
}
function writeTitle() {
const el = document.querySelector("#content-title");
el.value = formData.title;
}
function writeTable() {
let i = 0;
const els = document
.querySelector("iframe")
.contentWindow.document.querySelectorAll(".confluenceTd");
for (const key in formData.state) {
if (key.startsWith("form_")) {
const el = els[i];
el.innerHTML = formData.state[key];
i++;
}
}
}
async function writeTags() {
document.querySelector("#rte-button-labels").click();
await new Promise((resolve) => setTimeout(resolve, 100));
const inpEl = document.querySelector("#labels-string");
const okEl = document.querySelector("#add-labels-editor-button");
for (let i = 0; i < formData.tags.length; i++) {
const tag = formData.tags[i];
inpEl.value = tag;
await new Promise((resolve) => setTimeout(resolve, 100));
okEl.click();
await new Promise((resolve) => setTimeout(resolve, 100));
}
document
.querySelector("#edit-labels-dialog > div > div.dialog-button-panel > a")
.click();
}
function UI(ui, handlers = {}) {
const plan = document.createElement("div");
plan.id = "Wiki Helper";
plan.style["position"] = "fixed";
plan.style["top"] = "0";
plan.style["left"] = "40%";
plan.style["z-index"] = "10000";
plan.style["background"] = "#EEE";
plan.style["padding"] = "10px";
plan.innerHTML = ui;
plan.addEventListener("click", (e) => {
const methodName = e.target.attributes["@click"].value;
handlers[methodName]();
});
handlers.query = plan.querySelector.bind(plan);
handlers.queryAll = plan.querySelectorAll.bind(plan);
document.body.append(plan);
}
function defineState(data = {}, { keep = "@State" } = {}) {
const _data = Object.assign({}, data);
Object.assign(data, readState());
const state = new Proxy(data, {
get(target, key, rec) {
const val = Reflect.get(target, key, rec);
return typeof val === "function" ? val(state) : val;
},
set(target, key, val, rec) {
const res = Reflect.set(target, key, val, rec);
writeState();
return res;
},
});
const result = {
state,
reset,
readState,
writeState,
};
for (const key in state) {
proxyState(result, key);
}
return result;
function readState() {
let state = GM_getValue(keep);
return state;
}
function writeState() {
return GM_setValue(keep, data);
}
function reset() {
data = _data;
return writeState();
}
function proxyState(target, key) {
Object.defineProperty(target, key, {
get() {
return target.state[key];
},
set(v) {
return (target.state[key] = v);
},
});
}
}
// Your code here...
})();