Nova Hill Timezone modifier

Modify timezones on forums posts

// ==UserScript==
// @name         Nova Hill Timezone modifier
// @version      1.1
// @description  Modify timezones on forums posts
// @author       fajay
// @match        https://nova-hill.com/*
// @namespace https://greasyfork.org/users/725966
// ==/UserScript==
(function () {
    'use strict';
    var HourFormat24 = document.cookie.includes("24hour=true") ? true : false
    var MMDDYYYYFormat = document.cookie.includes("mmddyy=false") ? false : true

    var joinedRegex = /Joined ([0123]\d)\/([01]\d)\/(20\d{2})/ // REGEX FUCK YEAH
    var postRegex = /([01]\d):([012345]\d) (AM|PM) ([0123]\d)\/([01]\d)\/(20\d{2})/ // MORE REGEX FUCK YEAH
    var feedRegex = /([0123]\d)\/([01]\d)\/(20\d{2}) ([01]\d):([012345]\d) (AM|PM)/ // WHAT?! MORE REGEX?! AAAAAAAAAAAAAAAAAAAA
    var commentRegex = /([0123]\d)\/([01]\d)\/(20\d{2}) (\d{1,2}):([012345]\d):[012345]\d (AM|PM)/ // They use an other date format for comments, brick-hill ftw??
    var transactionsRegex = /([0123]\d)-([01]\d)-(20\d{2})/
    var gameRegex = /(20\d{2})\/([01]\d)\/([0123]\d)/
    // Some people might find the above lines of code sorcelery, but I love regex


    // BAD CODE INCOMING!!
    function convertDateAndHour(day, month, year, hour, minutes, modifier) {
        var date = new Date()
        date.setUTCFullYear(year, month-1, day)
        var a = convertHour(hour,minutes,modifier)
        date.setUTCHours(a[0], a[1])
        if (MMDDYYYYFormat) {
            if (HourFormat24) {
                return `${date.getHours().toString().padStart(2,"0")}:${date.getMinutes().toString().padStart(2,"0")} ${date.getMonth()+1}/${date.getDate()}/${date.getFullYear()}`
            }
            return `${convertToAMPM(date)} ${date.getMonth()+1}/${date.getDate()}/${date.getFullYear()}`
        } else {

            if (HourFormat24) {
                return `${date.getHours().toString().padStart(2,"0")}:${date.getMinutes().toString().padStart(2,"0")} ${date.getDate()}/${date.getMonth()+1}/${date.getFullYear()}`
            }
            return `${convertToAMPM(date)} ${date.getDate()}/${date.getMonth()+1}/${date.getFullYear()}`
        }
    }

    function convertDate(day,month,year) {
        if(MMDDYYYYFormat) {
            return month + "/" + day + "/" + year
        } else {
            return day + "/" + month + "/" + year
        }
    }

    function convertHour(hour, minutes, modifier) {
        hour = parseInt(hour)
        if (hour == 12) {
            hour = 0
        }
        if (modifier == "PM") {
            hour += 12
        }
        return [hour, minutes]
    }

    function convertToAMPM(date){
        if(date.getHours() < 12) {
            return (date.getHours() % 12 || 12).toString().padStart(2,"0") + ":" + date.getMinutes().toString().padStart(2,"0") + " AM"
        } else {
            return (date.getHours() % 12 || 12).toString().padStart(2,"0") + ":" + date.getMinutes().toString().padStart(2,"0") + " PM"
        }
    }
    // Loop? What's that?
    setInterval(()=>{
        var elements = document.body.querySelectorAll("*")
        elements.forEach(element => {
            if (!element.innerHTML.includes("<") && element.innerHTML != "" && !element.tzmfconverted) { //TimeZone ModiFier CONVERTED
                var m = ""
                element.tzmfconverted = true
                if (m = element.innerHTML.match(joinedRegex)) {
                    element.innerHTML = "Joined " + convertDate(m[1],m[2],m[3])
                } else if (m = element.innerHTML.match(postRegex)) {
                    element.innerHTML = convertDateAndHour(m[4],m[5],m[6],m[1],m[2],m[3])
                } else if (m = element.innerHTML.match(feedRegex)) {
                    element.innerHTML = convertDateAndHour(m[1],m[2],m[3],m[4],m[5],m[6])
                } else if (m = element.innerHTML.match(transactionsRegex)) {
                    element.innerHTML = convertDate(m[1],m[2],m[3])
                } else if(m = element.innerHTML.match(commentRegex)) {
                    element.innerHTML = convertDateAndHour(m[1],m[2],m[3],parseInt(m[4])+(new Date().getTimezoneOffset()/60),m[5],m[6])
                    // SOMEHOW jefemy the web developer managed to mess it up even more and make the comment time automatically adapted to your timezone. Thanks for the pain jefemy
                } else if(m = element.innerHTML.match(gameRegex)) {
                    element.innerHTML = convertDate(m[3],m[2],m[1])
                }
            }
        })
    },500)


    if(document.location.href.includes("settings")) {
        setTimeout(()=>{ // Settings need to load, wacky solution
            let settings = document.querySelector(".content")
            settings.appendChild(document.createElement("hr"))
            let title = document.createElement("span")
            title.className = "dark-gray-text bold block"
            title.style.paddingBottom = "5px"
            title.innerText = "Timezone Modifier Settings"
            settings.appendChild(title)
            let hour24 = document.createElement("div")
            hour24.className = "block"
            hour24.style.display = "flex"
            hour24.style.alignItems = "center"
            hour24.innerHTML = `<span style="margin-right: 5px">24 hour mode:</span><input type="checkbox" style="width: unset; margin: 0px" onclick='document.cookie = "24hour="+this.checked+"; path=/"' id="hour24">` // Ah yes, 100% width checkbox. Thanks jefemy
            settings.appendChild(hour24)
            document.getElementById("hour24").checked = document.cookie.includes("24hour=true") ? true : false
            let mmddyy = document.createElement("div")
            mmddyy.className = "block"
            mmddyy.style.display = "flex"
            mmddyy.style.alignItems = "center"
            mmddyy.innerHTML = `<span style="margin-right: 5px">MMDDYY format:</span><input type="checkbox" style="width: unset; margin: 0px" onclick='document.cookie = "mmddyy="+this.checked+"; path=/"' id="mmddyy">`
            settings.appendChild(mmddyy)
            document.getElementById("mmddyy").checked = document.cookie.includes("mmddyy=false") ? false : true
        },1500)
    }
})();