forked from kurtextrem/Twitch5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
common.js
838 lines (780 loc) · 40.7 KB
/
common.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
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
'use strict';
const ВЕРСИЯ_РАСШИРЕНИЯ = '2019.4.17';
const ВЕРСИЯ_ДВИЖКА_БРАУЗЕРА = Number.parseInt(/Chrome\/(\d+)/.exec(navigator.userAgent)[1], 10);
const ЭТО_ПЛАНШЕТ = navigator.userAgent.includes('Android');
const ЭТО_CONTENT_SCRIPT = !document.currentScript;
const АДРЕС_НЕ_ПЕРЕНАПРАВЛЯТЬ = 'twitch5=0';
const ЛЕВАЯ_КНОПКА = 0;
const СРЕДНЯЯ_КНОПКА = 1;
const ПРАВАЯ_КНОПКА = 2;
const НАЖАТА_ЛЕВАЯ_КНОПКА = 1;
const НАЖАТА_ПРАВАЯ_КНОПКА = 2;
const НАЖАТА_СРЕДНЯЯ_КНОПКА = 4;
const ПАССИВНЫЙ_ОБРАБОТЧИК = Object.freeze({
passive: true
});
const МИН_ЗНАЧЕНИЕ_НАСТРОЙКИ = Number.MIN_SAFE_INTEGER + 1e3;
const МАКС_ЗНАЧЕНИЕ_НАСТРОЙКИ = Number.MAX_SAFE_INTEGER - 1e3;
const АВТОНАСТРОЙКА = Number.MIN_SAFE_INTEGER;
const МИНИМАЛЬНАЯ_ГРОМКОСТЬ = 1;
const МАКСИМАЛЬНАЯ_ГРОМКОСТЬ = 100;
const ШАГ_ПОВЫШЕНИЯ_ГРОМКОСТИ_КЛАВОЙ = 4;
const ШАГ_ПОНИЖЕНИЯ_ГРОМКОСТИ_КЛАВОЙ = 2;
const ШАГ_ИЗМЕНЕНИЯ_ГРОМКОСТИ_МЫШЬЮ = 1;
const ЧАТ_ВЫГРУЖЕН = 0;
const ЧАТ_СКРЫТ = 1;
const ЧАТ_ПАНЕЛЬ = 2;
const ВЕРХНЯЯ_СТОРОНА = 1;
const ПРАВАЯ_СТОРОНА = 2;
const НИЖНЯЯ_СТОРОНА = 3;
const ЛЕВАЯ_СТОРОНА = 4;
const МИН_ИНТЕРВАЛ_ОБНОВЛЕНИЯ_СПИСКОВ = 40;
const МИН_ДЛИТЕЛЬНОСТЬ_ПОВТОРА = 30;
const МАКС_ДЛИТЕЛЬНОСТЬ_ПОВТОРА = 300;
const МИН_РАЗМЕР_БУФЕРА = 1.5;
const МАКС_РАЗМЕР_БУФЕРА = 30;
const МИН_РАСТЯГИВАНИЕ_БУФЕРА = 9;
const МАКС_РАСТЯГИВАНИЕ_БУФЕРА = 30;
const ПЕРЕПОЛНЕНИЕ_БУФЕРА = МАКС_РАЗМЕР_БУФЕРА + МАКС_РАСТЯГИВАНИЕ_БУФЕРА;
let г_лРаботаЗавершена = false;
if (!window.URLSearchParams) {
window.URLSearchParams = class URLSearchParams {
constructor(сПараметры) {
Проверить(arguments.length === 1 && typeof сПараметры == 'string');
this._амПараметры = new Map();
if (сПараметры.length !== 0) {
for (let сПараметр of сПараметры.split('&')) {
const чРавно = сПараметр.indexOf('=');
if (чРавно === -1) {
const сИмя = decodeURIComponent(сПараметр);
if (!this._амПараметры.has(сИмя)) {
this._амПараметры.set(сИмя, '');
}
} else {
let сИмя = decodeURIComponent(сПараметр.slice(0, чРавно));
if (!this._амПараметры.has(сИмя)) {
this._амПараметры.set(сИмя, decodeURIComponent(сПараметр.slice(чРавно + 1)));
}
}
}
}
}
has(сИмя) {
return this._амПараметры.has(String(сИмя));
}
get(сИмя) {
const сЗначение = this._амПараметры.get(String(сИмя));
return сЗначение === void 0 ? null : сЗначение;
}
};
}
if (!window.setImmediate) {
window.setImmediate = (фВызвать => {
Проверить(typeof фВызвать == 'function');
setTimeout(фВызвать, 0);
});
}
if (!NodeList.prototype[Symbol.iterator]) {
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
}
if (!HTMLCollection.prototype[Symbol.iterator]) {
HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
}
if (!ЭТО_CONTENT_SCRIPT && !window.PointerEvent) {
const узСкрипт = document.createElement('script');
узСкрипт.src = 'pointerevent.js';
document.currentScript.parentNode.appendChild(узСкрипт);
}
const ЗАГЛУШКА = () => {};
function Проверить(пУсловие) {
if (!пУсловие) {
throw new Error('Проверка не пройдена');
}
}
function ДобавитьОбработчикИсключений(фФункция) {
return function() {
if (г_лРаботаЗавершена) {
return;
}
try {
return фФункция.apply(this, arguments);
} catch (пИсключение) {
м_Отладка.ПойманоИсключение(пИсключение);
}
};
}
function ПеревестиИсключениеВСтроку(пИсключение) {
return пИсключение instanceof Error ? пИсключение.stack : `[typeof ${typeof пИсключение}] ${new Error(пИсключение).stack}`;
}
function Тип(пЗначение) {
return пЗначение === null ? 'null' : typeof пЗначение;
}
function ЭтоЧисло(пЗначение) {
return typeof пЗначение == 'number' && пЗначение == пЗначение;
}
function ЭтоОбъект(пЗначение) {
return typeof пЗначение == 'object' && пЗначение !== null;
}
function ЭтоНепустаяСтрока(пЗначение) {
return typeof пЗначение == 'string' && пЗначение !== '';
}
function ОграничитьДлинуСтроки(сСтрока, чМаксимальнаяДлина) {
return сСтрока.length <= чМаксимальнаяДлина ? сСтрока : `${сСтрока.slice(0, чМаксимальнаяДлина)}---8<---${сСтрока.length - чМаксимальнаяДлина}`;
}
function Узел(пУзел) {
if (typeof пУзел == 'string') {
пУзел = document.getElementById(пУзел);
}
Проверить(ЭтоОбъект(пУзел));
return пУзел;
}
const м_Журнал = (() => {
const КОЛИЧЕСТВО_ЗАПИСЕЙ_В_ЖУРНАЛЕ = 1500;
const МАКС_ДЛИНА_ЗАПИСИ = 1500;
let _мсЖурнал = null;
let _чПоследняяЗапись = -1;
function Добавить(сВажность, сЗапись) {
if (_мсЖурнал) {
Проверить(typeof сВажность == 'string' && typeof сЗапись == 'string');
сЗапись = ОграничитьДлинуСтроки(`${сВажность} ${(performance.now() / 1e3).toFixed(3)} ${сЗапись}`, МАКС_ДЛИНА_ЗАПИСИ);
if (++_чПоследняяЗапись === _мсЖурнал.length) {
_чПоследняяЗапись = 0;
}
_мсЖурнал[_чПоследняяЗапись] = сЗапись;
}
}
function ПолучитьДанныеДляОтчета() {
if (!_мсЖурнал) {
return null;
}
const чСледующаяЗапись = _чПоследняяЗапись + 1;
if (чСледующаяЗапись === _мсЖурнал.length) {
return _мсЖурнал;
}
if (_мсЖурнал[чСледующаяЗапись] === void 0) {
return _мсЖурнал.slice(0, чСледующаяЗапись);
}
return _мсЖурнал.slice(чСледующаяЗапись).concat(_мсЖурнал.slice(0, чСледующаяЗапись));
}
function Вот(сЗапись) {
Проверить(arguments.length === 1);
Добавить(' ', сЗапись);
}
function Окак(сЗапись) {
Проверить(arguments.length === 1);
Добавить('~', сЗапись);
}
function Ой(сЗапись) {
Проверить(arguments.length === 1);
Добавить('@', сЗапись);
}
function O(пОбъект) {
switch (Тип(пОбъект)) {
case 'object':
return JSON.stringify(пОбъект);
case 'function':
return `[function ${пОбъект.name}]`;
case 'symbol':
return '[symbol]';
default:
return String(пОбъект);
}
}
function F(чТочность) {
return чЗначение => typeof чЗначение == 'number' ? чЗначение.toFixed(чТочность) : 'NaN';
}
if (!ЭТО_CONTENT_SCRIPT) {
_мсЖурнал = new Array(КОЛИЧЕСТВО_ЗАПИСЕЙ_В_ЖУРНАЛЕ);
Вот(`[Журнал] Журнал запущен ${performance.now().toFixed()}мс`);
}
return {
Вот,
Окак,
Ой,
O,
F0: F(0),
F1: F(1),
F2: F(2),
F3: F(3),
ПолучитьДанныеДляОтчета
};
})();
const м_i18n = (() => {
const НАЗВАНИЯ_ЯЗЫКОВ = {
ar: 'العربية',
ase: 'American Sign Language',
asl: 'American Sign Language',
bg: 'Български',
ca: 'Català',
cs: 'Čeština',
da: 'Dansk',
de: 'Deutsch',
el: 'Ελληνικά',
en: 'English',
'en-gb': 'English (UK)',
es: 'Español',
'es-mx': 'Español (Latinoamérica)',
fi: 'Suomi',
fr: 'Français',
hi: 'हिंदी',
hu: 'Magyar',
id: 'Bahasa Indonesia',
it: 'Italiano',
ja: '日本語',
ko: '한국어',
ms: 'بهاس ملايو',
nl: 'Nederlands',
no: 'Norsk',
pl: 'Polski',
pt: 'Português',
'pt-br': 'Português (Brasil)',
ro: 'Română',
ru: 'Русский',
sk: 'Slovenčina',
sv: 'Svenska',
th: 'ภาษาไทย',
tl: 'Tagalog',
tr: 'Türkçe',
uk: 'Українська',
vi: 'Tiếng Việt',
zh: '中文',
'zh-cn': '简体中文',
'zh-hk': '中文(香港)',
'zh-tw': '繁體中文'
};
const _амФорматироватьЧисло = new Map();
let _фФорматироватьДату = null;
function GetMessage(sMessageName, sSubstitution) {
Проверить(ЭтоНепустаяСтрока(sMessageName));
Проверить(sSubstitution === void 0 || typeof sSubstitution == 'string');
const sMessageText = chrome.i18n.getMessage(sMessageName, sSubstitution);
if (!sMessageText) {
throw new Error(`Не найден текст ${sMessageName}`);
}
return sMessageText;
}
function FastInsertAdjacentHtmlMessage(elInsertTo, sPosition, sMessageName) {
//! Commentary for AMO reviewers: HTML content is taken from the file messages.json. See GetMessage().
elInsertTo.insertAdjacentHTML(sPosition, GetMessage(sMessageName));
}
function InsertAdjacentHtmlMessage(vInsertTo, sPosition, sMessageName) {
const elInsertTo = Узел(vInsertTo);
if (sPosition === 'content') {
sPosition = 'beforeend';
elInsertTo.textContent = '';
}
FastInsertAdjacentHtmlMessage(elInsertTo, sPosition, sMessageName);
return elInsertTo;
}
function TranslateDocument(оДокумент) {
м_Журнал.Вот('[i18n] Перевод документа');
for (let elTranslate, celTranslate = оДокумент.querySelectorAll('*[data-i18n]'), i = 0; elTranslate = celTranslate[i]; ++i) {
const sNames = elTranslate.getAttribute('data-i18n');
const sNamesDelimiter = sNames.indexOf('^');
if (sNamesDelimiter !== 0) {
FastInsertAdjacentHtmlMessage(elTranslate, 'afterbegin', sNamesDelimiter === -1 ? sNames : sNames.slice(0, sNamesDelimiter));
}
if (sNamesDelimiter !== -1) {
elTranslate.title = GetMessage(sNames.slice(sNamesDelimiter + 1));
}
}
}
function ФорматироватьЧисло(пЧисло, кДробныхРазрядов) {
Проверить(кДробныхРазрядов === void 0 || typeof кДробныхРазрядов == 'number' && кДробныхРазрядов >= 0);
let фФорматировать = _амФорматироватьЧисло.get(кДробныхРазрядов);
if (!фФорматировать) {
фФорматировать = new Intl.NumberFormat(void 0, кДробныхРазрядов === void 0 ? void 0 : {
minimumFractionDigits: кДробныхРазрядов,
maximumFractionDigits: кДробныхРазрядов
}).format;
_амФорматироватьЧисло.set(кДробныхРазрядов, фФорматировать);
}
return фФорматировать(пЧисло);
}
function ФорматироватьДату(пДата) {
Проверить(Number.isFinite(пДата) || Number.isFinite(пДата.getTime()));
if (!_фФорматироватьДату) {
_фФорматироватьДату = new Intl.DateTimeFormat(void 0, {
timeZone: 'UTC'
}).format;
}
return _фФорматироватьДату(пДата);
}
function ПеревестиСекундыВСтроку(кСекунды, лНужныСекунды) {
let ч = Math.floor(кСекунды / 60 % 60);
let с = Math.floor(кСекунды / 60 / 60) + (ч < 10 ? ' : 0' : ' : ') + ч;
if (лНужныСекунды) {
ч = Math.floor(кСекунды % 60);
с += (ч < 10 ? ' : 0' : ' : ') + ч;
}
return с;
}
function ПолучитьНазваниеЯзыка(сКодЯзыка) {
const сНазваниеЯзыка = НАЗВАНИЯ_ЯЗЫКОВ[сКодЯзыка.toLowerCase()];
if (!сНазваниеЯзыка) {
throw new Error(`Неизвестный код языка: ${сКодЯзыка}`);
}
return сНазваниеЯзыка;
}
return {
GetMessage,
InsertAdjacentHtmlMessage,
TranslateDocument,
ФорматироватьЧисло,
ФорматироватьДату,
ПеревестиСекундыВСтроку,
ПолучитьНазваниеЯзыка
};
})();
const м_Настройки = (() => {
const ВЕРСИЯ_НАСТРОЕК = 2;
const _амПредустановкиБуферизации = new Map([ [ 'J0126', {
кОдновременныхЗагрузок: 1,
чНачалоВоспроизведения: 3,
чРазмерБуфера: 5,
чРастягиваниеБуфера: 15,
чИнтервалОпроса: МИН_ИНТЕРВАЛ_ОБНОВЛЕНИЯ_СПИСКОВ
} ], [ 'J0127', {
кОдновременныхЗагрузок: 2,
чНачалоВоспроизведения: 3,
чРазмерБуфера: 8.5,
чРастягиваниеБуфера: 20,
чИнтервалОпроса: АВТОНАСТРОЙКА
} ], [ 'J0128', {
кОдновременныхЗагрузок: 2,
чНачалоВоспроизведения: 17,
чРазмерБуфера: 9.5,
чРастягиваниеБуфера: 30,
чИнтервалОпроса: АВТОНАСТРОЙКА
} ] ]);
const _амПредустановкиОформления = new Map([ [ 'J0122', {
сЦветФона: '#282828',
сЦветГрадиента: '#ffffff',
сЦветКнопок: '#d3be96',
сЦветЗаголовка: '#cdbdec',
сЦветВыделения: '#ff9428',
чПрозрачность: 25
} ], [ 'J0121', {
сЦветФона: '#425e7b',
сЦветГрадиента: '#ffffff',
сЦветКнопок: '#ffffff',
сЦветЗаголовка: '#d1f0fa',
сЦветВыделения: '#ffaa33',
чПрозрачность: 30
} ], [ 'J0138', {
сЦветФона: '#4b4b4b',
сЦветГрадиента: '#aaaaaa',
сЦветКнопок: '#bad4f8',
сЦветЗаголовка: '#e2ebb4',
сЦветВыделения: '#75a9f0',
чПрозрачность: 5
} ], [ 'J0125', {
сЦветФона: '#161616',
сЦветГрадиента: '#969696',
сЦветКнопок: '#f0f0f0',
сЦветЗаголовка: '#b6c3c3',
сЦветВыделения: '#6cb6ff',
чПрозрачность: 10
} ] ]);
const _моМетаданныеПредустановок = [ {
амДанные: _амПредустановкиБуферизации,
сНастраиваемая: 'J0129',
сВыбрана: 'сПредустановкаВыбрана_буферизация',
сЗаполнена: 'лПредустановкаЗаполнена_буферизация',
сСписок: 'предустановка-буферизация',
сСобытие: 'настройки-измениласьпредустановка-буферизация'
}, {
амДанные: _амПредустановкиОформления,
сНастраиваемая: 'J0123',
сВыбрана: 'сПредустановкаВыбрана_оформление',
сЗаполнена: 'лПредустановкаЗаполнена_оформление',
сСписок: 'предустановка-оформление',
сСобытие: 'настройки-измениласьпредустановка-оформление'
} ];
const _мноПостоянныеНастройки = new Set([ 'чВерсияНастроек', 'чСлучайноеЧисло', 'сПредыдущаяВерсия', 'лАвтоперенаправлениеЗамечено' ]);
class Настройка {
constructor(пНачальное, мпПеречисление, чМинимальное, чМаксимальное, сАвтонастройка) {
this.пТекущее = void 0;
this.пНачальное = пНачальное;
this.мпПеречисление = мпПеречисление;
this.чМинимальное = чМинимальное;
this.чМаксимальное = чМаксимальное;
this.сАвтонастройка = сАвтонастройка;
}
static Создать(пНачальное) {
return new this(пНачальное, null, МИН_ЗНАЧЕНИЕ_НАСТРОЙКИ, МАКС_ЗНАЧЕНИЕ_НАСТРОЙКИ, '');
}
static СоздатьПеречисление(пНачальное, мпПеречисление) {
return new this(пНачальное, мпПеречисление, МИН_ЗНАЧЕНИЕ_НАСТРОЙКИ, МАКС_ЗНАЧЕНИЕ_НАСТРОЙКИ, '');
}
static СоздатьДиапазон(пНачальное, чМинимальное, чМаксимальное, сАвтонастройка = '') {
return new this(пНачальное, null, чМинимальное, чМаксимальное, сАвтонастройка);
}
static ПроверитьЗначение(пЗначение) {
Проверить(пЗначение == пЗначение && пЗначение !== Infinity && пЗначение !== -Infinity && пЗначение !== void 0 && typeof пЗначение != 'function' && typeof пЗначение != 'symbol' && typeof пЗначение != 'object');
}
ИсправитьЗначение(пЗначение) {
Настройка.ПроверитьЗначение(пЗначение);
Проверить(typeof пЗначение == typeof this.пНачальное);
if (this.мпПеречисление) {
if (!this.мпПеречисление.includes(пЗначение)) {
пЗначение = this.пНачальное;
}
} else if (typeof пЗначение == 'number') {
if (пЗначение === АВТОНАСТРОЙКА) {
if (this.сАвтонастройка === '') {
пЗначение = this.пНачальное;
}
} else if (пЗначение < this.чМинимальное) {
пЗначение = this.чМинимальное;
} else if (пЗначение > this.чМаксимальное) {
пЗначение = this.чМаксимальное;
}
}
return пЗначение;
}
}
const _оНастройки = {
чВерсияНастроек: Настройка.Создать(ВЕРСИЯ_НАСТРОЕК),
чСлучайноеЧисло: Настройка.Создать(Math.random()),
сПредыдущаяВерсия: Настройка.Создать('2000.1.1'),
чГромкость2: Настройка.СоздатьДиапазон(МАКСИМАЛЬНАЯ_ГРОМКОСТЬ / 2, МИНИМАЛЬНАЯ_ГРОМКОСТЬ, МАКСИМАЛЬНАЯ_ГРОМКОСТЬ),
лПриглушить: Настройка.Создать(false),
сНазваниеВарианта: Настройка.Создать('CoolCmd'),
чДлительностьПовтора2: Настройка.СоздатьДиапазон(60, МИН_ДЛИТЕЛЬНОСТЬ_ПОВТОРА, МАКС_ДЛИТЕЛЬНОСТЬ_ПОВТОРА, 'J0124'),
лМасштабироватьИзображение: Настройка.Создать(true),
чСостояниеЧата: Настройка.СоздатьПеречисление(ЧАТ_ВЫГРУЖЕН, [ ЧАТ_ВЫГРУЖЕН, ЧАТ_СКРЫТ, ЧАТ_ПАНЕЛЬ ]),
чСостояниеЗакрытогоЧата: Настройка.СоздатьПеречисление(ЧАТ_ВЫГРУЖЕН, [ ЧАТ_ВЫГРУЖЕН, ЧАТ_СКРЫТ ]),
лАвтоПоложениеЧата: Настройка.Создать(ЭТО_ПЛАНШЕТ),
чГоризонтальноеПоложениеЧата: Настройка.СоздатьПеречисление(ПРАВАЯ_СТОРОНА, [ ПРАВАЯ_СТОРОНА, ЛЕВАЯ_СТОРОНА ]),
чВертикальноеПоложениеЧата: Настройка.СоздатьПеречисление(НИЖНЯЯ_СТОРОНА, [ ВЕРХНЯЯ_СТОРОНА, НИЖНЯЯ_СТОРОНА ]),
чПоложениеПанелиЧата: Настройка.СоздатьПеречисление(ПРАВАЯ_СТОРОНА, [ ВЕРХНЯЯ_СТОРОНА, ПРАВАЯ_СТОРОНА, НИЖНЯЯ_СТОРОНА, ЛЕВАЯ_СТОРОНА ]),
чШиринаПанелиЧата: Настройка.СоздатьДиапазон(340, 100, МАКС_ЗНАЧЕНИЕ_НАСТРОЙКИ),
чВысотаПанелиЧата: Настройка.СоздатьДиапазон(310, 100, МАКС_ЗНАЧЕНИЕ_НАСТРОЙКИ),
лПолноценныйЧат: Настройка.Создать(true),
лЗатемнитьЧат: Настройка.Создать(false),
чРазмерИнтерфейса: Настройка.СоздатьДиапазон(ЭТО_ПЛАНШЕТ ? 115 : 100, 75, 200),
чИнтервалАвтоскрытия: Настройка.СоздатьДиапазон(4, .5, 60),
лАнимацияИнтерфейса: Настройка.Создать(!ЭТО_ПЛАНШЕТ),
лМенятьГромкостьКолесом: Настройка.Создать(true),
чШагИзмененияГромкостиКолесом: Настройка.СоздатьДиапазон(5, 1, 10),
лПоказатьСтатистику: Настройка.Создать(false),
сПредустановкаВыбрана_буферизация: Настройка.Создать('J0127'),
лПредустановкаЗаполнена_буферизация: Настройка.Создать(false),
кОдновременныхЗагрузок: Настройка.СоздатьДиапазон(0, 1, 3),
чНачалоВоспроизведения: Настройка.СоздатьДиапазон(0, МИН_РАЗМЕР_БУФЕРА, МАКС_РАЗМЕР_БУФЕРА),
чРазмерБуфера: Настройка.СоздатьДиапазон(0, МИН_РАЗМЕР_БУФЕРА, МАКС_РАЗМЕР_БУФЕРА),
чРастягиваниеБуфера: Настройка.СоздатьДиапазон(0, МИН_РАСТЯГИВАНИЕ_БУФЕРА, МАКС_РАСТЯГИВАНИЕ_БУФЕРА),
чИнтервалОпроса: Настройка.СоздатьДиапазон(0, МИН_ИНТЕРВАЛ_ОБНОВЛЕНИЯ_СПИСКОВ, 250, 'J0120'),
сПредустановкаВыбрана_оформление: Настройка.Создать('J0122'),
лПредустановкаЗаполнена_оформление: Настройка.Создать(false),
сЦветФона: Настройка.Создать(''),
сЦветГрадиента: Настройка.Создать('#ffffff'),
сЦветКнопок: Настройка.Создать(''),
сЦветЗаголовка: Настройка.Создать(''),
сЦветВыделения: Настройка.Создать(''),
чПрозрачность: Настройка.СоздатьДиапазон(0, 0, 80),
лАвтоперенаправлениеРазрешено: Настройка.Создать(true),
лАвтоперенаправлениеЗамечено: Настройка.Создать(false)
};
const ОТКЛАДЫВАТЬ_СОХРАНЕНИЕ_НА = ЭТО_CONTENT_SCRIPT ? 50 : 500;
let _чТаймерОтложенногоСохранения = 0;
let _оОтложенноеСохранение = null;
let _лОтложенноеУдаление = false;
let _обВосстановить = null;
function Восстановить() {
const обВосстановить = _обВосстановить;
_обВосстановить = null;
return обВосстановить;
}
function НачатьВосстановление() {
м_Журнал.Вот('[Настройки] Восстанавливаю настройки');
_обВосстановить = new Promise((фВыполнить, фОтказаться) => {
chrome.storage.local.get(null, оВосстановленныеНастройки => {
if (г_лРаботаЗавершена) {
return;
}
try {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError.message);
м_Отладка.ЗавершитьРаботуИПоказатьСообщение('J0209');
} else {
м_Журнал.Вот(`[Настройки] Настройки прочитаны из хранилища: ${м_Журнал.O(оВосстановленныеНастройки)}`);
ЗавершитьВосстановление(оВосстановленныеНастройки);
фВыполнить();
}
} catch (пИсключение) {
фОтказаться(пИсключение);
}
});
});
}
function ЗавершитьВосстановление(оВосстановленныеНастройки) {
Проверить(ЭтоОбъект(оВосстановленныеНастройки));
Проверить(!_оНастройки.чВерсияНастроек.пТекущее);
const оСохранить = {};
const лОстальноеУдалить = ПроверитьВерсиюНастроек(оВосстановленныеНастройки, оСохранить);
for (let сИмя of Object.keys(_оНастройки)) {
if (оВосстановленныеНастройки.hasOwnProperty(сИмя)) {
const пЗначение = _оНастройки[сИмя].ИсправитьЗначение(оВосстановленныеНастройки[сИмя]);
if (пЗначение !== оВосстановленныеНастройки[сИмя]) {
оСохранить[сИмя] = пЗначение;
}
_оНастройки[сИмя].пТекущее = пЗначение;
} else {
if (_мноПостоянныеНастройки.has(сИмя)) {
оСохранить[сИмя] = _оНастройки[сИмя].пНачальное;
}
_оНастройки[сИмя].пТекущее = _оНастройки[сИмя].пНачальное;
}
}
НачатьСохранение(оСохранить, лОстальноеУдалить);
}
function ПроверитьВерсиюНастроек(оНастройки, оСохранить) {
if (!Number.isInteger(оНастройки.чВерсияНастроек) || оНастройки.чВерсияНастроек < 1 || оНастройки.чВерсияНастроек > ВЕРСИЯ_НАСТРОЕК) {
for (let сИмя of Object.keys(оНастройки)) {
delete оНастройки[сИмя];
}
return true;
}
for (let оМетаданные of _моМетаданныеПредустановок) {
let сИмя = оНастройки[оМетаданные.сВыбрана];
if (сИмя !== void 0 && сИмя !== оМетаданные.сНастраиваемая) {
for (let сИмяПредустановки of оМетаданные.амДанные.keys()) {
if (сИмя === сИмяПредустановки) {
сИмя = void 0;
break;
}
}
if (сИмя !== void 0) {
оСохранить[оМетаданные.сВыбрана] = оНастройки[оМетаданные.сВыбрана] = _оНастройки[оМетаданные.сВыбрана].пНачальное;
}
}
}
if (оНастройки.чСостояниеЗакрытогоЧата !== оНастройки.чСостояниеЧата && (оНастройки.чСостояниеЧата === ЧАТ_ВЫГРУЖЕН || оНастройки.чСостояниеЧата === ЧАТ_СКРЫТ)) {
оСохранить.чСостояниеЗакрытогоЧата = оНастройки.чСостояниеЗакрытогоЧата = оНастройки.чСостояниеЧата;
}
if (оНастройки.чВерсияНастроек === ВЕРСИЯ_НАСТРОЕК) {
return false;
}
оСохранить.чВерсияНастроек = оНастройки.чВерсияНастроек = ВЕРСИЯ_НАСТРОЕК;
return false;
}
function НачатьСохранение(оСохранить, лОстальноеУдалить) {
Проверить(ЭтоОбъект(оСохранить));
if (Object.keys(оСохранить).length !== 0 || лОстальноеУдалить) {
if (_чТаймерОтложенногоСохранения === 0) {
м_Журнал.Вот(`[Настройки] Откладываю сохранение настроек на ${ОТКЛАДЫВАТЬ_СОХРАНЕНИЕ_НА}мс`);
_оОтложенноеСохранение = оСохранить;
_лОтложенноеУдаление = лОстальноеУдалить;
_чТаймерОтложенногоСохранения = setTimeout(ДобавитьОбработчикИсключений(ЗавершитьСохранение), ОТКЛАДЫВАТЬ_СОХРАНЕНИЕ_НА);
} else if (лОстальноеУдалить) {
_оОтложенноеСохранение = оСохранить;
_лОтложенноеУдаление = лОстальноеУдалить;
} else {
Object.assign(_оОтложенноеСохранение, оСохранить);
}
}
}
function ЗавершитьСохранение() {
м_Журнал.Вот('[Настройки] Завершаю отложенное сохранение');
Проверить(_чТаймерОтложенногоСохранения !== 0);
_чТаймерОтложенногоСохранения = 0;
Проверить(ЭтоОбъект(_оОтложенноеСохранение));
Сохранить(_оОтложенноеСохранение, _лОтложенноеУдаление);
_оОтложенноеСохранение = null;
}
function Сохранить(оСохранить, лОстальноеУдалить) {
if (лОстальноеУдалить) {
chrome.storage.local.clear(ПроверитьРезультатСохранения);
м_Журнал.Вот('[Настройки] Все настройки удалены из хранилища');
}
chrome.storage.local.set(оСохранить, ПроверитьРезультатСохранения);
м_Журнал.Вот(`[Настройки] Настройки записаны в хранилище: ${м_Журнал.O(оСохранить)}`);
}
function ПроверитьРезультатСохранения() {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError.message);
м_Отладка.ЗавершитьРаботуИПоказатьСообщение('J0212');
}
}
function Сбросить() {
м_Журнал.Окак('[Настройки] Сбрасываю настройки');
const оСохранить = {};
for (let сИмя of _мноПостоянныеНастройки) {
оСохранить[сИмя] = _оНастройки[сИмя].пТекущее;
}
НачатьСохранение(оСохранить, true);
window.location.reload();
}
function Экспорт() {
м_Журнал.Окак('[Настройки] Экспортирую настройки');
Проверить(_оНастройки.чВерсияНастроек.пТекущее);
const оЭкспорт = {
чВерсияНастроек: ВЕРСИЯ_НАСТРОЕК
};
for (let сИмя of Object.keys(_оНастройки)) {
if (!_мноПостоянныеНастройки.has(сИмя)) {
оЭкспорт[сИмя] = _оНастройки[сИмя].пТекущее;
}
}
м_Журнал.Вот(`[Настройки] Отобраны настройки для экспорта: ${м_Журнал.O(оЭкспорт)}`);
ЗаписатьТекстВЛокальныйФайл(JSON.stringify(оЭкспорт), 'application/json', Текст('J0133'));
}
function Импорт(оИзФайла) {
м_Журнал.Окак(`[Настройки] Импортирую настройки из файла ${оИзФайла.name}`);
Проверить(_оНастройки.чВерсияНастроек.пТекущее);
if (оИзФайла.size === 0 || оИзФайла.size > 1e4) {
м_Журнал.Ой(`[Настройки] Размер файла: ${оИзФайла.size}`);
alert(Текст('J0134'));
return;
}
const оЧиталка = new FileReader();
оЧиталка.addEventListener('loadend', ДобавитьОбработчикИсключений(() => {
if (!ЭтоНепустаяСтрока(оЧиталка.result)) {
м_Журнал.Ой(`[Настройки] Результат чтения файла: ${оЧиталка.result}`);
alert(Текст('J0135') + оИзФайла.name);
return;
}
м_Журнал.Вот(`[Настройки] Настройки прочитаны из файла: ${оЧиталка.result}`);
let оСохранить;
try {
оСохранить = JSON.parse(оЧиталка.result);
if (!ЭтоОбъект(оСохранить)) {
throw 1;
}
if (ПроверитьВерсиюНастроек(оСохранить, оСохранить)) {
throw 2;
}
for (let сИмя of Object.keys(оСохранить)) {
if (!_оНастройки.hasOwnProperty(сИмя)) {
delete оСохранить[сИмя];
} else {
оСохранить[сИмя] = _оНастройки[сИмя].ИсправитьЗначение(оСохранить[сИмя]);
if (оСохранить[сИмя] === _оНастройки[сИмя].пНачальное) {
delete оСохранить[сИмя];
}
}
}
} catch (пИсключение) {
м_Журнал.Ой(`[Настройки] Поймано исключение во время разбора настроек: ${пИсключение}`);
alert(Текст('J0134'));
return;
}
for (let сИмя of _мноПостоянныеНастройки) {
оСохранить[сИмя] = _оНастройки[сИмя].пТекущее;
}
НачатьСохранение(оСохранить, true);
window.location.reload();
}));
оЧиталка.readAsText(оИзФайла);
}
function Получить2(сИмя) {
Проверить(typeof сИмя == 'string');
Проверить(_оНастройки.hasOwnProperty(сИмя));
for (let оМетаданные of _моМетаданныеПредустановок) {
const оПредустановка = оМетаданные.амДанные.get(_оНастройки[оМетаданные.сВыбрана].пТекущее);
if (оПредустановка) {
const пЗначение = оПредустановка[сИмя];
if (пЗначение !== void 0) {
return пЗначение;
}
}
}
return _оНастройки[сИмя].пТекущее;
}
function Получить(сИмя) {
if (сИмя === 'чМаксРазмерБуфера') {
return Math.max(Получить2('чНачалоВоспроизведения'), Получить2('чРазмерБуфера'));
}
return Получить2(сИмя);
}
function Изменить(сИмя, пЗначение, лНеСохранять = false) {
Проверить(typeof сИмя == 'string');
Проверить(_оНастройки[сИмя].ИсправитьЗначение(пЗначение) === пЗначение);
const оСохранить = {};
for (let оМетаданные of _моМетаданныеПредустановок) {
const оПредустановка = оМетаданные.амДанные.get(_оНастройки[оМетаданные.сВыбрана].пТекущее);
if (оПредустановка && оПредустановка.hasOwnProperty(сИмя)) {
if (пЗначение === оПредустановка[сИмя]) {
return;
}
Проверить(!лНеСохранять);
оСохранить[оМетаданные.сВыбрана] = _оНастройки[оМетаданные.сВыбрана].пТекущее = оМетаданные.сНастраиваемая;
оСохранить[оМетаданные.сЗаполнена] = _оНастройки[оМетаданные.сЗаполнена].пТекущее = true;
for (let сИмяПредустановки of Object.keys(оПредустановка)) {
оСохранить[сИмяПредустановки] = _оНастройки[сИмяПредустановки].пТекущее = оПредустановка[сИмяПредустановки];
}
ОбновитьСписокПредустановок(оМетаданные);
break;
}
}
if (_оНастройки[сИмя].пТекущее !== пЗначение) {
оСохранить[сИмя] = _оНастройки[сИмя].пТекущее = пЗначение;
}
if (!лНеСохранять) {
НачатьСохранение(оСохранить, false);
}
}
function ОбновитьСписокПредустановок(оМетаданные) {
const узСписок = Узел(оМетаданные.сСписок);
узСписок.length = 0;
const сВыбрать = _оНастройки[оМетаданные.сВыбрана].пТекущее;
for (let сИмя of оМетаданные.амДанные.keys()) {
узСписок.add(new Option(Текст(сИмя), сИмя, сИмя === сВыбрать, сИмя === сВыбрать));
}
if (_оНастройки[оМетаданные.сЗаполнена].пТекущее) {
узСписок.add(new Option(Текст(оМетаданные.сНастраиваемая), оМетаданные.сНастраиваемая, оМетаданные.сНастраиваемая === сВыбрать, оМетаданные.сНастраиваемая === сВыбрать));
}
Проверить(узСписок.value);
return узСписок;
}
const ОбработатьИзменениеПредустановки = ДобавитьОбработчикИсключений(оСобытие => {
for (let оМетаданные of _моМетаданныеПредустановок) {
if (оМетаданные.сСписок === оСобытие.target.id) {
Проверить(оСобытие.target.value);
Изменить(оМетаданные.сВыбрана, оСобытие.target.value);
м_События.ПослатьСобытие(оМетаданные.сСобытие);
return;
}
}
Проверить(false);
});
function НастроитьСпискиПредустановок() {
for (let оМетаданные of _моМетаданныеПредустановок) {
ОбновитьСписокПредустановок(оМетаданные).addEventListener('change', ОбработатьИзменениеПредустановки);
}
}
function ПолучитьПараметрыНастройки(сИмя) {
Проверить(typeof сИмя == 'string');
Проверить(_оНастройки.hasOwnProperty(сИмя));
return _оНастройки[сИмя];
}
function ПолучитьДанныеДляОтчета() {
const оОтчет = {};
for (let сИмя of Object.keys(_оНастройки)) {
if (_мноПостоянныеНастройки.has(сИмя) || _оНастройки[сИмя].пТекущее !== _оНастройки[сИмя].пНачальное) {
оОтчет[сИмя] = _оНастройки[сИмя].пТекущее;
}
}
return оОтчет;
}
window.addEventListener('beforeunload', () => {
if (_чТаймерОтложенногоСохранения !== 0) {
clearTimeout(_чТаймерОтложенногоСохранения);
ЗавершитьСохранение();
}
});
НачатьВосстановление();
return {
Восстановить,
Сбросить,
Экспорт,
Импорт,
Получить,
Изменить,
ПолучитьПараметрыНастройки,
НастроитьСпискиПредустановок,
ПолучитьДанныеДляОтчета
};
})();