ChatGPT Character Counter Limit (CCCL)

Adds a character counter to the input field with a limit of 32732 characters. (ChatGPT has a limit of 32732 characters.)

// ==UserScript==
// @name              ChatGPT Character Counter Limit (CCCL)
// @description       Adds a character counter to the input field with a limit of 32732 characters. (ChatGPT has a limit of 32732 characters.)
// @name:zh-CN        ChatGPT 字符计数器限制
// @description:zh-CN 添加一个字符计数器到输入框,限制为 32732 个字符。(ChatGPT 的限制是 32732 个字符。.)
// @name:ar           ChatGPT حد عداد الأحرف 
// @description:ar    إضافة عداد الأحرف إلى مربع الإدخال,يقتصر على 32732 الشخصيات。(ChatGPT الحد هو 32732 الشخصيات。)
// @name:bg           ChatGPT Ограничение на брояча на знаци
// @description:bg    Добавете брояч на символи към полето за въвеждане,ограничен до 32732 герои。(ChatGPT Ограничението е 32732 герои。)
// @name:cs           ChatGPT Limit počítadla znaků (CCCL)
// @description:cs    Do vstupního pole přidejte počítadlo znaků,omezena na 32732 postavy。(ChatGPT Limit je 32732 postavy。)
// @name:da           ChatGPT Tegntællergrænse (CCCL)
// @description:da    Tilføj en tegntæller til inputfeltet,begrænset til 32732 tegn。(ChatGPT Grænsen er 32732 tegn。)
// @name:de           ChatGPT Zeichenzählerlimit
// @description:de    Fügen Sie dem Eingabefeld einen Zeichenzähler hinzu,beschränkt auf 32732 Charaktere。(ChatGPT Die Grenze ist 32732 Charaktere。)
// @name:el           ChatGPT Όριο μετρητή χαρακτήρων (CCCL)
// @description:el    Προσθέστε έναν μετρητή χαρακτήρων στο πλαίσιο εισαγωγής,περιορίζεται σε 32732 χαρακτήρες。(ChatGPT Το όριο είναι 32732 χαρακτήρες。)
// @name:en           ChatGPT Character counter limit (CCCL)
// @description:en    Add a character counter to the input box,limited to 32732 characters。(ChatGPT The limit is 32732 characters。)
// @name:eo           ChatGPT Limo de nombrilo de karakteroj (CCCL)
// @description:eo    Aldonu signan nombrilon al la eniga skatolo,limigita al 32732 karakteroj。(ChatGPT La limo estas 32732 karakteroj。)
// @name:es           ChatGPT Límite del contador de caracteres (CCCL)
// @description:es    Agregue un contador de caracteres al cuadro de entrada,circunscrito a 32732 personajes。(ChatGPT El límite es 32732 personajes。)
// @name:fi           ChatGPT Merkkilaskurin raja (CCCL)
// @description:fi    Lisää merkkilaskuri syöttöruutuun,rajoitettu 32732 hahmoja。(ChatGPT Raja on 32732 hahmoja。)
// @name:fr           ChatGPT Limite du compteur de caractères (CCCL)
// @description:fr    Ajouter un compteur de caractères à la zone de saisie,limité à 32732 personnages。(ChatGPT La limite est 32732 personnages。)
// @name:he           ChatGPT מגבלת מונה תווים (CCCL)
// @description:he    הוסף מונה תווים לתיבת הקלט,מוגבל ל 32732 תווים。(ChatGPT הגבול הוא 32732 תווים。)
// @name:hr           ChatGPT Ograničenje brojača znakova (CCCL)
// @description:hr    Dodajte brojač znakova u polje za unos,ograničeno na 32732 likovi。(ChatGPT Granica je 32732 likovi。)
// @name:hu           ChatGPT Karakterszámláló korlát (CCCL)
// @description:hu    Adjon hozzá egy karakterszámlálót a beviteli mezőhöz,korlátozva 32732 karakterek。(ChatGPT A határ az 32732 karakterek。)
// @name:id           ChatGPT Batas penghitung karakter (CCCL)
// @description:id    Tambahkan penghitung karakter ke kotak input,terbatas pada 32732 karakter。(ChatGPT Batasnya adalah 32732 karakter。)
// @name:it           ChatGPT Limite del contatore di caratteri (CCCL)
// @description:it    Aggiungi un contatore di caratteri alla casella di input,limitato a 32732 caratteri。(ChatGPT Il limite è 32732 caratteri。)
// @name:ja           ChatGPT 文字数カウンターの制限 (CCCL)
// @description:ja    入力ボックスに文字カウンターを追加する,に限定される 32732 キャラクター。(ChatGPT 限界は 32732 キャラクター。)
// @name:ka           ChatGPT სიმბოლოების მრიცხველის ლიმიტი (CCCL)
// @description:ka    დაამატეთ სიმბოლოების მრიცხველი შეყვანის ველში,შემოიფარგლება 32732 პერსონაჟები。(ChatGPT ლიმიტი არის 32732 პერსონაჟები。)
// @name:ko           ChatGPT 문자 카운터 제한 (CCCL)
// @description:ko    입력 상자에 문자 카운터 추가,로 제한됨 32732 문자。(ChatGPT 한도는 32732 문자。)
// @name:nl           ChatGPT Limiet voor tekenteller (CCCL)
// @description:nl    Voeg een tekenteller toe aan het invoervak,beperkt tot 32732 karakters。(ChatGPT De limiet is 32732 karakters。)
// @name:nb           ChatGPT Tegntellergrense (CCCL)
// @description:nb    Legg til en tegnteller i inndataboksen,begrenset til 32732 tegn。(ChatGPT Grensen er 32732 tegn。)
// @name:pl           ChatGPT Limit licznika znaków (CCCL)
// @description:pl    Dodaj licznik znaków do pola wprowadzania,ograniczone do 32732 pismo。(ChatGPT Limit jest 32732 pismo。)
// @name:pt-BR        ChatGPT Limite do contador de caracteres (CCCL)
// @description:pt-BR Adicione um contador de caracteres à caixa de entrada,limitado a 32732 personagens。(ChatGPT O limite é 32732 personagens。)
// @name:ro           ChatGPT Limita contorului de caractere (CCCL)
// @description:ro    Adăugați un numărător de caractere în caseta de introducere,limitat la 32732 personaje。(ChatGPT Limita este 32732 personaje。)
// @name:ru           ChatGPT Ограничение счетчика символов (CCCL)
// @description:ru    Добавьте счетчик символов в поле ввода,ограничено 32732 персонажи。(ChatGPT Предел 32732 персонажи。)
// @name:sk           ChatGPT Limit počítadla znakov (CCCL)
// @description:sk    Do vstupného poľa pridajte počítadlo znakov,obmedzené na 32732 postavy。(ChatGPT Limit je 32732 postavy。)
// @name:sr           ChatGPT Ограничење бројача знакова (CCCL)
// @description:sr    Додајте бројач знакова у поље за унос,ограничен на 32732 ликова。(ChatGPT Граница је 32732 ликова。)
// @name:sv           ChatGPT Gräns för teckenräknare (CCCL)
// @description:sv    Lägg till en teckenräknare i inmatningsrutan,begränsat till 32732 tecken。(ChatGPT Gränsen är 32732 tecken。)
// @name:th           ChatGPT ขีดจำกัดตัวนับอักขระ (CCCL)
// @description:th    เพิ่มตัวนับอักขระลงในกล่องอินพุต,จำกัดอยู่ที่ 32732 ตัวอักษร。(ChatGPT ขีดจำกัดคือ 32732 ตัวอักษร。)
// @name:tr           ChatGPT Karakter sayacı sınırı (CCCL)
// @description:tr    Giriş kutusuna karakter sayacı ekleme,sınırlı 32732 karakterler。(ChatGPT Sınır 32732 karakterler。)
// @name:ug           ChatGPT ھەرپ-بەلگە چەكلىمىسى (CCCL)
// @description:ug    كىرگۈزۈش رامكىسىغا ھەرپ ھېسابلىغۇچ قوشۇڭ,بىلەنلا چەكلىنىدۇ 32732 ھەرپلەر。(ChatGPT چەك 32732 ھەرپلەر。)
// @name:uk           ChatGPT Обмеження лічильника символів (CCCL)
// @description:uk    Додайте лічильник символів у поле введення,обмежується 32732 персонажів。(ChatGPT Межа є 32732 персонажів。)
// @name:vi           ChatGPT Giới hạn bộ đếm ký tự (CCCL)
// @description:vi    Thêm bộ đếm ký tự vào hộp nhập liệu,giới hạn ở 32732 nhân vật。(ChatGPT Giới hạn là 32732 nhân vật。)
// @name:zh-TW        ChatGPT 字元計數器限制 (CCCL)
// @description:zh-TW 新增一個字元計數器到輸入框,限制為 32732 個字元。(ChatGPT 的限制是 32732 個字元。)
// @name:zh-HK        ChatGPT 字元計數器限制 (CCCL)
// @description:zh-HK 新增一個字元計數器到輸入框,限制為 32732 個字元。(ChatGPT 的限制是 32732 個字元。)
// @name:fr-CA        ChatGPT Limite du compteur de caractères (CCCL)
// @description:fr-CA Ajouter un compteur de caractères à la zone de saisie,limité à 32732 personnages。(ChatGPT La limite est 32732 personnages。)
// @namespace         https://github.com/ChinaGodMan/UserScripts
// @version           1.3.1.14
// @author            Emree.el on instagram ,人民的勤务员 <china.qinwuyuan@gmail.com>
// @match             https://chatgpt.com/*
// @grant             none
// @license           MIT
// @supportURL        https://github.com/ChinaGodMan/UserScripts/issues
// @homepageURL       https://github.com/ChinaGodMan/UserScripts
// @icon              data:image/png;base64,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
// ==/UserScript==
(function () {
    'use strict'
    // Function to add character counter and handle its behavior
    function addCharacterCounter() {
        if (document.querySelector('.gpt-charCounter')) {//存在返回
            return
        }
        let textarea = document.querySelector('#prompt-textarea')
        if (textarea) {
            let charCounter = document.createElement('div')
            charCounter.className = 'gpt-charCounter'
            charCounter.style.fontSize = '14px'
            charCounter.style.fontWeight = 'bold'
            charCounter.style.marginTop = '5px'
            charCounter.style.color = 'white'
            charCounter.style.textShadow = '0px 0px 5px white' // Default text shadow
            charCounter.textContent = '0/32732'
            textarea.parentElement.appendChild(charCounter)
            function updateCounter() {
                let charCount = textarea.value.length
                charCounter.textContent = `${charCount}/32732`
                if (charCount > 32732) {
                    charCounter.style.color = 'white'
                    charCounter.style.textShadow = '0px 0px 8px red'
                } else if (charCount > 0) {
                    charCounter.style.color = 'white'
                    charCounter.style.textShadow = '0px 0px 8px green'
                } else {
                    charCounter.style.color = 'white'
                    charCounter.style.textShadow = '0px 0px 5px white'
                }
            }
            textarea.addEventListener('input', function () {
                updateCounter()
            })
            document.querySelector('body').addEventListener('click', function (event) {
                const button = event.target.closest('button[data-testid="send-button"]')
                if (button) updateCounter()
            })
        }
    }
    let lastUrl = location.href
    new MutationObserver(() => {
        const url = location.href
        if (url !== lastUrl) {
            lastUrl = url
            addCharacterCounter()
            console.log('change', url)
        }
    }).observe(document, { subtree: true, childList: true })
    // Run the function after the page loads
    window.addEventListener('load', addCharacterCounter)
})()