Kaikeba Wiki Helper

Wiki Helper

目前为 2021-04-27 提交的版本。查看 最新版本

// ==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...
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址