牛客优聘增强

替换999+投递数为真实的数字,一键擦亮,一键邀约

// ==UserScript==
// @name         Nowpick Enhanced
// @description  Replaces 999+ application count with actual data, adds one-click refresh and one-click invitation features
// @name:zh-CN   牛客优聘增强
// @description:zh-CN   替换999+投递数为真实的数字,一键擦亮,一键邀约
// @name:ar          Nowpick المحسّن
// @description:ar    يستبدل عدد التقديمات 999+ بالبيانات الفعلية، ويضيف ميزات التحديث بنقرة واحدة والدعوة بنقرة واحدة
// @name:bg          Nowpick Подобрен
// @description:bg    Заменя броя на кандидатурите 999+ с действителни данни, добавя функции за обновяване с едно кликване и покана с едно кликване
// @name:cs          Nowpick Vylepšený
// @description:cs    Nahrazuje počet žádostí 999+ skutečnými daty, přidává funkce obnovení jedním kliknutím a pozvání jedním kliknutím
// @name:da          Nowpick Forbedret
// @description:da    Erstatter ansøgningstallet 999+ med faktiske data, tilføjer funktioner til opdatering med ét klik og invitation med ét klik
// @name:de          Nowpick Verbessert
// @description:de    Ersetzt die Bewerbungszahl 999+ durch tatsächliche Daten, fügt Funktionen für Ein-Klick-Aktualisierung und Ein-Klick-Einladung hinzu
// @name:el          Nowpick Ενισχυμένο
// @description:el    Αντικαθιστά τον αριθμό αιτήσεων 999+ με πραγματικά δεδομένα, προσθέτει λειτουργίες ανανέωσης με ένα κλικ και πρόσκλησης με ένα κλικ
// @name:eo          Nowpick Plibonigita
// @description:eo    Anstataŭigas la nombron de kandidatiĝoj 999+ per faktaj datumoj, aldonas funkciojn por unuklaka ĝisdatigo kaj unuklaka invito
// @name:es          Nowpick Mejorado
// @description:es    Reemplaza el conteo de solicitudes 999+ con datos reales, agrega funciones de actualización con un clic e invitación con un clic
// @name:fi          Nowpick Parannettu
// @description:fi    Korvaa hakemusten määrän 999+ todellisilla tiedoilla, lisää yhden napsautuksen päivitys- ja kutsutoiminnot
// @name:fr          Nowpick Amélioré
// @description:fr    Remplace le nombre de candidatures 999+ par des données réelles, ajoute des fonctions de rafraîchissement en un clic et d'invitation en un clic
// @name:fr-CA       Nowpick Amélioré
// @description:fr-CA    Remplace le nombre de candidatures 999+ par des données réelles, ajoute des fonctions de rafraîchissement en un clic et d'invitation en un clic
// @name:he          Nowpick משופר
// @description:he    מחליף את מספר הבקשות 999+ בנתונים ממשיים, מוסיף תכונות של רענון בלחיצה אחת והזמנה בלחיצה אחת
// @name:hr          Nowpick Poboljšan
// @description:hr    Zamjenjuje broj prijava 999+ stvarnim podacima, dodaje funkcije osvježavanja jednim klikom i poziva jednim klikom
// @name:hu          Nowpick Továbbfejlesztett
// @description:hu    Lecseréli a 999+ jelentkezési számot tényleges adatokra, hozzáad egykattintásos frissítési és meghívási funkciókat
// @name:id          Nowpick Ditingkatkan
// @description:id    Mengganti jumlah aplikasi 999+ dengan data aktual, menambahkan fitur penyegaran sekali klik dan undangan sekali klik
// @name:it          Nowpick Migliorato
// @description:it    Sostituisce il conteggio delle candidature 999+ con dati reali, aggiunge funzioni di aggiornamento con un clic e invito con un clic
// @name:ja          Nowpick 強化版
// @description:ja    応募数999+を実際のデータに置き換え、ワンクリック更新およびワンクリック招待機能を追加
// @name:ka          Nowpick გაუმჯობესებული
// @description:ka    ცვლის განაცხადების რაოდენობას 999+ ფაქტობრივი მონაცემებით, ამატებს ერთი დაწკაპუნებით განახლებისა და მოწვევის ფუნქციებს
// @name:ko          Nowpick 강화된
// @description:ko    지원 수 999+를 실제 데이터로 대체하고, 원클릭 새로고침 및 원클릭 초대 기능을 추가합니다
// @name:nb          Nowpick Forbedret
// @description:nb    Erstatter søknadstallet 999+ med faktiske data, legger til funksjoner for oppdatering med ett klikk og invitasjon med ett klikk
// @name:nl          Nowpick Verbeterd
// @description:nl    Vervangt het aantal sollicitaties 999+ door actuele gegevens, voegt functies toe voor vernieuwen met één klik en uitnodigen met één klik
// @name:pl          Nowpick Ulepszony
// @description:pl    Zastępuje liczbę aplikacji 999+ rzeczywistymi danymi, dodaje funkcje odświeżania jednym kliknięciem i zapraszania jednym kliknięciem
// @name:pt-BR       Nowpick Aprimorado
// @description:pt-BR    Substitui a contagem de candidaturas 999+ por dados reais, adiciona funções de atualização com um clique e convite com um clique
// @name:ro          Nowpick Îmbunătățit
// @description:ro    Înlocuiește numărul de aplicații 999+ cu date reale, adaugă funcții de reîmprospătare cu un clic și invitație cu un clic
// @name:ru          Nowpick Улучшенный
// @description:ru    Заменяет количество заявок 999+ на фактические данные, добавляет функции обновления одним кликом и приглашения одним кликом
// @name:sk          Nowpick Vylepšený
// @description:sk    Nahrádza počet žiadostí 999+ skutočnými údajmi, pridáva funkcie obnovenia jedným kliknutím a pozvania jedným kliknutím
// @name:sr          Nowpick Побољшан
// @description:sr    Замењује број пријава 999+ стварним подацима, додаје функције освежавања једним кликом и позива једним кликом
// @name:sv          Nowpick Förbättrad
// @description:sv    Ersätter ansökningssiffran 999+ med faktiska data, lägger till funktioner för uppdatering med ett klick och inbjudan med ett klick
// @name:th          Nowpick ปรับปรุง
// @description:th    แทนที่จำนวนการสมัคร 999+ ด้วยข้อมูลจริง เพิ่มฟีเจอร์การรีเฟรชด้วยคลิกเดียวและการเชิญด้วยคลิกเดียว
// @name:tr          Nowpick Geliştirilmiş
// @description:tr    Başvuru sayısını 999+ gerçek verilerle değiştirir, tek tıkla yenileme ve tek tıkla davet özelliklerini ekler
// @name:ug          Nowpick كۈچەيتىلگەن
// @description:ug    ئىلتىماس سانى 999+ نى ھەقىقىي سانلىق مەلۇماتلار بىلەن ئالماشتۇرىدۇ، بىر چەكلىمە ئارقىلىق يېڭىلاش ۋە بىر چەكلىمە ئارقىلىق تەكلىپ قىلىش ئىقتىدارلىرىنى قوشىدۇ
// @name:uk          Nowpick Покращений
// @description:uk    Замінює кількість заявок 999+ фактичними даними, додає функції оновлення одним кліком та запрошення одним кліком
// @name:vi          Nowpick Nâng cao
// @description:vi    Thay thế số lượng đơn đăng ký 999+ bằng dữ liệu thực tế, thêm tính năng làm mới bằng một cú nhấp chuột và mời bằng một cú nhấp chuột
// @name:zh          Nowpick增强
// @description:zh    替换999+投递数为真实的数字,添加一键擦亮和一键邀约功能
// @name:zh-HK       Nowpick增強
// @description:zh-HK    替換999+投遞數為真實的數字,添加一鍵擦亮和一鍵邀約功能
// @name:zh-SG       Nowpick增强
// @description:zh-SG    替换999+投递数为真实的数字,添加一键擦亮和一键邀约功能
// @name:zh-TW       Nowpick增強
// @description:zh-TW    替換999+投遞數為真實的數字,添加一鍵擦亮和一鍵邀約功能
// @namespace    http://tampermonkey.net/
// @version      1.0.4.5
// @author       aspen138
// @match        *://nowpick.nowcoder.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @require      https://update.greasyfork.org/scripts/462234/1322684/Message.js
// @icon         data:image/png;base64,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
// @license      MIT
// ==/UserScript==


// @iconbackup         https://static.nowcoder.com/fe/common/share-logo.png


// key: "getDeliverNum",
// value: function(t) {
//     if (1 === t.showStatus)
//         return "- -";
//     var e = t.inviteSuccessCnt + t.initiativeDeliverCnt;
//     return e > 999 ? "999+" : e
// }





// Replace 999+ with actual number
(function () {
    'use strict';

    // Function to execute the main functionality
    async function executeMainFunctionality() {
        if (window.location.href === "https://nowpick.nowcoder.com/w/hrconsole/job-manage") {
            window.QMSG_GLOBALS = {
                DEFAULTS: {
                    showClose: true,
                    autoClose: false,
                    timeout: 3600 * 1000 // ms
                }
            };

            const name = "JobUpdater";

            function toast(s, error = false) {
                if (error) {
                    Qmsg.error(`[${name}] ${s}`);
                    console.error(`[${name}] ${s}`);
                } else {
                    Qmsg.success(`[${name}] ${s}`);
                    console.log(`[${name}] ${s}`);
                }
            }

            // Function to show a toast message
            function showToast(message) {
                toast(" " + message, false); // Display
            }

            // Function to escape special characters in CSS selectors
            function escapeCSSSelector(selector) {
                return selector.replace(/([!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~])/g, '\\$1');
            }

            // Function to replace the '999+' value with actual data
            async function replaceValues(jobName, unProcessCount) {
                const jobTitleElements = document.querySelectorAll('.job-title-name');
                const updateTasks = Array.from(jobTitleElements).map(async (el) => {
                    if (el.textContent.trim() === jobName) {
                        const jobInfoParent = el.closest('.job-info').parentElement.parentElement;
                        const unProcessElement = jobInfoParent.querySelector('.tw-font-semibold');
                        if (unProcessElement && unProcessElement.textContent.trim() === '999+') {
                            unProcessElement.textContent = unProcessCount;
                            showToast(`Updated job "${jobName}" with deliverNum: ${unProcessCount}`);
                        }
                    }
                });
                await Promise.all(updateTasks);
            }

            // Function to delay the update (parallelized for faster updates)
            async function delayUpdate(summaryDetailList) {
                await new Promise(resolve => setTimeout(resolve, 0.0001*1000)); // 1 second delay //why we need the delay here???

                const updateTasks = summaryDetailList.map(async (job) => {
                    const deliverNum = job.unProcessCount + job.successCount + job.failCount + job.unDetermined + job.writtenInterviewCount;
                    await replaceValues(job.jobName, deliverNum);
                });

                await Promise.all(updateTasks);
            }

            // Function to fetch data and initiate update (parallelized)
            async function fetchDataAndInitiateUpdate() {
                try {
                    const response = await fetch("https://nowpick.nowcoder.com/h/resume-deliver/summary");
                    if (response.ok) {
                        const jsonResponse = await response.json();
                        if (jsonResponse.data && jsonResponse.data.summaryDetailList) {
                            const summaryDetailList = jsonResponse.data.summaryDetailList;
                            await delayUpdate(summaryDetailList);
                        } else {
                            showToast("Unexpected response format");
                        }
                    } else {
                        showToast("Error: " + response.statusText);
                    }
                } catch (e) {
                    showToast("Request failed: " + e.message);
                }
            }

            // Execute only if we are on the specific URL
            await fetchDataAndInitiateUpdate();
        }
    }

    // Execute the main functionality on page load
    executeMainFunctionality();

    // Listen for hash change or pop state to detect URL changes
    window.addEventListener('hashchange', executeMainFunctionality);
    window.addEventListener('popstate', executeMainFunctionality);

    // Use a MutationObserver to detect URL changes if the page uses JavaScript-based navigation
    const observer = new MutationObserver(() => {
        executeMainFunctionality();
    });

    observer.observe(document, { childList: true, subtree: true });
})();






//一键擦亮
(function() {
    'use strict';

    // Function to click buttons sequentially with delay
    function clickAllPolishButtons() {
        const buttons = Array.from(document.querySelectorAll('button[data-v-55eaa2d2] span'))
            .filter(span => span.textContent.trim() === '一键擦亮')
            .map(span => span.closest('button'))
            .filter(button => !button.classList.contains('is-clicked')); // Exclude already clicked buttons

        function clickNextButton(index) {
            if (index < buttons.length) {
                const button = buttons[index];
                button.click();
                button.classList.add('is-clicked'); // Mark as clicked
                setTimeout(() => clickNextButton(index + 1), 100); // 0.1s delay
            }
        }

        if (buttons.length > 0) {
            clickNextButton(0); // Start clicking only if there are unclicked buttons
        }
    }

    // Add click event listener to trigger the sequence only once
    document.addEventListener('click', function(event) {
        const target = event.target.closest('button[data-v-55eaa2d2]');
        if (target && target.querySelector('span')?.textContent.trim() === '一键擦亮' && !target.classList.contains('is-clicked')) {
            target.classList.add('is-clicked'); // Mark the clicked button immediately
            // Trigger the sequence for remaining unclicked buttons
            setTimeout(clickAllPolishButtons, 100); // Start after a short delay to allow the first click
        }
    }, { once: true }); // Ensure the listener runs only once to prevent multiple triggers
})();



// 右键菜单里选择“一键邀约”
(function() {
    'use strict';

    // Function to click all matching buttons
    function clickAllInviteButtons() {
        const buttons = document.querySelectorAll('button.el-button.invite-wrap.txt-center.fs-14.el-button--primary');
        buttons.forEach(button => {
            button.click();
        });
    }

    // Register context menu item
    GM_registerMenuCommand('Click All Invite Buttons', clickAllInviteButtons, 'c');
})();