SAMScript

更改 SAMS 网页出校时间

اعتبارا من 10-12-2022. شاهد أحدث إصدار.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

ستحتاج إلى تثبيت إضافة مثل Stylus لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتتمكن من تثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

(لدي بالفعل مثبت أنماط للمستخدم، دعني أقم بتثبيته!)

// ==UserScript==
// @name SAMScript
// @version 1.1.1
// @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 */
/***/ (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 }));
const constants_1 = __webpack_require__(1);
const prompt_1 = __webpack_require__(2);
const record_1 = __webpack_require__(3);
const localStorage_1 = __webpack_require__(6);
const math_1 = __webpack_require__(7);
const date_1 = __webpack_require__(5);
const dayjs_1 = __importDefault(__webpack_require__(4));
const weekday_1 = __importDefault(__webpack_require__(8));
dayjs_1.default.extend(weekday_1.default);
function setTimeText(DOM, date, format) {
    let timeText = date.format('YYYY-MM-DD HH:mm');
    if (format == 1) {
        timeText = date.toDate().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 = record.startTime.set("hour", startHour);
            record.endTime = record.endTime.set('hour', 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 = record.applyTime
                .set("hour", applyHour + 10)
                .set("minute", (0, math_1.getRandomInt)(60))
                .set("minute", (0, math_1.getRandomInt)(60));
            record.approveTime = record.approveTime
                .set("hour", applyHour + 11)
                .set("minute", (0, math_1.getRandomInt)(60))
                .set("minute", (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(constants_1.DETAIL_PAGE_END_TIME_DOM_SELECTOR)
            : document.querySelector(constants_1.LIST_PAGE_END_TIME_DOM_SELECTOR);
        const applyTimeDOM = isDetailPage
            ? document.querySelector(constants_1.DETAIL_PAGE_APPLY_TIME_DOM_SELECTOR)
            : document.querySelector(constants_1.LIST_PAGE_APPLY_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);
    }
})();


/***/ }),
/* 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_APPLY_TIME_DOM_SELECTOR = exports.DETAIL_PAGE_APPLY_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_APPLY_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.form-horizontal > div:nth-child(7) > div";
exports.LIST_PAGE_APPLY_TIME_DOM_SELECTOR = "body > div.wrapper > div.content-wrapper > section.content > div > div.table-responsive > table > tbody > tr:nth-child(2) > td:nth-child(6)";
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));
function getStartOfDay(date) {
    return date.set("hour", 0).set("minute", 0).set("second", 0);
}
exports.getStartOfDay = getStartOfDay;
function isWeekends() {
    alert((0, dayjs_1.default)().weekday());
    return (0, dayjs_1.default)().weekday() === 6 || (0, dayjs_1.default)().weekday() === 7;
}
exports.isWeekends = isWeekends;
function getEndOfWeekdays() {
    return (0, dayjs_1.default)().weekday(5);
}
exports.getEndOfWeekdays = getEndOfWeekdays;


/***/ }),
/* 6 */
/***/ ((__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;


/***/ }),
/* 7 */
/***/ ((__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;


/***/ }),
/* 8 */
/***/ (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")}}}));

/***/ })
/******/ 	]);
/************************************************************************/
/******/ 	// 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;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module is referenced by other modules so it can't be inlined
/******/ 	var __webpack_exports__ = __webpack_require__(0);
/******/ 	
/******/ })()
;