更改 SAMS 网页出校时间
Versión del día
// ==UserScript== // @name SAMScript // @version 1.1.0 // @description 更改 SAMS 网页出校时间 // @author Kaby Lake // @homepage https://github.com/Kaby-Lake/SAMScript // @match https://appgateway.nottingham.edu.cn/*/*/zh/Students/stuaskforleave // @match https://appgateway.nottingham.edu.cn/*/*/zh/Students/stuaskforleave/* // @match https://sams.nottingham.edu.cn/zh/Students/stuaskforleave // @match https://sams.nottingham.edu.cn/zh/Students/stuaskforleave/* // @require https://cdn.jsdelivr.net/npm/[email protected] // @namespace https://greasyfork.org/users/995444 // ==/UserScript== /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ([ /* 0 */, /* 1 */ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AVATAR_DOM_SELECTOR = exports.DETAIL_PAGE_APPROVE_TIME_DOM_SELECTOR = exports.LIST_PAGE_END_TIME_DOM_SELECTOR = exports.DETAIL_PAGE_END_TIME_DOM_SELECTOR = exports.LIST_PAGE_START_TIME_DOM_SELECTOR = exports.DETAIL_PAGE_START_TIME_DOM_SELECTOR = exports.SAMS_LOCAL_STORAGE_KEY = void 0; exports.SAMS_LOCAL_STORAGE_KEY = 'sams_crack'; exports.DETAIL_PAGE_START_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.form-horizontal > div:nth-child(2) > div"; exports.LIST_PAGE_START_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.table-responsive > table > tbody > tr:nth-child(2) > td:nth-child(2)"; exports.DETAIL_PAGE_END_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.form-horizontal > div:nth-child(3) > div"; exports.LIST_PAGE_END_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.table-responsive > table > tbody > tr:nth-child(2) > td:nth-child(3)"; exports.DETAIL_PAGE_APPROVE_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.form-horizontal > div:nth-child(8) > div > table > tbody > tr > td:nth-child(2)"; exports.AVATAR_DOM_SELECTOR = "body > div.wrapper > header > nav > div.navbar-custom-menu > ul > li > ul > li.user-header > img"; /***/ }), /* 2 */ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getIntegerFromPrompt = void 0; function getIntegerFromPrompt(text, invalidText) { var _a; const inputVal = parseInt((_a = window.prompt(text)) !== null && _a !== void 0 ? _a : ""); if (isNaN(inputVal)) { alert(invalidText); throw new Error("Invalid input"); } return inputVal; } exports.getIntegerFromPrompt = getIntegerFromPrompt; /***/ }), /* 3 */ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Record = void 0; const dayjs_1 = __importDefault(__webpack_require__(4)); const date_1 = __webpack_require__(5); class Record { constructor() { this.startTime = (0, date_1.getStartOfDay)((0, dayjs_1.default)()); this.endTime = (0, date_1.getStartOfDay)((0, dayjs_1.default)()); this.applyTime = (0, date_1.getStartOfDay)((0, dayjs_1.default)()); this.approveTime = (0, date_1.getStartOfDay)((0, dayjs_1.default)()); } restoreRecord(record) { this.startTime = (0, dayjs_1.default)(record.startTime); this.endTime = (0, dayjs_1.default)(record.endTime); this.applyTime = (0, dayjs_1.default)(record.applyTime); this.approveTime = (0, dayjs_1.default)(record.approveTime); return this; } toMemorizedString() { return JSON.stringify({ startTime: this.startTime.toString(), endTime: this.endTime.toString(), applyTime: this.applyTime.toString(), approveTime: this.approveTime.toString() }); } } exports.Record = Record; /***/ }), /* 4 */ /***/ (function(module) { !function(t,e){ true?module.exports=e():0}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",l="Invalid Date",$=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,f),s=n-i<0,u=e.clone().add(r+(s?-1:1),f);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:f,y:c,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:h}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",D={};D[g]=M;var p=function(t){return t instanceof _},S=function t(e,n,r){var i;if(!e)return g;if("string"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split("-");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},w=function(t,e){if(p(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},O=v;O.l=S,O.i=p,O.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=S(t.locale,null,!0),this.parse(t)}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(O.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return O},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<w(t)},m.$g=function(t,e,n){return O.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!O.u(e)||e,h=O.p(t),l=function(t,e){var i=O.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return O.w(n.toDate()[t].apply(n.toDate("s"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v="set"+(this.$u?"UTC":"");switch(h){case c:return r?l(1,0):l(31,11);case f:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+"Hours",0);case u:return $(v+"Minutes",1);case s:return $(v+"Seconds",2);case i:return $(v+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=O.p(t),h="set"+(this.$u?"UTC":""),l=(n={},n[a]=h+"Date",n[d]=h+"Date",n[f]=h+"Month",n[c]=h+"FullYear",n[u]=h+"Hours",n[s]=h+"Minutes",n[i]=h+"Seconds",n[r]=h+"Milliseconds",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===f||o===c){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[O.p(t)]()},m.add=function(r,h){var d,l=this;r=Number(r);var $=O.p(h),y=function(t){var e=w(l);return O.w(e.date(e.date()+Math.round(t*r)),l)};if($===f)return this.set(f,this.$M+r);if($===c)return this.set(c,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return O.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||"YYYY-MM-DDTHH:mm:ssZ",i=O.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,f=n.months,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},c=function(t){return O.s(s%12||12,t,"0")},d=n.meridiem||function(t,e,n){var r=t<12?"AM":"PM";return n?r.toLowerCase():r},$={YY:String(this.$y).slice(-2),YYYY:this.$y,M:a+1,MM:O.s(a+1,2,"0"),MMM:h(n.monthsShort,a,f,3),MMMM:h(f,a),D:this.$D,DD:O.s(this.$D,2,"0"),d:String(this.$W),dd:h(n.weekdaysMin,this.$W,o,2),ddd:h(n.weekdaysShort,this.$W,o,3),dddd:o[this.$W],H:String(s),HH:O.s(s,2,"0"),h:c(1),hh:c(2),a:d(s,u,!0),A:d(s,u,!1),m:String(u),mm:O.s(u,2,"0"),s:String(this.$s),ss:O.s(this.$s,2,"0"),SSS:O.s(this.$ms,3,"0"),Z:i};return r.replace(y,(function(t,e){return e||$[t]||i.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=O.p(d),M=w(r),m=(M.utcOffset()-this.utcOffset())*e,v=this-M,g=O.m(this,M);return g=($={},$[c]=g/12,$[f]=g,$[h]=g/3,$[o]=(v-m)/6048e5,$[a]=(v-m)/864e5,$[u]=v/n,$[s]=v/e,$[i]=v/t,$)[y]||v,l?g:O.a(g)},m.daysInMonth=function(){return this.endOf(f).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=S(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return O.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),T=_.prototype;return w.prototype=T,[["$ms",r],["$s",i],["$m",s],["$H",u],["$W",a],["$M",f],["$y",c],["$D",d]].forEach((function(t){T[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),w.extend=function(t,e){return t.$i||(t(e,_,w),t.$i=!0),w},w.locale=S,w.isDayjs=p,w.unix=function(t){return w(1e3*t)},w.en=D[g],w.Ls=D,w.p={},w})); /***/ }), /* 5 */ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getEndOfWeekdays = exports.isWeekends = exports.getStartOfDay = void 0; const dayjs_1 = __importDefault(__webpack_require__(4)); const weekday_1 = __importDefault(__webpack_require__(6)); dayjs_1.default.extend(weekday_1.default); function getStartOfDay(date) { return date.set("hour", 0).set("minute", 0).set("second", 0); } exports.getStartOfDay = getStartOfDay; function isWeekends() { return (0, dayjs_1.default)().weekday() === 6 || (0, dayjs_1.default)().weekday() === 0; } exports.isWeekends = isWeekends; function getEndOfWeekdays() { return (0, dayjs_1.default)().weekday(5); } exports.getEndOfWeekdays = getEndOfWeekdays; /***/ }), /* 6 */ /***/ (function(module) { !function(e,t){ true?module.exports=t():0}(this,(function(){"use strict";return function(e,t){t.prototype.weekday=function(e){var t=this.$locale().weekStart||0,i=this.$W,n=(i<t?i+7:i)-t;return this.$utils().u(e)?n:this.subtract(n,"day").add(e,"day")}}})); /***/ }), /* 7 */ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setLocalStorage = exports.getLocalStorage = exports.hasLocalStorage = void 0; const hasLocalStorage = (key) => { try { return !!window.localStorage.getItem(key); } catch (e) { return false; } }; exports.hasLocalStorage = hasLocalStorage; const getLocalStorage = (key) => { return window.localStorage.getItem(key); }; exports.getLocalStorage = getLocalStorage; const setLocalStorage = (key, value) => { window.localStorage.setItem(key, value); }; exports.setLocalStorage = setLocalStorage; /***/ }), /* 8 */ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRandomInt = void 0; function getRandomInt(max) { return Math.floor(Math.random() * max); } exports.getRandomInt = getRandomInt; /***/ }) /******/ ]); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be in strict mode. (() => { "use strict"; var exports = __webpack_exports__; Object.defineProperty(exports, "__esModule", ({ value: true })); const constants_1 = __webpack_require__(1); const prompt_1 = __webpack_require__(2); const record_1 = __webpack_require__(3); const localStorage_1 = __webpack_require__(7); const math_1 = __webpack_require__(8); const date_1 = __webpack_require__(5); function setTimeText(DOM, date, format) { let timeText = date.format('YYYY-MM-DD HH:mm'); if (format == 1) { timeText = date.toLocaleString(); } if (DOM) { DOM.innerHTML = timeText; } } (function main() { var _a; try { const isDetailPage = location.href.includes("/details/"); const record = new record_1.Record(); if ((0, localStorage_1.hasLocalStorage)(constants_1.SAMS_LOCAL_STORAGE_KEY)) { try { const parsed = JSON.parse((_a = (0, localStorage_1.getLocalStorage)(constants_1.SAMS_LOCAL_STORAGE_KEY)) !== null && _a !== void 0 ? _a : ""); record.restoreRecord(parsed); } catch (e) { localStorage.removeItem(constants_1.SAMS_LOCAL_STORAGE_KEY); alert("LocalStorage 格式错误,请刷新页面后重试"); } } else { let startHour = (0, prompt_1.getIntegerFromPrompt)("开始时间(小时):", "请输入正确的开始时间"); let endHour = (0, prompt_1.getIntegerFromPrompt)("结束时间(小时):", "请输入正确的结束时间"); record.startTime.set("hours", startHour); record.endTime.set('hours', endHour); if ((0, date_1.isWeekends)()) { record.applyTime = (0, date_1.getEndOfWeekdays)(); record.approveTime = (0, date_1.getEndOfWeekdays)(); } const applyHour = (0, math_1.getRandomInt)(5); record.applyTime .set("hours", applyHour + 10) .set("minutes", (0, math_1.getRandomInt)(60)) .set("minutes", (0, math_1.getRandomInt)(60)); record.approveTime .set("hours", applyHour + 11) .set("minutes", (0, math_1.getRandomInt)(60)) .set("minutes", (0, math_1.getRandomInt)(60)); (0, localStorage_1.setLocalStorage)(constants_1.SAMS_LOCAL_STORAGE_KEY, record.toMemorizedString()); } const startTimeDOM = isDetailPage ? document.querySelector(constants_1.DETAIL_PAGE_START_TIME_DOM_SELECTOR) : document.querySelector(constants_1.LIST_PAGE_START_TIME_DOM_SELECTOR); const endTimeDOM = isDetailPage ? document.querySelector("body > div.wrapper > div.content-wrapper > section.content > div > div.form-horizontal > div:nth-child(3) > div") : document.querySelector("body > div.wrapper > div.content-wrapper > section.content > div > div.table-responsive > table > tbody > tr:nth-child(2) > td:nth-child(3)"); const applyTimeDOM = isDetailPage ? document.querySelector(constants_1.DETAIL_PAGE_END_TIME_DOM_SELECTOR) : document.querySelector(constants_1.LIST_PAGE_END_TIME_DOM_SELECTOR); const approveTimeDOM = isDetailPage ? document.querySelector(constants_1.DETAIL_PAGE_APPROVE_TIME_DOM_SELECTOR) : undefined; setTimeText(startTimeDOM, record.startTime, 0); setTimeText(endTimeDOM, record.endTime, 0); setTimeText(applyTimeDOM, record.applyTime, 0); if (approveTimeDOM) { setTimeText(approveTimeDOM, record.approveTime, 1); } const avatarDOM = document.querySelector(constants_1.AVATAR_DOM_SELECTOR); avatarDOM === null || avatarDOM === void 0 ? void 0 : avatarDOM.addEventListener("click", () => { localStorage.removeItem(constants_1.SAMS_LOCAL_STORAGE_KEY); }); } catch (error) { console.log(error); } })(); })(); /******/ })() ;