-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathchatgpt-auto-continue.user.js
538 lines (503 loc) · 35.1 KB
/
chatgpt-auto-continue.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
// ==UserScript==
// @name ChatGPT Auto-Continue ⏩
// @name:af ChatGPT Auto-Aangaan ⏩
// @name:am ChatGPT Auto-ተጨባጭ ማሳያ ⏩
// @name:ar ChatGPT الاستمرار التلقائي ⏩
// @name:az ChatGPT Avtomatik Davam et ⏩
// @name:be ChatGPT Аўтаматычнае Працягванне ⏩
// @name:bg ChatGPT Автоматично Продължаване ⏩
// @name:bn ChatGPT স্বয়ংক্রিয় চালিয়ে যাওয়া ⏩
// @name:bo ChatGPT རེད་འཐུམ་བཅོས་པ། ⏩
// @name:bs ChatGPT Automatski Nastavi ⏩
// @name:ca ChatGPT Auto-Continua ⏩
// @name:ceb ChatGPT Auto-Padayon ⏩
// @name:ckb ChatGPT دهستكاری خۆکار ⏩
// @name:cs ChatGPT Automatické Pokračování ⏩
// @name:cy ChatGPT Auto-Parhau ⏩
// @name:da ChatGPT Auto-Fortsæt ⏩
// @name:de ChatGPT Automatisches Fortfahren ⏩
// @name:dv ChatGPT އައިނާދު ހިސާބަތް ⏩
// @name:dz ChatGPT རེད་འཐུམ་གཅིག་ཁྱེར། ⏩
// @name:el ChatGPT Αυτόματη Συνέχιση ⏩
// @name:eo ChatGPT Aŭtomata Daŭrigado ⏩
// @name:es ChatGPT Auto-Continuar ⏩
// @name:et ChatGPT Automaatne Jätkamine ⏩
// @name:eu ChatGPT Auto-Jarraitu ⏩
// @name:fa ChatGPT ادامه خودکار ⏩
// @name:fi ChatGPT Automaattinen Jatkaminen ⏩
// @name:fo ChatGPT Auto-Verða ⏩
// @name:fr ChatGPT Auto-Continuer ⏩
// @name:fr-CA ChatGPT Auto-Continuer ⏩
// @name:gd ChatGPT Auto-Leantainn ⏩
// @name:gl ChatGPT Auto-Continuar ⏩
// @name:gu ChatGPT સ્વચાલિત-ચાલુ રાખો ⏩
// @name:haw ChatGPT Auto-Kōkua ⏩
// @name:he ChatGPT המשך אוטומטי ⏩
// @name:hi ChatGPT स्वचालित-प्रचालित रखें ⏩
// @name:hr ChatGPT Auto-Nastavi ⏩
// @name:ht ChatGPT Otomatik Kontinye ⏩
// @name:hu ChatGPT Automatikus Folytatás ⏩
// @name:hy ChatGPT Ինքնաշխատում Շարունակումը ⏩
// @name:id ChatGPT Lanjut Otomatis ⏩
// @name:is ChatGPT Sjálfvirk Framhald ⏩
// @name:it ChatGPT Auto-Continua ⏩
// @name:ja ChatGPT 自動継続 ⏩
// @name:jv ChatGPT Lanjut Otomatis ⏩
// @name:ka ChatGPT ავტომატური გაგრძელება ⏩
// @name:kab ChatGPT Yemmeslayen Avrid n Tizwaru ⏩
// @name:kk ChatGPT Автоматты Жалғастыру ⏩
// @name:km ChatGPT បន្តទៅមកដល់ដោយស្វ័យប្រវត្តិ ⏩
// @name:kn ChatGPT ಸ್ವಯಂಚಾಲಿತ ಮುಂದುವರಿಕೆ ⏩
// @name:ko ChatGPT 자동 계속 ⏩
// @name:ku ChatGPT Berdewamkirina Auto ⏩
// @name:ky ChatGPT Автоматтык Жалгастыруу ⏩
// @name:la ChatGPT Auto-Continuare ⏩
// @name:lb ChatGPT Auto-Weiderginn ⏩
// @name:lo ChatGPT ດຽວນີ້ບໍ່ຮອດຄວາມເລີຍ ⏩
// @name:lt ChatGPT Automatinis Tęsti ⏩
// @name:lv ChatGPT Automātiska Turpināšana ⏩
// @name:mg ChatGPT Miverina Automatically ⏩
// @name:mi ChatGPT Whakareri Tūmau ⏩
// @name:mk ChatGPT Автоматско Продолжување ⏩
// @name:ml ChatGPT ഓട്ടോ-തുടരുക ⏩
// @name:mn ChatGPT Автомат Үргэлжлүүлэх ⏩
// @name:ms ChatGPT Auto-Sambung ⏩
// @name:mt ChatGPT Awto-Kontinwa ⏩
// @name:my ChatGPT အလိုအလျောက်-ဆက်လက်လုပ်ကိုင်တယ် ⏩
// @name:ne ChatGPT स्वचालित-तत्परता ⏩
// @name:nl ChatGPT Auto-Doorgaan ⏩
// @name:no ChatGPT Auto-Fortsette ⏩
// @name:ny ChatGPT Auto-Endeleza ⏩
// @name:pa ChatGPT ਸਵੈ-ਚਲੋ ⏩
// @name:pap ChatGPT Sigui Automátikamente ⏩
// @name:pl ChatGPT Automatyczne Kontynuowanie ⏩
// @name:ps ChatGPT خپلکار تسلیم ⏩
// @name:pt ChatGPT Auto-Continuar ⏩
// @name:ro ChatGPT Auto-Continuare ⏩
// @name:ru ChatGPT Авто-Продолжение ⏩
// @name:rw ChatGPT Kugerageza Auto ⏩
// @name:si ChatGPT ස්වයංක්රීය-දියවැඩියාව ⏩
// @name:sk ChatGPT Auto-Pokračovať ⏩
// @name:sl ChatGPT Samodejno Nadaljuj ⏩
// @name:sm ChatGPT Aunoa'i-Taulaga ⏩
// @name:so ChatGPT Isdhaaf Caruureed ⏩
// @name:sr ChatGPT Аутоматски Настави ⏩
// @name:sv ChatGPT Auto-Fortsätt ⏩
// @name:sw ChatGPT Kusonga Kiotomatiki ⏩
// @name:ta ChatGPT தானியங்கி தொடர்ந்து செல்லுங்கள் ⏩
// @name:te ChatGPT ఆటో-కంటిన్యూ ⏩
// @name:tg ChatGPT Давомоти автоматӣ ⏩
// @name:th ChatGPT ดำเนินการต่ออย่างอัตโนมัติ ⏩
// @name:ti ChatGPT ኣበይቲ ድሕሪ ተረኺቡ ⏩
// @name:tk ChatGPT Avtomatik Dowam etmek ⏩
// @name:to ChatGPT Tonu-'Aofa ⏩
// @name:tpi ChatGPT Otomatik Kontinyu ⏩
// @name:tr ChatGPT Otomatik Devam ⏩
// @name:uk ChatGPT Автоматичне Продовження ⏩
// @name:ur ChatGPT خودکار جاری رکھیں ⏩
// @name:uz ChatGPT Avtomatik Davom ⏩
// @name:vi ChatGPT Tự Động Tiếp Tục ⏩
// @name:xh ChatGPT Ukuphela Okuqukethweyo ⏩
// @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 Ngokugcwele Ukuphela ⏩
// @description ⚡ Automatically continue generating multiple ChatGPT responses
// @description:af ⚡ Outomaties voortgaan met die opwekking van meerdere ChatGPT-antwoorde
// @description:am ⚡ እንዴትስ እንዲደርስ ያለብሳል የተወሰነ ምርጫዎች ለChatGPT
// @description:ar ⚡ استمر في توليد استجابات متعددة لـ ChatGPT تلقائيًا
// @description:az ⚡ ChatGPT cavablarını avtomatik olaraq çoxaldmağa davam edin
// @description:be ⚡ Аўтаматычна працягвайце генерацыю некалькіх адказаў ChatGPT
// @description:bem ⚡ Tontonkanyani kupitika kuwambo wanthu wokha-wokha wa ChatGPT
// @description:bg ⚡ Продължете автоматично да генерирате множество отговори от ChatGPT
// @description:bn ⚡ ChatGPT প্রতিক্রিয়া উত্পাদন অটোমেটিকভাবে চালিয়ে যান
// @description:bo ⚡ ཡིག་ཆ་འཚོལ་ལག་སྤྱོད་རོགས་བྱུང་གནང་ནུས་པའི་ChatGPTལྕེབ་གསོར་བརྡ་འཕྲོ་ཤོག་ནང་བསྐྱོད་པ།
// @description:bs ⚡ Nastavite automatski generirati više odgovora ChatGPT-a
// @description:ca ⚡ Continua generant automàticament múltiples respostes de ChatGPT
// @description:ceb ⚡ Magpadayon sa pag-generate og daghang mga Tugbang sa ChatGPT nga Otomatik
// @description:ckb ⚡ بەردەوامبوون بە سەرجەم وەڵامەکانی ChatGPT
// @description:cs ⚡ Automaticky pokračujte v generování více odpovědí ChatGPT
// @description:cy ⚡ Parhewch i gynhyrchu nifer o ymatebion ChatGPT yn awtomatig
// @description:da ⚡ Forsæt automatisk med at generere flere ChatGPT-responser
// @description:de ⚡ Generieren Sie automatisch mehrere ChatGPT-Antworten weiterhin
// @description:dv ⚡ އައުތީ ހުންނަވާ މެއިންމު ChatGPT އަޕް ކޮންޓެއް ބަދަލުކުރުމުގެ ރަނގަޅަ
// @description:dz ⚡ འཕྲོས་མེད་པར་དུག་ཞིབ་པ་བསྐུགས་པར་ཡོད་མི་ChatGPTལྕེབ་གསོར་བརྡ་འཕྲོ་ཤོག་ནང་བསྐྱོད་པ།
// @description:el ⚡ Συνεχίστε αυτόματα να δημιουργείτε πολλαπλές απαντήσεις ChatGPT
// @description:eo ⚡ Daŭrigu aŭtomate generi plurajn respondojn ChatGPT
// @description:es ⚡ Continúa generando automáticamente múltiples respuestas de ChatGPT
// @description:et ⚡ Jätkake automaatselt mitme ChatGPT-vastuse genereerimist
// @description:eu ⚡ Jarraitu automatikoki ChatGPT erantzun anitzak sortzen
// @description:fa ⚡ ادامه تولید خودکار چندین پاسخ ChatGPT
// @description:fi ⚡ Jatka automaattisesti useiden ChatGPT-vastausten generointia
// @description:fo ⚡ Halda áfram við at framleiða fleiri ChatGPT svar
// @description:fr ⚡ Continuez automatiquement à générer plusieurs réponses ChatGPT
// @description:fr-CA ⚡ Continuez automatiquement à générer plusieurs réponses ChatGPT
// @description:gd ⚡ Lean air adhart a' gabhail air adhart na freagairtean ChatGPT le bhith a' riochdachadh nas mòr
// @description:gl ⚡ Continúa xerando automaticamente múltiples respostas de ChatGPT
// @description:gu ⚡ આપોઆપ વધતા ચાર્જો આપતી કરો ChatGPT પ્રતિભાઓ
// @description:haw ⚡ E mālama i ka hōʻoluʻolu ʻana i nā pane ʻelua a i ʻole iā ChatGPT
// @description:he ⚡ המשך ליצור באופן אוטומטי מספר תגובות ChatGPT
// @description:hi ⚡ स्वचालित रूप से बहुत सारे ChatGPT प्रतिक्रियाएँ उत्पन्न करना जारी रखें
// @description:hr ⚡ Automatski nastavite generirati više ChatGPT odgovora
// @description:ht ⚡ Kontinye otomatikman kontinye jenerasyon plizyè repons ChatGPT
// @description:hu ⚡ Folytassa automatikusan több ChatGPT-válasz generálását
// @description:hy ⚡ Շարունակեք ավտոմատ ստեղծել մեկից ավելի ChatGPT պատասխաններ
// @description:id ⚡ Lanjutkan secara otomatis menghasilkan beberapa respons ChatGPT
// @description:is ⚡ Halda áfram að framleiða fjölda ChatGPT-svara sjálfkrafa
// @description:it ⚡ Continua automaticamente a generare più risposte di ChatGPT
// @description:ja ⚡ ChatGPTの複数の応答を自動的に継続的に生成し続ける
// @description:jv ⚡ Terus ngasilake balasan multipel ChatGPT kasebut otomatis
// @description:ka ⚡ გაგრძელეთ ავტომატურად გენერირებას რამდენიმე ChatGPT პასუხის
// @description:kab ⚡ Sekcem seg yilmeẓyen deg usefru n tufat ChatGPT
// @description:kk ⚡ ChatGPT-ның бірнеше жауаптарын автоматты түрде жалғастыруға жалғастырыңыз
// @description:km ⚡ បន្តទៀតហើយបន្តការបង្កើតចម្លើយជាច្រើននៃ ChatGPT ដោយស្វ័យប្រវត្តិ
// @description:kn ⚡ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ChatGPT ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಮುಂದುವರಿಸಿ
// @description:ko ⚡ ChatGPT 응답을 자동으로 계속 생성하세요
// @description:ku ⚡ Parvekirina otomatîk a berdevkêya çêkirina gelek bersivên ChatGPT
// @description:ky ⚡ Тууралуу даярдалган көптөгөн ChatGPT каражаттарын жалгастыр
// @description:la ⚡ Automatica continua generatio plurium responsionum ChatGPT
// @description:lb ⚡ Fuert mat der Automatiséierung vum generéieren vun méi ChatGPT Äntwerten
// @description:lo ⚡ ຕະຫຼາດໃນການຜະລິດທັງເຫລົ່າຂອງການສ້າງຄໍາອະທິບາຍຂອງ ChatGPT
// @description:lt ⚡ Tęskite automatiškai generuoti daugelį ChatGPT atsakymų
// @description:lv ⚡ Turpiniet automātiski ģenerēt vairākas ChatGPT atbildes
// @description:mg ⚡ Mihatra ny famokarana an-taonana momba ny fijery maromaro amin'ny ChatGPT
// @description:mi ⚡ Whakapau tonu i te whakaputa i ngā whakahoki ā-ipurangi maha mō te ChatGPT
// @description:mk ⚡ Настани се автоматски да генерираш повеќе одговори на ChatGPT
// @description:ml ⚡ ChatGPT പ്രതികരണങ്ങൾക്ക് സ്വയംഭാവതന്നെ തുടങ്ങുക
// @description:mn ⚡ ChatGPT хариултуудыг автоматаар үүсгэнэ үү
// @description:ms ⚡ Terus menghasilkan beberapa respons ChatGPT secara automatik
// @description:mt ⚡ Kompluta b'mod awtomatiku jipproduċi iktar risposti tal-ChatGPT
// @description:my ⚡ ချောတောင်းကိုလည်း ChatGPT အတွက် အလိုအလျောက် ထပ်တိုးထားသည်ကိုနှိပ်ပါ
// @description:ne ⚡ क्याटजीपीटी प्रतिक्रियाहरूलाई स्वतः सार्नुहोस्
// @description:nl ⚡ Ga automatisch door met het genereren van meerdere ChatGPT-reacties
// @description:no ⚡ Fortsett automatisk med å generere flere ChatGPT-responser
// @description:ny ⚡ Kwezalitsa mabuku achinsinsi amakono apamwamba a ChatGPT
// @description:pa ⚡ ਆਪਣੇ ਆਪ ਕਈ ChatGPT ਜਵਾਬਾਂ ਨੂੰ ਜਾਰੀ ਰੱਖਣ ਦੇ ਨਾਲ ਜਾਰੀ ਰੱਖੋ
// @description:pap ⚡ Kontinua generando automaticamente varios respondenan di ChatGPT
// @description:pl ⚡ Kontynuuj automatyczne generowanie wielu odpowiedzi ChatGPT
// @description:ps ⚡ په خپله خوښه خپور شه کړه چې د ChatGPT پاسخونه وویشتل
// @description:pt ⚡ Continue gerando automaticamente várias respostas do ChatGPT
// @description:pt-BR ⚡ Continue gerando automaticamente várias respostas do ChatGPT
// @description:rn ⚡ Komeza automatik kugenera ibyanditswe byinshi bya ChatGPT
// @description:ro ⚡ Continuați să generați automat mai multe răspunsuri ChatGPT
// @description:ru ⚡ Продолжайте автоматически генерировать несколько ответов ChatGPT
// @description:rw ⚡ Angana gusuzumira kongera amakuru adahindurwa ya ChatGPT
// @description:sg ⚡ Kwâandâ mbele mbanzi mêlêba mêvâmba ya tâ ChatGPT
// @description:si ⚡ ChatGPT හි බහුතරක් ස්වයංක්රීයව පවතී
// @description:sk ⚡ Automaticky pokračujte v generovaní viacerých odpovedí ChatGPT
// @description:sl ⚡ Samodejno nadaljujte z generiranjem več odgovorov ChatGPT
// @description:sm ⚡ Alofa faauaogaina ona faaaogāina ni tali i le mafaufau ChatGPT
// @description:sn ⚡ Enda kusvika pachigadzirwa chekugadzirisa vashandisi vairambidzwi vechi ChatGPT
// @description:so ⚡ Sii wadnaansho badan oo ChatGPT ka heli
// @description:sr ⚡ Настави аутоматски да генеришеш више ChatGPT одговора
// @description:sv ⚡ Fortsätt att automatiskt generera flera ChatGPT-svar
// @description:sw ⚡ Endelea kuzalisha majibu mengi ya ChatGPT kiotomatiki
// @description:ta ⚡ தானியங்கி மீண்டும் பல விளக்கங்களை உருவாக்கத் தொடர்ந்துவிடுங்கள் ChatGPT
// @description:te ⚡ ఆటోమేటిక్గా మరియు మరిన్ని ChatGPT సమాధానాలను రచించండి
// @description:tg ⚡ Идомаи автоматӣ барои иҷод кардани чанд ҷавоби ChatGPT
// @description:th ⚡ ดำเนินการสร้างคำตอบหลาย ๆ ของ ChatGPT อัตโนมัติ
// @description:ti ⚡ ደቂቃዎት የሚጠፋ ኮድ ብቻ በኮስታኒክስ በሚገባ ጥሩ ጥያቄዎች ይሰጣል
// @description:tk ⚡ Tölegiňizde ChatGPT-e hasapla otomatik toplum
// @description:tn ⚡ Koisa ha maele a ChatGPT ho ngola ho tlaleletsa
// @description:to ⚡ Tonu ki hono fakahoko ki he fakafofonga ha nonga ai he ChatGPT
// @description:tpi ⚡ Kontinyu genaratim planti respons bilong ChatGPT bi autometik
// @description:tr ⚡ Otomatik olarak çoklu ChatGPT yanıtları üretmeye devam edin
// @description:uk ⚡ Продовжуйте автоматично генерувати багато відповідей ChatGPT
// @description:ur ⚡ ChatGPT جو جوابات خودکار طور پر تیار کرنا جاری رکھیں
// @description:uz ⚡ Ko'plab ChatGPT javoblarni avtomatik ravishda yaratishni davom ettirish
// @description:vi ⚡ Tiếp tục tạo ra nhiều câu trả lời ChatGPT một cách tự động
// @description:xh ⚡ Qhubeka ukuqhuba okuqukethweyo lwezibalo eziningi zikaChatGPT
// @description:yi ⚡ פֿאָרטזעצן ווײַטער גענערירן מיינערע אַנטוואָרטן פֿון ChatGPT אַװטאָמאַטיש
// @description:zh ⚡ 自动继续生成多个 ChatGPT 响应
// @description:zh-CN ⚡ 自动继续生成多个 ChatGPT 响应
// @description:zh-HK ⚡ 自動繼續生成多個 ChatGPT 響應
// @description:zh-SG ⚡ 自动继续生成多个 ChatGPT 响应
// @description:zh-TW ⚡ 自動繼續生成多個 ChatGPT 響應
// @description:zu ⚡ Terus menghasilkan imibuzo eminingi ye-ChatGPT ngokwesizulu
// @author Adam Lui
// @namespace https://github.com/adamlui
// @version 2025.4.28.1
// @license MIT
// @icon https://assets.chatgptautocontinue.com/images/icons/continue-symbol/black/icon48.png?v=a8c9387
// @icon64 https://assets.chatgptautocontinue.com/images/icons/continue-symbol/black/icon64.png?v=a8c9387
// @match *://chatgpt.com/*
// @match *://github.com/*/chatgpt-auto-continue*
// @connect cdn.jsdelivr.net
// @connect gm.chatgptautocontinue.com
// @connect raw.githubusercontent.com
// @require https://cdn.jsdelivr.net/npm/@kudoai/[email protected]/dist/chatgpt.min.js#sha256-Xg6XXZ7kcc/MTdlKwUq1rc41WiEwuqhl7DxIjIkzRhc=
// @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-continue@01495f8/chromium/extension/components/modals.js#sha256-tdsoqPkfGUmwo4I1oRT+jG3u7aBPwjMPy6Llb00gm7k=
// @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-continue@01495f8/chromium/extension/lib/dom.js#sha256-wX79+SnP3dPYqz9x9bfyZKz+yIJYLIgrUP+8Fa6Ckwg=
// @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-continue@01495f8/chromium/extension/lib/settings.js#sha256-pix/GpGmMPMUpCb6JWEVTG7sHAmRVCkHw/5ZTegs4t4=
// @require https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-continue@1d39a10/chromium/extension/lib/ui.js#sha256-H5ipBYjHNhKZ9xNRBboq2eZs1usmzXTYvuWtop+1AGU=
// @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://gm.chatgptautocontinue.com
// @updateURL https://gm.chatgptautocontinue.com
// @homepageURL https://www.chatgptautocontinue.com
// @supportURL https://support.chatgptautocontinue.com
// @contributionURL https://github.com/sponsors/adamlui
// ==/UserScript==
// Documentation: https://docs.chatgptautocontinue.com
// NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org
// © 2023–2025 KudoAI & contributors under the MIT license.
(async () => {
// Hide GF alert on GitHub if found
if (location.host == 'github.com') {
const gfAlert = [...document.querySelectorAll('.markdown-alert')]
.find(alert => alert.textContent.includes('Greasy Fork'))
return !gfAlert ? undefined : gfAlert.style.display = 'none'
}
// Init ENV context
const env = {
browser: {
language: chatgpt.getUserLanguage(), isFF: chatgpt.browser.isFirefox(), isMobile: chatgpt.browser.isMobile()
},
scriptManager: {
name: (() => { try { return GM_info.scriptHandler } catch (err) { return 'unknown' }})(),
version: (() => { try { return GM_info.version } catch (err) { return 'unknown' }})()
},
ui: { scheme: ui.getScheme() }
}
env.browser.isPortrait = env.browser.isMobile && (innerWidth < innerHeight)
env.scriptManager.supportsTooltips = env.scriptManager.name == 'Tampermonkey'
&& parseInt(env.scriptManager.version.split('.')[0]) >= 5
const xhr = typeof GM != 'undefined' && GM.xmlHttpRequest || GM_xmlhttpRequest
// Init APP data
const app = {
version: GM_info.script.version, chatgptJSver: /chatgpt\.js@([\d.]+)/.exec(GM_info.scriptMetaStr)[1], urls: {},
latestResourceCommitHash: '4439735' // for cached app.json + messages.json
}
app.urls.resourceHost = `https://cdn.jsdelivr.net/gh/adamlui/chatgpt-auto-continue@${app.latestResourceCommitHash}`
const remoteAppData = await new Promise(resolve => xhr({
method: 'GET', url: `${app.urls.resourceHost}/assets/data/app.json`,
onload: resp => resolve(JSON.parse(resp.responseText))
}))
Object.assign(app, { ...remoteAppData, urls: { ...app.urls, ...remoteAppData.urls }})
app.msgs = {
appName: app.name,
appAuthor: app.author.name,
appDesc: 'Automatically continue generating multiple ChatGPT responses',
menuLabel_autoScroll: 'Auto-Scroll',
menuLabel_modeNotifs: 'Mode Notifications',
menuLabel_about: 'About',
menuLabel_donate: 'Please send a donation',
menuLabel_extensionActive: 'extension active',
about_author: 'Author',
about_and: '&',
about_contributors: 'contributors',
about_version: 'Version',
about_poweredBy: 'Powered by',
about_openSourceCode: 'Open source code',
mode_autoContinue: 'Auto-Continue',
helptip_autoScroll: 'Automatically scroll to bottom as replies are generating',
helptip_modeNotifs: 'Show notifications when toggling modes/settings',
alert_updateAvail: 'Update available',
alert_newerVer: 'An update to',
alert_isAvail: 'is available',
alert_upToDate: 'Up-to-date',
alert_isUpToDate: 'is up-to-date',
alert_showYourSupport: 'Show your support',
alert_isOSS: 'is open-source software built & maintained for free through 100% volunteer efforts',
alert_despiteAffliction: 'Despite being severely afflicted by',
alert_longCOVID: 'long COVID',
alert_since2020: 'since 2020',
alert_byDonatingResults: 'by donating, you help me to continue improving, fixing bugs, adding new features, and making the software even better',
alert_yourContrib: 'Your contribution',
alert_noMatterSize: 'no matter the size',
alert_directlySupports: 'directly supports my unpaid efforts to ensure this project remains free and open for all to use',
alert_tyForSupport: 'Thank you for your support',
notif_chatAutoContinued: 'Chat Auto-Continued',
btnLabel_moreAIextensions: 'More AI Extensions',
btnLabel_rateUs: 'Rate Us',
btnLabel_discuss: 'Discuss',
btnLabel_getSupport: 'Get Support',
btnLabel_checkForUpdates: 'Check for Updates',
btnLabel_update: 'Update',
btnLabel_dismiss: 'Dismiss',
link_viewChanges: 'View changes',
state_disabled: 'disabled',
state_on: 'on',
state_off: 'off'
}
// LOCALIZE app.msgs for non-English users
if (!env.browser.language.startsWith('en')) {
const localizedMsgs = await new Promise(resolve => {
const msgHostDir = app.urls.resourceHost + '/chromium/extension/_locales/',
msgLocaleDir = ( env.browser.language ? env.browser.language.replace('-', '_') : 'en' ) + '/'
let msgHref = msgHostDir + msgLocaleDir + 'messages.json', msgXHRtries = 0
function fetchMsgs() { xhr({ method: 'GET', url: msgHref, 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
msgXHRtries++ ; if (msgXHRtries == 3) return resolve({}) // try original/region-stripped/EN only
msgHref = env.browser.language.includes('-') && msgXHRtries == 1 ? // if regional lang on 1st try...
msgHref.replace(/(_locales\/[^_]+)_[^_]+(\/)/, '$1$2') // ...strip region before retrying
: ( msgHostDir + 'en/messages.json' ) // else use default English messages
fetchMsgs()
}
}
fetchMsgs()
})
Object.assign(app.msgs, localizedMsgs)
}
// Export DEPENDENCIES to imported resources
dom.import({ scheme: env.ui.scheme }) // for dom.addRisingParticles()
modals.import({ app, env, updateCheck }) // for app data + env['<browser|ui>'] flags + modals.about() update btn
settings.import({ app }) // for app.configKeyPrefix
// Init SETTINGS
settings.load(Object.keys(settings.controls))
// 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
for (const id of this.entryIDs) { GM_unregisterMenuCommand(id) } this.register()
},
register() {
// Show "Disabled (extension active)"
this.entryIDs = env.extensionActive ? [
GM_registerMenuCommand(`${this.state.symbols[0]} ${
toTitleCase(app.msgs.state_disabled)} (${app.msgs.menuLabel_extensionActive})`,
() => modals.open('about'), env.scriptManager.supportsTooltips ? { title: ' ' } : undefined )
]
// ...or add settings toggles
: Object.keys(settings.controls).map(key => {
const ctrl = settings.controls[key]
const menuLabel = `${
ctrl.symbol || this.state.symbols[+settings.typeIsEnabled(key)] } ${ctrl.label} ${
ctrl.type == 'toggle' ? this.state.separator + this.state.words[+settings.typeIsEnabled(key)]
: ctrl.status ? ` — ${ctrl.status}` : '' }`
return GM_registerMenuCommand(menuLabel, () => {
settings.save(key, !config[key]) ; syncConfigToUI({ updatedKey: key })
notify(`${ctrl.label}: ${this.state.words[+settings.typeIsEnabled(key)]}`)
}, env.scriptManager.supportsTooltips ? { title: ctrl.helptip || ' ' } : undefined)
});
// Add About/Donate entries
['about', 'donate'].forEach(entryType => {
if (entryType == 'donate' && env.extensionActive) return
this.entryIDs.push(GM_registerMenuCommand(
`${ entryType == 'about' ? '💡' : '💖' } ${
app.msgs[`menuLabel_${entryType}`]} ${ entryType == 'about' ? app.msgs.appName : '' }`,
() => entryType == 'about' ? modals.open(entryType) : modals.safeWinOpen(app.urls.donate.gitHub),
env.scriptManager.supportsTooltips ? { title: ' ' } : undefined
))
})
}
}
function updateCheck() {
xhr({
method: 'GET', url: `${app.urls.update.gm}?t=${Date.now()}`,
headers: { 'Cache-Control': 'no-cache' },
onload: resp => {
// Compare versions, alert if update found
app.latestVer = /@version +(.*)/.exec(resp.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')
}})
}
function toTitleCase(str) {
if (!str) return ''
const words = str.toLowerCase().split(' ')
for (let i = 0 ; i < words.length ; i++) // for each word
words[i] = words[i][0].toUpperCase() + words[i].slice(1) // title-case it
return words.join(' ') // join'em back together
}
// Define FEEDBACK functions
function notify(msg, pos = '', notifDuration = '', shadow = '') {
if (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 == 'dark' ? '' : 'shadow')
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 UI functions
function checkBtnsToClick() {
let continueBtnClicked = false // to increase delay before next check if true to avoid repeated clicks
const btnTypesToCheck = ['Continue'] ; if (config.autoScroll) btnTypesToCheck.push('Scroll')
const btns = {} ; btnTypesToCheck.forEach(type => btns[type] = chatgpt[`get${type}Btn`]())
Object.entries(btns).forEach(([btnType, btn]) => {
if (!btn || btnType == 'Scroll' && ( !config.autoScroll || !chatgpt.isTyping() )) return
btn.click()
if (btnType == 'Continue') {
continueBtnClicked = true
notify(app.msgs.notif_chatAutoContinued, 'bottom-right')
if (config.autoScroll) try { chatgpt.scrollToBottom() } catch(err) {}
}})
setTimeout(checkBtnsToClick, continueBtnClicked ? 5000 : 500)
}
function syncConfigToUI() { toolbarMenu.refresh() /* prefixes/suffixes */ }
// Run MAIN routine
// Init EXTENSION ACTIVE state
postMessage({ action: 'getExtensionInfo', source: `${app.slug}.user.js` }, location.origin)
addEventListener('message', handleMsgResp)
function handleMsgResp(resp) {
if (resp.origin != location.origin) return
const sender = resp.data.source
env.extensionActive = sender.includes(app.slug) && /extension/i.test(sender)
}
await new Promise(resolve => setTimeout(resolve, 100)) // wait for extension response
removeEventListener('message', handleMsgResp)
// Create browser TOOLBAR MENU + DISABLE SCRIPT if extension active
toolbarMenu.register() ; if (env.extensionActive) return
// Add RISING PARTICLES styles
['rpg', 'rpw'].forEach(cssType => document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`))))
// Observe DOM for need to continue generating response
checkBtnsToClick()
// NOTIFY of status on load
notify(`${app.msgs.mode_autoContinue}: ${app.msgs.state_on.toUpperCase()}`)
// 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 = ui.getScheme()
if (env.ui.scheme != displayedScheme) { env.ui.scheme = displayedScheme ; modals.stylize() }
}
})()