diff --git a/package.json b/package.json
index 656e20e7..5e841d08 100755
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "frankerfacez",
"author": "Dan Salvato LLC",
- "version": "4.31.1",
+ "version": "4.31.6",
"description": "FrankerFaceZ is a Twitch enhancement suite.",
"private": true,
"license": "Apache-2.0",
@@ -42,9 +42,9 @@
"extract-loader": "^2.0.1",
"file-loader": "^4.3.0",
"json-loader": "^0.5.7",
- "jszip": "^3.7.1",
"raw-loader": "^3.1.0",
"rimraf": "^3.0.2",
+ "sass": "^1.43.4",
"sass-loader": "^7.3.1",
"semver": "^7.3.5",
"terser-webpack-plugin": "4",
@@ -70,6 +70,7 @@
"file-saver": "^2.0.5",
"graphql": "^16.0.1",
"graphql-tag": "^2.12.6",
+ "jszip": "^3.7.1",
"js-cookie": "^2.2.1",
"markdown-it": "^12.2.0",
"markdown-it-link-attributes": "^3.0.0",
@@ -78,7 +79,6 @@
"raven-js": "^3.27.2",
"react": "^17.0.2",
"safe-regex": "^2.1.1",
- "sass": "^1.43.4",
"sortablejs": "^1.14.0",
"sourcemapped-stacktrace": "^1.1.11",
"text-diff": "^1.0.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 346e34a3..f2e77e77 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -78,6 +78,7 @@ dependencies:
graphql: 16.0.1
graphql-tag: 2.12.6_graphql@16.0.1
js-cookie: 2.2.1
+ jszip: 3.7.1
markdown-it: 12.2.0
markdown-it-link-attributes: 3.0.0
mnemonist: 0.38.5
@@ -85,7 +86,6 @@ dependencies:
raven-js: 3.27.2
react: 17.0.2
safe-regex: 2.1.1
- sass: 1.43.4
sortablejs: 1.14.0
sourcemapped-stacktrace: 1.1.11
text-diff: 1.0.1
@@ -117,9 +117,9 @@ devDependencies:
extract-loader: 2.0.1
file-loader: 4.3.0_webpack@4.46.0
json-loader: 0.5.7
- jszip: 3.7.1
raw-loader: 3.1.0_webpack@4.46.0
rimraf: 3.0.2
+ sass: 1.43.4
sass-loader: 7.3.1_webpack@4.46.0
semver: 7.3.5
terser-webpack-plugin: 4.2.3_webpack@4.46.0
@@ -988,6 +988,7 @@ packages:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.0
+ dev: true
/aproba/1.2.0:
resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
@@ -1173,6 +1174,7 @@ packages:
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
+ dev: true
/binary/0.3.0:
resolution: {integrity: sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=}
@@ -1260,6 +1262,7 @@ packages:
engines: {node: '>=8'}
dependencies:
fill-range: 7.0.1
+ dev: true
/brorand/1.1.0:
resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=}
@@ -1513,6 +1516,7 @@ packages:
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
+ dev: true
/chownr/1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@@ -1760,7 +1764,6 @@ packages:
/core-util-is/1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
- dev: true
/create-ecdh/4.0.4:
resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
@@ -2593,6 +2596,7 @@ packages:
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
+ dev: true
/finalhandler/1.1.2:
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
@@ -2748,6 +2752,7 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
+ dev: true
optional: true
/fstream/1.0.12:
@@ -2804,6 +2809,7 @@ packages:
engines: {node: '>= 6'}
dependencies:
is-glob: 4.0.3
+ dev: true
/glob/7.2.0:
resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
@@ -3107,7 +3113,7 @@ packages:
/immediate/3.0.6:
resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=}
- dev: true
+ dev: false
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
@@ -3157,7 +3163,6 @@ packages:
/inherits/2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- dev: true
/internal-ip/6.2.0:
resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==}
@@ -3243,6 +3248,7 @@ packages:
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
+ dev: true
/is-boolean-object/1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
@@ -3327,6 +3333,7 @@ packages:
/is-extglob/2.1.1:
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
engines: {node: '>=0.10.0'}
+ dev: true
/is-fullwidth-code-point/3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
@@ -3338,6 +3345,7 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
is-extglob: 2.1.1
+ dev: true
/is-ip/3.1.0:
resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==}
@@ -3368,6 +3376,7 @@ packages:
/is-number/7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ dev: true
/is-path-cwd/2.2.0:
resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
@@ -3466,7 +3475,6 @@ packages:
/isarray/1.0.0:
resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
- dev: true
/isexe/2.0.0:
resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
@@ -3564,7 +3572,7 @@ packages:
pako: 1.0.11
readable-stream: 2.3.7
set-immediate-shim: 1.0.1
- dev: true
+ dev: false
/kind-of/3.2.2:
resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=}
@@ -3602,7 +3610,7 @@ packages:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
dependencies:
immediate: 3.0.6
- dev: true
+ dev: false
/linkify-it/3.0.3:
resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==}
@@ -4079,6 +4087,7 @@ packages:
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
+ dev: true
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
@@ -4314,7 +4323,6 @@ packages:
/pako/1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
- dev: true
/parallel-transform/1.2.0:
resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==}
@@ -4425,6 +4433,7 @@ packages:
/picomatch/2.3.0:
resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==}
engines: {node: '>=8.6'}
+ dev: true
/pify/2.3.0:
resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=}
@@ -4548,7 +4557,6 @@ packages:
/process-nextick-args/2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
- dev: true
/process/0.11.10:
resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=}
@@ -4719,7 +4727,6 @@ packages:
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
- dev: true
/readable-stream/3.6.0:
resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
@@ -4745,6 +4752,7 @@ packages:
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.0
+ dev: true
/rechoir/0.7.1:
resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==}
@@ -4889,7 +4897,6 @@ packages:
/safe-buffer/5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
- dev: true
/safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
@@ -4931,7 +4938,7 @@ packages:
hasBin: true
dependencies:
chokidar: 3.5.2
- dev: false
+ dev: true
/schema-utils/1.0.0:
resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==}
@@ -5045,7 +5052,7 @@ packages:
/set-immediate-shim/1.0.1:
resolution: {integrity: sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=}
engines: {node: '>=0.10.0'}
- dev: true
+ dev: false
/set-value/4.1.0:
resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
@@ -5353,7 +5360,6 @@ packages:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
safe-buffer: 5.1.2
- dev: true
/string_decoder/1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -5547,6 +5553,7 @@ packages:
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
+ dev: true
/to-regex/3.0.2:
resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
@@ -5697,7 +5704,6 @@ packages:
/util-deprecate/1.0.2:
resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
- dev: true
/util/0.10.3:
resolution: {integrity: sha1-evsa/lCAUkZInj23/g7TeTNqwPk=}
diff --git a/src/i18n.js b/src/i18n.js
index d5ac48fe..a4a4086c 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -15,8 +15,6 @@ import NewTransCore from 'utilities/translation-core';
const fetchJSON = (url, options) => fetch(url, options).then(r => r.ok ? r.json() : null).catch(() => null);
-const API_SERVER = 'https://api-test.frankerfacez.com';
-
const STACK_SPLITTER = /\s*at\s+(.+?)\s+\((.+)\)$/,
SOURCE_SPLITTER = /^(.+):\/\/(.+?)(?:\?[a-zA-Z0-9]+)?:(\d+:\d+)$/;
@@ -691,29 +689,24 @@ export class TranslationManager extends Module {
const chunks = await Promise.all(promises);
const result = {};
+ let ignored = 0;
+
for(const chunk of chunks) {
if (! chunk)
continue;
- for(const [key,val] of Object.entries(chunk))
- result[key] = val;
+ for(const [key,val] of Object.entries(chunk)) {
+ if (typeof val === 'string' && val.length > 0)
+ result[key] = val;
+ else
+ ignored++;
+ }
}
+ if (ignored > 0)
+ this.log.debug(`Ignored ${ignored} invalid values while loading ${locale} chunks.`);
+
return result;
-
- /*const resp = await fetch(`${API_SERVER}/v2/i18n/locale/${locale}`);
- if ( ! resp.ok ) {
- if ( resp.status === 404 ) {
- this.log.info(`Cannot Load Locale: ${locale}`);
- return {};
- }
-
- this.log.warn(`Cannot Load Locale: ${locale} -- Status: ${resp.status}`);
- throw new Error(`http error ${resp.status} loading phrases`);
- }
-
- const data = await resp.json();
- return data?.phrases;*/
}
async setLocale(new_locale) {
diff --git a/src/modules/chat/actions/index.jsx b/src/modules/chat/actions/index.jsx
index 733f0815..50abad1d 100644
--- a/src/modules/chat/actions/index.jsx
+++ b/src/modules/chat/actions/index.jsx
@@ -311,7 +311,13 @@ export default class Actions extends Module {
{reason_text ?
{reason_text}
: null}
-
+
);
}
diff --git a/src/modules/chat/badges.jsx b/src/modules/chat/badges.jsx
index 1ca672b4..a008a7f4 100644
--- a/src/modules/chat/badges.jsx
+++ b/src/modules/chat/badges.jsx
@@ -502,6 +502,12 @@ export default class Badges extends Module {
message = container[fine.accessor]?.return?.stateNode?.props?.message;
if ( ! message )
message = fine.searchParent(container, n => n.props?.message)?.props?.message;
+ if ( ! message && this.root.flavor === 'clips' ) {
+ const lines = this.resolve('site.chat.line');
+ const node = fine.searchParent(container, n => n.props?.node)?.props?.node;
+ if ( lines && node )
+ message = lines.messages.get(node);
+ }
if ( ! message )
message = fine.searchParent(container, n => n.props?.node)?.props?.node?._ffz_message;
if ( ! message )
diff --git a/src/modules/chat/emotes.js b/src/modules/chat/emotes.js
index a7f1bcd9..3c81719b 100644
--- a/src/modules/chat/emotes.js
+++ b/src/modules/chat/emotes.js
@@ -498,6 +498,8 @@ export default class Emotes extends Module {
if ( ! line || ! opener )
return;
+ const rect = target.getBoundingClientRect();
+
opener.onShowEmoteCard({
channelID: line.props.channelID || '',
channelLogin: line.props.channelLogin || '',
@@ -505,7 +507,8 @@ export default class Emotes extends Module {
emoteCode: target.alt,
sourceID: 'chat',
referrerID: '',
- initialTopOffset: target.getBoundingClientRect().bottom
+ initialTopOffset: rect.bottom,
+ initialBottomOffset: rect.top
});
return true;
diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js
index f9ee9afd..a62c0570 100644
--- a/src/modules/chat/index.js
+++ b/src/modules/chat/index.js
@@ -1854,6 +1854,24 @@ export default class Chat extends Module {
});
}
+ removeTokenizer(tokenizer) {
+ let type;
+ if ( typeof tokenizer === 'string' ) type = tokenizer;
+ else type = tokenizer.type;
+
+ tokenizer = this.tokenizers[type];
+ if ( ! tokenizer )
+ return null;
+
+ if ( tokenizer.tooltip )
+ delete this.tooltips.types[type];
+
+ const idx = this.__tokenizers.indexOf(tokenizer);
+ if ( idx !== -1 )
+ this.__tokenizers.splice(idx, 1);
+
+ return tokenizer;
+ }
addRichProvider(provider) {
const type = provider.type;
@@ -1869,12 +1887,39 @@ export default class Chat extends Module {
});
}
+ removeRichProvider(provider) {
+ let type;
+ if ( typeof provider === 'string' ) type = provider;
+ else type = provider.type;
- tokenizeString(message, msg) {
+ provider = this.rich_providers[type];
+ if ( ! provider )
+ return null;
+
+ const idx = this.__rich_providers.indexOf(provider);
+ if ( idx !== -1 )
+ this.__rich_providers.splice(idx, 1);
+
+ return provider;
+ }
+
+
+ tokenizeString(message, msg, user, haltable = false) {
let tokens = [{type: 'text', text: message}];
- for(const tokenizer of this.__tokenizers)
- tokens = tokenizer.process.call(this, tokens, msg);
+ for(const tokenizer of this.__tokenizers) {
+ if ( ! tokenizer.process )
+ continue;
+
+ const new_tokens = tokenizer.process.call(this, tokens, msg, user, haltable);
+ if ( new_tokens )
+ tokens = new_tokens;
+
+ if ( haltable && msg.ffz_halt_tokens ) {
+ msg.ffz_halt_tokens = undefined;
+ break;
+ }
+ }
return tokens;
}
@@ -1914,7 +1959,13 @@ export default class Chat extends Module {
let tokens = [{type: 'text', text: msg.message}];
for(const tokenizer of this.__tokenizers) {
- tokens = tokenizer.process.call(this, tokens, msg, user, haltable);
+ if ( ! tokenizer.process )
+ continue;
+
+ const new_tokens = tokenizer.process.call(this, tokens, msg, user, haltable);
+ if ( new_tokens )
+ tokens = new_tokens;
+
if ( haltable && msg.ffz_halt_tokens ) {
msg.ffz_halt_tokens = undefined;
break;
diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx
index f82a2d51..9ccf7ede 100644
--- a/src/modules/chat/tokenizers.jsx
+++ b/src/modules/chat/tokenizers.jsx
@@ -34,7 +34,7 @@ export const FilterTester = {
process(tokens, msg) {
if ( ! tokens || ! tokens.length || ! this.context.get('chat.filtering.debug') )
- return tokens;
+ return;
msg.filters = [];
@@ -178,9 +178,7 @@ export const Links = {
process(tokens) {
if ( ! tokens || ! tokens.length )
- return tokens;
-
- //const use_new = this.experiments.getAssignment('new_links');
+ return;
const out = [];
for(const token of tokens) {
@@ -189,7 +187,6 @@ export const Links = {
continue;
}
- //LINK_REGEX.lastIndex = 0;
NEW_LINK_REGEX.lastIndex = 0;
const text = token.text;
let idx = 0, match;
@@ -251,41 +248,6 @@ Links.tooltip.delayHide = function(target) {
};
-// ============================================================================
-// Rich Content
-// ============================================================================
-
-/*export const RichContent = {
- type: 'rich-content',
-
- render(token, e) {
- return e('div', {
- className: 'ffz--rich-content elevation-1 mg-y-05',
- }, e('a', {
- className: 'clips-chat-card flex flex-nowrap pd-05',
- target: '_blank',
- href: token.url
- }, [
- e('div', {
- className: 'clips-chat-card__thumb align-items-center flex justify-content-center'
- })
- ]));
- },
-
- process(tokens, msg) {
- if ( ! tokens || ! tokens.length )
- return tokens;
-
- for(const token of tokens) {
- if ( token.type !== 'link' )
- continue;
-
-
- }
- }
-}*/
-
-
// ============================================================================
// Replies (Styled Like Mentions)
// ============================================================================
@@ -333,10 +295,6 @@ export const Replies = {
reply.parentMessageBody
])
];
- },
-
- process(tokens) {
- return tokens;
}
}
@@ -351,11 +309,11 @@ export const Mentions = {
component: () => import(/* webpackChunkName: 'vue-chat' */ './components/chat-mention.vue'),
- oldRender(token, createElement) {
+ /*oldRender(token, createElement) {
return (
{token.text}
);
- },
+ },*/
render(token, createElement) {
let color = token.color;
@@ -376,7 +334,7 @@ export const Mentions = {
process(tokens, msg, user) {
if ( ! tokens || ! tokens.length )
- return tokens;
+ return;
const can_highlight_user = user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own'),
priority = this.context.get('chat.filtering.mention-priority');
@@ -467,19 +425,17 @@ export const UserHighlights = {
process(tokens, msg, user) {
if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') )
- return tokens;
+ return;
const list = this.context.get('__filter:highlight-users');
if ( ! list || ! list.length )
- return tokens;
+ return;
const u = msg.user;
for(const [priority, color, regex] of list) {
if ( regex.test(u.login) || regex.test(u.displayName) )
this.applyHighlight(msg, priority, color, 'user');
}
-
- return tokens;
}
}
@@ -489,12 +445,12 @@ export const BlockedUsers = {
process(tokens, msg, user, haltable) {
if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') )
- return tokens;
+ return;
const u = msg.user,
regexes = this.context.get('__filter:block-users');
if ( ! regexes )
- return tokens;
+ return;
if ( regexes[1] && (regexes[1].test(u.login) || regexes[1].test(u.displayName)) ) {
msg.deleted = true;
@@ -504,8 +460,6 @@ export const BlockedUsers = {
} else if ( ! msg.deleted && regexes[0] && (regexes[0].test(u.login) || regexes[0].test(u.displayName)) )
msg.deleted = true;
-
- return tokens;
}
}
@@ -530,17 +484,17 @@ export const BadgeStuff = {
process(tokens, msg, user, haltable) {
if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') )
- return tokens;
+ return;
const highlights = this.context.get('__filter:highlight-badges'),
list = this.context.get('__filter:block-badges');
if ( ! highlights && ! list )
- return tokens;
+ return;
const keys = getBadgeIDs(msg);
if ( ! keys || ! keys.length )
- return tokens;
+ return;
for(const badge of keys) {
if ( list && list[1].includes(badge) ) {
@@ -548,7 +502,7 @@ export const BadgeStuff = {
msg.ffz_removed = true;
if ( haltable )
msg.ffz_halt_tokens = true;
- return tokens;
+ return;
}
if ( list && ! msg.deleted && list[0].includes(badge) )
@@ -560,8 +514,6 @@ export const BadgeStuff = {
this.applyHighlight(msg, details[0], details[1], 'badge');
}
}
-
- return tokens;
}
}
@@ -609,14 +561,14 @@ export const CustomHighlights = {
process(tokens, msg, user) {
if ( ! tokens || ! tokens.length )
- return tokens;
+ return;
if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') )
- return tokens;
+ return;
const data = this.context.get('__filter:highlight-terms');
if ( ! data )
- return tokens;
+ return;
let had_match = false;
if ( data.non ) {
@@ -781,14 +733,14 @@ export const BlockedTerms = {
process(tokens, msg, user, haltable) {
if ( ! tokens || ! tokens.length )
- return tokens;
+ return;
if ( user && user.login && user.login == msg.user.login && ! this.context.get('chat.filtering.process-own') )
- return tokens;
+ return;
const regexes = this.context.get('__filter:block-terms');
if ( ! regexes )
- return tokens;
+ return;
if ( regexes.remove ) {
tokens = blocked_process(tokens, msg, regexes.remove, true, haltable);
@@ -863,7 +815,7 @@ export const AutomoddedTerms = {
process(tokens, msg, user, haltable) {
if ( ! tokens || ! tokens.length || ! msg.flags || ! Array.isArray(msg.flags.list) )
- return tokens;
+ return;
const cats = msg.flags.preferences,
flagged = msg.flags.list.filter(x => {
@@ -882,7 +834,7 @@ export const AutomoddedTerms = {
f_length = flagged.length;
if ( ! f_length )
- return tokens;
+ return;
const out = [];
let idx = 0,
@@ -898,7 +850,7 @@ export const AutomoddedTerms = {
msg.ffz_removed = true;
if ( haltable )
msg.ffz_halt_tokens = true;
- return tokens;
+ return;
}
for(const token of tokens) {
@@ -1050,13 +1002,13 @@ export const CheerEmotes = {
process(tokens, msg) {
if ( ! tokens || ! tokens.length || ! msg.bits )
- return tokens;
+ return;
const room = this.getRoom(msg.roomID, msg.roomLogin, true),
actions = room && room.bitsConfig;
if ( ! actions )
- return tokens;
+ return;
const matcher = new RegExp(`^(${Object.keys(actions).join('|')})(\\d+)$`, 'i');
@@ -1464,10 +1416,10 @@ export const AddonEmotes = {
process(tokens, msg) {
if ( ! tokens || ! tokens.length )
- return tokens;
+ return;
if ( this.context.get('chat.emotes.enabled') !== 2 )
- return tokens;
+ return;
const emotes = this.emotes.getEmotes(
msg.user.id,
@@ -1477,7 +1429,7 @@ export const AddonEmotes = {
);
if ( ! emotes )
- return tokens;
+ return;
const big = this.context.get('chat.emotes.2x'),
anim = this.context.get('chat.emotes.animated'),
@@ -1508,12 +1460,14 @@ export const AddonEmotes = {
// Is this emote a modifier?
if ( emote.modifier && last_token && last_token.modifiers && (!text.length || (text.length === 1 && text[0] === '')) ) {
if ( last_token.modifiers.indexOf(emote.token) === -1 ) {
- if ( big )
- last_token.modifiers.push(Object.assign({
- big
- }, emote.token));
- else
- last_token.modifiers.push(emote.token);
+ last_token.modifiers.push(
+ Object.assign({
+ big,
+ anim
+ },
+ emote.token
+ )
+ );
}
continue;
@@ -1574,14 +1528,15 @@ export const Emoji = {
process(tokens) {
if ( ! tokens || ! tokens.length )
- return tokens;
+ return;
const splitter = this.emoji.splitter,
- style = this.context.get('chat.emoji.style'),
- out = [];
+ style = this.context.get('chat.emoji.style');
if ( style === 0 )
- return tokens;
+ return;
+
+ const out = [];
for(const token of tokens) {
if ( ! token )
@@ -1648,10 +1603,10 @@ export const TwitchEmotes = {
process(tokens, msg) {
if ( ! msg.ffz_emotes )
- return tokens;
+ return;
if ( this.context.get('chat.emotes.enabled') < 1 )
- return tokens;
+ return;
const data = msg.ffz_emotes,
anim = this.context.get('chat.emotes.animated'),
@@ -1666,11 +1621,12 @@ export const TwitchEmotes = {
emotes.push([emote_id, match.startIndex, match.endIndex + 1]);
}
- const out = [],
- e_length = emotes.length;
+ const e_length = emotes.length;
if ( ! e_length )
- return tokens;
+ return;
+
+ const out = [];
emotes.sort((a,b) => a[1] !== b[1] ? a[1] - b[1] : b[0] - a[0]);
diff --git a/src/modules/main_menu/components/experiments.vue b/src/modules/main_menu/components/experiments.vue
index 8c8bf48d..0a662175 100644
--- a/src/modules/main_menu/components/experiments.vue
+++ b/src/modules/main_menu/components/experiments.vue
@@ -237,7 +237,7 @@ export default {
data() {
return {
code: pick_random(CODES),
- experiments_locked: true, //this.item.is_locked(),
+ experiments_locked: this.item.is_locked(),
sort_by: 1,
unused: false,
unique_id: this.item.unique_id(),
diff --git a/src/modules/main_menu/components/link-tester.vue b/src/modules/main_menu/components/link-tester.vue
index 4ca1bcb9..2ae6dde4 100644
--- a/src/modules/main_menu/components/link-tester.vue
+++ b/src/modules/main_menu/components/link-tester.vue
@@ -91,6 +91,8 @@