// ==UserScript== // @name ChatGPT Auto Refresh ↻ // @name:af ChatGPT Auto Verfris ↻ // @name:am የአቃጥል GPT ራስሀሽ ↻ // @name:ar ChatGPT تحديث تلقائي ↻ // @name:az ChatGPT Avtomatik Yenilə ↻ // @name:be Аўтаматычнае абнаўленне ChatGPT ↻ // @name:bem ChatGPT Auto Sintalula ↻ // @name:bg Автоматично опресняване на ChatGPT ↻ // @name:bn ChatGPT স্বয়ংক্রিয় রিফ্রেশ ↻ // @name:bo ChatGPT རེའུ་མིན་པར་སྣོད་དང་ ↻ // @name:bs ChatGPT Automatsko Osvježavanje ↻ // @name:ca ChatGPT Actualització Automàtica ↻ // @name:ckb ChatGPT نوێکردنهوهی خۆکار ↻ // @name:cs ChatGPT Automatické obnovení ↻ // @name:cy ChatGPT Adnewyddu Auto ↻ // @name:da ChatGPT Automatisk Opdatering ↻ // @name:de ChatGPT Automatisches Aktualisieren ↻ // @name:dv ChatGPT އައްޗައިސް އަސްޓްރީ ↻ // @name:dz ChatGPT རེའུ་མིན་པར་སྣོད་དང་ ↻ // @name:el ChatGPT Αυτόματη Ανανέωση ↻ // @name:eo ChatGPT Aŭtomata Refreŝigo ↻ // @name:es ChatGPT Actualización Automática ↻ // @name:et ChatGPT Automaatne Värskendamine ↻ // @name:eu ChatGPT Automatikoki Freskatu ↻ // @name:fa به روز رسانی خودکار ChatGPT ↻ // @name:fi ChatGPT Automaattinen Päivitys ↻ // @name:fo ChatGPT Auto Uppdatering ↻ // @name:fr ChatGPT Actualisation Automatique ↻ // @name:fr-CA ChatGPT Actualisation Automatique ↻ // @name:gd ChatGPT Ath-bhualadh Aonaranach ↻ // @name:gl ChatGPT Actualización Automática ↻ // @name:gu ChatGPT સ્વચાલિત રિફ્રેશ ↻ // @name:haw Hoʻonoho Hōʻike Auto ChatGPT ↻ // @name:he רענון אוטומטי של ChatGPT ↻ // @name:hi ChatGPT स्वचालित रीफ़्रेश ↻ // @name:hr ChatGPT Automatsko Osvježavanje ↻ // @name:ht ChatGPT Rafrechi Otomatik ↻ // @name:hu ChatGPT Automatikus Frissítés ↻ // @name:hy Ինքնաշխատ Թարմացում ChatGPT ↻ // @name:id ChatGPT Pembaruan Otomatis ↻ // @name:is ChatGPT Sjálfvirk Endurnýjun ↻ // @name:it ChatGPT Aggiornamento Automatico ↻ // @name:ja ChatGPT 自動更新 ↻ // @name:jv Pembaruan Otomatis ChatGPT ↻ // @name:ka ChatGPT ავტომატური განახლება ↻ // @name:kab ChatGPT Akarẓim Aɣelnaw ↻ // @name:kk ChatGPT Автоматты Жаңарту ↻ // @name:km ChatGPT បន្ទាប់ពីបច្ចុប្បន្នភាព ↻ // @name:kn ChatGPT ಸ್ವಯಂಚಾಲಿತ ರಿಫ್ರೆಶ್ ↻ // @name:ko ChatGPT 자동 새로 고침 ↻ // @name:ky ChatGPT Автоматтык Тазартуу ↻ // @name:la ChatGPT Automatica Refectio ↻ // @name:lb ChatGPT Automatescht Aktualiséieren ↻ // @name:lo ChatGPT ປັບປຸງອັດຕະໂນມັດອັດຕະໂນມັດ ChatGPT ↻ // @name:lt ChatGPT Automatinis Atnaujinimas ↻ // @name:lv ChatGPT Automātiska Atsvaidzināšana ↻ // @name:mg Fanavaozana Ankehitriny i ChatGPT ↻ // @name:mi ChatGPT Whakahōu Aunoa ↻ // @name:mk Автоматско освежување ChatGPT ↻ // @name:ml ChatGPT ഓട്ടോ അപ്ഡേറ്റ് ↻ // @name:mn ChatGPT Автоматаар Шинэчлэх ↻ // @name:ms Penyegaran Auto ChatGPT ↻ // @name:mt ChatGPT Rifreżġjar Awtomatiku ↻ // @name:my ChatGPT အလိုအလျောက်ထပ်ဖြန် ↻ // @name:ne ChatGPT आफ्नैजस्तै ताजा गर्नुहोस् ↻ // @name:nl ChatGPT Automatische Vernieuwing ↻ // @name:no ChatGPT Automatisk Oppdatering ↻ // @name:pa ChatGPT ਆਟੋ ਰਿਫਰੈਸ਼ ↻ // @name:pap ChatGPT Refreskamentu Automatico ↻ // @name:pl ChatGPT Automatyczne Odświeżanie ↻ // @name:ps د ChatGPT زما تازه کول ↻ // @name:pt ChatGPT Atualização Automática ↻ // @name:pt-BR ChatGPT Atualização Automática ↻ // @name:rn ChatGPT Gushira Ubushyuhe ↻ // @name:ro ChatGPT Reîmprospătare Automată ↻ // @name:ru Автообновление ChatGPT ↻ // @name:sg ChatGPT Rafraîchissement Auto ↻ // @name:si ChatGPT ස්වයංක්රීය නැවතුම් ↻ // @name:sk ChatGPT Automatické Obnovenie ↻ // @name:sl ChatGPT Samodejna Osvežitev ↻ // @name:sm ChatGPT Toeaina Auto Taulagaina ↻ // @name:sn ChatGPT Rurefu Rakaita Zvakanaka ↻ // @name:so ChatGPT Dib-u-helayna Xafiiska ↻ // @name:sr ChatGPT Аутоматско Освежавање ↻ // @name:sv ChatGPT Automatisk Uppdatering ↻ // @name:sw ChatGPT Kupakia Moja kwa moja ↻ // @name:ta ChatGPT தானியங்கி புதுப்பிப்பு ↻ // @name:te ChatGPT ఆటో రిఫ్రెష్ ↻ // @name:tg ChatGPT Таҷдиди худкори ChatGPT ↻ // @name:th ChatGPT รีเฟรชอัตโนมัติ ↻ // @name:ti ChatGPT ኣካውንታት እውነት ዓይኒ ↻ // @name:tk ChatGPT Awtomatik Täzele ↻ // @name:tn ChatGPT Tlhokomelo ya Moafrika ↻ // @name:to ChatGPT Fakahā ʻihaotaha ↻ // @name:tpi ChatGPT Awto Rifrehs ↻ // @name:tr ChatGPT Otomatik Yenileme ↻ // @name:uk Автоматичне Оновлення ChatGPT ↻ // @name:ur خودکار تازہ کاری ChatGPT ↻ // @name:uz ChatGPT Avtomatik Yangilash ↻ // @name:vi ChatGPT Tự động Cập nhật ↻ // @name:xh ChatGPT Ukunovusa Okuvela ↻ // @name:yi ChatGPT אַטאַ אַקטואַליזירן ↻ // @name:zh ChatGPT 自动刷新 ↻ // @name:zh-CN ChatGPT 自动刷新 ↻ // @name:zh-HK ChatGPT 自動刷新 ↻ // @name:zh-SG ChatGPT 自动刷新 ↻ // @name:zh-TW ChatGPT 自動刷新 ↻ // @name:zu ChatGPT Ukusasaza Ngokuzenzakalelayo ↻ // @description *SAFELY* eliminate 10-minute chat resets + constant network errors + Cloudflare checks from ChatGPT // @description:af *VEILIG* elimineer 10-minuut klets herstelling + aanhoudende netwerkfoute + Cloudflare-kontroles uit ChatGPT. // @description:am *ባርማ* ከChatGPT ውስጥ የ10 ደቂቃ መካከለኛ ገጽታ መድረስን፣ *በጭራቅ የሚከሰቱ አውታረ መረብ ስህተቶችን*እና ክላይንት ፓስያንት ምርመራዎችን ይወግዱ። // @description:ar *بأمان* احذف إعادة تعيين الدردشة لمدة 10 دقائق + *أخطاء الشبكة المستمرة* + فحوصات Cloudflare من ChatGPT. // @description:az *TƏHLÜKƏSİZ* 10 dəqiqəlik söhbət sıfırlamalarını, *davamlı şəbəkə xətalarını* və Cloudflare yoxlamalarını ChatGPT'dən çıxarın. // @description:be *БЯСПЕКА* выдаліце 10-хвілінныя перазагрузкі чата, *пастаянныя сеткавыя памылкі* і праверкі Cloudflare са ChatGPT. // @description:bem *UMULI* fyumbafye amafuula ya menso 10 + *aya makota yambi konse konse* nefimfi ifyakwa pantu + ifiletelwe ifyakwa Cloudflare ukufuma mu ChatGPT. // @description:bg *БЕЗОПАСНО* премахнете 10-минутни нулирания на чата, *постоянни мрежови грешки* и проверки на Cloudflare от ChatGPT. // @description:bn ChatGPT-এর থেকে ১০ মিনিটের চ্যাট রিসেট, *চিরস্থায়ী নেটওয়ার্ক ত্রুটি* এবং ক্লাউডফ্লেয়ার যাচাই-বাছাই সরিয়ে দিন *নিরাপদে*। // @description:bo *རྒྱབ་བཞིན་པའི་* ཟའ་གྲགས་10 སྐར་མ་གཞན་འགྱུར་འདོན་སྐབས་མེད་པ། *ངོས་འཛིན་ཡོད་པ་* Cloudflare་དྲི་ཞིམ་བཟོ་བའི་ཕྱིར་ ChatGPT་ནས་ཕྱི་ལོག ། // @description:bs *SIGURNO* uklonite 10-minutna resetovanja četa, *konstantne greške mreže* i Cloudflare provjere iz ChatGPT. // @description:ca *SEGUR* elimineu els reajustaments de xat de 10 minuts + *errors de xarxa constants* i comprovacions de Cloudflare de ChatGPT. // @description:ceb *LUWAS* hika ang mga pag-reset sa pag-chat sa 10 ka minuto + *walay hunong nga mga sayop sa network* + mga pagsusi sa Cloudflare gikan sa ChatGPT. // @description:ckb *بەبێ پەیمانە* پشوودانی سنووری چاتی ١٠ خولەکی، *کێشەی شبکەیی ڕاستەوخۆ* و بڵاودەکردنەوەکانی Cloudflare لە ChatGPT دابڕۆ. // @description:cs *BEZPEČNĚ* odstraňte 10minutová obnovení chatu, *trvalé síťové chyby* a kontroly Cloudflare z ChatGPT. // @description:cy *YN DIOGEL* cael gwared â 10 munud ailosod sgwrs + *gwallau rhwydwaith parhaus* + gwiriadau Cloudflare o ChatGPT. // @description:da *SIKKERT* fjern 10-minutters chat-nulstillinger + *konstante netværksfejl* og Cloudflare-tjek fra ChatGPT. // @description:de *SICHER* entfernen Sie 10-Minuten-Chat-Zurücksetzungen + *kontinuierliche Netzwerkfehler* und Cloudflare-Überprüfungen aus ChatGPT. // @description:dv ChatGPT އިން ދޮގު ނަތީޖާ ގެ ގޮތުން ދިމާވާ މިނެޓުގެ އަޑުގަދަވުމުގެ ވަގުތު އަލުން ސެޓްކުރުން 10 ގެ އަދަދު އަނބުރާ ގެނެސްދިނުމާއެކު + *ތެރޭގައި ހުރި ނެޓްވޯކް މައްސަލަތަކާއި* ކްލައުޑްފްލެއަރގެ ޗެކްތައް ދޫކުރުން ބޭނުންވެއެވެ. // @description:dz *དགའ་བསྐྱིད་བཞུགས་བརྡ* མི་ཉུང་སྐར་མ་གི་ཟའ་གྲགས་རིམ་ལེབ་འགྱུར་བསྡད་མེད་པ། *ངོས་འཛིན་ཡོད་པ་* Cloudflare་བཤད་པ་བཟོ་བའི་ཕྱིར་ ChatGPT ནས་ཕྱི་ལོག ། // @description:el *ΜΕ ΑΣΦΑΛΕΙΑ* εξαλείψτε τις επαναφορές συνομιλίας 10 λεπτών + *συνεχείς σφάλματα δικτύου* και ελέγχους Cloudflare από το ChatGPT. // @description:eo *SEKURE* forigu 10-minutajn babiletajajn rekomencigojn + *konstantajn reto-erarojn* kaj Cloudflare-kontrolojn de ChatGPT. // @description:es *SEGURO* elimine los reinicios de chat de 10 minutos + *errores de red constantes* y verificaciones de Cloudflare de ChatGPT. // @description:et *TURVALISELT* eemalda ChatGPT-st 10-minutilised vestluse lähtestamised + *püsivad võrguvead* ja Cloudflare'i kontrollid. // @description:eu *SEGUROA* kendu ChatGPT-tik 10 minutuko txat berrabiarazteak + *sareko akats etengabeak* eta Cloudflare egiaztapenak. // @description:fa *به طور ایمن* بازنشانی چت 10 دقیقه ای + *خطاهای مداوم شبکه* و بررسی های Cloudflare را از ChatGPT حذف کنید. // @description:fi *TURVALLISESTI* poista ChatGPT:stä 10 minuutin keskustelun nollaukset + *jatkuvat verkkovirheet* ja Cloudflare-tarkistukset. // @description:fo *TRYGT* strika 10 minuttir endursetan av samrøðum + *staðug netbrek* og Cloudflare-royndir frá ChatGPT. // @description:fr *EN TOUTE SÉCURITÉ* éliminez les réinitialisations de chat de 10 minutes + *les erreurs réseau constantes* et les vérifications Cloudflare de ChatGPT. // @description:fr-CA *EN TOUTE SÉCURITÉ* éliminez les réinitialisations de chat de 10 minutes + *les erreurs réseau constantes* et les vérifications Cloudflare de ChatGPT. // @description:gd *GU SÀBHALTE* thoir air falbh ath-shuidheachadh còmhraidh 10 mionaid + *mearachdan lìonraidh leantainneach* agus sgrùdaidhean Cloudflare à ChatGPT. // @description:gl *SEGURAMENTE* elimine os reinicios de conversa de 10 minutos + *erros de rede constantes* e verificacións de Cloudflare de ChatGPT. // @description:gu ChatGPT માંથી ૧૦ મિનિટના ચૅટ રીસેટ, *સ્થાયી નેટવર્ક ભૂલો* અને ક્લાઉડફ્લેર તપાસો *સુરક્ષિતપણે* દૂર કરો. // @description:haw *KUHIAO* wehe i ka hoʻomaʻemaʻe ʻana i nā hoʻouka hou ʻana o ka walaʻau no 10 minuke + mau ʻano hihia mau loa o ka nahenahe + nā hoʻokolokolo o Cloudflare, mai ke keʻena nei o ChatGPT. // @description:he *בטחון* הסירו איפוסי צ'אט של 10 דקות + *שגיאות רשת קבועות* ובדיקות קלאודפלייר מ-ChatGPT. // @description:hi ChatGPT से 10 मिनट के चैट रीसेट, *स्थायी नेटवर्क त्रुटियाँ* और क्लाउडफ़्लेयर जाँच को *सुरक्षित रूप से* हटाएं। // @description:hr *SIGURNO* uklonite 10-minutna resetiranja čavrljanja, *stalne mrežne pogreške* i Cloudflare provjere iz ChatGPT-a. // @description:ht *AN SEKIRITE,* elimine resè chat 10 minit yo, *erè sou rezo ki konstan* epitou tchèk Cloudflare nan ChatGPT. // @description:hu *BIZTONSÁGOSAN* távolítsa el a 10 perces csevegések visszaállításait, a *folyamatos hálózati hibákat* és a Cloudflare ellenőrzéseket a ChatGPT-ből. // @description:hy *ԱՆՎՏԱՆԳՈՒԹՅՈՒՆ ՀԱՍԿԱՑՈՒՄԸ`* հեռացնել 10 րոպեանոց չատի վերագործարկումները, *մշտական ցանցային սխալները* եւ Cloudflare ստուգումները ChatGPT-ից: // @description:id *AMAN* menghapus batas obrolan 10 menit, *kesalahan jaringan yang konstan*, dan pemeriksaan Cloudflare dari ChatGPT. // @description:is *ÖRUGGLEGA* fjarlægðu endurstillingu spjalls í 10 mínútur, *sífelldum netvillum* og Cloudflare prófanir úr ChatGPT. // @description:it *IN SICUREZZA* eliminare i reset della chat di 10 minuti, *gli errori di rete costanti* e i controlli Cloudflare da ChatGPT. // @description:ja ChatGPTから10分のチャットのリセット、*定常的なネットワークのエラー*、Cloudflareのチェックを*安全に*削除してください。 // @description:jv *AMAN* busak wates obrolan 10 menit, *kesalahan jaringan sing konstan*, lan pemeriksaan Cloudflare saka ChatGPT. // @description:ka *უსაფრთხოდ* წაშალეთ 10 წუთიანი ჩეთის დაბრუნებები, *მუდმივი ქსელური შეცდომები* და Cloudflare შემოწმებები ChatGPT-დან. // @description:kk *ҚАУІПСІЗ* ChatGPT дан 10 минуттық чат қайта орнатуларды, *тұрақты желі қателерін* және Cloudflare тексерістерін жойыңыз. // @description:km *ដោយសុវត្ថិភាព* លុបការកំណត់ឡើងវិញនៃការជជែក 10 នាទី, *កំហុសបណ្តាញជាក់លាក់* និងការពិនិត្យរបស់ Cloudflare ចេញពី ChatGPT។ // @description:kn ChatGPT ನಿಂದ 10 ನಿಮಿಷಗಳ ಚಾಟ್ ಮರುಹೊಂದಿಕೆಗಳು, *ನಿರಂತರ ಜಾಲ ದೋಷಗಳು* ಮತ್ತು ಕ್ಲೌಡ್‍ಫ್ಲೇರ್ ಪರಿಶೀಲನೆಗಳನ್ನು *ಸುರಕ್ಷಿತವಾಗಿ* ತೆಗೆದುಹಾಕಿ. // @description:ko ChatGPT에서 10분 채팅 재설정, *지속적인 네트워크 오류*, 클라우드플레어 검사를 *안전하게* 제거하십시오. // @description:ku *بە ئاسایی* ڕیسێتی چاتی ١٠ خولەکی، *کێشەی شبکەیی ڕاستەوخۆ* و دیاریکردنی کلاڵدفلەر لە ChatGPT دابڕۆ. // @description:ky *КООПСУЗДУК МЕНЕН* ChatGPT дан 10 мүнөттүк чаттын кайра жөндөөсүн, *туруктуу тармак каталарын* жана Cloudflare текшерүүлөрүн алып салыңыз. // @description:la *TUTO* dele 10 minutarum colloquii reconsitutiones, *crebros errores retis* et inspectiones Cloudflare ab ChatGPT. // @description:lb *SÉCHER* Huel 10 Minutte Chat-Limitt-Reschtellungen, *bestänneg Netzwierker-Feeler* an d'Cloudflare-Iwwerpréifunge fort vu ChatGPT. // @description:lo *ດ້ວຍຄວາມປອດໄພ* ລຶບການຕັ້ງຄ່າໃຫມ່ການແຊັດ 10 ນາທീ, *ຂໍ້ຜິດພາດເຄືອຂ່າຍປະຈໍາ* ແລະ ການກວດສອບຂອງ Cloudflare ອອກຈາກ ChatGPT. // @description:lt *SAUGIAI* pašalinkite 10 minučių pokalbių atstatymus, *nuolatinius tinklo trikdžius* ir Cloudflare patikras iš ChatGPT. // @description:lv *DROŠI* noņemiet 10 minūšu čata atiestatījumus, *pastāvīgās tīkla kļūdas* un Cloudflare pārbaudes no ChatGPT. // @description:mg *MIANDRY ARA-KIRA* esory ny fandrombahana ny fisalasana 10 minitra, *ny diso amin'ny tambajotra mandritra* ary ny fanamarinana amin'ny Cloudflare avy amin'ny ChatGPT. // @description:mi *KA TŪTURU* whakakorehia ngā whakatikatika kōrero 10 meneti, *hapa whatunga rāroto e tohu tonu ana + ngā aroturuki Cloudflare i ChatGPT. // @description:mk *БЕЗБЕДНО* отстранете ги 10-минутните повторни вклучувања на разговорот, *константни мрежни грешки* и проверките на Cloudflare од ChatGPT. // @description:ml ChatGPT നിന്ന് 10 മിനിറ്റ് ചാറ്റ് പുനഃസജ്ജമാക്കലുകൾ, *തുടർച്ചയായ നെറ്റ്‌വർക്ക് പിശകുകൾ*, ക്ലൗഡ്ഫ്ലെയർ പരിശോധനകൾ *സുരക്ഷിതമായി* നീക്കം ചെയ്യുക. // @description:mn ChatGPT-с *АЮУЛГҮЙ БОЛОВЧ* 10 минутын чат дахин тохирохыг, *үргэлжилсэн сүлжээний алдаа* болон Cloudflare-ийн шалгалтуудыг хасна уу. // @description:mr ChatGPT मधून *सुरक्षितपणे* १० मिनिटांची गप्पागोष्टी पुन्हा सेट करणे, *सातत्याने नेटवर्क त्रुटी* आणि क्लाउडफ्लेअर तपासणी काढून टाका. // @description:ms *DENGAN SELAMAT* singkirkan had sembang semula 10 minit, *kesalahan rangkaian yang kerap*, dan semakan Cloudflare daripada ChatGPT. // @description:mt *B'SIGURTÀ* neħħi l-limiti ta' risettjar tal-kliem ta' 10 minuta, *żbalji fil-network persistenti*, u kontrolli ta' Cloudflare minn ġewwa ChatGPT. // @description:my ChatGPT မှ *လုံးဝ လုံခြုံစွာ* ၁၀ မိနစ် စကားပြောရန် ပြန်လည် သတ်မှတ်ချက်များ၊ *မြောက်မြောက် ကွန်ရက် ပြၚ အမှား* များနှင့် Cloudflare စစ်ဆေးမှုများကို ဖယ်ရှားပါ။ // @description:ne ChatGPT बाट *सुरक्षितरूपमा* १० मिनेटको च्याट पुनःसेट, *निरन्तर नेटवर्क त्रुटि* र क्लाउडफ्लेयर जाँच हटाउनुहोस्। // @description:nl *VEILIG* verwijder 10-minuten chat resets, *constante netwerkfouten* en Cloudflare-controles van ChatGPT. // @description:no *TRYGT* fjern 10-minutters chat-tilbakestillinger, *konstante nettverksfeil* og Cloudflare-sjekker fra ChatGPT. // @description:ny *NDIWOYIMILIRENI* tsikani kupindulitsanso kogawana kwamizuzu khumi + *zolakwika zambirimbiri pa intaneti* ndi zolingalira za Cloudflare kuchokera ku ChatGPT. // @description:pa ChatGPT ਤੋਂ *ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ* 10 ਮਿੰਟ ਦੀਆਂ ਚੈਟ ਰੀ-ਸੈਟਾਂ, *ਲਗਾਤਾਰ ਨੈੱਟਵਰਕ ਗਲਤੀਆਂ* ਅਤੇ ਕਲਾਉਡਫਲੇਅਰ ਜਾਂਚਾਂ ਹਟਾਓ। // @description:pap *SEGURO* eliminá rekashonan di chat di 10 minüt, *faltanan di red kontínuo* i kontròlnan di Cloudflare for di ChatGPT. // @description:pl *BEZPIECZNIE* usuń 10-minutowe resetowanie czatu, *stałe błędy sieciowe* i kontrole Cloudflare z ChatGPT. // @description:ps له ChatGPT څخه *په امنه* توګه د ۱۰ دقیقو چت بیا ټاکل کول، *دوامداره شبکي غلطي* او Cloudflare بررسۍ لرې کړئ. // @description:pt *COM SEGURANÇA* elimine resets de chat de 10 minutos, *erros de rede constantes* e verificações do Cloudflare do ChatGPT. // @description:pt-BR *COM SEGURANÇA* elimine as redefinições de chat de 10 minutos, *erros frequentes de rede* e checagens do do Cloudflare do ChatGPT. // @description:rn *MU BUNYAMINE* gukuraho ingaruka zo gusegurira imyumvire icumi, amakosa akomeye yo mu murongo w'ubucuruzi no kugenzura amabuye ya Cloudflare ukufuma mu ChatGPT. // @description:ro *ÎN SIGURANȚĂ* eliminați reinițializările de chat de 10 minute, erorile constante de rețea și verificările Cloudflare din ChatGPT. // @description:ru *БЕЗОПАСНО* устраните 10-минутные сбросы чата, постоянные сетевые ошибки и проверки Cloudflare из ChatGPT. // @description:rw *MU BUNYAMINE* ikuraho iseswa ry’iminota 10, amakosa akomeje kw’itumanaho mu rwego rw’ibikorwaremezo n’igenzura rya Cloudflare mu ChatGPT. // @description:sg *NI ÌTỌJU* ṣe ìyọ̀sọ́wọ́jú ọrọ̀'lọ̀wọ́ mẹ́rinlelogun, awọn ṣiṣe ilana aláilóbájẹ́ + awọn adánilọ́jọ́ Cloudflare láti inú ChatGPT. // @description:si *ආරක්ෂිතව* 10 මිනිත්තු චැට් යළි සැකසීම්, ස්ථිර ජාල දෝෂ සහ Cloudflare පරීක්ෂණ ChatGPT වෙතින් ඉවත් කරන්න. // @description:sk *BEZPEČNE* odstráňte 10-minútové opätovné nastavenia četu, neustále sieťové chyby a kontroly Cloudflare z ChatGPT. // @description:sl *VARNO* odstranite 10-minutna ponastavljanja klepetov, nenehne napake v omrežju in preverjanja cloudfare iz ChatGPT. // @description:sm *MA FA'AMANUIAGA* ia eseese fa'amalosi e tusi tulaga tautua ta'aloga e 10 minute + tala esemanuuga + nisi'i Cloudflare mai ChatGPT. // @description:sn *KANA KUTAMBA WAKAWANDA* dzimba kupindura zvakare maonero echirongwa che10min + zvivi zvisingakoni nekupera + ruzivo rweCloudflare uye kubvisa zviri muChatGPT. // @description:so *SI AMMAAN* ka saar 10 daqiiqo dib u habayn xidhiidh + xatooyin xaaladaha ah + baaritaan Cloudflare ka mid ah ChatGPT. // @description:sr *BEZBEDNO* eliminišite 10-minutna resetovanja ćaska, konstantne mrežne greške i Cloudflare provere iz ChatGPT-a. // @description:sv *SÄKERT* eliminera 10-minuters återställningar av chattar, konstanta nätverksfel och Cloudflare-kontroller från ChatGPT. // @description:sw *KWA USALAMA* ondoa marejesho ya mazungumzo ya dakika 10, hitilafu endelevu za mtandao na ukaguzi wa Cloudflare kutoka ChatGPT. // @description:ta *பாதுகாப்பாக* 10 நிமிட உரையாடல் மறுதொடக்கங்கள், தொடர்ச்சியான வலையமைப்பு பிழைகள், மேகக்கம்பெனி சோதனைகளை ChatGPT இருந்து அகற்றுங்கள். // @description:te *సురక్షితంగా* 10 నిమిషాల చాట్ రీసెట్లు, నిరంతర నెట్వర్క్ లోపాలు, క్లౌడ్ఫ్లేర్ తనిఖీలను ChatGPT నుండి తీసివేయండి. // @description:tg *БО ҲИФЗИ АМНИЯТ* 10-дақиқагии бозсозии чат, хатогиҳои доимии шабака ва санҷиши Cloudflare-ро аз ChatGPT ҳазф намоед. // @description:th *อย่างปลอดภัย* กําจัดการรีเซ็ตแชท 10 นาที ข้อผิดพลาดของเครือข่ายตลอดเวลา และการตรวจสอบของ Cloudflare ออกจาก ChatGPT // @description:ti *ብናይ ደሞዝ* 10 ደቂቕ ድምጺ ናይ መጀመርታ ምቕራብን, ናይ ሕፅይቲ ምእታይን, ናይ Cloudflare ፍልጠትን ካብ ChatGPT ክወግዙ:: // @description:tk *HOWPSUZLYK BILEN* 10 minutly çat ýeniden başlatmalaryny, durnukly internet ýalňyşlaryny we Cloudflare barlagyny ChatGPT-den aýyrыň. // @description:tn *KA POLAOKEHI* e ntšha thekiso ya ho qala hape ya metsotso e 10 + diphoso tsa neteweke tse kileng + dipatlisiso tsa Cloudflare ho tswa ho ChatGPT. // @description:to *'I HE FA'A'EA'EA'ANGA* 'e aveese 'a e ngaahi fili 'o e fetu'utaki chatí ki he meniti 'e 10 + hili pea 'o e ngaahi me'angaue'aki 'a e néétuiaki + ngaahi sivi 'o e Cloudflare mei he ChatGPT. // @description:tr *GÜVENLİ BİR ŞEKİLDE* 10 dakikalık sohbet sıfırlamalarını, sürekli ağ hatalarını ve Cloudflare kontrollerini ChatGPT'ten kaldırın. // @description:uk *БЕЗПЕЧНО* усуньте 10-хвилинні скинення чату, постійні мережеві помилки та перевірки Cloudflare з ChatGPT. // @description:ur *محفوظ* ChatGPT سے 10 منٹ کی چیٹ ری سیٹس، مستقل نیٹ ورک نقص اور کلاؤڈ فلیئر چیکس ہٹائیں۔ // @description:uz *XAVFSIZ* 10 daqiqa suhbat qayta tiklanishlarini, doimiy tarmoq xatoliklarini va Cloudflare tekshiruvlarini ChatGPT'dan olib tashlang. // @description:vi *AN TOÀN* loại bỏ đặt lại trò chuyện 10 phút, lỗi mạng liên tục và kiểm tra Cloudflare khỏi ChatGPT. // @description:xh *NGEKONAKALIYO* susa ukunqamula okutsha koxo yemizuzu eli-10 + amathuba olu hlulekileyo womeli + ukuhlolwa kukaCloudflare ukusuka ku ChatGPT. // @description:yi *זיכער* נעמט אַראָפ 10 מינוט רעד איבערארבעטן, שטענדיק נעץ פֿעלערן און קלוידפֿלאַרע באַשעקן פֿון ChatGPT. // @description:zh *安全* 消除 10 分钟聊天重置 + 持续的网络错误 + ChatGPT 的 Cloudflare 检查。 // @description:zh-CN *安全* 消除 10 分钟聊天重置 + 持续的网络错误 + ChatGPT 的 Cloudflare 检查。 // @description:zh-HK *安全* 消除 10 分鐘聊天重設 + 持續的網路錯誤 + ChatGPT 的 Cloudflare 檢查。 // @description:zh-SG *安全* 消除 10 分钟聊天重置 + 持续的网络错误 + ChatGPT 的 Cloudflare 检查。 // @description:zh-TW *安全* 消除 10 分鐘聊天重設 + 持續的網路錯誤 + ChatGPT 的 Cloudflare 檢查。 // @description:zu *NGOKUPHEPHA* susa ukusetha kabusha ingxoxo yemizuzu eyi-10 + amaphutha enethiwekhi ahlala njalo + Ukuhlolwa kwe-Cloudflare ku-ChatGPT. // @author Adam Lui // @namespace https://github.com/adamlui // @version 2026.5.25 // @license MIT // @icon data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22180%22%20height=%22180%22%20fill=%22none%22%3E%3Cstyle%3E:root%7B--primary-fill:%23000;--secondary-fill:%23fff;%7D@media%20(prefers-color-scheme:dark)%7B:root%7B--primary-fill:%23fff;--secondary-fill:%23000;%7D%7D%3C/style%3E%3Cg%20clip-path=%22url(%23a)%22%3E%3Crect%20width=%22180%22%20height=%22180%22%20fill=%22var(--primary-fill)%22%20rx=%2290%22/%3E%3Cg%20clip-path=%22url(%23b)%22%3E%3Cpath%20fill=%22var(--secondary-fill)%22%20d=%22M75.91%2073.628V62.232c0-.96.36-1.68%201.199-2.16l22.912-13.194c3.119-1.8%206.838-2.639%2010.676-2.639%2014.394%200%2023.511%2011.157%2023.511%2023.032%200%20.839%200%201.799-.12%202.758l-23.752-13.914c-1.439-.84-2.879-.84-4.318%200L75.91%2073.627Zm53.499%2044.383v-27.23c0-1.68-.72-2.88-2.159-3.719L97.142%2069.55l9.836-5.638c.839-.48%201.559-.48%202.399%200l22.912%2013.195c6.598%203.839%2011.035%2011.995%2011.035%2019.912%200%209.116-5.397%2017.513-13.915%2020.992v.001Zm-60.577-23.99-9.836-5.758c-.84-.48-1.2-1.2-1.2-2.16v-26.39c0-12.834%209.837-22.55%2023.152-22.55%205.039%200%209.716%201.679%2013.676%204.678L70.993%2055.516c-1.44.84-2.16%202.039-2.16%203.719v34.787-.002Zm21.173%2012.234L75.91%2098.339V81.546l14.095-7.917%2014.094%207.917v16.793l-14.094%207.916Zm9.056%2036.467c-5.038%200-9.716-1.68-13.675-4.678l23.631-13.676c1.439-.839%202.159-2.038%202.159-3.718V85.863l9.956%205.757c.84.48%201.2%201.2%201.2%202.16v26.389c0%2012.835-9.957%2022.552-23.27%2022.552v.001Zm-28.43-26.75L47.72%20102.778c-6.599-3.84-11.036-11.996-11.036-19.913%200-9.236%205.518-17.513%2014.034-20.992v27.35c0%201.68.72%202.879%202.16%203.718l29.989%2017.393-9.837%205.638c-.84.48-1.56.48-2.399%200Zm-1.318%2019.673c-13.555%200-23.512-10.196-23.512-22.792%200-.959.12-1.919.24-2.879l23.63%2013.675c1.44.84%202.88.84%204.32%200l30.108-17.392v11.395c0%20.96-.361%201.68-1.2%202.16l-22.912%2013.194c-3.119%201.8-6.837%202.639-10.675%202.639Zm29.748%2014.274c14.515%200%2026.63-10.316%2029.39-23.991%2013.434-3.479%2022.071-16.074%2022.071-28.91%200-8.396-3.598-16.553-10.076-22.43.6-2.52.96-5.039.96-7.557%200-17.153-13.915-29.99-29.989-29.99-3.239%200-6.358.48-9.477%201.56-5.398-5.278-12.835-8.637-20.992-8.637-14.515%200-26.63%2010.316-29.39%2023.991-13.434%203.48-22.07%2016.074-22.07%2028.91%200%208.396%203.598%2016.553%2010.075%2022.431-.6%202.519-.96%205.038-.96%207.556%200%2017.154%2013.915%2029.989%2029.99%2029.989%203.238%200%206.357-.479%209.476-1.559%205.397%205.278%2012.835%208.637%2020.992%208.637Z%22/%3E%3C/g%3E%3C/g%3E%3Cdefs%3E%3CclipPath%20id=%22a%22%3E%3Cpath%20d=%22M0%200h180v180H0z%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22b%22%3E%3Cpath%20d=%22M29.487%2029.964h121.035v119.954H29.487z%22/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E // @icon64 data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22180%22%20height=%22180%22%20fill=%22none%22%3E%3Cstyle%3E:root%7B--primary-fill:%23000;--secondary-fill:%23fff;%7D@media%20(prefers-color-scheme:dark)%7B:root%7B--primary-fill:%23fff;--secondary-fill:%23000;%7D%7D%3C/style%3E%3Cg%20clip-path=%22url(%23a)%22%3E%3Crect%20width=%22180%22%20height=%22180%22%20fill=%22var(--primary-fill)%22%20rx=%2290%22/%3E%3Cg%20clip-path=%22url(%23b)%22%3E%3Cpath%20fill=%22var(--secondary-fill)%22%20d=%22M75.91%2073.628V62.232c0-.96.36-1.68%201.199-2.16l22.912-13.194c3.119-1.8%206.838-2.639%2010.676-2.639%2014.394%200%2023.511%2011.157%2023.511%2023.032%200%20.839%200%201.799-.12%202.758l-23.752-13.914c-1.439-.84-2.879-.84-4.318%200L75.91%2073.627Zm53.499%2044.383v-27.23c0-1.68-.72-2.88-2.159-3.719L97.142%2069.55l9.836-5.638c.839-.48%201.559-.48%202.399%200l22.912%2013.195c6.598%203.839%2011.035%2011.995%2011.035%2019.912%200%209.116-5.397%2017.513-13.915%2020.992v.001Zm-60.577-23.99-9.836-5.758c-.84-.48-1.2-1.2-1.2-2.16v-26.39c0-12.834%209.837-22.55%2023.152-22.55%205.039%200%209.716%201.679%2013.676%204.678L70.993%2055.516c-1.44.84-2.16%202.039-2.16%203.719v34.787-.002Zm21.173%2012.234L75.91%2098.339V81.546l14.095-7.917%2014.094%207.917v16.793l-14.094%207.916Zm9.056%2036.467c-5.038%200-9.716-1.68-13.675-4.678l23.631-13.676c1.439-.839%202.159-2.038%202.159-3.718V85.863l9.956%205.757c.84.48%201.2%201.2%201.2%202.16v26.389c0%2012.835-9.957%2022.552-23.27%2022.552v.001Zm-28.43-26.75L47.72%20102.778c-6.599-3.84-11.036-11.996-11.036-19.913%200-9.236%205.518-17.513%2014.034-20.992v27.35c0%201.68.72%202.879%202.16%203.718l29.989%2017.393-9.837%205.638c-.84.48-1.56.48-2.399%200Zm-1.318%2019.673c-13.555%200-23.512-10.196-23.512-22.792%200-.959.12-1.919.24-2.879l23.63%2013.675c1.44.84%202.88.84%204.32%200l30.108-17.392v11.395c0%20.96-.361%201.68-1.2%202.16l-22.912%2013.194c-3.119%201.8-6.837%202.639-10.675%202.639Zm29.748%2014.274c14.515%200%2026.63-10.316%2029.39-23.991%2013.434-3.479%2022.071-16.074%2022.071-28.91%200-8.396-3.598-16.553-10.076-22.43.6-2.52.96-5.039.96-7.557%200-17.153-13.915-29.99-29.989-29.99-3.239%200-6.358.48-9.477%201.56-5.398-5.278-12.835-8.637-20.992-8.637-14.515%200-26.63%2010.316-29.39%2023.991-13.434%203.48-22.07%2016.074-22.07%2028.91%200%208.396%203.598%2016.553%2010.075%2022.431-.6%202.519-.96%205.038-.96%207.556%200%2017.154%2013.915%2029.989%2029.99%2029.989%203.238%200%206.357-.479%209.476-1.559%205.397%205.278%2012.835%208.637%2020.992%208.637Z%22/%3E%3C/g%3E%3C/g%3E%3Cdefs%3E%3CclipPath%20id=%22a%22%3E%3Cpath%20d=%22M0%200h180v180H0z%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22b%22%3E%3Cpath%20d=%22M29.487%2029.964h121.035v119.954H29.487z%22/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E // @compatible chrome // @compatible firefox // @compatible edge // @compatible opera // @compatible brave // @compatible vivaldi // @compatible waterfox // @compatible librewolf // @compatible ghost // @compatible qq // @match *://chatgpt.com/* // @connect cdn.jsdelivr.net // @connect raw.githubusercontent.com // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@4.4.0/dist/chatgpt.min.js#sha256-FA4s3czaGF1fDzc/vJBTbvxtSFhO2vkt1fRPstzkD1E= // @require https://cdn.jsdelivr.net/gh/adamlui/userscripts@ff2baba/assets/js/lib/css.js/dist/css.min.js#sha256-zf9s8C0cZ/i+gnaTIUxa0+RpDYpsJVlyuV5L2q4KUdA= // @require https://cdn.jsdelivr.net/gh/adamlui/userscripts@ff2baba/assets/js/lib/dom.js/dist/dom.min.js#sha256-nTc2by3ZAz6AR7B8fOqjloJNETvjAepe15t2qlghMDo= // @resource rpgCSS https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/gray.min.css#sha256-48sEWzNUGUOP04ur52G5VOfGZPSnZQfrF3szUr4VaRs= // @resource rpwCSS https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/white.min.css#sha256-6xBXczm7yM1MZ/v0o1KVFfJGehHk47KJjq8oTktH4KE= // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @noframes // @downloadURL https://raw.githubusercontent.com/adamlui/chatgpt-auto-refresh/refs/heads/main/greasemonkey/chatgpt-auto-refresh.user.js // @updateURL https://raw.githubusercontent.com/adamlui/chatgpt-auto-refresh/refs/heads/main/greasemonkey/chatgpt-auto-refresh.user.js // @homepageURL https://github.com/adamlui/chatgpt-auto-refresh/#readme // @supportURL https://github.com/adamlui/chatgpt-auto-refresh/issues // @contributionURL https://ko-fi.com/adamlui // ==/UserScript== // Documentation: https://github.com/adamlui/chatgpt-auto-refresh/tree/main/docs // NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org // © 2023–2026 KudoAI & contributors under the MIT license. (async () => { 'use strict' // Init DATA window.env = { browser: { language: chatgpt.getUserLanguage(), isMobile: chatgpt.browser.isMobile(), isFF: chatgpt.browser.isFirefox() }, scriptManager: { name: (() => { try { return GM_info.scriptHandler } catch (err) { return 'unknown' }})(), version: (() => { try { return GM_info.version } catch (err) { return 'unknown' }})() }, ui: { scheme: getScheme() } } Object.assign(env.browser, { get isCompact() { return innerWidth <= 480 }}) env.scriptManager.supportsTooltips = env.scriptManager.name == 'Tampermonkey' && parseInt(env.scriptManager.version.split('.')[0]) >= 5 window.xhr = typeof GM != 'undefined' && GM.xmlHttpRequest || GM_xmlhttpRequest window.app = { version: GM_info.script.version, chatgptjsVer: /chatgpt\.js@([\d.]+)/.exec(GM_info.scriptMetaStr)[1], commitHashes: { app: '225c773' } // for cached .json } app.urls = { resourceHost: `https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-refresh@${app.commitHashes.app}` } const remoteData = { app: await new Promise(resolve => xhr({ method: 'GET', url: `${app.urls.resourceHost}/assets/data/app.json`, onload: ({ responseText }) => resolve(JSON.parse(responseText)) })), msgs: await new Promise(resolve => { const msgBaseURL = `${app.urls.resourceHost}/greasemonkey/_locales`, locale = `${ env.browser.language ? env.browser.language.replace('-', '_') : 'en' }` let msgURL = `${msgBaseURL}/${locale}/messages.json`, msgFetchesTried = 0 function fetchMsgs() { xhr({ method: 'GET', url: msgURL, onload: handleMsgs })} function handleMsgs(resp) { try { // to return localized messages.json const msgs = JSON.parse(resp.responseText), flatMsgs = {} for (const key in msgs) // remove need to ref nested keys if (typeof msgs[key] == 'object' && 'message' in msgs[key]) flatMsgs[key] = msgs[key].message resolve(flatMsgs) } catch (err) { // if bad response msgFetchesTried++ ; if (msgFetchesTried == 3) return resolve({}) // try original/region-stripped/EN only msgURL = env.browser.language.includes('-') && msgFetchesTried == 1 ? // if regional lang on 1st try... msgURL.replace(/(_locales\/[^_]+)_[^_]+(\/)/, '$1$2') // ...strip region before retrying : `${msgBaseURL}/en/messages.json` // else use default English messages fetchMsgs() } } fetchMsgs() }) } Object.assign(app, { ...remoteData.app, urls: { ...app.urls, ...remoteData.app.urls }, msgs: remoteData.msgs }) // Init SETTINGS app.config ??= {} const settings = { controls: { // displays top-to-bottom in toolbar menu arDisabled: { type: 'toggle', defaultVal: false, label: app.msgs.menuLabel_autoRefresh }, toggleHidden: { type: 'toggle', defaultVal: false, label: app.msgs.menuLabel_toggleVis, helptip: app.msgs.helptip_toggleVis }, notifDisabled: { type: 'toggle', defaultVal: false, label: app.msgs.menuLabel_modeNotifs, helptip: app.msgs.helptip_modeNotifs }, refreshInterval: { type: 'prompt', symbol: '⌚', label: app.msgs.menuLabel_refreshInt, helptip: app.msgs.helptip_refreshInt } }, load(...keys) { keys.flat().forEach(key => app.config[key] = processKey(key, GM_getValue(`${app.configKeyPrefix}_${key}`, undefined))) function processKey(key, val) { const ctrl = settings.controls?.[key] if (val != undefined && ( // validate stored val (ctrl?.type == 'toggle' && typeof val != 'boolean') || (ctrl?.type == 'slider' && isNaN(parseFloat(val))) )) val = undefined return val ?? (ctrl?.defaultVal ?? (ctrl?.type == 'slider' ? 100 : false)) } }, save(key, val) { GM_setValue(`${app.configKeyPrefix}_${key}`, val) ; app.config[key] = val }, typeIsEnabled(key) { // for menu labels + notifs to return ON/OFF const reInvertSuffixes = /disabled|hidden/i return reInvertSuffixes.test(key) // flag in control key name && !reInvertSuffixes.test(this.controls[key]?.label || '') // but not in label msg key name ? !app.config[key] : app.config[key] // so invert since flag reps opposite type state, else don't } } settings.load(Object.keys(settings.controls)) if (!app.config.refreshInterval) settings.save('refreshInterval', 30) // init refresh interval to 30 secs if unset // Define MENU functions const toolbarMenu = { state: { symbols: ['❌', '✔️'], separator: env.scriptManager.name == 'Tampermonkey' ? ' — ' : ': ', words: [app.msgs.state_off.toUpperCase(), app.msgs.state_on.toUpperCase()] }, refresh() { if (typeof GM_unregisterMenuCommand == 'undefined') return this.entryIDs.forEach(id => GM_unregisterMenuCommand(id)) this.register() }, register() { // Init prompt setting status labels settings.controls.refreshInterval.status = `${app.config.refreshInterval}s` // Add toggles this.entryIDs = Object.keys(settings.controls).map(key => { const entryData = settings.controls[key] const menuLabel = `${ entryData.symbol || this.state.symbols[+settings.typeIsEnabled(key)] } ${entryData.label} ${ entryData.type == 'toggle' ? this.state.separator + this.state.words[+settings.typeIsEnabled(key)] : entryData.type == 'slider' ? ': ' + app.config[key] + entryData.labelSuffix || '' : entryData.status ? ` — ${entryData.status}` : '' }` return GM_registerMenuCommand(menuLabel, () => { if (entryData.type == 'toggle') { settings.save(key, !app.config[key]) notify(`${entryData.label}: ${this.state.words[+settings.typeIsEnabled(key)]}`) } else { // Refresh Interval prompt const refreshInterval = prompt( `${app.msgs.prompt_updateInt}:`, app.config.refreshInterval) if (refreshInterval == null) return // user cancelled so do nothing else if (!isNaN(parseInt(refreshInterval, 10)) && parseInt(refreshInterval, 10) > 0) { settings.save('refreshInterval', parseInt(refreshInterval, 10)) if (chatgpt.autoRefresh.isActive) { // reset running auto-refresh chatgpt.autoRefresh.deactivate() chatgpt.autoRefresh.activate(refreshInterval) } this.refresh() const minInt = Math.max(2, app.config.refreshInterval -10), maxInt = app.config.refreshInterval +10 modals.alert(`${app.msgs.alert_intUpdated}!`, `${app.msgs.alert_willRefresh} ${minInt}–${maxInt} ${app.msgs.unit_secs}`) } } syncConfigToUI({ updatedKey: key }) }, env.scriptManager.supportsTooltips ? { title: entryData.helptip || ' ' } : undefined) }) // Add About entry this.entryIDs.push(GM_registerMenuCommand( `💡 ${app.msgs.menuLabel_about} ${app.msgs.appName}`, () => modals.open('about'), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined )) } } window.updateCheck = () => { xhr({ method: 'GET', url: `${app.urls.update.gm}?t=${Date.now()}`, headers: { 'Cache-Control': 'no-cache' }, onload: ({ responseText }) => { // Compare versions, alert if update found app.latestVer = /@version +(.*)/.exec(responseText)?.[1] if (app.latestVer) for (let i = 0 ; i < 4 ; i++) { // loop thru subver's const currentSubVer = parseInt(app.version.split('.')[i], 10) || 0, latestSubVer = parseInt(app.latestVer.split('.')[i], 10) || 0 if (currentSubVer > latestSubVer) break // out of comparison since not outdated else if (latestSubVer > currentSubVer) // if outdated return modals.open('update', 'available') } // Alert to no update found, nav back to About modals.open('update', 'unavailable') ; modals.open('about') }}) } // Define FEEDBACK functions function notify(msg, pos = '', notifDuration = '', shadow = '') { if (app.config.notifDisabled && !msg.includes(app.msgs.menuLabel_modeNotifs)) return // Strip state word to append colored one later const foundState = toolbarMenu.state.words.find(word => msg.includes(word)) if (foundState) msg = msg.replace(foundState, '') // Show notification chatgpt.notify(`${app.symbol} ${msg}`, pos, notifDuration, shadow || env.ui.scheme == 'light') const notif = document.querySelector('.chatgpt-notif:last-child') // Append styled state word if (foundState) { const stateStyles = { on: { light: 'color: #5cef48 ; text-shadow: rgba(255,250,169,0.38) 2px 1px 5px', dark: 'color: #5cef48 ; text-shadow: rgb(55,255,0) 3px 0 10px' }, off: { light: 'color: #ef4848 ; text-shadow: rgba(255,169,225,0.44) 2px 1px 5px', dark: 'color: #ef4848 ; text-shadow: rgba(255, 116, 116, 0.87) 3px 0 9px' } } const styledStateSpan = dom.create.elem('span') styledStateSpan.style.cssText = stateStyles[ foundState == toolbarMenu.state.words[0] ? 'off' : 'on'][env.ui.scheme] styledStateSpan.append(foundState) ; notif.append(styledStateSpan) } } // Define MODAL functions const modals = { stack: [], // of types of undismissed modals class: `${app.slug}-modal`, about() { // Show modal const labelStyles = 'text-transform: uppercase ; font-size: 17px ; font-weight: bold ;' + `color: ${ env.ui.scheme == 'dark' ? 'white' : '#494141' }` const aboutModal = modals.alert( `${app.symbol} ${app.msgs.appName}`, // title `🧠 ${app.msgs.about_author}: ` + `${app.msgs.appAuthor} ` + `${app.msgs.about_and} ` + `${app.msgs.about_contributors}\n` + `🏷️ ${app.msgs.about_version}: ` + `${app.version}\n` + `📜 ${app.msgs.about_openSourceCode}: ` + `` + app.urls.github + '\n' + `🚀 ${app.msgs.about_latestChanges}: ` + `` + `${app.urls.github}/commits\n` + `⚡ ${app.msgs.about_poweredBy}: ` + `chatgpt.js` + ` v${app.chatgptjsVer}`, [ // buttons function checkForUpdates() { updateCheck() }, function getSupport(){}, function discuss(){}, function moreAIextensions(){} ], '', 714 // set width ) // Format text aboutModal.querySelector('h2').style.cssText = ` text-align: center ; font-size: 51px ; line-height: 46px ; padding: 15px 0` aboutModal.querySelector('p').style.cssText = ` text-align: center ; overflow-wrap: anywhere ; margin: ${ env.browser.isCompact ? '6px 0 -16px' : '3px 0 29px' }` // Hack buttons aboutModal.querySelectorAll('button').forEach(btn => { btn.style.cssText = 'height: 58px ; min-width: 136px ; text-align: center' // Replace link buttons w/ clones that don't dismiss modal if (/support|discuss|extensions/i.test(btn.textContent)) { btn.replaceWith(btn = btn.cloneNode(true)) btn.onclick = () => modals.safeWinOpen(app.urls[ btn.textContent.includes(app.msgs.btnLabel_getSupport) ? 'support' : btn.textContent.includes(app.msgs.btnLabel_discuss) ? 'discuss' : 'relatedExtensions' ]) } // Prepend emoji + localize labels if (/updates/i.test(btn.textContent)) btn.textContent = `🚀 ${app.msgs.btnLabel_checkForUpdates}` else if (/support/i.test(btn.textContent)) btn.textContent = `🧠 ${app.msgs.btnLabel_getSupport}` else if (/discuss/i.test(btn.textContent)) btn.textContent = `🗨️ ${app.msgs.btnLabel_discuss}` else if (/extensions/i.test(btn.textContent)) btn.textContent = `🤖 ${app.msgs.btnLabel_moreAIextensions}` // Hide Dismiss button else btn.style.display = 'none' // hide Dismiss button }) return aboutModal }, alert(title = '', msg = '', btns = '', checkbox = '', width = '') { // generic one from chatgpt.alert() const alertID = chatgpt.alert(title, msg, btns, checkbox, width), alert = document.getElementById(alertID).firstChild this.init(alert) // add classes + rising particles bg return alert }, init(modal) { this.stylize() modal.classList.add(this.class) ; modal.parentNode.classList.add(`${this.class}-bg`) css.addRisingParticles(modal) }, observeRemoval(modal, modalType, modalSubType) { // to maintain stack for proper nav const modalBG = modal.parentNode new MutationObserver(([mutation], obs) => { mutation.removedNodes.forEach(removedNode => { if (removedNode == modalBG) { if (modals.stack[0].includes(modalSubType || modalType)) { // new modal not launched so nav back modals.stack.shift() // remove this modal type from stack 1st const prevModalType = modals.stack[0] if (prevModalType) { // open it modals.stack.shift() // remove type from stack since re-added on open modals.open(prevModalType) } } obs.disconnect() }}) }).observe(modalBG.parentNode, { childList: true, subtree: true }) }, open(modalType, modalSubType) { const modal = modalSubType ? this[modalType][modalSubType]() : this[modalType]() // show modal if (!modal) return // since no div returned this.stack.unshift(modalSubType ? `${modalType}_${modalSubType}` : modalType) // add to stack this.init(modal) // add classes + rising particles bg this.observeRemoval(modal, modalType, modalSubType) // to maintain stack for proper nav }, safeWinOpen(url) { open(url, '_blank', 'noopener') }, // to prevent backdoor vulnerabilities stylize() { const { scheme } = env.ui if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ` .${this.class} { /* modals */ user-select: none ; -webkit-user-select: none ; -moz-user-select: none ; -ms-user-select: none ; font-family: -apple-system, system-ui, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, sans-serif ; padding: 20px 25px 24px 25px !important ; font-size: 20px ; color: ${ scheme == 'dark' ? 'white' : 'black' } !important ; background-image: linear-gradient(180deg, ${ scheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) } .${this.class} [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } .${this.class} [class*=modal-close-btn] svg { height: 10px } .${this.class} [class*=modal-close-btn] path { ${ scheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ scheme == 'dark' ? // invert dark mode hover paths `.${this.class} [class*=modal-close-btn]:hover path { stroke: black ; fill: black }` : '' } .${this.class} [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ .${this.class} [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ .${this.class} a { color: #${ scheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .${this.class} h2 { font-weight: bold } .${this.class} button { --btn-transition: transform 0.1s ease-in-out, box-shadow 0.1s ease-in-out ; font-size: 14px ; text-transform: uppercase ; /* shrink/uppercase labels */ border-radius: 0 !important ; /* square borders */ transition: var(--btn-transition) ; /* smoothen hover fx */ -webkit-transition: var(--btn-transition) ; -moz-transition: var(--btn-transition) ; -o-transition: var(--btn-transition) ; -ms-transition: var(--btn-transition) ; cursor: pointer !important ; /* add finger cursor */ border: 1px solid ${ scheme == 'dark' ? 'white' : 'black' } !important ; padding: 8px !important ; min-width: 102px /* resize */ } .${this.class} button:not([class*=primary]) { background: none } .${this.class} button:hover { ${ scheme == 'light' ? // reduce intensity of light scheme hover glow '--btn-shadow: 2px 1px 43px #00cfff70 ;' : '' } color: inherit !important ; /* remove color hack */ background-color: rgb(${ scheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) } ${ env.browser.isMobile ? '' : `.${this.class} .modal-buttons { margin-left: -13px !important }` } .about-em { color: ${ scheme == 'dark' ? 'white' : 'green' } !important }` }, update: { width: 377, available() { // Show modal const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.msgs.appName} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '${app.msgs.link_viewChanges}`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) // Localize button labels if needed if (!env.browser.language.startsWith('en')) { const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.msgs.appName} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Define UI functions function getScheme() { return /\b(light|dark)\b/.exec(document.documentElement.className)?.[1] || ( window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' ) } function syncConfigToUI({ updatedKey } = {}) { if (updatedKey == 'arDisabled') toggleAutoRefresh() if (/arDisabled|toggleHidden/.test(updatedKey)) toggles.sidebar.update.state() toolbarMenu.refresh() // prefixes/suffixes } const toggles = { sidebar: { class: `${app.slug}-sidebar-toggle`, create() { // Init toggle elems this.div = dom.create.elem('div', { class: this.class }) this.navicon = dom.create.elem('img') this.toggleLabel = dom.create.elem('label') this.switchSpan = dom.create.elem('span') this.knobSpan = dom.create.elem('span') // Assemble elems into parent div this.switchSpan.append(this.knobSpan) this.div.append(this.navicon, this.toggleLabel, this.switchSpan) // Stylize elems this.stylize() // create/append stylesheet // Update scheme/state this.update.scheme() ; this.update.state() // Add hover/click listeners this.div.onmouseover = this.div.onmouseout = ({ type }) => // trigger OpenAI hover overlay this.div.style.setProperty('--item-background-color', `var(--sidebar-surface-${ type == 'mouseover' ? 'secondary' : 'primary' })`) this.div.onclick = () => { settings.save('arDisabled', !app.config.arDisabled) ; syncConfigToUI({ updatedKey: 'arDisabled' }) notify(`${app.msgs.menuLabel_autoRefresh}: ${toolbarMenu.state.words[+!app.config.arDisabled]}`) } }, stylize() { // requires lib/.js + env const firstLink = chatgpt.getNewChatLink() if (firstLink && !this.classesBorrowed) { // borrow/assign classes from sidebar elems const firstIcon = firstLink.querySelector('div:first-child'), firstLabel = firstLink.querySelector('div:nth-child(2)') this.div.classList.add(...firstLink.classList, ...(firstLabel?.classList || [])) this.div.querySelector('img')?.classList.add(...(firstIcon?.classList || [])) this.classesBorrowed = true } this.styles ||= dom.create.style( `:root { /* vars */ --switch-enabled-bg-color: #ad68ff ; --switch-disabled-bg-color: #ccc ; --switch-enabled-box-shadow: 1px 2px 8px #d8a9ff ; --switch-enabled-hover-box-shadow: 0 1px 10px #9b5ad1 ; --knob-box-shadow: rgba(0,0,0,0.3) 0 1px 2px 0 ; --knob-box-shadow-dark: rgba(0,0,0,0.3) 0 1px 2px 0, rgba(0,0,0,0.15) 0 3px 6px 2px }` // Element styles + `.${this.class} { /* parent div */ width: auto ; max-height: 37px ; padding: 0 5px ; user-select: none ; cursor: pointer } .${this.class} > img { /* navicon */ width: 1.25rem ; height: 1.25rem ; margin-left: 2px ; margin-right: 4px } .${this.class} > span { /* switch span */ position: relative ; width: 30px ; height: 15px ; border-radius: 28px ; background-color: var(--switch-disabled-bg-color) ; bottom: ${ firstLink ? '0.5px' : '-0.15em' } ; transition: 0.4s ; -webkit-transition: 0.4s ; -moz-transition: 0.4s ; -o-transition: 0.4s ; -ms-transition: 0.4s } .${this.class} > span.enabled { /* switch on */ background-color: var(--switch-enabled-bg-color) ; box-shadow: var(--switch-enabled-box-shadow) ; -webkit-box-shadow: var(--switch-enabled-box-shadow) ; -moz-box-shadow: var(--switch-enabled-box-shadow) ; transition: 0.15s ; -webkit-transition: 0.15s ; -moz-transition: 0.15s ; -o-transition: 0.15s ; -ms-transition: 0.15s } .${this.class}:hover > span.enabled { /* switch on when hover on parent div */ box-shadow: var(--switch-enabled-hover-box-shadow) ; -webkit-box-shadow: var(--switch-enabled-hover-box-shadow) ; -moz-box-shadow: var(--switch-enabled-hover-box-shadow) } .${this.class} > span.disabled { /* switch off */ background-color: var(--switch-disabled-bg-color) ; box-shadow: none } .${this.class} > span > span { /* knob span */ position: absolute ; width: 12px ; height: 12px ; content: "" ; border-radius: 28px ; background-color: white ; left: 2px ; bottom: 1.25px ; box-shadow: var(--knob-box-shadow) ; -webkit-box-shadow: var(--knob-box-shadow) ; -moz-box-shadow: var(--knob-box-shadow) ; transition: 0.4s ; -webkit-transition: 0.4s ; -moz-transition: 0.4s ; -o-transition: 0.4s ; -ms-transition: 0.4s } .${this.class} > label { /* toggle label */ cursor: pointer ; overflow: hidden ; text-overflow: ellipsis ; white-space: nowrap ; color: black ; padding: 0 3px ; flex-grow: 1 ; font-size: var(--text-sm) }` // Dark scheme mods + `.${this.class}.dark > span.enabled { /* switch on */ background-color: var(--switch-enabled-bg-color) ; box-shadow: var(--switch-enabled-hover-box-shadow) ; /* use hover style instead */ -webkit-box-shadow: var(--switch-enabled-hover-box-shadow) ; -moz-box-shadow: var(--switch-enabled-hover-box-shadow) } .${this.class}.dark:hover > span.enabled { /* switch on when hover on parent div */ box-shadow: var(--switch-enabled-box-shadow) ; /* use regular style instead */ -webkit-box-shadow: var(--switch-enabled-box-shadow) ; -moz-box-shadow: var(--switch-enabled-box-shadow) } .${this.class}.dark > span > span { /* knob span */ box-shadow: var(--knob-box-shadow-dark) ; /* make 3D-er */ -webkit-box-shadow: var(--knob-box-shadow-dark) ; -moz-box-shadow: var(--knob-box-shadow-dark) } .${this.class}.dark > label { color: white } /* toggle label */` ) if (!this.styles.isConnected) document.head.append(this.styles) }, insert() { // requires lib/.min.js const sidebar = document.querySelector(chatgpt.selectors.sidebar) if (!sidebar || this.status?.startsWith('insert') || document.querySelector(`.${this.class}`)) return this.status = 'inserting' ; if (!this.div) this.create() const sidebarHeader = sidebar.querySelector('div#sidebar-header') if (sidebarHeader) { sidebarHeader.after(this.div) ; this.status = 'inserted' } else { this.status = 'waitingForSidebar' dom.get.loadedElem('div#sidebar-header').then(header => { header.after(this.div) ; this.stylize() ; this.status = 'inserted' }).catch((err) => { this.status = 'failed' ; console.error('toggles.sidebar.insert()', err) }) } }, update: { navicon({ preload } = {}) { const baseURL = `${ app.urls.resourceHost.replace(/@\w+/, '@579fa7c')}/assets/images/icons/auto-refresh` const schemeMap = { light: 'black', dark: 'white' }, fileName = 'icon32.png' if (preload) Object.keys(schemeMap).forEach(scheme => new Image().src = `${baseURL}/${schemeMap[scheme]}/${fileName}`) else toggles.sidebar.navicon.src = `${baseURL}/${schemeMap[env.ui.scheme]}/${fileName}` }, scheme() { // to match UI scheme toggles.sidebar.div.classList.remove('dark', 'light') toggles.sidebar.div.classList.add(env.ui.scheme) toggles.sidebar.update.navicon() }, state() { if (!toggles.sidebar.div) return // since toggle never created = sidebar missing toggles.sidebar.div.style.display = app.config.toggleHidden ? 'none' : 'flex' const isOn = !app.config.arDisabled toggles.sidebar.toggleLabel.textContent = `${app.msgs.menuLabel_autoRefresh} ` + app.msgs[`state_${ isOn ? 'enabled' : 'disabled' }`] requestAnimationFrame(() => { toggles.sidebar.switchSpan.className = isOn ? 'enabled' : 'disabled' toggles.sidebar.knobSpan.style.transform = `translateX(${ isOn ? 13 : 0 }px)` }) // to trigger 1st transition fx } } } } // Define AUTO-REFRESH function function toggleAutoRefresh() { if (!app.config.arDisabled && !chatgpt.autoRefresh.isActive) chatgpt.autoRefresh.activate(app.config.refreshInterval) else if (app.config.arDisabled && chatgpt.autoRefresh.isActive) chatgpt.autoRefresh.deactivate() } // Run MAIN routine toolbarMenu.register() // create browser toolbar menu toggles.sidebar.update.navicon({ preload: true }) // preload sidebar NAVICON variants await Promise.race([chatgpt.isLoaded(), new Promise(resolve => setTimeout(resolve, 5000))]) // initial UI loaded ;['rpg', 'rpw'].forEach(cssType => // add Rising Particles styles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) toggles.sidebar.insert() // Prevent sporadic convo RESETS const ogAEL = EventTarget.prototype.addEventListener EventTarget.prototype.addEventListener = function(type, listener, optionsOrUseCapture) { let calledByOpenAI = false if (type == 'focus' && this == unsafeWindow || type == 'visibilitychange') { const callStack = new Error().stack + '\n', aelCaller = /-extension:\/\/.*\n(.+)/.exec(callStack)?.[1] calledByOpenAI = !aelCaller?.includes('-extension://') if (calledByOpenAI && type == 'visibilitychange') { ogAEL.call(this, type, function(event) { if (document.visibilityState != 'visible') listener.call(this, event) }, optionsOrUseCapture) }} if (!calledByOpenAI) ogAEL.apply(this, arguments) } // Activate AUTO-REFRESH on first visit if enabled if (!app.config.arDisabled) { chatgpt.autoRefresh.activate(app.config.refreshInterval) notify(`${app.msgs.menuLabel_autoRefresh}: ${app.msgs.state_on.toUpperCase()}`) } // Monitor NODE CHANGES to maintain sidebar toggle visibility new MutationObserver(() => { if (!app.config.toggleHidden && document.querySelector(chatgpt.selectors.sidebar) && !document.querySelector(`.${toggles.sidebar.class}`) && toggles.sidebar.status != 'inserting' ) { toggles.sidebar.status = 'missing' ; toggles.sidebar.insert() } }).observe(document.body, { attributes: true, subtree: true }) // Monitor SCHEME PREF changes to update sidebar toggle + modal colors new MutationObserver(handleSchemePrefChange).observe( // for site scheme pref changes document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { const displayedScheme = getScheme() if (env.ui.scheme != displayedScheme) { env.ui.scheme = displayedScheme ; toggles.sidebar.update.scheme() ; modals.stylize() } } })()