ChatGPT 轻松管理聊天

搜索聊天、过滤聊天、快速/批量删除聊天。

  1. // ==UserScript==
  2. // @name ChatGPT Easy Chat Management
  3. // @name:aa ChatGPT sahlin walalih walal
  4. // @name:ab ЧатГПТ Имарианы ацәажәарақәа рнапхгара
  5. // @name:af Chatgpt bestuur maklik geselsies
  6. // @name:ak ChatGPT yɛ mmerɛw sɛ wobɛhwɛ nkɔmmɔbɔ so .
  7. // @name:am ውይይት በቀላሉ ቻትዎችን ያስተዳድራል
  8. // @name:ar ChatGPT بسهولة إدارة الدردشات
  9. // @name:as Chatgpt সহজে চ্যাট পৰিচালনা কৰে
  10. // @name:av ChatGPT Бигьаго нухмалъи гьабизе чат
  11. // @name:ay Chatgpt ukax jasakiw chats ukar apnaqañama .
  12. // @name:az ChatGept asanlıqla söhbətləri idarə edin
  13. // @name:ba ChatGPT еңел идара итеү чат
  14. // @name:be Chatgpt лёгка кіраваць чатамі
  15. // @name:bg Chatgpt лесно управлява чатовете
  16. // @name:bh चैटजीपीटी आसानी से चैट के प्रबंधन करीं
  17. // @name:bm ChatGPT bɛ se ka barow ɲɛnabɔ nɔgɔya la .
  18. // @name:bn চ্যাটজিপ্ট সহজেই চ্যাট পরিচালনা করুন
  19. // @name:bo ChatGPT ཁ་བརྡ་བདེ་བླག་ངང་འཛིན་སྐྱོང་བྱེད་པ།
  20. // @name:br ChatGPT Aes merañ ar c’hrogadoù
  21. // @name:bs Chaggpt Lako upravljati chatovima
  22. // @name:ca Chatgpt gestiona fàcilment els xats
  23. // @name:ce ChatGPT Easily-н урхалла до чаташна
  24. // @name:ceb Ang chatgpt dali nga magdumala sa mga chat
  25. // @name:ch Gaigue-ña si ChatGPT Gi i lina’la’
  26. // @name:ckb Chatgpt بە ئاسانی بەڕێوەبردنی چاتەکان
  27. // @name:co Chatgpt fabricà facilmente i chats
  28. // @name:cs Chatgpt Snadno spravuje chaty
  29. // @name:cv ЧатГПТ йĕркеллĕ чатсене йĕркелеме пулать
  30. // @name:cy Chatgpt yn rheoli sgyrsiau yn hawdd
  31. // @name:da Chatgpt Administrer let chats
  32. // @name:de ChatGPT verwalten einfach Chats
  33. // @name:dv ޗެޓްޖީޕީޓީ އިން ފަސޭހައިން ޗެޓް މެނޭޖް ކުރަނީ
  34. // @name:dz ChatGPT འཇམ་ཏོང་ཏོ་སྦེ་ཁ་སླབ་ཚུ་འཛིན་སྐྱོང་འཐབ་ནི།
  35. // @name:ee Chatgpt kpɔa dzeɖoɖowo dzi bɔbɔe .
  36. // @name:el Το Chatgpt διαχειρίζεται εύκολα τις συνομιλίες
  37. // @name:en ChatGPT Easily manage chats
  38. // @name:en-GB ChatGPT Easily manage chats
  39. // @name:eo Chatgpt facile administras babiladojn
  40. // @name:es Chatgpt administrar fácilmente los chats
  41. // @name:et Chatgpt hallake vestlusi hõlpsalt
  42. // @name:eu Chatgpt erraz kudeatu txatak
  43. // @name:fa Chatgpt به راحتی چت ها را مدیریت می کند
  44. // @name:ff ChatGPT Ko yaawi ina jogori waɗde yeewtereeji
  45. // @name:fi ChatgPT hallitsee helposti keskusteluja
  46. // @name:fil Ang chatgpt ay madaling pamahalaan ang mga chat
  47. // @name:fj Vakarautaki ni Eusily ni lewa .
  48. // @name:fo ChatGPT umsitur Lætt
  49. // @name:fr Chatgpt Gérez facilement les chats
  50. // @name:fr-CA Chatgpt Gérez facilement les chats
  51. // @name:fy Chatgpt maklik beheare petearen
  52. // @name:ga Chatgpt comhrá a bhainistiú go héasca
  53. // @name:gd Bidh Chatgpt furasta a ’comharrachadh chait
  54. // @name:gl Chatgpt xestionar facilmente os chats
  55. // @name:gn CHATGPT Ojesareko pya’e umi ñe’ẽjoaju rehe .
  56. // @name:gsw-berne ChatGPT Easily manage chats
  57. // @name:gu ચેટગપ્ટ સરળતાથી ચેટ્સનું સંચાલન કરો
  58. // @name:gv ChatGPT Easily.
  59. // @name:ha CYGTP sauƙin sarrafawa
  60. // @name:he צ’אט
  61. // @name:hi CHATGPT आसानी से चैट का प्रबंधन करें
  62. // @name:hmn Chatgpt yooj yim tswj chats
  63. // @name:hr Chatgpt lako upravljati chatovima
  64. // @name:ht Chatgpt fasil jere cha
  65. // @name:hu A chatgpt könnyen kezelheti a csevegést
  66. // @name:hy Chatgpt- ը հեշտությամբ կառավարում է զրույցները
  67. // @name:id Chatgpt dengan mudah mengelola obrolan
  68. // @name:ig Nkata dị mfe jikwaa nkata
  69. // @name:is Chatgpt stjórna auðveldlega spjalli
  70. // @name:it Chatgpt gestisce facilmente le chat
  71. // @name:iu ChatGPT-ᑯᑦ ᐊᐅᓚᑦᑎᖏᓐᓇᐅᔭᖅᑐᑦ ᐅᖃᖃᑎᒌᒍᑎᓂᒃ
  72. // @name:ja ChatGptはチャットを簡単に管理します
  73. // @name:jv ChatGPT Gampang Ngatur Chats
  74. // @name:ka Chatgpt ადვილად მართავს ჩეთებს
  75. // @name:kg ChatGPT ke sadilaka masolo kukonda mpasi
  76. // @name:kk Чатшпта чаттарды оңай басқаруда
  77. // @name:kl ChatGPT chats-inik ajornanngitsumik aqutsisinnaavutit
  78. // @name:km Chatgpt គ្រប់គ្រងការជជែក
  79. // @name:kn ಚಾಟ್ಜಿಪಿಟಿ ಸುಲಭವಾಗಿ ಚಾಟ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ
  80. // @name:ko Chatgpt는 채팅을 쉽게 관리합니다
  81. // @name:kr ChatGPT kəskelan zandewa cistǝgǝ
  82. // @name:ku Chatgpt bi hêsanî chat
  83. // @name:kv ЧатГПТ Кокниӧн веськӧдлӧны чатъясӧн .
  84. // @name:ky Чатгптай
  85. // @name:la Chatgpt facile Curo Chats
  86. // @name:lb ChatGPT einfach managen Chats
  87. // @name:lg ChatGpt enyangu okuddukanya emboozi .
  88. // @name:ln Chatgpt e gérer na pete ba chats .
  89. // @name:lo ChatGPT ຄຸ້ມຄອງການສົນທະນາໄດ້ຢ່າງງ່າຍດາຍ
  90. // @name:lt „ChatGpt“ lengvai valdo pokalbius
  91. // @name:lv Chatgpt viegli pārvaldīt tērzēšanu
  92. // @name:mg Mora mitantana ny chatgpt mora
  93. // @name:mh ChatGPT Ej kōṃṃan bwe en pidodo aer kōnono .
  94. // @name:mi He ngawari te whakahaere i nga whakawhitinga
  95. // @name:mk Chatgpt лесно управува со разговори
  96. // @name:ml ചാറ്റ്ഗേറ്റ് ചാറ്റുകൾ എളുപ്പത്തിൽ മാനേജുചെയ്യുക
  97. // @name:mn Chatgpt амархан чатыг хялбархан удирддаг
  98. // @name:mo Chatgpt gestionează cu ușurință chaturile
  99. // @name:mr Chatgpt सहजपणे गप्पा व्यवस्थापित करा
  100. // @name:ms Chatgpt dengan mudah menguruskan sembang
  101. // @name:mt Chatgpt faċilment jimmaniġġja chats
  102. // @name:my chatgpt အလွယ်တကူ chats ကိုစီမံခန့်ခွဲ
  103. // @name:nb Chatgpt klarer enkelt chatter
  104. // @name:ne च्याट गर्न सजीलो CHTST CHEST
  105. // @name:nl Chatgpt beheren eenvoudig chats
  106. // @name:nr Fala /Suma Susa .
  107. // @name:ny ChatGTT SART TRAMISH
  108. // @name:oc ChatGPT gestionar facilmente los chats .
  109. // @name:om Chatgpt Chaat salphaatti bulchuu .
  110. // @name:or ଚାଟ୍ ଟୁଟି ସହଜରେ ଚଟାଣ ପରିଚାଳନା କରନ୍ତୁ |
  111. // @name:os ChatGPT æнцонæй къухдариуæг кæны чатæн
  112. // @name:pa ਚੱਟਾਨਾਂ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ਕਰੋ
  113. // @name:pl Chatgpt łatwo zarządzaj czatami
  114. // @name:ps د چیټکوټ په اسانۍ سره چاټونه اداره کوي
  115. // @name:pt Chatgpt gerencia facilmente bate -papos
  116. // @name:pt-BR Chatgpt gerencia facilmente bate -papos
  117. // @name:pt-PT Chatgpt gerencia facilmente bate -papos
  118. // @name:qu chatgpt fácilmente manejar chats .
  119. // @name:rn ChatGPT Gucungera neza ubutumwa
  120. // @name:ro Chatgpt gestionează cu ușurință chaturile
  121. // @name:ru Chatgpt легко управлять чатами
  122. // @name:rw Ikiganiro Byoroshye Gucunga Ibiganiro
  123. // @name:sa चॅट्जीपीटी सहजतया गपशपं प्रबन्धयन्तु।
  124. // @name:sd چٽپٽ آسانيء سان چٽ کي منظم ڪري ٿو
  125. // @name:se ChatGPT álkit hálddašit ságastallamiid
  126. // @name:sg ChatGPT Esily ti sara lisoro na azo .
  127. // @name:sh ЦхатГпт Лако управљајте четовима
  128. // @name:si චැට් පහසුවෙන් සංදර්ශන කළමනාකරණය කරන්න
  129. // @name:sk Chatgpt ľahko spravovať rozhovory
  130. // @name:sl Chatgpt enostavno upravljati klepete
  131. // @name:sm Talatalanoaga faigofie ona puleaina talatalanoaga
  132. // @name:sn Chatgpt inogadzirisa nyore chats
  133. // @name:so CHATGPTPTPTPTPTPTPTPT SITE waxay maamushaa sheekaysiga
  134. // @name:sq Chatgpt menaxhoni me lehtësi bisedat
  135. // @name:sr ЦхатГпт Лако управљајте четовима
  136. // @name:ss I-ChatGPT ilawula kahle tingcoco
  137. // @name:st Chatgpt Hantle habonolo
  138. // @name:su ChatGPS gampang ngatur chats
  139. // @name:sv Chatgpt hanterar enkelt chattar
  140. // @name:sw Chatgpt kusimamia kwa urahisi mazungumzo
  141. // @name:ta அரட்டைகளை எளிதில் நிர்வகிக்கவும்
  142. // @name:te చాట్‌గ్ప్ట్ చాట్‌లను సులభంగా నిర్వహించండి
  143. // @name:tg Чатчпппппппппсро идора кунед
  144. // @name:th CHATGPT จัดการแชทได้อย่างง่ายดาย
  145. // @name:ti CHATGPT ንታት ብቐሊሉ የመሓድር
  146. // @name:tk ChatGPton sygyrlary aňsatlyk bilen dolandyryň
  147. // @name:tl Ang chatgpt ay madaling pamahalaan ang mga chat
  148. // @name:tn ChatGPT Go laola dipuisano tse di bonolo
  149. // @name:to ChatGPT Pule’i Faingofua ’a e ngaahi talanoa .
  150. // @name:tr Chatgpt sohbetleri kolayca yönetin
  151. // @name:ts Chatgpt hi ku olova lawula ti-chat .
  152. // @name:tt Чатгипт чатлар белән идарә итә
  153. // @name:tw ChatGPT yɛ mmerɛw sɛ wobɛhwɛ nkɔmmɔbɔ so .
  154. // @name:ty Te faatere nei o ChatGPT i te mau aparauraa
  155. // @name:ug Chatgpt ئاسانلا چاتاقنى باشقۇرىدۇ
  156. // @name:uk Чатгпт легко керувати чатами
  157. // @name:ur چیٹ آسانی سے چیٹس کا انتظام کرتے ہیں
  158. // @name:uz Chatgpt Kamchiliklarni osongina boshqaradi
  159. // @name:ve ChatGPT ni lavhelese nga hu leluwaho nyambedzano
  160. // @name:vi Chatgpt dễ dàng quản lý các cuộc trò chuyện
  161. // @name:wo ChatGPT
  162. // @name:xh I-CHATGPPT ilawula ngokulula iincoko
  163. // @name:yi טשאַטגפּט לייכט פירן טשאַץ
  164. // @name:yo Lightig wa ni rọọrun ṣakoso awọn ibaraẹnisọrọ
  165. // @name:zh ChatGPT 轻松管理聊天
  166. // @name:zh-CN ChatGPT 轻松管理聊天
  167. // @name:zh-HK ChatGPT 輕鬆管理聊天
  168. // @name:zh-MO ChatGPT 輕鬆管理聊天
  169. // @name:zh-MY ChatGPT 轻松管理聊天
  170. // @name:zh-SG ChatGPT 轻松管理聊天
  171. // @name:zh-TW ChatGPT 輕鬆管理聊天
  172. // @name:zu I-Chatgpt ukuphatha izingxoxo kalula
  173. // @name:es-419 Chatgpt administrar fácilmente los chats
  174. // @description Search for chats, filter them, quickly/bulk delete them.
  175. // @description:aa walal, maydaddaarat walala, sissik/batch baysiyyih walala.
  176. // @description:ab Аԥшааратә чат, афильтр аицәажәара, аццакыра/абатч аныхратә чат.
  177. // @description:af Soek chat, filter chat, vinnige/groep delete chat.
  178. // @description:ak Hwehwɛ nkɔmmɔbɔ, filter nkɔmmɔbɔ, fast/batch Popa nkɔmmɔbɔ.
  179. // @description:am ፍለጋ ውይይት, ማጣሪያ ውይይት, ፈጣን / የቡድን ሰርዝ
  180. // @description:ar بحث الدردشة ، دردشة التصفية ، الدردشة السريعة/الدُفعة.
  181. // @description:as Search Chat, ফিল্টাৰ চেট, দ্ৰুত/বেচ মচি পেলাওক চেট।
  182. // @description:av Поиск чат, фильтр чат, быстро/парти делеат чат.
  183. // @description:ay Chat, Filtrar Chat, Fast/Batch Chat chat.
  184. // @description:az Axtarış sohbeti, filtr chat, sürətli / toplu silmək söhbət.
  185. // @description:ba Эҙләү чат, фильтр чат, тиҙ/партия юйыу чат.
  186. // @description:be Шукайце чат, фільтр -чат, хуткі/партыйны выдаленне чата.
  187. // @description:bg Чат за търсене, чат за филтриране, бърз/партиден изтриване чат.
  188. // @description:bh खोज चैट, फिल्टर चैट, फास्ट/बैच हटाईं चैट।
  189. // @description:bm Search chat, filter chat, teliya/batch delete chat.
  190. // @description:bn চ্যাট অনুসন্ধান করুন, ফিল্টার চ্যাট, দ্রুত/ব্যাচ মুছুন চ্যাট।
  191. // @description:bo འཚོལ་ཞིབ་ཁ་བརྡ་དང་། ཚགས་རླུང་ཁ་བརྡ། མགྱོགས་པོ། བསུབ་པའི་ཁ་བརྡ།
  192. // @description:br Klask flapañ, flapañ silañ, flapañ buan/batch dilemel.
  193. // @description:bs Pretražite chat, filter chat, brza / serija Delete Chat.
  194. // @description:ca Cerqueu xat, xat de filtres, xat de suprimir ràpid/lot.
  195. // @description:ce Лехамаш чат, фильтр чат, сиха/батч делете чат.
  196. // @description:ceb Pagpangita Chat, Filter Chat, Fast / Batch Delete Chat.
  197. // @description:ch Manma’å’ñao i chat, ya filter, båba/batch.
  198. // @description:ckb گەڕان بەدوای چات، چاتی فلتەر، خێرا/وەجبەیی بسڕەوە چات.
  199. // @description:co A ricerca di u chat, filtru chat, veloce / batch eliminate u chat.
  200. // @description:cs Hledejte chat, chat filtru, rychlý/dávkový chat.
  201. // @description:cv Шырав чат, фильтр чат, хăвăрт/пайчĕн делете чат.
  202. // @description:cy Chwilio sgwrs, sgwrs hidlo, sgwrsio cyflym/swp Dileu sgwrs.
  203. // @description:da Søgchat, filterchat, hurtig/batch slet chat.
  204. // @description:de Suchen Sie Chat, Filter -Chat, Schnell/Stapel -Chat löschen.
  205. // @description:dv ޗެޓް، ފިލްޓަރ ޗެޓް، ފަސްޓް/ބެޗް ޑިލީޓް ޗެޓް.
  206. // @description:dz འཚོལ་ཞིབ་ཁ་སླབ་ ཚགས་མ་ཁ་སླབ་ མགྱོགས་དྲགས་/བེཆ་ བཏོན་གཏང་བའི་ཁ་སླབ་།
  207. // @description:ee Search chat, filter chat, fast/batch delete chat.
  208. // @description:el Αναζήτηση συνομιλίας, συνομιλία φίλτρου, συνομιλία γρήγορης/παρτίδας.
  209. // @description:en Search chat, filter chat, fast/batch delete chat.
  210. // @description:en-GB Search chat, filter chat, fast/batch delete chat.
  211. // @description:eo Serĉu babilejon, filtran babilejon, Rapida/Batch Forigi Babilejon.
  212. // @description:es Buscar chat, filtrar chat, fast/lotes eliminar chat.
  213. // @description:es-419 Buscar chat, filtrar chat, fast/lotes eliminar chat.
  214. // @description:et Otsige vestlust, filtreerige vestlus, kiire/partii kustuta vestlus.
  215. // @description:eu Bilatu txat, iragazi txat, azkarra / sorta berriketan.
  216. // @description:fa چت را جستجو کنید ، گپ فیلتر ، چت سریع/دسته ای را حذف کنید.
  217. // @description:ff Yiylo yeewtere, yeewtere filtirde, yeewtere momtunde yaawnde/batch.
  218. // @description:fi Hakukeskustelu, suodatin chat, nopea/eräpoisto chat.
  219. // @description:fil Paghahanap chat, filter chat, mabilis/batch tanggalin ang chat.
  220. // @description:fj Vakasaqarai veisau, totolo, totolo/bati deleti.
  221. // @description:fo Leita kjatt, filtur prát, fast/bólkur strika kjak.
  222. // @description:fr Chat de recherche, chat filtre, chat de suppression rapide / lot.
  223. // @description:fr-CA Chat de recherche, chat filtre, chat de suppression rapide / lot.
  224. // @description:fy Sykje Chat, Filter Chat, Fast / Batch / Batch wiskje Chat.
  225. // @description:ga Cuardaigh comhrá, comhrá scagaire, tapa/baisc scrios comhrá.
  226. // @description:gd Rannsaich cat, bruidheach cabadaich, luath / baidse Cuir às do chat.
  227. // @description:gl Buscar chat, chat de filtro, chat de eliminación rápida/lote.
  228. // @description:gn Eheka chat, filtro chat, pya’e/batch Embogue chat.
  229. // @description:gsw-berne Search chat, filter chat, fast/batch delete chat.
  230. // @description:gu ચેટ, ફિલ્ટર ચેટ, ફાસ્ટ/બેચ કા delete ી નાખો ચેટ.
  231. // @description:gv Ct chat, filter chat, s’fast/batch chat.
  232. // @description:ha Tattaunawa, tace taɗi, Fast / Batch Share Chat.
  233. // @description:he חיפוש בצ’אט, סנן צ’אט, מהיר/אצווה מחק צ’אט.
  234. // @description:hi खोज चैट, फ़िल्टर चैट, फास्ट/बैच डिलीट चैट।
  235. // @description:hmn Tshawb Tham, Lim Sib Tham, ceev / Batch Delete kev sib tham.
  236. // @description:hr Pretražite chat, filter chat, brz/batch brisanje chata.
  237. // @description:ht Search chat, filtre chat, vit/pakèt efase chat.
  238. // @description:hu Keressen csevegést, szűrő csevegést, gyors/tétel törlés csevegést.
  239. // @description:hy Որոնում Զրուցարան, Զրուցարան, Fast / Batch Delete նջել Զրուցարան.
  240. // @description:id Cari Obrolan, Obrolan Filter, Obrolan Hapus Batch/Batch.
  241. // @description:ig Nchọta nkata, Nyocha Nkata, ngwa ngwa / bch Hichapụ nkata.
  242. // @description:is Leitaðu að spjalli, síu spjalli, hratt/lotu Eyða spjalli.
  243. // @description:it Cerca chat, chat filtrante, elimina veloce/batch.
  244. // @description:iu ᕿᓂᕐᓗᑎᑦ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ, ᓴᓗᒻᒪᖅᓴᐃᔾᔪᑎᒥᒃ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ, ᓱᒃᑲᔪᒥᒃ/ᑲᑎᙵᔪᒥᒃ ᐲᖅᓯᓗᑎᑦ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ.
  245. // @description:ja チャット、フィルターチャット、高速/バッチ削除チャットを検索します。
  246. // @description:jv Nggoleki Goleki, ngobrol Filter, cepet / batch mbusak.
  247. // @description:ka მოძებნეთ ჩეთი, ფილტრის ჩეთი, სწრაფი/სურათების წაშლა ჩეთი.
  248. // @description:kg Sosa masolo, chat ya filtre, chat ya nswalu/ya batch.
  249. // @description:kk Чат, чат, Сүзгі, жылдам / буманы іздеу Чатты жою.
  250. // @description:kl Ujaasineq, filter-chat, sukkasuumik/batch-imik delete-mik chat-imik ujarlerneq.
  251. // @description:km ស្វែងរកការស្វែងរកតម្រងជជែកកំសាន្តរហ័ស / បាច់ជជែកជជែកជជែកកំសាន្ត។
  252. // @description:kn ಚಾಟ್ ಹುಡುಕಿ, ಫಿಲ್ಟರ್ ಚಾಟ್, ಫಾಸ್ಟ್/ಬ್ಯಾಚ್ ಅಳಿಸು ಚಾಟ್.
  253. // @description:ko 검색 채팅, 필터 채팅, 빠른/배치 삭제 채팅.
  254. // @description:kr Zande kulashiye, zande filterbe, duwaro/batch delete.
  255. // @description:ku Chat lêgerîn, chat filter, Fast / Batch Chat.
  256. // @description:kv Корсьны чат, фильтр чат, пост/партия удалить чат.
  257. // @description:ky Чат издөө, чыпкалоочу чат, тез / партиялык чат.
  258. // @description:la Search Chat, filter Chat, Fast / Batch Delete Chat.
  259. // @description:lb Sich Chat, Filter Chat, Fast / Batch läschen Chat.
  260. // @description:lg Noonya emboozi, sengejja emboozi, okusangula okusazaamu mu bwangu/okusangula.
  261. // @description:ln Boluka chat, filtrer chat, Fast/batch effacer chat.
  262. // @description:lo ຄົ້ນຫາສົນທະນາ, ການສົນທະນາການກັ່ນຕອງ, Delete Fast / Batch Delete Chat.
  263. // @description:lt Paieškos pokalbis, filtrų pokalbis, greitas/partijos ištrynimo pokalbis.
  264. // @description:lv Meklējiet tērzēšanu, filtru tērzēšanu, ātru/partijas dzēšanas tērzēšanu.
  265. // @description:mg Fikarohana Chat, Filter Chat, Fast / Batch Delete Chat.
  266. // @description:mh Chat in pukōt, kōnono in filter, kōnono eo em̧ōkaj an m̧ōkaj.
  267. // @description:mi Rapua te korero, tātari, tere / tere te korero korero korero.
  268. // @description:mk Разговор за пребарување, разговор за филтрирање, брз/разделување на серија.
  269. // @description:ml തിരയൽ, ചാറ്റ് ഫിൽട്ടർ ചെയ്യുക, വേഗത്തിൽ / ബാച്ച് ഇല്ലാതാക്കുക ചാറ്റ് ചെയ്യുക.
  270. // @description:mn Чат, шүүлтүүр чат, хурдан / багц устгах чатыг устгах.
  271. // @description:mo Chat de căutare, chat de filtrare, chat de ștergere rapidă/lot.
  272. // @description:mr चॅट, फिल्टर चॅट, वेगवान/बॅच चॅट हटवा.
  273. // @description:ms CHAT Chat, sembang penapis, cepat/batch padam sembang.
  274. // @description:mt Fittex chat, chat tal-filtru, fast / lott tħassar chat.
  275. // @description:my Search Chat, Filter Chat, Filter Chat, Fast / Batch Delete Chat ။
  276. // @description:nb Søk chat, filter chat, rask/batch slett chat.
  277. // @description:ne खोजी च्याट, फिल्टर च्याट, द्रुत / ब्याच च्याट लगाउनुहोस्।
  278. // @description:nl Zoek chat, filterchat, snel/batch verwijderen chat.
  279. // @description:nr I-in ts, iso, i-orss, i-or.
  280. // @description:ny Kusaka macheza, zosefera, mwachangu / batch chochotsa macheza.
  281. // @description:oc Cerca chat, filtre chat, chat de supression rapida/lots.
  282. // @description:om Chaat barbaadi, filter chat, fast/batch delete chat.
  283. // @description:or ଚାଟ୍, ଫିଲ୍ଟର ଚାଟ୍, ଫାଷ୍ଟ / ବ୍ୟାଚ୍ ଡିଲିଟ୍ ଚାଟ୍ ଡିଲିଟ୍ କରନ୍ତୁ |
  284. // @description:os Агурæн чат, фильтр чат, тагъд/партион удалить чат.
  285. // @description:pa ਖੋਜ ਚੈਟ, ਫਿਲਟਰ ਚੈਟ, ਤੇਜ਼ / ਬੈਚ ਮਿਟਾਓ ਗੱਲਬਾਤ.
  286. // @description:pl Wyszukaj czat, czat filtrujący, szybki/partii usuń czat.
  287. // @description:ps د چیټ چیټ، فلټر چیټ، ګړندي / بیچ حذف کول.
  288. // @description:pt Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
  289. // @description:pt-BR Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
  290. // @description:pt-PT Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
  291. // @description:qu Buscar chat, filtro chat, rápido/lote borrar chat.
  292. // @description:rn Rondera ibiganiro, ucungure, wihute/ushireho ubutumwa.
  293. // @description:ro Chat de căutare, chat de filtrare, chat de ștergere rapidă/lot.
  294. // @description:ru Поиск чата, фильтр чат, быстрый/партия удалить чат.
  295. // @description:rw Shakisha Ikiganiro, Guyunguruzi Ikiganiro, Byihuta / Bitch Gusiba Ikiganiro.
  296. // @description:sa सर्च गपशप, फ़िल्टर चैट, फास्ट/बैच विलोप करें गपशप।
  297. // @description:sd ڳولا چيٽ، فلٽر چيٽ، فاسٽ / بيچ خارج ڪريو چيٽ.
  298. // @description:se Ohcat chat, filterchat, fast/batch slette chat.
  299. // @description:sg Recherche chat, filtre chat, fast/batch chat.
  300. // @description:sh Тражи Цхат, Филтер Цхат, Фаст / Батцх Делете Цхат.
  301. // @description:si සෙවුම් චැට්, පෙරහන් චැට්, වේගවත් / කණ්ඩායම මකන්න කතාබස්.
  302. // @description:sk Vyhľadajte chat, chat filtra, rýchly/dávkový odstránený chat.
  303. // @description:sl Poiščite klepet, filtrirajte klepet, hitri/serija brisanje klepeta.
  304. // @description:sm Saili talatalanoaga, faʻamama talanoaga, vave / botch tape le talatalanoaga.
  305. // @description:sn Tsvaga Chat, Firita Chat, Fast / Batch Delete Chat.
  306. // @description:so Raadinta Wadahadalka, Xirfadlaha Fund, Soonka / Dufcaddii tirtir sheekada.
  307. // @description:sq Biseda në kërkim, biseda filtri, Fast/Batch Fshi bisedën.
  308. // @description:sr Тражи Цхат, Филтер Цхат, Фаст / Батцх Делете Цхат.
  309. // @description:ss Sesha ingcoco, chat yekuhlunga, kushesha/ batch desice chat.
  310. // @description:st Batla Chat, Chatter Chat, Faces / Batch Delet Chat.
  311. // @description:su Milarian chat, nyaring panipuan, gancang / tumpak cup.
  312. // @description:sv Sökchatt, filterchatt, snabb/batch radera chatt.
  313. // @description:sw Tafuta gumzo, gumzo la kichujio, mazungumzo ya haraka/batch.
  314. // @description:ta தேடு அரட்டை, வடிகட்டி அரட்டை, வேகமான/தொகுதி நீக்கு அரட்டை.
  315. // @description:te శోధన చాట్, ఫిల్టర్ చాట్, ఫాస్ట్/బ్యాచ్ తొలగించు చాట్.
  316. // @description:tg Чат, филтри филтр, чат зуд / Bitche нест кунед.
  317. // @description:th ค้นหาแชทตัวกรองแชท Fast/Batch ลบแชท
  318. // @description:ti ዕላል፡ ፍልተር ቻት፡ ቅልጡፍ/ባች ምድምሳስ ቻት ድለ።
  319. // @description:tk Söhbet söhbetdeşligi, süzgüç söhbet, çalt / partiýa söhbetdeşligi pozuň.
  320. // @description:tl Paghahanap chat, filter chat, mabilis/batch tanggalin ang chat.
  321. // @description:tn Batla motlotlo, sefa puisano, ka potlako / batch hlakola puisano.
  322. // @description:to Fekumi ki he talanoa, talanoa filter, talanoa delete vave/batch.
  323. // @description:tr Sohbet, filtre sohbeti, hızlı/toplu Sil sohbet arayın.
  324. // @description:ts Ku lavisisa chat, filter chat, ku hatlisa/ku batch Susa chat.
  325. // @description:tt Чат, фильтр чат, тиз / партия чатны бетерегез.
  326. // @description:tw Hwehwɛ nkɔmmɔbɔ, filter nkɔmmɔbɔ, fast/batch Popa nkɔmmɔbɔ.
  327. // @description:ty A imi i te chat, te chat, te chat vitiviti/batch.
  328. // @description:ug ئىزدەش پاراڭ, سۈزگۈچ پاراڭ, تېز / تۈركۈملەش پاراڭ.
  329. // @description:uk Шукайте чат, чат фільтр, швидкий/пакетний вилучення чату.
  330. // @description:ur سرچ چیٹ ، فلٹر چیٹ ، فاسٹ/بیچ کو حذف کریں چیٹ۔
  331. // @description:uz Chatni qidirish, Filtr chat, tez / partiya chatni o’chirib tashlang.
  332. // @description:ve U ṱoḓa nyambedzano, nyambedzano ya u sefa, nyambedzano ya u ṱavhanya/batch ya u phumula.
  333. // @description:vi Chat tìm kiếm, trò chuyện lọc, trò chuyện xóa nhanh/hàng loạt.
  334. // @description:wo Seetlu chat, segg, chat de filtre, gaaw/batch chat.
  335. // @description:xh Incoko yokukhangela, incoko yecebo lokucoca, ngokukhawuleza / ibhetch cima incoko.
  336. // @description:yi זוכן טשאַט, פילטער שמועסן, שנעל / פּעקל ויסמעקן שמועסן.
  337. // @description:yo Wiwọle Wiwa, Iyipada àlẹmọ, Yara / Itọsọna Paare Paare Ret.
  338. // @description:zh 搜索聊天、过滤聊天、快速/批量删除聊天。
  339. // @description:zh-CN 搜索聊天、过滤聊天、快速/批量删除聊天。
  340. // @description:zh-HK 搜索聊天、過濾聊天、快速/批量刪除聊天。
  341. // @description:zh-MO 搜索聊天、過濾聊天、快速/批量刪除聊天。
  342. // @description:zh-MY 搜索聊天、过滤聊天、快速/批量删除聊天。
  343. // @description:zh-SG 搜索聊天、过滤聊天、快速/批量删除聊天。
  344. // @description:zh-TW 搜索聊天、過濾聊天、快速/批量刪除聊天。
  345. // @description:zu Ukucinga Chat, Chat Chat Chat, Fast / Batch Delete Chat.
  346. // @author mysy00
  347. // @namespace https://github.com/mysy00/userscripts
  348. // @supportURL https://github.com/mysy00/userscripts/issues
  349. // @homepageURL https://github.com/mysy00/userscripts
  350. // @homepage https://github.com/mysy00/userscripts
  351. // @license MIT
  352. // @match https://chatgpt.com/*
  353. // @icon https://raw.githubusercontent.com/ChinaGodMan/UserScriptsHistory/main/scriptsIcon/chatgpt-plus.png
  354. // @compatible chrome
  355. // @compatible firefox
  356. // @compatible edge
  357. // @compatible opera
  358. // @compatible safari
  359. // @compatible kiwi
  360. // @compatible qq
  361. // @compatible via
  362. // @compatible brave
  363. // @version 2025.6.3.1
  364. // @created 2025-06-03 11:26:11
  365. // ==/UserScript==
  366.  
  367. /**
  368. * File: chatgpt-easy-management.user.js
  369. * Project: UserScripts
  370. * File Created: 2025/06/03,Tuesday 11:26:11
  371. * Author: mysy00
  372. * -----
  373. * Last Modified: 2025/06/03,Tuesday 11:34:19
  374. * Modified By: 人民的勤务员@ChinaGodMan (china.qinwuyuan@gmail.com)
  375. * -----
  376. * License: MIT License
  377. * Copyright © 2024 - 2025 ChinaGodMan,Inc
  378. */
  379.  
  380. (function () {
  381. 'use strict'
  382.  
  383. const API = 'https://chatgpt.com/backend-api'
  384. const MAX_MSG_LEN = 100
  385. const RETRIES = 3
  386. const RETRY_DELAY = 300
  387. const PAGE_SIZE = 50
  388.  
  389. const wait = ms => new Promise(r => setTimeout(r, ms))
  390. const fmt = ts => {
  391. const d = new Date(ts * 1000)
  392. const date = d.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })
  393. const time = d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })
  394. return `${date} ${time}`
  395. }
  396. const trimStr = s =>
  397. typeof s === 'string' && s.length > MAX_MSG_LEN ? s.slice(0, MAX_MSG_LEN) + '…' : s
  398. const extractText = part => {
  399. // If it’s a plain string, return it
  400. if (typeof part === 'string') {
  401. return part
  402. }
  403. // If it’s an object with an explicit type
  404. if (part && typeof part === 'object') {
  405. // ChatGPT image attachments often come as { type: 'image_url', url: '…' }
  406. if (part.content_type === 'image_asset_pointer') {
  407. return '🖼️'
  408. }
  409. // Some variants may include a url/src field even without type
  410. if (part.url || part.src) {
  411. return '[image]'
  412. }
  413. }
  414. // Otherwise we don’t know how to render it
  415. return '[unknown]'
  416. }
  417.  
  418. async function getToken() {
  419. const res = await fetch('https://chatgpt.com/api/auth/session', { credentials: 'include' })
  420. const j = await res.json()
  421. if (!j.accessToken) throw new Error('No auth token')
  422. return j.accessToken
  423. }
  424.  
  425. async function fetchPage(offset = 0, limit = PAGE_SIZE) {
  426. const t = await getToken()
  427. const res = await fetch(`${API}/conversations?offset=${offset}&limit=${limit}`, {
  428. headers: { Authorization: `Bearer ${t}` }
  429. })
  430. if (!res.ok) throw new Error(`Summaries fetch failed ${res.status}`)
  431. return res.json()
  432. }
  433.  
  434. async function fetchDetailsWithRetry(id) {
  435. for (let i = 0; i < RETRIES; i++) {
  436. try {
  437. const t = await getToken()
  438. const res = await fetch(`${API}/conversation/${id}`, {
  439. headers: { Authorization: `Bearer ${t}` }
  440. })
  441. if (!res.ok) throw new Error()
  442. return await res.json()
  443. } catch {
  444. await wait(RETRY_DELAY)
  445. }
  446. }
  447. throw new Error(`Failed to load details for ${id}`)
  448. }
  449.  
  450. async function deleteChat(id) {
  451. const t = await getToken()
  452. const res = await fetch(`${API}/conversation/${id}`, {
  453. method: 'PATCH',
  454. headers: {
  455. Authorization: `Bearer ${t}`,
  456. 'Content-Type': 'application/json'
  457. },
  458. body: JSON.stringify({ is_visible: false })
  459. })
  460. if (!res.ok) throw new Error(`Delete failed ${res.status}`)
  461. await wait(200)
  462. }
  463.  
  464. function injectStyles() {
  465. if (document.getElementById('bd-styles')) return
  466. const st = document.createElement('style')
  467. st.id = 'bd-styles'
  468. st.textContent = `
  469. /* Overlay & modal shell */
  470. #bd-overlay { background: rgba(0,0,0,0.5) !important; }
  471. #bd-overlay.hidden { display: none !important; }
  472. #bd-modal {
  473. background: var(--sidebar-surface-primary);
  474. color: var(--token-text-primary);
  475. border-radius: 16px;
  476. box-shadow: 0 20px 60px rgba(0,0,0,0.45);
  477. display: flex; flex-direction: column;
  478. max-width: 800px; width: 90%; max-height: 85vh; overflow: hidden;
  479. transform: translateY(20px); opacity: 0;
  480. animation: fadeInUp 0.3s ease-out forwards;
  481. font-family: inherit;
  482. }
  483. @keyframes fadeInUp { to { transform: translateY(0); opacity: 1; } }
  484. /* Header */
  485. #bd-modal > .header {
  486. background: var(--sidebar-surface-tertiary);
  487. padding: 16px 24px;
  488. display: flex; align-items: center;
  489. border-bottom: 1px solid var(--border-light);
  490. gap: 12px;
  491. }
  492. #bd-modal .header h2 { margin: 0; flex: 1; font-size: 18px; }
  493. #bd-modal .header button {
  494. background: var(--sidebar-surface-secondary);
  495. color: var(--token-text-primary);
  496. border: none; border-radius: 6px;
  497. font-size: 14px; font-weight: 500;
  498. padding: 6px 14px; cursor: pointer;
  499. }
  500. #bd-modal .header button:hover { background: var(--sidebar-surface-hover); }
  501. #bd-modal .header input[type="number"] {
  502. width: 60px; padding: 6px 8px; margin-left: 8px;
  503. border: 1px solid var(--border-light);
  504. border-radius: 6px;
  505. background: var(--sidebar-surface-secondary);
  506. color: var(--token-text-primary);
  507. }
  508. /* Status */
  509. #bd-status {
  510. padding: 8px 24px; font-size: 14px; color: var(--token-text-secondary);
  511. }
  512. /* Chat rows */
  513. #bd-modal .chat-row {
  514. padding: 16px 20px; border-bottom: 1px solid var(--border-light);
  515. display: flex; flex-direction: column; gap: 6px;
  516. }
  517. #bd-modal .chat-row:hover { background: var(--menu-item-active); }
  518. #bd-modal .chat-row.selected { background: var(--interactive-bg-secondary-press) !important; }
  519. .chat-row .top { display: flex; align-items: center; }
  520. .chat-row .title { margin-left: 8px; font-weight: 600; font-size: 15px; }
  521. .chat-row .meta { font-size: 13px; }
  522. .chat-row .msg { font-size: 14px; line-height: 1.4; word-break: break-word; }
  523. /* Footer */
  524. #bd-modal > .footer {
  525. background: var(--sidebar-surface-tertiary);
  526. padding: 16px 24px;
  527. display: flex; align-items: center;
  528. border-top: 1px solid var(--border-light);
  529. justify-content: flex-end; gap: 12px;
  530. }
  531. #bd-modal .footer button {
  532. background: var(--sidebar-surface-secondary);
  533. color: var(--token-text-primary);
  534. border: none; border-radius: 6px;
  535. font-size: 14px; font-weight: 500;
  536. padding: 6px 14px; cursor: pointer;
  537. }
  538. #bd-modal .footer button:first-child {
  539. background: var(--sidebar-surface-tertiary);
  540. border: 1px solid var(--border-light);
  541. }
  542. #bd-modal .footer button:last-child {
  543. background: var(--danger-action);
  544. color: var(--button-text);
  545. }
  546. #bd-modal .footer button:hover { background: var(--sidebar-surface-hover); }
  547. `
  548. document.head.appendChild(st)
  549. }
  550.  
  551. function renderChatCard(convo, updateCount) {
  552. const row = document.createElement('div')
  553. row.className = 'chat-row'
  554. row.dataset.id = convo.id
  555.  
  556. const top = document.createElement('div'); top.className = 'top'
  557. const cb = document.createElement('input'); cb.type = 'checkbox'; cb.dataset.id = convo.id
  558. const tit = document.createElement('div'); tit.className = 'title'; tit.textContent = convo.title || '(no title)'
  559. top.append(cb, tit)
  560. row.append(top)
  561.  
  562. const meta = document.createElement('div'); meta.className = 'meta'; row.append(meta)
  563. const m1 = document.createElement('div'); m1.className = 'msg'; row.append(m1)
  564. const m2 = document.createElement('div'); m2.className = 'msg'; row.append(m2)
  565.  
  566. function updateSelection() {
  567. row.classList.toggle('selected', cb.checked)
  568. updateCount()
  569. }
  570.  
  571. row.addEventListener('click', e => {
  572. if (e.target.tagName !== 'INPUT') cb.checked = !cb.checked
  573. updateSelection()
  574. })
  575. cb.addEventListener('change', e => { updateSelection(); e.stopPropagation() })
  576.  
  577. row.update = ({ create_time, update_time, first, last }) => {
  578. row.dataset.updateTs = update_time
  579. meta.innerHTML = `<strong>Created:</strong> ${fmt(create_time)} — <strong>Updated:</strong> ${fmt(update_time)}`
  580. m1.innerHTML = `<strong>First:</strong> ${first}`
  581. m2.innerHTML = `<strong>Last:</strong> ${last}`
  582. }
  583.  
  584. return row
  585. }
  586.  
  587. function openModal() {
  588. // If there's already an overlay, remove it entirely so state resets
  589. const existing = document.getElementById('bd-overlay')
  590. if (existing) existing.remove()
  591.  
  592. injectStyles()
  593.  
  594. const overlay = document.createElement('div')
  595. overlay.id = 'bd-overlay'
  596. Object.assign(overlay.style, { position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 9999 })
  597.  
  598. function hideAndRemove() { overlay.remove() }
  599.  
  600. overlay.addEventListener('click', e => { if (e.target === overlay) hideAndRemove() })
  601. window.addEventListener('keydown', function esc(e) { if (e.key === 'Escape') { hideAndRemove(); window.removeEventListener('keydown', esc) } })
  602.  
  603. const modal = document.createElement('div'); modal.id = 'bd-modal'
  604. const statusEl = document.createElement('div'); statusEl.id = 'bd-status'
  605. const list = document.createElement('div'); Object.assign(list.style, { flex: '1 1 auto', overflowY: 'auto' })
  606.  
  607. // Header
  608. const header = document.createElement('div'); header.className = 'header'
  609. const h2 = document.createElement('h2'); h2.textContent = 'Bulk Delete Chats'
  610. const sortBtn = document.createElement('button'); sortBtn.textContent = 'Sort by Updated'
  611. const ageInput = document.createElement('input'); ageInput.type = 'number'; ageInput.min = '0'; ageInput.placeholder = 'Days'
  612. const listOldBtn = document.createElement('button'); listOldBtn.textContent = 'List older'
  613. const refreshBtn = document.createElement('button'); refreshBtn.textContent = 'Reload'
  614. const closeBtn = document.createElement('button'); closeBtn.textContent = '✕'
  615. header.append(h2, sortBtn, ageInput, listOldBtn, refreshBtn, closeBtn)
  616.  
  617. // Footer
  618. const footer = document.createElement('div'); footer.className = 'footer'
  619. const cancelBtn = document.createElement('button'); cancelBtn.textContent = 'Cancel'
  620. const delBtn = document.createElement('button'); delBtn.textContent = 'Delete Selected'
  621. footer.append(cancelBtn, delBtn)
  622.  
  623. modal.append(header, statusEl, list, footer)
  624. overlay.append(modal)
  625. document.body.append(overlay)
  626.  
  627. let totalChats = 0, offset = 0, loadingMore = false
  628. const rows = []
  629.  
  630. function updateCount() {
  631. const shown = rows.length
  632. const sel = list.querySelectorAll('input:checked').length
  633. statusEl.textContent = `Showing ${shown} of ${totalChats} chats ${sel} selected`
  634. }
  635.  
  636. const obs = new IntersectionObserver((ents) => {
  637. ents.forEach(ent => {
  638. if (!ent.isIntersecting) return
  639. obs.unobserve(ent.target)
  640. fetchDetailsWithRetry(ent.target.dataset.id)
  641. .then(dt => {
  642. const userMsgs = Object.values(dt.mapping || {})
  643. .filter(n => n.message?.author?.role === 'user')
  644. .map(n => extractText(n.message?.content?.parts?.[0]))
  645. let first = trimStr(userMsgs[0] || '—')
  646. let last = trimStr(userMsgs.at(-1) || '—')
  647. if (first === last) {
  648. const asst = Object.values(dt.mapping || {})
  649. .filter(n => n.message?.author?.role === 'assistant')
  650. if (asst.length) {
  651. last = 'Chat: ' + trimStr(extractText(asst.at(-1).message.content.parts?.[0] || ''))
  652. }
  653. }
  654. ent.target.update({ create_time: dt.create_time, update_time: dt.update_time, first, last })
  655. })
  656. .catch(() => ent.target.update({ create_time: 0, update_time: 0, first: '✖️', last: '✖️' }))
  657. })
  658. }, { root: list, threshold: 0.1 })
  659.  
  660. async function loadChats() {
  661. list.innerHTML = ''
  662. rows.length = 0
  663. offset = 0
  664. const page = await fetchPage(0, PAGE_SIZE)
  665. totalChats = page.total ?? page.total_count ?? page.pagination?.total_count ?? page.pagination?.total ?? page.items.length
  666. page.items.forEach(c => {
  667. const row = renderChatCard(c, updateCount)
  668. list.append(row)
  669. rows.push(row)
  670. })
  671. offset = page.items.length
  672. updateCount()
  673. rows.forEach(r => obs.observe(r))
  674. }
  675.  
  676. // initial load
  677. loadChats().catch(() => statusEl.textContent = 'Failed to load chats.')
  678.  
  679. // Refresh handler
  680. refreshBtn.addEventListener('click', async () => {
  681. statusEl.textContent = 'Reloading…'
  682. obs.disconnect()
  683. try {
  684. await loadChats()
  685. statusEl.textContent = 'Reloaded.'
  686. } catch (err) {
  687. statusEl.textContent = 'Reload failed.'
  688. console.error(err)
  689. }
  690. })
  691.  
  692. // Infinite scroll
  693. list.addEventListener('scroll', async () => {
  694. if (loadingMore) return
  695. if (offset < totalChats && list.scrollTop + list.clientHeight >= list.scrollHeight - 50) {
  696. loadingMore = true
  697. const page = await fetchPage(offset, PAGE_SIZE)
  698. page.items.forEach(c => {
  699. const row = renderChatCard(c, updateCount)
  700. list.append(row)
  701. rows.push(row)
  702. obs.observe(row)
  703. })
  704. offset += page.items.length
  705. updateCount()
  706. loadingMore = false
  707. }
  708. })
  709.  
  710. // Sort
  711. sortBtn.addEventListener('click', () => {
  712. rows
  713. .sort((a, b) => Number(b.dataset.updateTs) - Number(a.dataset.updateTs))
  714. .forEach(r => list.append(r))
  715. updateCount()
  716. })
  717.  
  718. // Filter older
  719. listOldBtn.addEventListener('click', () => {
  720. const days = parseInt(ageInput.value, 10)
  721. if (isNaN(days) || days < 0) {
  722. statusEl.textContent = 'Enter a valid number of days'
  723. return
  724. }
  725. const threshold = Math.floor(Date.now() / 1000) - days * 86400
  726. statusEl.textContent = `Filtering chats older than ${days} days…`
  727. obs.disconnect()
  728. const filtered = rows.filter(r => Number(r.dataset.updateTs) < threshold)
  729. list.innerHTML = ''
  730. filtered.forEach(r => { r.querySelector('input').checked = true; r.classList.add('selected'); list.append(r); obs.observe(r) })
  731. updateCount()
  732. })
  733.  
  734. // Cancel & close
  735. cancelBtn.addEventListener('click', hideAndRemove)
  736. closeBtn.addEventListener('click', hideAndRemove)
  737.  
  738. // Delete flow
  739. delBtn.addEventListener('click', () => {
  740. const selected = [...list.querySelectorAll('.chat-row.selected')]
  741. if (!selected.length) {
  742. statusEl.textContent = 'No chats selected.'
  743. return
  744. }
  745.  
  746. const confirmPane = document.createElement('div')
  747. confirmPane.id = 'bd-confirm-pane'
  748. confirmPane.style = 'flex:1 1 auto;overflow-y:auto;padding:16px'
  749.  
  750. const info = document.createElement('div')
  751. info.textContent = `Confirm deletion of ${selected.length} chat(s). Uncheck any youd like to keep:`
  752. info.style = 'margin-bottom:12px;font-weight:500'
  753. confirmPane.appendChild(info)
  754.  
  755. selected.forEach((row, idx) => {
  756. const id = row.dataset.id
  757. const title = row.querySelector('.title').textContent
  758. const label = document.createElement('label')
  759. label.style = 'display:flex;align-items:center;margin-bottom:8px'
  760. const cb = document.createElement('input')
  761. cb.type = 'checkbox'; cb.checked = true; cb.dataset.id = id; cb.style = 'margin-right:8px'
  762. label.append(cb, document.createTextNode(`${idx + 1}. ${title}`))
  763. confirmPane.appendChild(label)
  764. })
  765.  
  766. footer.innerHTML = ''
  767. const backBtn = document.createElement('button'); backBtn.textContent = 'Back'
  768. const confirmBtn = document.createElement('button')
  769. confirmBtn.textContent = 'Confirm Delete'
  770. confirmBtn.style = 'background:var(--danger-action);color:var(--button-text)'
  771. footer.append(backBtn, confirmBtn)
  772.  
  773. list.replaceWith(confirmPane)
  774.  
  775. backBtn.addEventListener('click', () => {
  776. confirmPane.replaceWith(list)
  777. footer.innerHTML = ''
  778. footer.append(cancelBtn, delBtn)
  779. updateCount()
  780. })
  781.  
  782. confirmBtn.addEventListener('click', async () => {
  783. const toDelete = [...confirmPane.querySelectorAll('input:checked')]
  784. if (!toDelete.length) {
  785. statusEl.textContent = 'Nothing to delete.'
  786. return
  787. }
  788. let done = 0, failed = 0
  789. for (const cb of toDelete) {
  790. done++
  791. statusEl.textContent = `Deleting (${done}/${toDelete.length})…`
  792. try { await deleteChat(cb.dataset.id) } catch { failed++ }
  793. }
  794. statusEl.textContent = `Deleted ${toDelete.length - failed}, ${failed} failed.`
  795. // close & remove after a short pause
  796. setTimeout(hideAndRemove, 1000)
  797. })
  798. })
  799. }
  800.  
  801. // Inject main icon & quick-delete buttons
  802. function injectIcon() {
  803. const target = document.querySelector('#sidebar-header')
  804. if (!target || target.querySelector('[data-bulk-delete]')) return
  805.  
  806. const link = document.createElement('a')
  807. link.className = document.querySelectorAll('#sidebar-header > a')[0].className
  808. link.dataset.bulkDelete = 'true'; link.href = '#'
  809. link.setAttribute('aria-label', 'Bulk Delete Chats')
  810. link.setAttribute('role', 'button')
  811. link.innerHTML = `
  812. <svg width="24" height="24" fill="currentColor">
  813. <path d="M9 3v1H4v2h16V4h-5V3H9zm-1 5v12h2V8H8zm4 0v12h2V8h-2z"/>
  814. </svg>`
  815. link.addEventListener('click', e => { e.preventDefault(); openModal() })
  816. target.append(link)
  817. }
  818.  
  819. function injectQuickDeleteButtons() {
  820. document.querySelectorAll('a[data-discover][href^="/c/"]').forEach(link => {
  821. if (link.querySelector('.quick-delete-btn')) return
  822. const convoId = link.getAttribute('href').split('/').pop()
  823. if (!convoId) return
  824. const btn = document.createElement('button')
  825. btn.className = 'quick-delete-btn'
  826. btn.setAttribute('aria-label', 'Delete conversation')
  827. btn.style.cssText = 'margin-left:8px;background:transparent;border:none;cursor:pointer;color:var(--token-text-secondary);'
  828. btn.innerHTML = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M9 3v1H4v2h16V4h-5V3H9zm-1 5v12h2V8H8zm4 0v12h2V8h-2z" fill="currentColor"/></svg>`
  829. btn.addEventListener('click', async e => {
  830. e.preventDefault(); e.stopPropagation()
  831. try { await deleteChat(convoId); link.remove() } catch (err) { console.error('Quick delete failed', err) }
  832. })
  833. const trailing = link.querySelector('.text-token-text-tertiary');
  834. (trailing || link).appendChild(btn)
  835. })
  836. }
  837.  
  838. const observer = new MutationObserver(() => {
  839. injectIcon()
  840. injectQuickDeleteButtons()
  841. })
  842. observer.observe(document.body, { childList: true, subtree: true })
  843.  
  844. window.addEventListener('load', () => {
  845. injectIcon()
  846. injectQuickDeleteButtons()
  847. })
  848. })()

QingJ © 2025

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