// ==UserScript==
// @name UMU 增强
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 增强 UMU 的体验,可根据参与人数进行搜索,可模糊搜索,支持在新窗口打开页面从而不丢失当前浏览状态。
// @author LinHQ
// @match https://m.umu.cn/course/*
// @icon https://m.umu.cn/favicon.ico
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @connect https://m.umu.cn/uapi/*
// @require https://gf.qytechs.cn/scripts/429203-async-xmlhttprequest/code/Async%20xmlhttprequest.js?version=949226
// ==/UserScript==
'use strict'; // 搜索关键字 ask
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
var TYPES = new Map();
TYPES.set(1, "survey");
TYPES.set(2, "ask");
TYPES.set(3, "discussion");
TYPES.set(4, "photo");
TYPES.set(5, "GAME");
TYPES.set(6, "attendance");
TYPES.set(7, "mini_course");
TYPES.set(8, "raffle_drawing");
TYPES.set(9, "registration");
TYPES.set(10, "quiz");
TYPES.set(11, "video");
TYPES.set(12, "live");
TYPES.set(13, "article");
TYPES.set(14, "document");
TYPES.set(16, "exercise/?surl=");
var GROUPID = new URL(window.location.href).searchParams.get('groupId'); // 获取第{cid}目录下的内容
function getChapters(_x, _x2) {
return _getChapters.apply(this, arguments);
} // 获取第{id}页
function _getChapters() {
_getChapters = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(cid, sessionCount) {
var resp, li;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return req({
method: "POST",
headers: {
"Content-type": "application/x-www-form-urlencoded"
},
url: "https://m.umu.cn/uapi/v2/element/chapter-session",
data: "t=".concat(new Date().getTime(), "&parent_id=").concat(GROUPID, "&chapter_id=").concat(cid, "&page=1&size=").concat(sessionCount, "&get_draft=0")
});
case 2:
resp = _context2.sent;
// 解析返回数据
li = JSON.parse(resp.responseText).data.list;
li = li.map(function (l) {
return {
title: l.index + '.' + l.title,
href: l.share_card_view.replace("element/share", "session/".concat(TYPES.get(l.type))),
people: parseInt(l.stat.finish_num),
learned: l.extend.learn_status !== 0
};
});
console.log(li);
return _context2.abrupt("return", li);
case 7:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return _getChapters.apply(this, arguments);
}
function getPage(_x3) {
return _getPage.apply(this, arguments);
} // 获取所有列表
function _getPage() {
_getPage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(index) {
var resp;
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return req({
method: "POST",
headers: {
"Content-type": "application/x-www-form-urlencoded"
},
url: "https://m.umu.cn/uapi/v2/element/list",
data: "t=".concat(new Date().getTime(), "&parent_id=").concat(GROUPID, "&page=").concat(index, "&size=15&get_draft=0")
});
case 2:
resp = _context3.sent;
return _context3.abrupt("return", JSON.parse(resp.responseText).data);
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return _getPage.apply(this, arguments);
}
function getIds() {
return _getIds.apply(this, arguments);
} // 根据人数进行过滤
function _getIds() {
_getIds = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
var ids, meta, pages, p, currentPage, _iterator2, _step2, dir, chapterIds;
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
ids = [];
_context4.next = 3;
return getPage(1);
case 3:
meta = _context4.sent;
pages = meta.page_info.total_page_num;
p = 1;
case 6:
if (!(p <= pages)) {
_context4.next = 32;
break;
}
_context4.next = 9;
return getPage(p);
case 9:
currentPage = _context4.sent;
_iterator2 = _createForOfIteratorHelper(currentPage.list);
_context4.prev = 11;
_iterator2.s();
case 13:
if ((_step2 = _iterator2.n()).done) {
_context4.next = 21;
break;
}
dir = _step2.value;
_context4.next = 17;
return getChapters(dir.id, parseInt(dir.session_count));
case 17:
chapterIds = _context4.sent;
ids = ids.concat(chapterIds);
case 19:
_context4.next = 13;
break;
case 21:
_context4.next = 26;
break;
case 23:
_context4.prev = 23;
_context4.t0 = _context4["catch"](11);
_iterator2.e(_context4.t0);
case 26:
_context4.prev = 26;
_iterator2.f();
return _context4.finish(26);
case 29:
p++;
_context4.next = 6;
break;
case 32:
return _context4.abrupt("return", ids);
case 33:
case "end":
return _context4.stop();
}
}
}, _callee4, null, [[11, 23, 26, 29]]);
}));
return _getIds.apply(this, arguments);
}
function doFilter(filter, data) {
console.log(data); // 【模式,值】
var _filter$split = filter.split(":"),
_filter$split2 = _slicedToArray(_filter$split, 2),
mode = _filter$split2[0],
v = _filter$split2[1];
switch (mode) {
case 's':
return data.filter(function (e) {
return e.title !== undefined && e.title.includes(v);
});
case 'gt':
return data.filter(function (e) {
return e.people >= parseInt(v);
});
case 'lt':
return data.filter(function (e) {
return e.people <= parseInt(v);
});
case 'd':
return data.filter(function (e) {
return e.learned;
});
case '!d':
return data.filter(function (e) {
return !e.learned;
});
default:
return [];
}
}
(function () {
GM_addStyle("#gm_box{\n position: fixed;\n z-index: 9999;\n top: 0vh;\n left: 0;\n border: 1px solid #a0c5fd;\n border-radius: 5px;\n height: 95vh;\n width: 3.4rem;\n display: flex;\n flex-flow: column;\n }\n\n #gm_box input {\n margin: 10px;\n }\n\n #gm_box .show{\n height: 90vh;\n width: 3.4rem;\n margin: 3px auto;\n overflow: auto;\n padding: 5px;\n }\n\n #gm_box li {\n margin: 5px;\n border-left: 3px solid #fa541c;\n background: #e6e6e6;\n border-radius: 3px;\n padding: 3px;\n color: #114979;\n cursor: pointer;\n line-height: 1.2em;\n }\n\n #gm_box li.learned {\n border-left: 3px solid #52c41a;\n }\n\n #gm_box li.clicked {\n border-left: 3px solid #73289b;\n }\n\n #gm_box .state {\n text-align: center;\n align-self: center;\n font-size: 0.7em;\n }\n\n #gm_box .state span {\n color: #ff7875;\n }\n ");
var container = document.createElement("div");
container.id = "gm_box";
container.innerHTML = "\n <input type=\"text\" value=\"s:\"/>\n <div class=\"state\">Enter\u4EE5\u5F00\u59CB\u641C\u7D22</div>\n <div class=\"show\">\n <ol>\n </ol>\n </div>\n ";
document.body.appendChild(container);
var reader = document.querySelector("#gm_box input");
var li = [];
reader.onkeypress = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(e) {
var ol, state, res, _iterator, _step, _loop;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
ol = document.querySelector(".show>ol");
state = document.querySelector("div.state");
if (!(e.code === "Enter")) {
_context.next = 13;
break;
}
// 清除之前内容
ol.innerHTML = ""; // 检查缓存
if (!(li.length === 0)) {
_context.next = 9;
break;
}
state.textContent = "正在加载中,请稍后...";
_context.next = 8;
return getIds();
case 8:
li = _context.sent;
case 9:
res = doFilter(e.target.value, li); // 展示结果
state.textContent = "".concat(res.length, " \u6761\u7ED3\u679C");
_iterator = _createForOfIteratorHelper(res);
try {
_loop = function _loop() {
var l = _step.value;
var li = document.createElement("li");
li.textContent = "".concat(l.title);
ol.appendChild(li);
if (l.learned) li.classList.add("learned");
li.onclick = function () {
// 点击变色
li.classList.add("clicked");
window.open(l.href);
};
};
for (_iterator.s(); !(_step = _iterator.n()).done;) {
_loop();
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
case 13:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x4) {
return _ref.apply(this, arguments);
};
}();
})();