Grab Lecture in SZU

【使用前先看介绍/有问题可反馈】深圳大学抢领航讲座脚本 (Grab Lecture in SZU):可用于在深圳大学抢领航讲座,目前处于测试阶段。

10.03.2021 itibariyledir. En son verisyonu görün.

// ==UserScript==
// @name         Grab Lecture in SZU
// @namespace    http://tampermonkey.net/
// @version      0.6.1
// @description  【使用前先看介绍/有问题可反馈】深圳大学抢领航讲座脚本 (Grab Lecture in SZU):可用于在深圳大学抢领航讲座,目前处于测试阶段。
// @author       cc
// @match        http://lecture.szu.edu.cn/*
// @require      https://cdn.bootcss.com/jquery/3.4.1/jquery.js
// @require      https://greasyfork.org/scripts/422854-bubble-message.js
// @noframes
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    'use strict';
    let campus;
    let bm = new BubbleMessage();
    bm.config.cmap.info = '#009688';
    bm.config.width = 300;
    function getStartTime() {
        let now = new Date();
        let year = now.getFullYear();
        let month = now.getMonth() + 1;
        let day = now.getDate();
        let startTime = new Date(`${year}-${month}-${day} 12:30:00`);
        return startTime.getTime();
    };
    function rushLecture() {
        let deltaTime = startTime - currentTime;
        bm.message({
            type: 'info',
            message: `将在 ${parseInt(deltaTime / 1000)} 秒后开抢`,
            duration: 3000,
        })
        $.ajax({
            url: 'http://lecture.szu.edu.cn/tLectureSignUp/list?page=1&limit=10',
            type: 'GET',
        }).then(res => {
            if (res.code === 0) {
                let availableLectures = res.data.filter(lecture => Date.now() < new Date(lecture.lectureEndTime));
                Promise.all(availableLectures.map(lecture => {
                    return $.ajax({
                        url: `http://lecture.szu.edu.cn/lectureClassroomSignUp/list?page=1&limit=20&lectureId=${lecture.id}`,
                        type: 'GET',
                    }).then(res => {
                        return res.code === 0 ? res.data.filter(room => room.remainSeats > 0) : [];
                    });
                })).then(res => {
                    let availableRooms = [];
                    res.forEach(room => availableRooms.concat(room));
                    availableRooms = availableRooms.filter(room => campus.indexOf(room.campus) >= 0);
                    if (availableRooms.length === 0) {
                        bm.message({
                            type: 'warning',
                            message: '无可抢讲座',
                            duration: 1500,
                        });
                    } else {
                        Promise.all(availableRooms.map(room => {
                            return $.ajax({
                                url: `http://lecture.szu.edu.cn/tSelectLecture/addItem?lectureClassroomId=${room.id}&lectureId=${room.lectureId}&classroomId=${room.classroomId}`,
                                type: 'POST',
                            }).then(res => {
                                return res;
                            });
                        })).then(res => {
                            bm.message({
                                type: 'info',
                                message: '抢领航讲座已完成,请刷新页面查看结果',
                                duration: 3000,
                            });
                            console.log(res);
                        });
                    };
                });
            } else {
                bm.message({
                    type: 'error',
                    message: '请求失败',
                })
            };
        });
    };
    function loadConfig () {
        let config = GM_getValue('config');
        let duration = 0;
        if (!config) {
            if (!confirm(`是否选择粤海校区/沧海校区的讲座?(丽湖校区请点击'取消')`))
                campus = ['丽湖校区'];
            else
                campus = ['粤海校区', '沧海校区'];
            GM_setValue('config', { campus: campus });
            duration = 3000;
            bm.message({
                type: 'info',
                message: `已经设置校区为${campus.join('/')},可以通过重新安装脚本进行重置`,
                duration: duration,
            });
        } else {
            campus = config.campus;
        };
        return duration;
    };
    function run () {
        let duration = loadConfig();
        setTimeout(() => {
            let currentTime = Date.now();
            let startTime = getStartTime();
            if (currentTime < startTime) {
                setTimeout(rushLecture, startTime - currentTime);
            } else {
                bm.message({
                    type: 'info',
                    message: `已经过了抢课时间`,
                    duration: 3000,
                })
            };
        }, duration);
    };
    run();
})();