LztDynamicTimeContest

Динамическое обновление времени в темах розыгрышей

// ==UserScript==
// @name         LztDynamicTimeContest
// @version      0.1
// @description  Динамическое обновление времени в темах розыгрышей
// @author       vuchaev2015
// @match        https://zelenka.guru/threads/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru
// @grant        none
// @namespace https://gf.qytechs.cn/users/997663
// ==/UserScript==

let postElement = document.querySelector('li[id^="post-"]');
if (postElement) {
    let postId = postElement.id.split('-')[1];
    let selector = `#post-${postId} > div.messageInfo > div.messageContent > article > div > div.new-raffle-info.mn-15-0-0 > div:nth-child(1) > div:nth-child(2)`;
    let textElement = document.querySelector(selector);
    if (textElement) {
        let textContent = textElement.textContent;

        textContent = textContent.replace(/\s+/g, ' ').trim();

        textContent = textContent.replace('Времени до завершения:', '');
        console.log(textContent);

        let duration = 0;
        let match = textContent.match(/(\d+) д(ня|ней|ень)/);
        if (match) {
            duration += parseInt(match[1]) * 24 * 60 * 60 * 1000;
        }
        match = textContent.match(/(\d+) час/);
        if (match) {
            duration += parseInt(match[1]) * 60 * 60 * 1000;
        }
        match = textContent.match(/(\d+) минут/);
        if (match) {
            duration += parseInt(match[1]) * 60 * 1000;
        }
        match = textContent.match(/(\d+) секунд/);
        if (match) {
            duration += parseInt(match[1]) * 1000;
        }

        let currentTime = new Date();
        let resultTime = new Date(currentTime.getTime() + duration);

        let lastRemainingTimeString = '';
        let newElementAdded = false;
        let intervalId = setInterval(() => {
            let currentTime = new Date();
            let remainingTime = resultTime - currentTime;
            if (remainingTime <= 0) {

                let resultTimeString = `${resultTime.getDate()} ${['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'][resultTime.getMonth()]} ${resultTime.getFullYear()} в ${resultTime.getHours()}:${resultTime.getMinutes().toString().padStart(2, '0')}`;
                textElement.innerHTML = `<div><p>До</p> ${resultTimeString}</div>`;

                let messageListElement = document.querySelector('ol.messageList');
                if (messageListElement) {
                    let usernameElements = messageListElement.querySelectorAll('a.username');
                    let rootUsernames = Array.from(usernameElements).filter(username => username.textContent === 'root')

                    if (rootUsernames.length > 0 && !newElementAdded && !document.querySelector('span.button.contestIsFinished.disabled')) {
                        let contestThreadBlockElement = document.querySelector('div.contestThreadBlock');
                        if (contestThreadBlockElement) {
                            let textHeadingElement = contestThreadBlockElement.querySelector('div.textHeading');
                            if (textHeadingElement) {
                                let newElement = document.createElement('span');
                                newElement.className = 'button contestIsFinished disabled';
                                newElement.innerHTML = '<i class="fa fa-check muted" aria-hidden="true"></i> Розыгрыш завершен';
                                contestThreadBlockElement.insertBefore(newElement, textHeadingElement.nextSibling);
                                newElementAdded = true;

                                let elementToRemove1 = document.querySelector(`#post-${postId} > div.messageInfo > div.messageContent > article > div > div.new-raffle-info.mn-15-0-0 > div:nth-child(1)`);
                                if (elementToRemove1) {
                                    elementToRemove1.parentNode.removeChild(elementToRemove1);
                                }
                                let elementToRemove2 = document.querySelector(`#post-${postId} > div.messageInfo > div.messageContent > article > div > div.new-raffle-info.mn-15-0-0 > div:nth-child(2)`);
                                if (elementToRemove2) {
                                    elementToRemove2.parentNode.removeChild(elementToRemove2);
                                }

                                let quickReplyMessageElement = document.querySelector('div.quickReply.message');
                                if (quickReplyMessageElement) {
                                    quickReplyMessageElement.outerHTML = '<div class="pageNavLinkGroup pageNavLinkGroupAfterPosts"><span class="element">Вы не можете выполнить это действие, потому что тема была закрыта.</span></div>';

                                }
                                clearInterval(intervalId);
                            }
                        }
                    } else {
console.log(22)}


                    let participateButtonElement = document.querySelector('.LztContest--Participate.button.mn-15-0-0.primary');
                    if (participateButtonElement) {
                        participateButtonElement.parentNode.removeChild(participateButtonElement);
                    }


                    let contestCaptchaElement = document.querySelector('.ContestCaptcha.mn-15-0-0');
                    if (contestCaptchaElement) {
                        contestCaptchaElement.parentNode.removeChild(contestCaptchaElement);
                    }


                }
            } else {
                let days = Math.floor(remainingTime / (1000 * 60 * 60 * 24));
                remainingTime -= days * (1000 * 60 * 60 * 24);
                let hours = Math.floor(remainingTime / (1000 * 60 * 60));
                remainingTime -= hours * (1000 * 60 * 60);
                let minutes = Math.floor(remainingTime / (1000 * 60));
                remainingTime -= minutes * (1000 * 60);
                let seconds = Math.floor(remainingTime / (1000));


                let remainingTimeString = '';
                if (days > 0) {
                    remainingTimeString += ` ${days} ${declOfNum(days, ['день', 'дня', 'дней'])}`;
                }
                if ((hours > 0 || days > 0) && !(days === 0 && hours === 0)) {
                    remainingTimeString += ` ${hours} ${declOfNum(hours, ['час', 'часа', 'часов'])}`;
                }
                if ((minutes > 0 || hours > 0 || days > 0) && !(days === 0 && hours === 0 && minutes === 0)) {
                    remainingTimeString += ` ${minutes} ${declOfNum(minutes, ['минута', 'минуты', 'минут'])}`;
                }
                if (days === 0) {
                    remainingTimeString += ` ${seconds} ${declOfNum(seconds, ['секунда', 'секунды', 'секунд'])}`;
                }


                if (remainingTimeString !== lastRemainingTimeString) {
                    textElement.innerHTML = `<div><p>Времени до завершения:</p> ${remainingTimeString}</div>`;
                    lastRemainingTimeString = remainingTimeString;
                }
            }
        });
    } else {
        console.log('Текстовый элемент не найден на странице');
    }
} else {
    console.log('Элемент с id, начинающимся с "post-", не найден на странице');
}

function declOfNum(number, titles) {
    cases = [2, 0, 1, 1, 1, 2];
    return titles[(number %100 >4 && number %100 <20)?2:cases[(number %10 <5)?number %10:5]];
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址