Brain Tree

Store and auto-populate info for Brain Tree daily quest.

目前为 2023-04-27 提交的版本。查看 最新版本

// ==UserScript==
// @name         Brain Tree
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Store and auto-populate info for Brain Tree daily quest.
// @author       baileyb (GC user bailey)
// @match        http*://www.grundos.cafe/halloween/braintree*
// @match        http*://www.grundos.cafe/halloween/esophagor*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=grundos.cafe
// @grant        GM.setValue
// @grant        GM_getValue
// @grant        GM.deleteValue
// ==/UserScript==

const selectors = {
    answer: "#page_content strong u",
    submitButton: "#page_content input[type='submit']",
    placeInput: "input[name='place']",
    yearInput: "input[name='year']"
}

const elements = {
    answer: document.querySelector(selectors.answer),
    submitButton: document.querySelector(selectors.submitButton),
    placeInput: document.querySelector(selectors.placeInput),
    yearInput: document.querySelector(selectors.yearInput)
}

const currentDate = new Date()

/**
 * Compute if Daylight Savings Time is active.
 * @param {Object} date
 * @returns {Boolean}
 */
function isDaylightSavings(date) {
    let jan = new Date(date.getFullYear(), 0, 1).getTimezoneOffset()
    let jul = new Date(date.getFullYear(), 6, 1).getTimezoneOffset()
    return Math.max(jan, jul) !== date.getTimezoneOffset()
}

/**
 * Compute Date for midnight when dailies reset.
 * @param {Object} date
 * @returns {Object} date at midnight
 */
function getMidnight(date) {
    let midnightNumber = 0

    if (isDaylightSavings(date)) {
        midnightNumber = date.setUTCHours(7,0,0,0)
    } else {
        midnightNumber = date.setUTCHours(8,0,0,0)
    }
    return new Date(midnightNumber);
}

/**
 * Handle locally stored answer value by clearing if expired, or populating input.
 * @param {String} answerType - 'year' or 'place'
 * @param {Object} date
 */
function handleStoredAnswer(answerType, date) {
    const answer = GM_getValue(answerType)
    const answerExpires = new Date(GM_getValue(`${answerType}Expires`))

    if (!answer) {
        return
    } else {
        if (answerExpires && date > answerExpires) {
            GM.removeValue(answerType)
            GM.removeValue(`${answerType}Expires`)
        } else {
            elements[`${answerType}Input`].value = answer
        }
    }
}

/**
 * Store answer.
 * @param {String} answer
 */
function storeAnswer(answer) {
    const midnight = Date.parse(getMidnight(currentDate));

    if (answer.match(/[\d]+[\w]*/)) {
        GM.setValue('year', answer)
        GM.setValue('yearExpires', midnight)
    } else {
        GM.setValue('place', answer)
        GM.setValue('placeExpires', midnight)
    }
}

(function() {
    'use strict'

    if (window.location.href.includes('braintree')) {
        if (!elements.submitButton) {
            return
        } else {
            handleStoredAnswer('year', currentDate)
            handleStoredAnswer('place', currentDate)
        }
    }

    if (window.location.href.includes('esophagor')) {
        if (!elements.answer) {
            return;
        } else {
            const answer = elements.answer.innerHTML;
            storeAnswer(answer)
        }
    }
})();