Greasy Fork

来自缓存

Greasy Fork is available in English.

打卡提醒

try to take over the world!

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         打卡提醒
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  try to take over the world!
// @author       cA7dEm0n
// @include      *
// @match        *
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @require     http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.2/moment.min.js
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==

(function () {
    'use strict';

    const DEFAULT_WORK_START_TIME = "09:00";
    const DEFAULT_WORK_END_TIME = "18:30";

    const REFRESH_MS_TIME = 3000;
    const TIME_FORMAT = "H:m";

    let today = moment().format('L');
    const WORK_SIGN_KEY = `workSign_${today}`;
    const WORK_SIGN_TIME_KEY = `workSignTime_${today}`;
    const OFF_WORK_SIGN_KEY = `offWorkSign_${today}`;
    const OFF_WORK_SIGN_TIME_KEY = `offWorkSignTime_${today}`;

    const DEFAULT_WORK_TIME_MINUTE = Number(moment(DEFAULT_WORK_END_TIME, TIME_FORMAT).diff(moment(DEFAULT_WORK_START_TIME, TIME_FORMAT), 'minute'))

    if (stringInUrl("help!!!")) {
        console.log("setWorkTime    手动设置上班打卡时间,例: http://www.baidu.com/?setWorkTime=09:40")
        console.log("setWorkStatus  手动设置上班打卡状态,例: http://www.baidu.com/?setWorkStatus=true")
        console.log("setOffWorkTime   手动设置下班打卡时间,例: http://www.baidu.com/?setOffWorkTime=18:40")
        console.log("setOffWorkStatus  手动设置下班打卡状态,例: http://www.baidu.com/?setOffWorkStatus=true")
        alert("查看控制台")
    }

    if (getParameterByName("setWorkTime")) {
        let workSignTime = getParameterByName("setWorkTime")
        GM_setValue(WORK_SIGN_TIME_KEY, workSignTime)

        let endTime = moment(workSignTime, TIME_FORMAT).add(DEFAULT_WORK_TIME_MINUTE, 'm').format(TIME_FORMAT)
        GM_setValue(OFF_WORK_SIGN_TIME_KEY, endTime)
        alert(`上班打卡提示时间修改为: ${workSignTime}\n下班打卡提示时间修改为: ${endTime}`)
    }

    if (getParameterByName("setOffWorkTime")) {
        let offWorkSignTime = getParameterByName("setOffWorkTime")
        GM_setValue(OFF_WORK_SIGN_TIME_KEY, offWorkSignTime)
        alert(`下班打卡时间改为\n${offWorkSignTime}`)
    };

    if (getParameterByName("setOffWorkStatus")) {
        let offWorkSignStatus = getParameterByName("setOffWorkStatus")
        let status = offWorkSignStatus == "true" ? true : false
        GM_setValue(OFF_WORK_SIGN_KEY, status)
        alert(`修改下班打卡状态为[${status}]`)
    }

    if (getParameterByName("setWorkStatus")) {
        let workSignStatus = getParameterByName("setWorkStatus")
        let status = workSignStatus == "true" ? true : false
        GM_setValue(WORK_SIGN_KEY, status)
        alert(`修改上班打卡状态为[${status}]`)
    }

    function stringInUrl(name, url) {
        if (!url) url = window.location.href;
        return url.indexOf(name) > 0
    };

    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, '\\$&');
        var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }

    if (GM_getValue(OFF_WORK_SIGN_KEY, false)) {
        throw new Error("下班已经打卡,进程结束.");
    }

    let workSignTime = GM_getValue(WORK_SIGN_TIME_KEY, DEFAULT_WORK_START_TIME);
    $("body").append(`<div class="pfys">上午打卡时间:${workSignTime}</div>`)
    GM_addStyle(" \
    .pfys { \
        span { display: block; }\
        font-size: 8px;\
        z-index:9999; \
        opacity:0.5; \
        width: 10px; \
        line-height: 20px;\
        height: 40px;\
        position: fixed;\
        word-wrap:break-word; \
        word-break:break-all; \
        right: 1px;\
        top: 120px;\
        text-align: center;\
        -webkit-box-shadow: 1.2px 1.2px 1.2px #000;\
        box-shadow: 1px 1px 1px hsla(0,0%,0%,.4);\
        border-top-left-radius: 3px;\
        border-bottom-left-radius: 3px;\
        transition: all .8s ease 0s;\
        overflow: hidden;\
     }\
     .pfys:hover {\
        opacity:0.88; \
        width: 200px;\
        height: 120px;\
        font-size: 16px;\
        color: #333;\
        background-color: #FAFAFE;\
        line-height: 40px;\
      }\
     .pfys span { \
        display:block; \
      }"
    )

    $(".pfys").hover(function () {
        let offWorkSignTime = GM_getValue(OFF_WORK_SIGN_TIME_KEY, DEFAULT_WORK_END_TIME);
        let timeDiff = offWorkSignTimeMomentObj().diff(moment(), 'minute');
        $(".pfys").html(`<span>上午打卡时间:\t${workSignTime}</span><span> 下午打卡时间:\t${offWorkSignTime}</span><span>还有<b>${timeDiff}</b>分钟放学</span>`);
    });

    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, '\\$&');
        var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }

    function workSignTimeMomentObj() {
        let workSignTime = GM_getValue(WORK_SIGN_TIME_KEY, DEFAULT_WORK_START_TIME)
        return moment(workSignTime, TIME_FORMAT)
    }

    function offWorkSignTimeMomentObj() {
        let offWorkSignTime = GM_getValue(OFF_WORK_SIGN_TIME_KEY, DEFAULT_WORK_END_TIME)
        return moment(offWorkSignTime, TIME_FORMAT)
    }

    function isWork(timeObj) {
        return timeObj().unix() >= workSignTimeMomentObj().unix();
    };

    function isOffWork(timeObj) {
        return timeObj().unix() >= offWorkSignTimeMomentObj().unix();
    }

    let intervarl = setInterval(main, REFRESH_MS_TIME)

    function main() {
        console.log(`[.] 打卡提醒插件正常运行, 当前[${REFRESH_MS_TIME}ms]检测一次`)
        let nowTime = moment;
        let workSign = GM_getValue(WORK_SIGN_KEY, false);
        if (isWork(nowTime) && !workSign) {
            if (confirm("打卡了吗?")) {
                GM_setValue(WORK_SIGN_KEY, true);
                GM_setValue(WORK_SIGN_TIME_KEY, nowTime().format(TIME_FORMAT));

                let endTime = nowTime().add(DEFAULT_WORK_TIME_MINUTE, 'm').format(TIME_FORMAT)
                GM_setValue(OFF_WORK_SIGN_TIME_KEY, endTime);
            }
        }

        let offWorkSign = GM_getValue(OFF_WORK_SIGN_KEY, false);
        if (isOffWork(nowTime) && offWorkSign == false) {
            if (confirm("下班打卡了吗?")) {
                GM_setValue(OFF_WORK_SIGN_KEY, true);
                console.log(`下班打卡成功:${nowTime().format(TIME_FORMAT)}`);
            } else {
                console.log("打卡失败");
            }
        }
        if (GM_getValue(OFF_WORK_SIGN_KEY, false) == true) {
            console.log("[!] 下班已打卡!!!!")
            clearInterval(intervarl);
        }
    }
})();