491 Commits

Author SHA1 Message Date
3503a63a10 Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2025-06-15 09:19:36 -04:00
e41529b61f update note 2025-06-09 12:18:14 +02:00
1e7e851dc9 Release v13.0.0 2025-06-09 11:11:23 +02:00
80a5b76172 Updating SPDX headers. 2025-06-09 10:48:43 +02:00
6cd7f013f2 Merge pull request #698 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-434c38cfec
Bump the minor-and-patch group across 1 directory with 2 updates
2025-06-09 10:45:52 +02:00
419355640a Merge pull request #696 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-06-09 10:45:45 +02:00
9c2d8cfbb6 Translated using Weblate (Czech)
Currently translated at 47.7% (430 of 900 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-06-09 10:45:32 +02:00
06c274c4b5 Translated using Weblate (Catalan)
Currently translated at 100.0% (900 of 900 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-06-09 10:45:32 +02:00
bdf8817bf8 Translated using Weblate (German)
Currently translated at 100.0% (900 of 900 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2025-06-09 10:45:32 +02:00
cd1fa7c4d4 Translated using Weblate (French)
Currently translated at 83.7% (754 of 900 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2025-06-09 10:45:32 +02:00
d75e07e022 Merge pull request #697 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-06-09 10:45:27 +02:00
bebb7918bd Bump the minor-and-patch group across 1 directory with 2 updates
Bumps the minor-and-patch group with 2 updates in the / directory: [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/express` from 5.0.2 to 5.0.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

Updates `typescript-eslint` from 8.33.0 to 8.33.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.33.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/express"
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-version: 8.33.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-09 03:45:13 +00:00
14ff00c730 Translated using Weblate (German)
Currently translated at 100.0% (317 of 317 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2025-06-07 10:38:23 +02:00
edd29ed1ed Mentioning the NlNet funding. 2025-06-06 17:29:47 +02:00
e24385c3f1 Updating documentation + removing deprecated field description 2025-06-06 17:08:53 +02:00
0be11fb2ae Security Fix: mitigate ReDOS attacks on the chat bot. 2025-06-06 16:41:22 +02:00
98dc729447 Merge pull request #681 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-06-06 16:40:22 +02:00
7dcfac00cb Translated using Weblate (Czech)
Currently translated at 100.0% (318 of 318 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2025-06-06 16:40:06 +02:00
3b319927c6 Translated using Weblate (Catalan)
Currently translated at 100.0% (318 of 318 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2025-06-06 16:40:06 +02:00
ad1d7786af Merge pull request #692 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-06-06 16:39:58 +02:00
500624d0ff Translated using Weblate (Czech)
Currently translated at 46.8% (421 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-06-04 00:35:13 +02:00
6dd4639727 Merge pull request #691 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-5bad440f25
Bump the minor-and-patch group across 1 directory with 7 updates
2025-06-03 16:19:12 +02:00
c00f5d1593 Merge pull request #685 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-06-03 16:18:50 +02:00
ee1417774a Bump the minor-and-patch group across 1 directory with 7 updates
Bumps the minor-and-patch group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.27.0` | `9.28.0` |
| [@tsconfig/node16](https://github.com/tsconfig/bases/tree/HEAD/bases) | `16.1.3` | `16.1.4` |
| [esbuild](https://github.com/evanw/esbuild) | `0.25.4` | `0.25.5` |
| [globals](https://github.com/sindresorhus/globals) | `16.1.0` | `16.2.0` |
| [sass](https://github.com/sass/dart-sass) | `1.89.0` | `1.89.1` |
| [stylelint](https://github.com/stylelint/stylelint) | `16.19.1` | `16.20.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.32.1` | `8.33.0` |



Updates `@eslint/js` from 9.27.0 to 9.28.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.28.0/packages/js)

Updates `@tsconfig/node16` from 16.1.3 to 16.1.4
- [Commits](https://github.com/tsconfig/bases/commits/HEAD/bases)

Updates `esbuild` from 0.25.4 to 0.25.5
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.4...v0.25.5)

Updates `globals` from 16.1.0 to 16.2.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v16.1.0...v16.2.0)

Updates `sass` from 1.89.0 to 1.89.1
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.89.0...1.89.1)

Updates `stylelint` from 16.19.1 to 16.20.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.19.1...16.20.0)

Updates `typescript-eslint` from 8.32.1 to 8.33.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.33.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@tsconfig/node16"
  dependency-version: 16.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: esbuild
  dependency-version: 0.25.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: globals
  dependency-version: 16.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: sass
  dependency-version: 1.89.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: stylelint
  dependency-version: 16.20.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-version: 8.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-02 04:20:02 +00:00
dfd694782e Translated using Weblate (Czech)
Currently translated at 43.1% (388 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-05-23 00:47:28 +02:00
8348011b34 Translated using Weblate (Czech)
Currently translated at 42.8% (385 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-05-22 19:48:39 +02:00
b0c08e72e2 Fix: message deletion were not properly anonymized when using "Anonymize moderation actions" option. 2025-05-21 18:18:44 +02:00
60ea2b4ed0 Fix #626: Bot timer was buggy, using seconds as delay instead of minutes.
There was a regression some months ago in the "bot timer" functionnality.
In the channels settings, the delay between two quotes is supposed to be in minutes, but in fact we applied seconds.
We don't have any way to detect if the user meant seconds or minutes when they configured their channels (it depends if it was before or after the regression).
So we encourage all streamers to go through their channel settings, check the frequency of their bot timers (if enabled), set them to the correct value, and save the form.
Users must save the form to be sure to apply the correct value.
2025-05-21 17:51:54 +02:00
078515572e Fix data type. 2025-05-21 17:45:56 +02:00
8a12ddabc2 Fix: bot timer can't be negative or null. 2025-05-21 17:12:14 +02:00
1b8531a198 Fix: bot timer can't be negative or null. 2025-05-21 16:51:47 +02:00
a5ede49402 Fix tasks: checkbox state does not change when clicked. 2025-05-21 16:36:44 +02:00
4bebc18c67 Fix: moderation notes: fix filter button wrongly displayed on notes without associated occupant.
Also fix typo.
2025-05-21 16:25:11 +02:00
562e6a16e2 npm audit fix 2025-05-21 12:28:24 +02:00
1bb79054b4 Merge pull request #677 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-86ff11a346
Bump the minor-and-patch group across 1 directory with 5 updates
2025-05-21 12:24:15 +02:00
8ec8eb63e4 Merge pull request #678 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-05-21 10:58:58 +02:00
688c4099ad Translated using Weblate (Czech)
Currently translated at 99.0% (315 of 318 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2025-05-21 10:58:12 +02:00
238407c060 Changelog. 2025-05-21 10:57:24 +02:00
97587ab92f Merge pull request #671 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-05-21 10:56:31 +02:00
fdff085b37 Merge branch 'main' into weblate-peertube-livechat-peertube-plugin-livechat 2025-05-21 10:51:41 +02:00
743e794d5d Bump the minor-and-patch group across 1 directory with 5 updates
Bumps the minor-and-patch group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.26.0` | `9.27.0` |
| [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) | `5.0.1` | `5.0.2` |
| [sass](https://github.com/sass/dart-sass) | `1.88.0` | `1.89.0` |
| [sharp](https://github.com/lovell/sharp) | `0.34.1` | `0.34.2` |
| [yaml](https://github.com/eemeli/yaml) | `2.7.1` | `2.8.0` |



Updates `@eslint/js` from 9.26.0 to 9.27.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.27.0/packages/js)

Updates `@types/express` from 5.0.1 to 5.0.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

Updates `sass` from 1.88.0 to 1.89.0
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.88.0...1.89.0)

Updates `sharp` from 0.34.1 to 0.34.2
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.1...v0.34.2)

Updates `yaml` from 2.7.1 to 2.8.0
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.7.1...v2.8.0)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.27.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@types/express"
  dependency-version: 5.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: sass
  dependency-version: 1.89.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: sharp
  dependency-version: 0.34.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: yaml
  dependency-version: 2.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-21 03:41:47 +00:00
9669861dec Add activate chat via short UUID mention to documentation (translation fr, en, es) 2025-05-20 16:54:42 +02:00
bb78c61b08 Fix #75: Short uuid handling 2025-05-20 16:54:42 +02:00
5b8ccdf5ae Put occupants filters items on a single line 2025-05-20 16:48:35 +02:00
922e2fbdf4 Minor refactoring and fix. 2025-05-20 16:48:35 +02:00
42e589d397 Fix: Converse bottom panel messages not visible on new Peertube v7 theme (for example for muted users) 2025-05-20 16:48:35 +02:00
02fff14351 update changelog 2025-05-20 16:48:35 +02:00
3e70fd3892 Enlarge a custom emoji when posted without any other text 2025-05-20 16:48:35 +02:00
dd040582d4 Resize custom emojis to text height 2025-05-20 16:48:35 +02:00
d79deef5c0 Handle draggable lines on touch screens 2025-05-20 16:48:35 +02:00
048c003ff0 Hide offline occupants in list by default 2025-05-20 16:48:35 +02:00
ccbfe8e6d5 Add go to last msg button in chat bottom panel 2025-05-20 16:48:35 +02:00
3bc8d2466b auto focus message field after anonymous user has entered nickname 2025-05-20 16:48:35 +02:00
356b385fc9 Translated using Weblate (French)
Currently translated at 100.0% (317 of 317 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2025-05-20 13:08:04 +02:00
b5c7fa4246 Translated using Weblate (German)
Currently translated at 100.0% (317 of 317 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2025-05-20 13:08:04 +02:00
e7c0be98ee Translated using Weblate (Catalan)
Currently translated at 100.0% (317 of 317 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2025-05-20 13:08:04 +02:00
ca13d237a3 Fix documentation. 2025-05-20 13:07:45 +02:00
799043c88e Merge pull request #670 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-9184e5ce34
Bump typescript-eslint from 8.32.0 to 8.32.1 in the minor-and-patch group
2025-05-13 09:26:24 +02:00
f12d4cb13a Bump typescript-eslint in the minor-and-patch group
Bumps the minor-and-patch group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.32.0 to 8.32.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.32.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.32.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 03:53:35 +00:00
c3142a3282 use upstream 2025-05-12 16:55:10 -04:00
134d94d6fc Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2025-05-12 16:50:25 -04:00
6b30886bb6 Fix changelog 2025-05-12 16:13:20 +02:00
090679d6c3 Bump version 12.0.4 2025-05-12 16:12:41 +02:00
88376b82ee Adding a warning in settings if theme is not set to Peertube or if autocolors are disabled. 2025-05-12 15:40:27 +02:00
d841e88e00 Merge pull request #666 from JohnXLivingston/dependabot/npm_and_yarn/eslint-plugin-lit-2.1.1
Bump eslint-plugin-lit from 1.15.0 to 2.1.1
2025-05-12 15:07:49 +02:00
aef508ef77 Merge pull request #668 from JohnXLivingston/dependabot/npm_and_yarn/stylistic/eslint-plugin-3.1.0
Bump @stylistic/eslint-plugin from 2.11.0 to 3.1.0
2025-05-12 15:07:00 +02:00
673c128c1b Bump @stylistic/eslint-plugin from 2.11.0 to 3.1.0
Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.11.0 to 3.1.0.
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v3.1.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 3.1.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 11:53:55 +00:00
22668c5532 Bump eslint-plugin-lit from 1.15.0 to 2.1.1
Bumps [eslint-plugin-lit](https://github.com/43081j/eslint-plugin-lit) from 1.15.0 to 2.1.1.
- [Release notes](https://github.com/43081j/eslint-plugin-lit/releases)
- [Commits](https://github.com/43081j/eslint-plugin-lit/compare/1.15.0...2.1.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-lit
  dependency-version: 2.1.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 11:44:03 +00:00
fb27214d36 Merge pull request #663 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-d14adfe196
Bump openid-client from 5.7.0 to 5.7.1 in the minor-and-patch group
2025-05-12 13:41:20 +02:00
8ff8b01148 Bump openid-client from 5.7.0 to 5.7.1 in the minor-and-patch group
Bumps the minor-and-patch group with 1 update: [openid-client](https://github.com/panva/openid-client).


Updates `openid-client` from 5.7.0 to 5.7.1
- [Release notes](https://github.com/panva/openid-client/releases)
- [Changelog](https://github.com/panva/openid-client/blob/v5.7.1/CHANGELOG.md)
- [Commits](https://github.com/panva/openid-client/compare/v5.7.0...v5.7.1)

---
updated-dependencies:
- dependency-name: openid-client
  dependency-version: 5.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 11:39:14 +00:00
0ffc652194 Dependabot: @stylistic/eslint-plugin blocked by eslint version. 2025-05-12 13:34:53 +02:00
69c9c1f83f Merge pull request #662 from JohnXLivingston/dependabot/npm_and_yarn/babel/helpers-7.27.1
Bump @babel/helpers from 7.24.0 to 7.27.1
2025-05-12 13:20:37 +02:00
94753ab60b Dependabot: openid-client < 6.0.0 2025-05-12 13:20:08 +02:00
375e5cb405 Updating globals dependency. 2025-05-12 13:14:41 +02:00
38cfc05962 Merge branch 'dependabot/npm_and_yarn/minor-and-patch-74f704f9c9' 2025-05-12 13:09:51 +02:00
c0d2c0caae Addapt linting to dependency update. 2025-05-12 13:05:43 +02:00
3af263fb12 Bump @babel/helpers from 7.24.0 to 7.27.1
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.24.0 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-version: 7.27.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 10:51:36 +00:00
d36fa2e241 Bump the minor-and-patch group across 1 directory with 16 updates
Bumps the minor-and-patch group with 16 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@xmpp/jid](https://github.com/xmppjs/xmpp.js) | `0.13.1` | `0.13.2` |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.16.0` | `9.24.0` |
| [@lit-labs/motion](https://github.com/lit/lit/tree/HEAD/packages/labs/motion) | `1.0.7` | `1.0.8` |
| [@lit/context](https://github.com/lit/lit/tree/HEAD/packages/context) | `1.1.3` | `1.1.5` |
| [@lit/task](https://github.com/lit/lit/tree/HEAD/packages/task) | `1.0.1` | `1.0.2` |
| [@peertube/feed](https://github.com/Chocobozzz/feed) | `5.1.3` | `5.4.1` |
| [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) | `5.0.0` | `5.0.1` |
| [@types/http-proxy](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/http-proxy) | `1.17.15` | `1.17.16` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `16.18.121` | `16.18.126` |
| [esbuild](https://github.com/evanw/esbuild) | `0.24.0` | `0.25.2` |
| [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) | `3.2.1` | `3.3.0` |
| [sass](https://github.com/sass/dart-sass) | `1.81.1` | `1.86.3` |
| [sharp](https://github.com/lovell/sharp) | `0.33.5` | `0.34.1` |
| [stylelint](https://github.com/stylelint/stylelint) | `16.11.0` | `16.18.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.17.0` | `8.29.1` |
| [yaml](https://github.com/eemeli/yaml) | `2.6.1` | `2.7.1` |



Updates `@xmpp/jid` from 0.13.1 to 0.13.2
- [Release notes](https://github.com/xmppjs/xmpp.js/releases)
- [Commits](https://github.com/xmppjs/xmpp.js/compare/v0.13.1...v0.13.2)

Updates `@eslint/js` from 9.16.0 to 9.24.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.24.0/packages/js)

Updates `@lit-labs/motion` from 1.0.7 to 1.0.8
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/labs/motion/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/@lit-labs/react@1.0.8/packages/labs/motion)

Updates `@lit/context` from 1.1.3 to 1.1.5
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/context/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/@lit/context@1.1.5/packages/context)

Updates `@lit/task` from 1.0.1 to 1.0.2
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/task/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/@lit/task@1.0.2/packages/task)

Updates `@peertube/feed` from 5.1.3 to 5.4.1
- [Commits](https://github.com/Chocobozzz/feed/commits)

Updates `@types/express` from 5.0.0 to 5.0.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

Updates `@types/http-proxy` from 1.17.15 to 1.17.16
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/http-proxy)

Updates `@types/node` from 16.18.121 to 16.18.126
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `esbuild` from 0.24.0 to 0.25.2
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.24.0...v0.25.2)

Updates `lit` from 3.2.1 to 3.3.0
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@3.3.0/packages/lit)

Updates `sass` from 1.81.1 to 1.86.3
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.81.1...1.86.3)

Updates `sharp` from 0.33.5 to 0.34.1
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.33.5...v0.34.1)

Updates `stylelint` from 16.11.0 to 16.18.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.11.0...16.18.0)

Updates `typescript-eslint` from 8.17.0 to 8.29.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.29.1/packages/typescript-eslint)

Updates `yaml` from 2.6.1 to 2.7.1
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.6.1...v2.7.1)

---
updated-dependencies:
- dependency-name: "@xmpp/jid"
  dependency-version: 0.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@eslint/js"
  dependency-version: 9.24.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@lit-labs/motion"
  dependency-version: 1.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@lit/context"
  dependency-version: 1.1.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@lit/task"
  dependency-version: 1.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@peertube/feed"
  dependency-version: 5.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@types/express"
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@types/http-proxy"
  dependency-version: 1.17.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@types/node"
  dependency-version: 16.18.126
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: esbuild
  dependency-version: 0.25.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: lit
  dependency-version: 3.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: sass
  dependency-version: 1.86.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: sharp
  dependency-version: 0.34.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: stylelint
  dependency-version: 16.18.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-version: 8.29.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: yaml
  dependency-version: 2.7.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 10:50:18 +00:00
59f56087c6 Merge pull request #640 from JohnXLivingston/dependabot/npm_and_yarn/stylelint-config-standard-scss-14.0.0
Bump stylelint-config-standard-scss from 13.1.0 to 14.0.0
2025-05-12 12:35:57 +02:00
e47954f72b Merge pull request #639 from JohnXLivingston/dependabot/npm_and_yarn/commander-13.1.0
Bump commander from 12.1.0 to 13.1.0
2025-05-12 12:35:27 +02:00
f831962868 Bump commander from 12.1.0 to 13.1.0
Bumps [commander](https://github.com/tj/commander.js) from 12.1.0 to 13.1.0.
- [Release notes](https://github.com/tj/commander.js/releases)
- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tj/commander.js/compare/v12.1.0...v13.1.0)

---
updated-dependencies:
- dependency-name: commander
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 10:32:30 +00:00
984d5fc529 Blocking eslint-config-love upgrades for now, too many breaking changes. 2025-05-12 12:29:02 +02:00
433588d6cd Changelog. 2025-05-12 12:26:09 +02:00
a40f23380f Merge pull request #636 from JohnXLivingston/dependabot/npm_and_yarn/esbuild-0.25.0
Bump esbuild from 0.24.0 to 0.25.0
2025-05-12 12:23:33 +02:00
4d28df5687 Changelog 2025-05-12 12:17:06 +02:00
df9b9359f7 Fix shebangs (for NixOS compatibility). 2025-05-12 12:14:37 +02:00
c93e1e4fa3 Changelog 2025-05-12 12:05:46 +02:00
fa79afa42c Fix reuse linting.
Seems there is an issue with multiple copyright lines in dep5 file.
2025-05-12 12:03:42 +02:00
87431327e6 update copyright notice 2025-05-12 12:03:42 +02:00
a129a9bc4c Fix shebangs 2025-05-12 12:03:42 +02:00
561bd50a42 Merge pull request #653 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-05-12 11:33:46 +02:00
8d9541ac9b Translated using Weblate (Czech)
Currently translated at 42.8% (385 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-05-12 11:33:19 +02:00
ae012fa5b8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.7% (807 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/pt_BR/
2025-05-12 11:33:19 +02:00
e8d45a4c61 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.5% (805 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/pt_BR/
2025-05-12 11:33:19 +02:00
56f263d755 Merge pull request #654 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-05-12 11:33:14 +02:00
1b686ca183 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2025-05-12 11:20:29 +02:00
df4eb42769 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.8% (303 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2025-05-12 11:20:28 +02:00
dc2d59ca22 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.5% (302 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2025-05-12 11:20:28 +02:00
35236328b2 Fix #660: don't send headers twice on emoji router errors. 2025-05-12 11:18:29 +02:00
99a0ba6945 hopefully fix crashing 2025-05-10 23:49:38 -04:00
4ab4a0fa7f Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2025-03-12 12:58:45 -04:00
7fd895c82e Release v12.0.3. 2025-03-11 15:46:28 +01:00
5216076844 Fix #648: workaround for a regression in Firefox that breaks the scrollbar
Thanks [Raph](https://github.com/raphgilles) for the workaround!
2025-03-11 15:38:05 +01:00
04ebfc9002 Merge pull request #631 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-03-11 15:15:57 +01:00
193f15dcfc Translated using Weblate (Catalan)
Currently translated at 100.0% (899 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
98b89c19f0 Translated using Weblate (Czech)
Currently translated at 42.7% (384 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:43 +01:00
802b3de2eb Translated using Weblate (Catalan)
Currently translated at 100.0% (899 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
317e136f22 Translated using Weblate (Catalan)
Currently translated at 100.0% (899 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
e12c63c552 Translated using Weblate (Catalan)
Currently translated at 90.1% (810 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
5512d0f717 Translated using Weblate (Czech)
Currently translated at 33.2% (299 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:43 +01:00
cf8c3d67e1 Translated using Weblate (Catalan)
Currently translated at 89.5% (805 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
b9d0d0a5d2 Translated using Weblate (Catalan)
Currently translated at 76.0% (684 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
40b09ec1bf Translated using Weblate (Czech)
Currently translated at 33.2% (299 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:43 +01:00
c7be72d6a0 Translated using Weblate (Catalan)
Currently translated at 66.6% (599 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
ea837273cd Translated using Weblate (Catalan)
Currently translated at 55.5% (499 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
fa69be743a Translated using Weblate (Catalan)
Currently translated at 50.2% (452 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
cde28daff9 Translated using Weblate (Catalan)
Currently translated at 39.0% (351 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
51daea7942 Translated using Weblate (Catalan)
Currently translated at 24.5% (221 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
d236b31630 Translated using Weblate (Catalan)
Currently translated at 20.4% (184 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
1fffd32414 Translated using Weblate (Catalan)
Currently translated at 17.5% (158 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
7555e1555a Translated using Weblate (Catalan)
Currently translated at 16.3% (147 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/
2025-03-11 15:14:43 +01:00
a1f0529ce9 Translated using Weblate (Czech)
Currently translated at 31.2% (281 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:43 +01:00
f767287bd3 Translated using Weblate (Czech)
Currently translated at 25.4% (229 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
449849e9b5 Translated using Weblate (Czech)
Currently translated at 25.2% (227 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
433abc6e83 Translated using Weblate (Czech)
Currently translated at 23.4% (211 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
c1dba5d038 Translated using Weblate (Czech)
Currently translated at 22.9% (206 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
74adea194e Translated using Weblate (Czech)
Currently translated at 22.8% (205 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
c369a78d06 Translated using Weblate (Czech)
Currently translated at 21.2% (191 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
64cb5a0c22 Translated using Weblate (Czech)
Currently translated at 21.0% (189 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-03-11 15:14:42 +01:00
531d462b3f Merge pull request #630 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-03-11 15:14:30 +01:00
T.S
166482c735 Translated using Weblate (Japanese)
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2025-03-01 18:17:03 +01:00
23a29b3b2d Bump stylelint-config-standard-scss from 13.1.0 to 14.0.0
Bumps [stylelint-config-standard-scss](https://github.com/stylelint-scss/stylelint-config-standard-scss) from 13.1.0 to 14.0.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-config-standard-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-config-standard-scss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-config-standard-scss/compare/v13.1.0...v14.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard-scss
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-25 03:15:02 +00:00
c042100189 Bump esbuild from 0.24.0 to 0.25.0
Bumps [esbuild](https://github.com/evanw/esbuild) from 0.24.0 to 0.25.0.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.24.0...v0.25.0)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-12 11:00:35 +00:00
e33731c4e1 Translated using Weblate (Finnish)
Currently translated at 12.6% (40 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fi/
2025-01-30 20:55:05 +01:00
c98f117617 Translated using Weblate (Portuguese (Brazil))
Currently translated at 63.9% (202 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2025-01-10 02:28:29 +01:00
d4001cb7c7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 50.6% (160 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2025-01-02 20:00:03 +01:00
dd10174709 Merge pull request #625 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2025-01-02 15:46:30 +01:00
b98886d106 Translated using Weblate (French)
Currently translated at 83.8% (754 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2025-01-02 15:40:37 +01:00
649ba3995f Translated using Weblate (French)
Currently translated at 83.8% (754 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2025-01-02 15:40:37 +01:00
4c7a25da1e Translated using Weblate (French)
Currently translated at 83.3% (749 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2025-01-02 15:40:37 +01:00
97bb68593a Translated using Weblate (Czech)
Currently translated at 20.0% (180 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2025-01-02 15:40:37 +01:00
8e98b464f1 Differenciate pt-PT and pt-BR translations. 2025-01-02 15:40:19 +01:00
8a9d0ed446 Merge pull request #624 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2025-01-02 15:05:46 +01:00
e0e0712102 Translated using Weblate (Portuguese (Brazil))
Currently translated at 25.0% (79 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pt_BR/
2024-12-31 17:46:18 +01:00
f739dcf0c7 Added translation using Weblate (Portuguese (Brazil)) 2024-12-31 13:57:39 +01:00
f70705dc55 Translated using Weblate (French)
Currently translated at 98.4% (311 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-12-24 20:43:54 +01:00
57e65cf6ac Translated using Weblate (Catalan)
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-18 21:33:12 +01:00
87f2a3dda6 Translated using Weblate (Catalan)
Currently translated at 37.6% (119 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 21:18:41 +01:00
0720a8550d Translated using Weblate (Catalan)
Currently translated at 37.3% (118 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 21:16:43 +01:00
568add06c7 Translated using Weblate (Catalan)
Currently translated at 36.3% (115 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 21:08:09 +01:00
330552ebb4 Translated using Weblate (Catalan)
Currently translated at 35.4% (112 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 21:00:03 +01:00
ae7ab16970 Translated using Weblate (Catalan)
Currently translated at 27.2% (86 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 20:18:03 +01:00
dd29b96f8f Slovak 2024-12-17 17:05:15 +01:00
8f1bcb6f13 Changelog update. 2024-12-17 16:52:46 +01:00
affe72e919 Merge pull request #623 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-12-17 16:46:39 +01:00
d11cbfa51b Translated using Weblate (Catalan)
Currently translated at 23.1% (73 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 08:14:45 +01:00
067d53957d Translated using Weblate (Catalan)
Currently translated at 22.7% (72 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 08:12:07 +01:00
ac9e5145e4 Translated using Weblate (Catalan)
Currently translated at 20.8% (66 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ca/
2024-12-17 08:08:56 +01:00
8f722f5560 Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2024-12-11 10:32:09 -05:00
3f256b1027 Fixing gitlab CI. 2024-12-10 11:44:54 +01:00
b54c17e497 Fix styling for "configure mod_firewall" button + Peertube v7.0.0 compatibility 2024-12-10 11:41:44 +01:00
238d62f17d Changelog 2024-12-10 11:33:09 +01:00
373a3901f5 Bump version 12.0.2 2024-12-10 11:30:47 +01:00
28be2a8bbb Merge pull request #621 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-12-10 11:29:25 +01:00
f9938b5f9d Translated using Weblate (Basque)
Currently translated at 9.8% (31 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/eu/
2024-12-10 11:27:46 +01:00
2975018f91 Changelog 2024-12-10 11:27:37 +01:00
09ef387d71 Merge pull request #622 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-12-10 11:26:53 +01:00
ff8a148dbc Translated using Weblate (Czech)
Currently translated at 9.3% (84 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-10 11:25:59 +01:00
d0797ba631 Fix task list label styling. 2024-12-10 11:25:33 +01:00
1bea08654f Bump version 12.0.1 2024-12-05 19:49:47 +01:00
f35bb5c8ac Fix #618: Fix custom emojis vs upper/lower case. 2024-12-05 19:46:47 +01:00
6286ca90b9 Merge branch 'main' of gitea.nicecrew.digital:matty/peertube-plugin-livechat 2024-12-03 17:04:03 -05:00
a4bf37d534 Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2024-12-03 17:03:42 -05:00
a37438bdaf Bump v12.0.0 + npm audit fix 2024-12-03 17:36:59 +01:00
9b01d8ed09 Update ConverseJS. 2024-12-03 17:29:14 +01:00
5d3a0288d4 Merge pull request #615 from JohnXLivingston/dependabot/npm_and_yarn/multi-a001adc68c
Bump cookie, express and socket.io
2024-12-03 17:13:49 +01:00
3a0138b70d Merge pull request #593 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-12-03 17:11:06 +01:00
0d3cb9957e Bump cookie, express and socket.io
Bumps [cookie](https://github.com/jshttp/cookie), [express](https://github.com/expressjs/express) and [socket.io](https://github.com/socketio/socket.io). These dependencies needed to be updated together.

Updates `cookie` from 0.4.2 to 0.7.1
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.4.2...v0.7.1)

Updates `express` from 4.21.0 to 4.21.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.1)

Updates `socket.io` from 4.7.5 to 4.8.1
- [Release notes](https://github.com/socketio/socket.io/releases)
- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io/compare/socket.io@4.7.5...socket.io@4.8.1)

---
updated-dependencies:
- dependency-name: cookie
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
- dependency-name: socket.io
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 16:10:38 +00:00
60531dc502 Translated using Weblate (Basque)
Currently translated at 9.1% (29 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/eu/
2024-12-03 17:10:32 +01:00
1f7028703f Translated using Weblate (Czech)
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
35b802f580 Translated using Weblate (Czech)
Currently translated at 95.5% (302 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
d113b4cabe Translated using Weblate (Czech)
Currently translated at 93.6% (296 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
d2027b7fe2 Translated using Weblate (Czech)
Currently translated at 77.8% (246 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
e0d356eb35 Translated using Weblate (Czech)
Currently translated at 56.9% (180 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
437dcdb09c Translated using Weblate (Polish)
Currently translated at 31.9% (101 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pl/
2024-12-03 17:10:32 +01:00
46acb4a186 Translated using Weblate (Czech)
Currently translated at 55.3% (175 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
d6b90b87c0 Translated using Weblate (Czech)
Currently translated at 47.4% (150 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
bf9c51d80e Translated using Weblate (Czech)
Currently translated at 44.3% (140 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
7c90d40f42 Translated using Weblate (Czech)
Currently translated at 43.9% (139 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
1459a7c51b Translated using Weblate (Czech)
Currently translated at 41.4% (131 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
ec8c66d490 Translated using Weblate (Czech)
Currently translated at 37.6% (119 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
6ebcacdd41 Translated using Weblate (Czech)
Currently translated at 37.0% (117 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
940d7b630d Translated using Weblate (Czech)
Currently translated at 31.3% (99 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
575ea7cdd3 Translated using Weblate (Czech)
Currently translated at 10.7% (34 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/cs/
2024-12-03 17:10:32 +01:00
629a01e55e Merge pull request #600 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-12-03 17:10:26 +01:00
195c56b5ec Translated using Weblate (Czech)
Currently translated at 9.1% (82 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
11ae5f8e5a Translated using Weblate (Czech)
Currently translated at 7.5% (68 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
4c23e17dfe Translated using Weblate (Czech)
Currently translated at 7.1% (64 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
c511484511 Translated using Weblate (Czech)
Currently translated at 6.6% (60 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
76a25326e8 Translated using Weblate (Czech)
Currently translated at 5.4% (49 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
c51245501c Translated using Weblate (Czech)
Currently translated at 4.3% (39 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/
2024-12-03 17:09:35 +01:00
6156429e31 Merge pull request #613 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-acab3de618
Bump the minor-and-patch group across 1 directory with 8 updates
2024-12-03 17:09:30 +01:00
eb50ef5524 Merge pull request #610 from Chocobozzz/feature/peertube-v7
Add style compat with peertube v7
2024-12-03 17:06:52 +01:00
950643ac1d Bump the minor-and-patch group across 1 directory with 8 updates
Bumps the minor-and-patch group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.12.0` | `9.16.0` |
| [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) | `2.9.0` | `2.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `16.18.113` | `16.18.121` |
| [globals](https://github.com/sindresorhus/globals) | `15.11.0` | `15.13.0` |
| [sass](https://github.com/sass/dart-sass) | `1.79.5` | `1.81.1` |
| [stylelint](https://github.com/stylelint/stylelint) | `16.10.0` | `16.11.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.8.1` | `8.17.0` |
| [yaml](https://github.com/eemeli/yaml) | `2.6.0` | `2.6.1` |



Updates `@eslint/js` from 9.12.0 to 9.16.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.16.0/packages/js)

Updates `@stylistic/eslint-plugin` from 2.9.0 to 2.11.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.11.0/packages/eslint-plugin)

Updates `@types/node` from 16.18.113 to 16.18.121
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `globals` from 15.11.0 to 15.13.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v15.11.0...v15.13.0)

Updates `sass` from 1.79.5 to 1.81.1
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.5...1.81.1)

Updates `stylelint` from 16.10.0 to 16.11.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.10.0...16.11.0)

Updates `typescript-eslint` from 8.8.1 to 8.17.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.17.0/packages/typescript-eslint)

Updates `yaml` from 2.6.0 to 2.6.1
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.6.0...v2.6.1)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@stylistic/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: globals
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: yaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 03:59:42 +00:00
577eec6fa4 Add style compat with peertube v7 2024-11-28 10:47:29 +01:00
2e011a8022 Merge pull request #588 from JohnXLivingston/dependabot/npm_and_yarn/eslint-config-love-84.1.1
Bump eslint-config-love from 84.1.0 to 84.1.1
2024-10-14 10:28:23 +02:00
7b91684e47 Merge pull request #587 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-fc99efc694
Bump the minor-and-patch group with 2 updates
2024-10-14 10:27:55 +02:00
0477f7e656 Merge pull request #586 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-10-14 10:26:05 +02:00
b354ac2895 Bump eslint-config-love from 84.1.0 to 84.1.1
Bumps [eslint-config-love](https://github.com/mightyiam/eslint-config-love) from 84.1.0 to 84.1.1.
- [Release notes](https://github.com/mightyiam/eslint-config-love/releases)
- [Changelog](https://github.com/mightyiam/eslint-config-love/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mightyiam/eslint-config-love/compare/v84.1.0...v84.1.1)

---
updated-dependencies:
- dependency-name: eslint-config-love
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 03:40:29 +00:00
c6340a289c Bump the minor-and-patch group with 2 updates
Bumps the minor-and-patch group with 2 updates: [stylelint](https://github.com/stylelint/stylelint) and [yaml](https://github.com/eemeli/yaml).


Updates `stylelint` from 16.9.0 to 16.10.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.9.0...16.10.0)

Updates `yaml` from 2.5.1 to 2.6.0
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.5.1...v2.6.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: yaml
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 03:40:11 +00:00
903c291e2c Translated using Weblate (Ukrainian)
Currently translated at 3.1% (28 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/uk/
2024-10-13 11:25:45 +02:00
afbece60ab Merge pull request #585 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-bfbdea340a
Bump sass from 1.79.4 to 1.79.5 in the minor-and-patch group
2024-10-11 10:24:52 +02:00
79893c5cea Bump sass from 1.79.4 to 1.79.5 in the minor-and-patch group
Bumps the minor-and-patch group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.79.4 to 1.79.5
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.4...1.79.5)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 03:31:07 +00:00
d217836bc8 Merge pull request #584 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-7898c72144
Bump globals from 15.10.0 to 15.11.0 in the minor-and-patch group
2024-10-10 10:07:33 +02:00
fee56c383d Bump globals from 15.10.0 to 15.11.0 in the minor-and-patch group
Bumps the minor-and-patch group with 1 update: [globals](https://github.com/sindresorhus/globals).


Updates `globals` from 15.10.0 to 15.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v15.10.0...v15.11.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-10 04:08:08 +00:00
b871d873c6 Better github CI configuration. 2024-10-08 17:28:30 +02:00
1e97193030 Merge pull request #578 from JohnXLivingston/dependabot/npm_and_yarn/eslint-config-love-84.1.0
Bump eslint-config-love from 66.0.0 to 84.1.0
2024-10-08 17:23:50 +02:00
bb992e29a6 Fix linting according to new rules, and disable buggy rules. 2024-10-08 17:23:18 +02:00
6836138fc1 Bump eslint-config-love from 66.0.0 to 84.1.0
Bumps [eslint-config-love](https://github.com/mightyiam/eslint-config-love) from 66.0.0 to 84.1.0.
- [Release notes](https://github.com/mightyiam/eslint-config-love/releases)
- [Changelog](https://github.com/mightyiam/eslint-config-love/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mightyiam/eslint-config-love/compare/v66.0.0...v84.1.0)

---
updated-dependencies:
- dependency-name: eslint-config-love
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 15:03:01 +00:00
77ec284ade Fix build & CI 2024-10-08 16:53:55 +02:00
3f0f6e4d3b Github CI: new job to test build and lint. 2024-10-08 16:44:46 +02:00
8a481ecb0e Merge pull request #570 from JohnXLivingston/dependabot/npm_and_yarn/types/express-5.0.0
Bump @types/express from 4.17.21 to 5.0.0
2024-10-08 16:40:18 +02:00
e1195c18d8 Bump @types/express from 4.17.21 to 5.0.0
Bumps [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) from 4.17.21 to 5.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

---
updated-dependencies:
- dependency-name: "@types/express"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 14:28:46 +00:00
ce8ec5cee4 Merge pull request #583 from JohnXLivingston/dependabot/npm_and_yarn/minor-and-patch-406fc9582c
Bump the minor-and-patch group with 9 updates
2024-10-08 16:27:23 +02:00
1aa406cae8 Bump the minor-and-patch group with 9 updates
Bumps the minor-and-patch group with 9 updates:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.10.0` | `9.12.0` |
| [@lit/context](https://github.com/lit/lit/tree/HEAD/packages/context) | `1.1.2` | `1.1.3` |
| [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) | `2.8.0` | `2.9.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `16.18.108` | `16.18.113` |
| [esbuild](https://github.com/evanw/esbuild) | `0.23.1` | `0.24.0` |
| [globals](https://github.com/sindresorhus/globals) | `15.9.0` | `15.10.0` |
| [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) | `3.2.0` | `3.2.1` |
| [sass](https://github.com/sass/dart-sass) | `1.78.0` | `1.79.4` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.6.0` | `8.8.1` |


Updates `@eslint/js` from 9.10.0 to 9.12.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.12.0/packages/js)

Updates `@lit/context` from 1.1.2 to 1.1.3
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/context/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/@lit/context@1.1.3/packages/context)

Updates `@stylistic/eslint-plugin` from 2.8.0 to 2.9.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.9.0/packages/eslint-plugin)

Updates `@types/node` from 16.18.108 to 16.18.113
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `esbuild` from 0.23.1 to 0.24.0
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.23.1...v0.24.0)

Updates `globals` from 15.9.0 to 15.10.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v15.9.0...v15.10.0)

Updates `lit` from 3.2.0 to 3.2.1
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@3.2.1/packages/lit)

Updates `sass` from 1.78.0 to 1.79.4
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.78.0...1.79.4)

Updates `typescript-eslint` from 8.6.0 to 8.8.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.8.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@lit/context"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@stylistic/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: esbuild
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: globals
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: lit
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 14:20:27 +00:00
1bb6f6fc41 update package.json 2024-10-08 16:17:01 +02:00
b2f8595198 Dependabot: trying grouping strategy. 2024-10-08 16:05:29 +02:00
36934ed56f Merge branch 'main' of gitea.nicecrew.digital:matty/peertube-plugin-livechat 2024-10-01 19:20:01 -04:00
b5e18faaaa Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2024-10-01 19:19:13 -04:00
4a29b68d57 Merge pull request #558 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-25 10:20:43 +02:00
c94f23fbe5 Translated using Weblate (Polish)
Currently translated at 30.3% (96 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/pl/
2024-09-25 10:20:00 +02:00
abfdb0f08d Fix dependabot config: use versioning-strategy: increase 2024-09-25 10:19:45 +02:00
84b21dde6d Fix: moderation delay max value was not correctly handled. 2024-09-17 11:38:18 +02:00
1b53a6ec2d Fix #300: prosody tweaking. 2024-09-17 10:34:11 +02:00
583f581192 Update ConverseJS + CSS fix. 2024-09-17 10:03:57 +02:00
3da491ea49 Merge pull request #549 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-09-17 09:10:17 +02:00
04768347f2 Translated using Weblate (Croatian)
Currently translated at 11.4% (103 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/hr/
2024-09-17 09:10:00 +02:00
261d7e0506 Merge pull request #548 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-17 09:09:55 +02:00
f98013f2be Translated using Weblate (Croatian)
Currently translated at 92.7% (293 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/hr/
2024-09-17 09:09:13 +02:00
c426f0c8c3 Merge pull request #556 from JohnXLivingston/dependabot/npm_and_yarn/typescript-eslint-8.6.0
Bump typescript-eslint from 8.5.0 to 8.6.0
2024-09-17 09:09:08 +02:00
a63240ca25 Merge pull request #557 from JohnXLivingston/dependabot/npm_and_yarn/eslint-8.57.1
Bump eslint from 8.57.0 to 8.57.1
2024-09-17 09:05:10 +02:00
05b1f0f645 Bump eslint from 8.57.0 to 8.57.1
Bumps [eslint](https://github.com/eslint/eslint) from 8.57.0 to 8.57.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.57.0...v8.57.1)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-17 03:51:28 +00:00
baf08ae321 Bump typescript-eslint from 8.5.0 to 8.6.0
Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.5.0 to 8.6.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.6.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-17 03:51:13 +00:00
149bab2fc5 TODO 2024-09-16 15:04:19 +02:00
80274ecee3 TODO 2024-09-16 15:03:14 +02:00
e08e59d625 Merge pull request #543 from JohnXLivingston/dependabot/npm_and_yarn/multi-cf87d80143
Bump send and express
2024-09-16 11:44:44 +02:00
98eb12104c Bump send and express
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.20.0 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.20.0...4.21.0)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-16 09:36:28 +00:00
3c93aad053 Merge pull request #542 from JohnXLivingston/dependabot/npm_and_yarn/eslint-config-love-66.0.0
Bump eslint-config-love from 64.0.0 to 66.0.0
2024-09-16 11:35:19 +02:00
0cc87e95e9 Disabling new @typescript-eslint/no-magic-numbers rule. 2024-09-16 11:34:44 +02:00
75dcd3ab1c Merge pull request #539 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-09-16 10:44:46 +02:00
aaea13a2fc Translated using Weblate (German)
Currently translated at 100.0% (899 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-09-16 10:42:55 +02:00
e940fdc2d3 Translated using Weblate (Arabic)
Currently translated at 13.5% (122 of 899 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ar/
2024-09-16 10:42:55 +02:00
d7e98642f5 Translated using Weblate (German)
Currently translated at 100.0% (887 of 887 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-09-16 10:42:54 +02:00
ee37e8893b Merge pull request #538 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-16 10:42:50 +02:00
T.S
8fa17b050b Translated using Weblate (Japanese)
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-09-16 10:11:24 +02:00
b336dbbc78 Translated using Weblate (German)
Currently translated at 100.0% (316 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-09-16 10:11:24 +02:00
a68a2d0e30 Translated using Weblate (Albanian)
Currently translated at 62.6% (198 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-09-16 10:11:24 +02:00
99371bcdec Translated using Weblate (Albanian)
Currently translated at 62.3% (197 of 316 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-09-16 10:11:24 +02:00
1bdd7df712 Translated using Weblate (German)
Currently translated at 100.0% (311 of 311 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-09-16 10:11:24 +02:00
3ec4482043 Fix dependabot config. 2024-09-16 10:11:10 +02:00
9a30958979 Bump eslint-config-love from 64.0.0 to 66.0.0
Bumps [eslint-config-love](https://github.com/mightyiam/eslint-config-love) from 64.0.0 to 66.0.0.
- [Release notes](https://github.com/mightyiam/eslint-config-love/releases)
- [Changelog](https://github.com/mightyiam/eslint-config-love/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mightyiam/eslint-config-love/compare/v64.0.0...v66.0.0)

---
updated-dependencies:
- dependency-name: eslint-config-love
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-16 03:47:41 +00:00
538ec28da9 Fix typo. 2024-09-12 17:36:48 +02:00
9824435b6e New features: announcements WIP (#518):
* Documentation.
2024-09-12 12:54:16 +02:00
4e436c00f0 New features: announcements WIP (#518):
* handling message correction.
2024-09-12 12:07:55 +02:00
f0088671ea New features: announcements WIP (#518):
* prevent annoucement spoofing on backend.
2024-09-12 11:44:35 +02:00
d92bf9073e New features: announcements WIP (#518):
* Front-end implementation finished.
* Refactoring.
2024-09-12 11:17:44 +02:00
8944bb95d8 New features: announcements WIP (#518). 2024-09-11 19:27:02 +02:00
b357619f7a Merge pull request #536 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-11 14:38:05 +02:00
T.S
5e754b0103 Translated using Weblate (Japanese)
Currently translated at 99.6% (310 of 311 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-09-11 13:36:12 +02:00
7e2f6ede65 Translated using Weblate (French)
Currently translated at 100.0% (311 of 311 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-09-11 13:36:12 +02:00
91d6782a3c Translated using Weblate (German)
Currently translated at 98.3% (306 of 311 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-09-11 13:36:12 +02:00
35c486035e Translated using Weblate (English)
Currently translated at 100.0% (311 of 311 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/en/
2024-09-11 13:36:11 +02:00
b66b0aa315 Fix emoji picker colors and size. 2024-09-11 12:40:23 +02:00
0b196805b2 Updating ConverseJS (v11 WIP) with latest fixes. 2024-09-11 11:54:50 +02:00
33be9b3fc5 Update dependencies:
* update @tsconfig/nodes12 to @tsconfig/node16
* Peertube >= 5.2.0 required
2024-09-11 11:29:28 +02:00
1d0a7a97d2 Missing SPDX 2024-09-11 10:39:57 +02:00
89f1f42e7a npm run doc:translate. 2024-09-11 10:37:02 +02:00
c2430856b4 Documentation:
* no_duplicate documentation
* livechat_version_notice documentation
* fix typo in english string
2024-09-11 10:34:47 +02:00
4c84146cff Replace v11.1.0 by v12.0.0:
There will probably be some breaking changes, so renaming v11.1.0 to
v12.0.0.
Also fixing a typo in a filename.
2024-09-11 10:34:47 +02:00
6f479d26c5 Moving max and default values in constants. 2024-09-11 10:34:47 +02:00
5225257bb5 New option for the moderation bot: forbid duplicate messages (#516). 2024-09-11 10:34:44 +02:00
651641f63c Fix typo 2024-09-11 10:33:51 +02:00
8dcd3ef488 Merge pull request #533 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-11 10:32:28 +02:00
T.S
2d5fec25c7 Translated using Weblate (Japanese)
Currently translated at 100.0% (307 of 307 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-09-11 03:55:41 +02:00
5566f4b6cf Prosody modules: fix lua 5.3/5.4 compatibility:
Lua 5.3 comes with new integers type, and can fail if floats are used
where integers are wanted.
2024-09-10 17:58:12 +02:00
5018d04b78 Documentation: livechat_version_notice strings migration. 2024-09-10 12:35:07 +02:00
c65995e5fa Documentation: new shortcode for livechat version notices. 2024-09-10 12:02:40 +02:00
071ee9f6b4 Dependabot: daily update. 2024-09-10 11:11:28 +02:00
3e23d2751f Update @tsconfig/node12 2024-09-10 11:10:00 +02:00
9731835c31 Fixing again dependabot config file. 2024-09-10 11:08:18 +02:00
e6381c7bba Merge pull request #527 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-09-10 11:06:10 +02:00
ace8ad72f5 Translated using Weblate (German)
Currently translated at 100.0% (891 of 891 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-09-10 11:05:26 +02:00
50309c6ba9 Merge pull request #525 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-10 11:05:22 +02:00
0c220b2fc4 Translated using Weblate (German)
Currently translated at 100.0% (306 of 306 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-09-10 11:03:59 +02:00
T.S
1ce68eec7e Translated using Weblate (Japanese)
Currently translated at 100.0% (306 of 306 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-09-10 11:03:59 +02:00
5f4cc7c46e Fix dependabot conf file. 2024-09-10 11:03:51 +02:00
7330729ac1 Enabling dependabot. 2024-09-10 10:59:33 +02:00
d5a25af6c8 npm audit fix 2024-09-10 10:41:56 +02:00
634e894522 Updating stylelint dependencies. 2024-09-10 10:38:45 +02:00
4f2fbfc228 Updating other dependencies. 2024-09-10 10:23:16 +02:00
4b5f83c45f Updating dependencies. 2024-09-10 10:15:35 +02:00
c561851bb6 Fix a regression in OIDC handling. 2024-09-09 21:21:44 +02:00
edca1be70a Final eslint 8.57 adjustements.
There are still some FIXME, but should be enought for now.
2024-09-09 20:37:45 +02:00
fd27105c2c eslint 8.57 WIP:
* tweaking some more rules.
* fixing linting.
2024-09-09 20:01:25 +02:00
c010758164 eslint 8.57 WIP:
* tweaking rules
* fixing issues
2024-09-09 18:47:21 +02:00
7b3d93b290 Typescript v5 + eslint 8.57 WIP
This commit also improves some type handling in the project.
2024-09-09 15:57:04 +02:00
15ea3c8306 re-enable colorized usernames 2024-09-07 15:48:55 -04:00
bcabf148ad disable colorize_usernames in ConverseJS 2024-09-07 09:38:38 -04:00
64a9c7be21 Fix typo. 2024-09-07 12:56:35 +02:00
b5990f0c1d Documentation: fix livechat_label regression (#514). 2024-09-07 12:52:25 +02:00
f15d3ed542 New option for the moderation bot:
* forbid messages with too many special characters (#517).
* update moderation bot to v0.4.0.
* refactoring localization segments to reuse existing one in multiple
  context.
* npm run doc:translate
2024-09-07 12:40:38 +02:00
b6028ef740 Changelog 2024-09-07 12:21:32 +02:00
e61db352c7 Merge pull request #521 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-09-07 12:14:04 +02:00
b3d74a3816 Translated using Weblate (German)
Currently translated at 100.0% (888 of 888 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-09-07 12:13:45 +02:00
122ab9725b Merge pull request #513 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-07 12:13:40 +02:00
ac64c27c3e Translated using Weblate (German)
Currently translated at 100.0% (302 of 302 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-09-07 08:09:03 +02:00
8ad762eaa2 Translated using Weblate (Albanian)
Currently translated at 66.2% (196 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-09-06 16:02:50 +02:00
acce1c5a5c Reverting typescript version to 4.3.5, because it breaks linting. 2024-09-06 16:02:22 +02:00
e57d5b0f30 npm run doc:translate 2024-09-06 12:35:38 +02:00
b45ab79c0e Emoji only mode documentation. 2024-09-06 12:30:43 +02:00
91cddfa8d8 Emoji only mode WIP:
* Button to enable it on all rooms.
2024-09-06 11:53:07 +02:00
08017ac2bb Emoji only mode WIP:
* refactoring + optimization
* migration
2024-09-06 11:01:48 +02:00
7e0cfee8f1 Merge branch 'main' of https://github.com/JohnXLivingston/peertube-plugin-livechat 2024-09-05 22:17:17 -04:00
b115c28ee7 Fix typo. 2024-09-05 19:22:58 +02:00
5db4f46421 Emoji only mode WIP:
Fix emojis regexp. The RCPE2 library can't handle long regexp, so we
switch to Oniguruma.
2024-09-05 19:12:07 +02:00
1a75b30c50 Emoji only mode WIP 2024-09-05 18:28:54 +02:00
2f78b901e3 v11.0.1:
* Fix "send message" button that was sending the message twice.
* Bump v11.0.1
2024-09-03 15:28:57 +02:00
575703a7e5 Bump v11.0.0 + npm audit fix. 2024-09-03 14:42:14 +02:00
8e0f239993 Fix typo. 2024-09-03 14:16:03 +02:00
8a1948520d Fix regression for muc sidebar (related to Converse upstream). 2024-09-02 17:07:58 +02:00
0fe0ebfb3e Fix css regression (related to Converse upstream). 2024-09-02 14:52:07 +02:00
9ee4476f4d Fix: improved minimum chat width. 2024-09-02 14:39:26 +02:00
0e98cbaba5 ConverseJS upstream update:
* update ConverseJS version
* remove concord theme from settings (and migrate to peertube)
* added cyberpunk theme
* fixed settings localization
2024-09-02 12:11:21 +02:00
22dc4db61b Merge pull request #511 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-09-02 11:53:31 +02:00
42147148ea Translated using Weblate (German)
Currently translated at 100.0% (880 of 880 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-09-02 11:47:09 +02:00
87e8f9fd39 Translated using Weblate (Arabic)
Currently translated at 13.2% (117 of 880 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ar/
2024-09-02 11:47:09 +02:00
033a86b3a6 Changelog. 2024-09-02 11:47:01 +02:00
8394e7222d Update Typescript version. 2024-09-02 11:46:10 +02:00
d8fc90dd1f Merge pull request #512 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-09-02 11:44:31 +02:00
04db24b6af Translated using Weblate (Albanian)
Currently translated at 65.8% (195 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-08-30 22:08:35 +02:00
b0d65add1f Translated using Weblate (Galician)
Currently translated at 10.1% (30 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/gl/
2024-08-30 22:08:35 +02:00
6b69f0bf46 Translated using Weblate (Arabic)
Currently translated at 31.7% (94 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ar/
2024-08-30 22:08:34 +02:00
T.S
6373af32ba Translated using Weblate (Japanese)
Currently translated at 100.0% (296 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-08-30 22:08:34 +02:00
d87cdbb1ff Translated using Weblate (German)
Currently translated at 100.0% (296 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-30 22:08:34 +02:00
5d87121631 npm run doc:translate 2024-08-30 16:24:35 +02:00
c205acbb17 Improved documentation accessibility (#118):
* Adding alts and titles on screenshots. Alts are now descriptive.
2024-08-30 16:21:16 +02:00
5462e3d52f Documentation: fix titles using livechat_label shortcode
This fix will avoid weird "hahahugoshortcode" anchor and title in the
navigation menu.
2024-08-30 14:19:37 +02:00
ef5bc3cb8a Fix gitlab CI. 2024-08-30 12:39:34 +02:00
d8da3ca3b8 Improved documentation accessibility (#118):
* borders on focused links.
2024-08-30 12:39:34 +02:00
3d8fbba767 Documentation: improve home links. 2024-08-30 12:39:33 +02:00
8183dc82bb Documentation: stable language selector order. 2024-08-30 12:39:33 +02:00
a799a9c07e Improved documentation accessibility (#118):
* underline links in the right footer.
2024-08-30 12:39:33 +02:00
6eeb19607f Improved documentation accessibility (#118):
* `white-space: normal` for the breadcrumbs, to avoid it to be
  truncated.
2024-08-30 12:39:33 +02:00
56547cc084 Improved documentation accessibility (#118):
* better contrast.
2024-08-30 12:39:33 +02:00
75925b1117 Documentation: migrating from hugo-theme-learn to hugo-theme-relearn 2024-08-30 12:39:27 +02:00
2824bd1e38 Merge pull request #505 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-30 12:38:34 +02:00
T.S
7293f4a6d5 Translated using Weblate (Japanese)
Currently translated at 6.8% (60 of 879 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ja/
2024-08-30 12:37:54 +02:00
f7ddd58a2c Translated using Weblate (German)
Currently translated at 100.0% (879 of 879 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-30 12:37:54 +02:00
4a747d7314 Merge pull request #508 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-08-30 12:37:48 +02:00
f5074934e4 Translated using Weblate (French)
Currently translated at 100.0% (296 of 296 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-08-29 21:15:47 +02:00
6c0b5e1c19 Translated using Weblate (French)
Currently translated at 96.6% (285 of 295 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-08-29 14:36:05 +02:00
T.S
1b75f3d504 Translated using Weblate (Japanese)
Currently translated at 100.0% (295 of 295 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-08-29 14:36:05 +02:00
b673a49af6 Improved accessibility (#118):
* channel configuration: adding title to inputs.
* channel configuration: `aria-hidden="true"` on icons for add and
  remove row buttons.
2024-08-29 12:20:36 +02:00
944bdcebb7 Improved accessibility (#118):
* aria-hidden on the channel avatar in the `p/livechat/configuration`
  page.
2024-08-29 11:28:58 +02:00
c6d012cfb4 Including Converse accessibility fixes. 2024-08-29 11:28:30 +02:00
0732bd1de3 Improved accessibility (#118):
* top chat button accessibility improved (role, aria-hidden for icons,
  tabindex for keyboard navigation, ...)
2024-08-20 17:52:53 +02:00
e65bd5c426 Improved accessibility (#118):
* Adding a role="region" and an aria-label="Chat" on the chat container.
2024-08-20 17:24:18 +02:00
3177c31b08 Improved accessibility (#118):
* Fix autocomplete vs tab key
2024-08-20 16:59:08 +02:00
cee42b4bcc Improved accessibility (#118):
* adding role="button" or type="button" where missing.
2024-08-20 15:30:45 +02:00
9e252193d4 Fix #504: better prosodyctl documentation 2024-08-19 10:58:49 +02:00
08eb466e27 Merge pull request #502 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-08-19 10:55:09 +02:00
0cf5647a89 Translated using Weblate (Chinese (Traditional))
Currently translated at 51.5% (152 of 295 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/zh_Hant/
2024-08-19 10:54:35 +02:00
4113259975 Translated using Weblate (German)
Currently translated at 100.0% (295 of 295 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-19 10:54:35 +02:00
4bdf40e905 Merge pull request #501 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-19 10:54:27 +02:00
a385204256 Translated using Weblate (German)
Currently translated at 100.0% (879 of 879 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-15 11:38:20 +02:00
e1d1dd94e6 Update documentation. 2024-08-13 10:49:35 +02:00
940e8c9ac4 Merge pull request #500 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-13 10:47:04 +02:00
9a22ab7f18 Translated using Weblate (German)
Currently translated at 100.0% (862 of 862 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-13 10:37:16 +02:00
8e99199f29 New option to use and configure Prosody mod_firewall WIP (#97):
* new setting
* new configuration screen for Peertube admins
* include the mod_firewall module
* load mod_firewall if enabled
* sys admin can disable the firewall config editing by creating a
  special file on the disk
* user documentation
2024-08-13 10:35:47 +02:00
481f265a44 Merge pull request #498 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-12 14:19:06 +02:00
6fd8383439 Translated using Weblate (French)
Currently translated at 95.4% (823 of 862 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2024-08-12 13:25:35 +02:00
54c31500a3 Fix typo. 2024-08-12 12:09:32 +02:00
e08c413682 Merge pull request #497 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-12 12:08:16 +02:00
73845eb5d4 Translated using Weblate (French)
Currently translated at 94.0% (811 of 862 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2024-08-12 12:07:50 +02:00
a47737967a Merge pull request #496 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-12 12:04:14 +02:00
67b89f1aef Translated using Weblate (German)
Currently translated at 100.0% (862 of 862 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-12 12:04:00 +02:00
e1e91c2984 Merge pull request #494 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-08-12 12:03:55 +02:00
a813ceb723 Translated using Weblate (German)
Currently translated at 100.0% (285 of 285 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-12 11:58:01 +02:00
cd0813fb14 Translated using Weblate (French)
Currently translated at 100.0% (285 of 285 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-08-12 11:58:01 +02:00
62caa63dc5 ConverseJS: using a version with the occupant actions on the right. 2024-08-12 11:57:31 +02:00
ef1b49f291 Fix: increase chat height on small screens, try to better detect the device viewport size and orientation. 2024-08-07 00:09:55 +02:00
b8db486410 Message search results: display original nickname if has changed. 2024-08-06 17:54:07 +02:00
df75659a05 Merge pull request #492 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-08-06 17:37:43 +02:00
a3555ed3cd Translated using Weblate (Albanian)
Currently translated at 68.3% (194 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-08-06 17:35:19 +02:00
fd7d24c121 Translated using Weblate (French)
Currently translated at 100.0% (284 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-08-06 17:35:19 +02:00
a9ae96622a Translated using Weblate (German)
Currently translated at 98.9% (281 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-06 17:35:19 +02:00
4afc0b6ab8 Translated using Weblate (German)
Currently translated at 100.0% (284 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-06 17:35:18 +02:00
ad5397b3c7 Adding actions on the occupant list. 2024-08-06 17:32:37 +02:00
49e11d2b6b Include a Converse fix. 2024-08-06 15:50:40 +02:00
df7981f896 Including a Converse Fix. 2024-08-06 12:25:26 +02:00
003cb24dd8 Updating Converse upstream (with bootstrap5):
* bootstrap 5 compatibility
* other Converse updates integration
* hack to get the sidebar work as with Converse v10.
* modal onHide was renamed close.
* fix slow mode infobox margin.
* fix margin
* shorter action label, for better dropdown UX.
2024-08-06 12:04:28 +02:00
33da4314af Merge pull request #490 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-08-06 11:46:13 +02:00
c2c1211b9a Translated using Weblate (German)
Currently translated at 100.0% (857 of 857 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-06 11:45:27 +02:00
5d843ebf92 Translated using Weblate (German)
Currently translated at 100.0% (851 of 851 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-08-06 11:45:27 +02:00
18fa3aec10 Merge pull request #489 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-08-06 11:45:20 +02:00
18a1c2f71c better nigbot avatar sizing 2024-08-05 22:04:24 -04:00
21ecdf77c6 I don't think it worked 2024-08-05 21:49:12 -04:00
cfe2ac0607 maybeee?? 2024-08-05 21:46:02 -04:00
74566a895a fix duplicate requires 2024-08-05 21:28:09 -04:00
587334a3e1 separate the nigbot generation and normal avatar generation 2024-08-05 21:26:11 -04:00
30cce2ec03 probably fix issue with Nigbot avatar generation 2024-08-05 21:10:10 -04:00
24f48788ab wheee 2024-08-05 21:04:55 -04:00
bed00aa4c5 niggers are so black tbh 2024-08-05 20:44:04 -04:00
fd16c95b8f add nigbot build job 2024-08-05 20:29:46 -04:00
39f6e4c637 maybe fr fr? 2024-08-05 20:12:46 -04:00
f8c34213cb maybe fr fr fix it? 2024-08-05 19:46:09 -04:00
eb889711f5 fix invalid-avatar set 2024-08-05 19:32:57 -04:00
8dd6ed7888 hopefully fix avatar generation for nigbot avatar 2024-08-05 19:25:45 -04:00
0cc38ac575 update index.md 2024-08-05 19:20:28 -04:00
cde9b3f74a add options in config 2024-08-05 17:54:22 -04:00
75245c0858 add nigbot avatar 2024-08-05 17:42:01 -04:00
631d8c7a6b Translated using Weblate (French)
Currently translated at 100.0% (284 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-08-05 19:39:57 +02:00
9746f3d86e Translated using Weblate (English)
Currently translated at 100.0% (284 of 284 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/en/
2024-08-05 19:39:57 +02:00
d412f86577 Translated using Weblate (German)
Currently translated at 100.0% (282 of 282 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-08-05 12:10:36 +02:00
e665823f5b Message search documentation (#145) 2024-08-05 12:08:45 +02:00
966669ebbc Search user messages WIP (#145) 2024-08-05 11:44:11 +02:00
be59329581 from 30 to 800 kb for emojis 2024-08-01 21:17:31 -04:00
4181661faf Search user messages WIP (#145) 2024-08-01 18:58:25 +02:00
dd03075831 Fix naming. 2024-08-01 17:14:07 +02:00
a4497739fa Search user messages WIP (#145) 2024-08-01 16:54:31 +02:00
cdbe97137e Moderation notes technical documentation. 2024-07-31 23:28:10 +02:00
7892fd6c03 Fix doc link + add missing chapter. 2024-07-31 23:19:48 +02:00
0543a720f2 Fix REUSE. 2024-07-31 23:00:29 +02:00
af2941f4e0 npm run doc:translate 2024-07-31 22:50:38 +02:00
3004105b5e Moderator notes WIP (#144):
* user documentation
2024-07-31 22:48:16 +02:00
bb2aca71c1 Moderator notes WIP (#144):
* Fix notes occupants when unknown
* notes.getAboutOccupant result cache
2024-07-31 22:48:16 +02:00
48763e6173 Moderator notes WIP (#144):
Displaying the nickname at time of note creation if it changed.
2024-07-31 22:48:16 +02:00
70f702f78e Fix: clicking on the current user nickname in message history was failing to open the profile modal. 2024-07-31 22:48:16 +02:00
a46425d51f Moderator notes WIP (#144) 2024-07-31 22:48:15 +02:00
e81a7c90b8 Adding the commit id for jcbrand/bootstrap5 (commented) 2024-07-31 22:48:15 +02:00
9c2b84027a Moderator notes WIP (#144) 2024-07-31 22:48:15 +02:00
704e660f37 Moderator notes WIP (#144) 2024-07-31 22:48:15 +02:00
31c4e5a646 Updating Converse upstream. 2024-07-31 22:48:15 +02:00
1c749f68bc Fix new task order + fix notes order. 2024-07-31 22:48:15 +02:00
fbc9a39485 Refactoring: moving the draggable code in a common class. 2024-07-31 22:48:15 +02:00
eb76e7ebb9 Moderator notes WIP (#144) 2024-07-31 22:48:14 +02:00
20cb668e09 Muc-app: some refactoring. 2024-07-31 22:48:14 +02:00
86cac34ef3 Muc-app: cleaning code. 2024-07-31 22:48:14 +02:00
074e688ed8 New moderator app WIP:
* #144: moderator notes WIP,
* plugin size: adding an API,
* refactoring the code from the task app, to create a new MUC App
  system.
2024-07-31 22:48:14 +02:00
34da786b65 Merge pull request #485 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-07-31 22:47:49 +02:00
a700263eda Translated using Weblate (German)
Currently translated at 100.0% (272 of 272 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-07-31 22:47:37 +02:00
1b92e7287d Merge pull request #484 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-07-31 22:47:31 +02:00
bf8f3a08ec Translated using Weblate (German)
Currently translated at 100.0% (812 of 812 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-07-30 08:49:55 +02:00
6d103af5c9 Merge tag 'v10.3.3' of https://github.com/JohnXLivingston/peertube-plugin-livechat
v10.3.3

Minor changes and fixes:

* Fix #481: Moderation bot was not able to connect when remote chat was disabled.
* Some cleaning in code generating Prosody configuration file.
2024-07-29 19:44:23 -04:00
faef584f8b npm run doc:translate 2024-07-29 15:00:02 +02:00
ce5114afc9 mod_muc_anonymize_moderation_actions: fix XEP-0425 v0.2.1 compliance. 2024-07-29 15:00:02 +02:00
c5bcb9fc14 Fix mod_muc_moderation + anonymize moderation events (#137) 2024-07-29 15:00:02 +02:00
6e92882176 Fix mod_muc_moderation regression:
See https://issues.prosody.im/1862
2024-07-29 15:00:02 +02:00
ebc8fc8797 Option to hide moderator name who made actions WIP (#137). 2024-07-29 15:00:02 +02:00
38f2b2af57 prosody-modules: preparing some modules for publication on
prosody-modules repo
2024-07-29 15:00:02 +02:00
b7c595214b Updated mod_muc_moderation to upstream. 2024-07-29 15:00:01 +02:00
58676a5508 Merge pull request #482 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-07-29 14:59:01 +02:00
12f11e4468 Translated using Weblate (French)
Currently translated at 100.0% (270 of 270 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/fr/
2024-07-26 13:07:22 +02:00
e1252709b3 Translated using Weblate (German)
Currently translated at 100.0% (270 of 270 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/de/
2024-07-26 10:58:36 +02:00
80d458c445 Changelog. 2024-07-26 10:58:26 +02:00
f88520d925 Implements #146: copy message button for moderators
We overload the copy message method that comes with Converse 11, to add
the message metadata (nick and full date).
2024-07-26 10:51:55 +02:00
dd4bca8c06 Fix Converse v11 regression - occupant comparator function:
The way we overloaded the MUCOccupants method was no more working.
2024-07-25 18:32:38 +02:00
81632fa467 livechat-specific Converse plugin: refactoring 2024-07-25 18:03:46 +02:00
c6c365abf0 Avatar set for anonymous users: new 'none' choice (that will fallback to Converse new colorized avatars). 2024-07-25 15:34:27 +02:00
099ff28c76 Merge branch 'release/10.3.x' 2024-07-25 12:17:20 +02:00
e57d39c8ab Fix #481:
* Moderation bot was not able to connect when remote chat was disabled.
* Some cleaning in code generating Prosody configuration file.
* Bump version 10.3.3
2024-07-25 12:09:55 +02:00
b40b3a2716 Changelog. 2024-07-25 11:12:49 +02:00
731be16e53 Merge pull request #479 from framabot/weblate-peertube-livechat-peertube-plugin-livechat-documentation
Translations update from Framasoft Weblate
2024-07-25 11:10:31 +02:00
a7bd0c1c3e Translated using Weblate (German)
Currently translated at 100.0% (809 of 809 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/
2024-07-25 11:10:11 +02:00
e938f79182 Translated using Weblate (Croatian)
Currently translated at 13.1% (106 of 809 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/hr/
2024-07-25 11:10:11 +02:00
36323569c0 Translated using Weblate (French)
Currently translated at 100.0% (809 of 809 strings)

Translation: PeerTube LiveChat/Peertube Plugin Livechat Documentation
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/fr/
2024-07-25 11:10:11 +02:00
e7b1376a43 Merge pull request #480 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-07-25 11:10:04 +02:00
9526a19aab what the fuck 2024-07-20 22:45:58 -04:00
T.S
1b4ccf6693 Translated using Weblate (Japanese)
Currently translated at 63.5% (171 of 269 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/ja/
2024-07-20 15:42:47 +02:00
d4ecafb6de Translated using Weblate (Croatian)
Currently translated at 90.3% (243 of 269 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/hr/
2024-07-19 21:15:39 +02:00
20550bc3d7 Merge pull request #478 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-07-18 16:45:40 +02:00
548b79a3a6 Translated using Weblate (Albanian)
Currently translated at 71.7% (193 of 269 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-07-18 16:43:55 +02:00
ed0b2eb913 ConverseJS merge. 2024-07-18 10:39:40 +02:00
bdc11cb92e Merge branch 'release/10.3.x' 2024-07-18 10:29:12 +02:00
db1993f97e Fix #477: ended polls never disappear when archiving is disabled (and no more than 20 new messages). 2024-07-18 10:24:54 +02:00
8b0d72bf13 Fix Converse bug. 2024-07-17 11:48:43 +02:00
64f03e5454 Documentation. 2024-07-17 10:53:53 +02:00
522265db5c Changelog. 2024-07-17 10:48:14 +02:00
22daa45b92 Converse update. 2024-07-17 10:47:30 +02:00
76cd519c00 Merge pull request #475 from framabot/weblate-peertube-livechat-peertube-plugin-livechat
Translations update from Framasoft Weblate
2024-07-17 10:46:26 +02:00
123f9a5a8a Translated using Weblate (Albanian)
Currently translated at 62.4% (168 of 269 strings)

Translation: PeerTube LiveChat/Peertube Plugin LiveChat
Translate-URL: https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat/sq/
2024-07-16 14:36:05 +02:00
555 changed files with 54212 additions and 17957 deletions

View File

@ -1,14 +0,0 @@
{
"root": true,
"env": {},
"extends": [],
"globals": {},
"plugins": [],
"ignorePatterns": [
"node_modules/", "dist/", "webpack.config.js",
"build/",
"vendor/",
"support/documentation",
"build-*js"],
"rules": {}
}

View File

@ -1,3 +0,0 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

49
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,49 @@
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10
groups:
minor-and-patch:
applies-to: version-updates
update-types:
- "patch"
- "minor"
versioning-strategy: increase
ignore:
- dependency-name: typescript
versions:
- ">=5.6.0" # linting libs are not ready for 5.6
- dependency-name: "@types/node"
versions:
- ">=17.0.0" # must be set to the Peertube required version.
- dependency-name: "@peertube/peertube-types"
versions:
- ">5.2.0" # must be set to the Peertube required version.
- dependency-name: eslint
versions:
- ">=9.0.0" # not ready for v9, missing dependencies.
- dependency-name: "@stylistic/eslint-plugin"
versions:
- ">=4.0.0" # needs eslint >= 9.0.0
- dependency-name: got
versions:
- ">=12.0.0" # breaking changes, must adapt code.
- dependency-name: "@typescript-eslint/parser"
versions:
- ">=8.5.0" # for now 8.5.0 is broken because of the lack of ./tsconfig.json file. Must fix conf.
- dependency-name: "eslint-config-love"
versions:
- ">=85.0.0" # Versions goes up to 118 very quickly. Too much breaking changes. We must do this progressively.
- dependency-name: "openid-client"
versions:
- ">=6.0.0" # this is a complete rewrite. We have to check if it is compatible.

34
.github/workflows/gh-build.yml vendored Normal file
View File

@ -0,0 +1,34 @@
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only
name: github build and lint
on:
push:
branches:
- main
pull_request:
types: [assigned, opened, synchronize, reopened]
jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
submodules: false # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- uses: actions/setup-node@v4
with:
node-version: '20.x'
- name: Install build dependencies
run: sudo apt update && sudo apt install wget reuse -y
- name: Build
run: npm install
- name: Lint
run: npm run lint

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only
@ -33,7 +33,7 @@ jobs:
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.80.0'
hugo-version: '0.132.2'
extended: true
- name: Generate documentation translations

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only
@ -19,10 +19,10 @@ builddoctranslations:
pages:
stage: deploy
image: registry.gitlab.com/pages/hugo/hugo_extended:latest
image: registry.gitlab.com/pages/hugo/hugo_extended:0.132.2
variables:
GIT_SUBMODULE_STRATEGY: recursive
GIT_SUBMODULE_PATHS: support/documentation/themes/hugo-theme-learn
GIT_SUBMODULE_PATHS: support/documentation/themes/hugo-theme-relearn
script:
# gitlab need the generated documentation to be in the /public dir.
- hugo -s support/documentation/ --minify -d ../../public/ --baseURL='https://livingston.frama.io/peertube-plugin-livechat/'

8
.gitmodules vendored
View File

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only
[submodule "documentation/themes/hugo-theme-learn"]
path = support/documentation/themes/hugo-theme-learn
url = https://github.com/matcornic/hugo-theme-learn.git
[submodule "support/documentation/themes/hugo-theme-relearn"]
path = support/documentation/themes/hugo-theme-relearn
url = https://github.com/McShelby/hugo-theme-relearn.git

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
#
# SPDX-License-Identifier: AGPL-3.0-only

View File

@ -10,25 +10,29 @@ Source: https://github.com/JohnXLivingston/peertube-plugin-livechat/
# License: ...
Files: CHANGELOG.md
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: languages/*
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: support/documentation/po/*
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: support/documentation/content/en/*
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: .github/ISSUE_TEMPLATE/*
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: .github/PULL_REQUEST_TEMPLATE.md
Copyright: 2024 John Livingston <https://www.john-livingston.fr/>
Copyright: 2024-2025 John Livingston <https://www.john-livingston.fr/>
License: AGPL-3.0-only
Files: prosody-modules/mod_firewall/*
Copyright: Prosody Community Modules <https://modules.prosody.im/mod_firewall>
License: MIT

View File

@ -1,8 +1,8 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
'use strict';
'use strict'
module.exports = {
extends: [
@ -14,7 +14,7 @@ module.exports = {
// extending the kebab-case to accept ConverseJS class names.
'^([a-z][a-z0-9]*)(-[a-z0-9]+)*((__|--)[a-z]+(-[a-z0-9]+)*)?$',
{
message: 'Expected class selector to be kebab-case, or ConverseJS-style.',
message: 'Expected class selector to be kebab-case, or ConverseJS-style.'
}
]
}

View File

@ -1,10 +1,168 @@
# Changelog
## 11.0.0 (Not Released Yet)
## 13.0.0
**Important note**: if you got an error on updating the plugin, please try to restart Peertube and install it again.
### Security Fix
Severity: low.
[Radically Open Security](radicallyopensecurity.com) reported a security vulnerability: a malicious user can forge a malicious Regular Expression to cause a [ReDOS](https://en.wikipedia.org/wiki/ReDoS) on the Chat Bot.
Such attack would only make the bot unresponsive, and won't affect the Peertube server or the XMPP server.
This version mitigates the attack by using the [RE2](https://github.com/google/re2) regular expression library.
Thanks [NlNet](https://nlnet.nl/) for funding the security audit.
### Breaking changes
#### Bot timers
There was a regression some months ago in the "bot timer" functionnality.
In the channels settings, the delay between two quotes is supposed to be in minutes, but in fact we applied seconds.
We don't have any way to detect if the user meant seconds or minutes when they configured their channels (it depends if it was before or after the regression).
So we encourage all streamers to go through their channel settings, check the frequency of their bot timers (if enabled), set them to the correct value, and save the form.
Users must save the form to be sure to apply the correct value.
#### Bot forbidden words
When using regular expressions for the forbidden words, the chat bot now uses the [RE2](https://github.com/google/re2) regular expression library.
This library does not support all character classes, and all regular expressions that were previously possible (with the Javascript RegExp class).
For more information about the accepted regular expression, please refer to the [documentation](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/bot/forbidden_words/#consider-as-regular-expressions).
If you configured non-compatible regular expressions, the bot will just ignore them, and log an error.
When saving channel's preference, if non-compatible regular expression is used, an error will be shown.
### Minor changes and fixes
* Translations updates.
* Dependencies updates.
* Fix #329: auto focus message field after anonymous user has entered nickname (Thanks [Axolotle](https://github.com/axolotle).
* Fix #392: add draggable items touch screen handling (Thanks [Axolotle](https://github.com/axolotle).
* Fix #506: hide offline users by default in occupant list (Thanks [Axolotle](https://github.com/axolotle).
* Fix #547: add button to go to the end of the chat (Thanks [Axolotle](https://github.com/axolotle).
* Fix #503: set custom emojis max height to text height + bigger when posted alone (Thanks [Axolotle](https://github.com/axolotle).
* Fix: Converse bottom panel messages not visible on new Peertube v7 theme (for example for muted users).
* Fix #75: New short video urls makes it difficult to use the settings «Activate chat for these videos».
* Fix moderation notes: fix filter button wrongly displayed on notes without associated occupant.
* Fix tasks: checkbox state does not change when clicked.
* Fix: bot timer can't be negative or null.
* Fix #626: Bot timer was buggy, using seconds as delay instead of minutes.
* Fix: message deletions were not properly anonymized when using "Anonymize moderation actions" option.
## 12.0.4
### Minor changes and fixes
* Fix #660: don't send headers twice on emoji router errors.
* Fix shebangs (for NixOS compatibility).
* Translations updates.
* Updating various dependencies.
* Adding a warning in settings if theme is not set to Peertube or if autocolors are disabled.
## 12.0.3
### Minor changes and fixes
* Translations updates.
* Slovak translation integration.
* Differenciate pt-PT and pt-BR translations.
* Fix styling for "configure mod_firewall" button + Peertube v7.0.0 compatibility.
* Fix #648: workaround for a regression in Firefox that breaks the scrollbar (Thanks [Raph](https://github.com/raphgilles) for the workaround!).
## 12.0.2
### Minor changes and fixes
* Fix task list label styling.
* Translations updates.
## 12.0.1
### Minor changes and fixes
* Fix custom emojis vs upper/lower case.
## 12.0.0
### Importante Notes
This version requires Peertube 5.2.0 or superior.
It also requires NodeJS 16 or superior (same as Peertube 5.2.0.).
If you use the "system Prosody", you should update to Prosody 0.12.4, and Lua 5.4.
### New features
* Updating ConverseJS, to use upstream (v11 WIP). This comes with many improvments and new features.
* #131: Emoji only mode.
* #516: new option for the moderation bot: forbid duplicate messages.
* #517: new option for the moderation bot: forbid messages with too many special characters.
* #518: moderators can send announcements and highlighted messages.
* #610: compatibility with PeerTube v7
### Minor changes and fixes
* Updating ConverseJS (v11 WIP) with latest fixes.
* Updating Prosody AppImage to Prosody 0.12.4 + Lua 5.4.
* Various translation updates.
* Using Typescript 5.5.4, and Eslint 8.57.0 (with new ruleset).
* Fix race condition in bot/ctl.
* Various type improvements.
* Update dependencies.
* Fix emoji picker colors and size.
* Fix: moderation delay max value was not correctly handled.
## 11.0.1
### Minor changes and fixes
* Fix "send message" button that was sending the message twice.
## 11.0.0
### Importante Notes
With the new [mod_firewall](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/mod_firewall/) feature, Peertube admins can write firewall rules for the Prosody server. These rules could be used to run arbitrary code on the server. If you are a hosting provider, and you don't want to allow Peertube admins to write such rules, you can disable the online editing by creating a `disable_mod_firewall_editing` file in the plugin directory. Check the documentation for more information. This is opt-out, as Peertube admins can already run arbitrary code just by installing any plugin.
The concord theme was removed from ConverseJS. If you had it set in the plugin settings, it will fallback to the Peertube theme.
### New features
* Updating ConverseJS, to use upstream (v11 WIP). This comes with many improvements and new features.
* #146: copy message button for moderators.
* #137: option to hide moderator name who made actions (kick, ban, message moderation, ...).
* #144: [moderator notes](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/moderation_notes/).
* #145: action for moderators to find all messages from a given participant.
* #97: option to use and configure [mod_firewall](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/mod_firewall/) at the server level.
### Minor changes and fixes
* #118: improved accessibility.
* Avatar set for anonymous users: new 'none' choice (that will fallback to Converse new colorized avatars).
* New translation: Albanian.
* Translation updates: Crotian, Japanese, traditional Chinese, Arabic, Galician.
* Updated mod_muc_moderation to upstream.
* Fix new task ordering.
* Fix: clicking on the current user nickname in message history was failing to open the profile modal.
* Fix: increase chat height on small screens, try to better detect the device viewport size and orientation.
* Converse theme: removed concord, added cyberpunk.
* Fixed Converse theme settings localization.
* Fix: improved minimum chat width.
## 10.3.3
### Minor changes and fixes
* Fix #481: Moderation bot was not able to connect when remote chat was disabled.
* Some cleaning in code generating Prosody configuration file.
## 10.3.2
### Minor changes and fixes
* Fix #477: ended polls never disappear when archiving is disabled (and no more than 20 new messages).
## 10.3.1

View File

@ -1,5 +1,5 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->

View File

@ -1,5 +1,5 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->

View File

@ -1,5 +1,5 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->

View File

@ -1,5 +1,5 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->

View File

@ -1,5 +1,5 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,3 +1,3 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -0,0 +1,98 @@
/*
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
/* stylelint-disable custom-property-pattern */
@use "sass:color";
@use "../../variables";
.peertube-plugin-livechat-admin-firewall {
h1 {
padding-top: 40px;
/* See Peertube sub-menu-h1 mixin */
font-size: 1.3rem;
border-bottom: 2px solid var(--bg-secondary-400, var(--greyBackgroundColor));
padding-bottom: 15px;
}
textarea[name^="_content_"] {
min-height: 10rem;
}
input[type="submit"],
input[type="reset"],
button[type="submit"],
button[type="reset"] {
// Peertube rounded-line-height-1-5 mixins
line-height: variables.$button-calc-line-height;
// Peertube peertube-button mixin
padding: 4px 13px;
border: 0;
font-weight: variables.$font-semibold;
border-radius: 3px !important;
text-align: center;
cursor: pointer;
font-size: variables.$button-font-size;
}
input[type="submit"],
button[type="submit"] {
&,
&:active,
&.active,
&:focus {
color: var(--on-primary, #fff);
background-color: var(--primary, var(--mainColor));
border: 1px solid var(--primary, var(--mainColor));
}
&:hover {
color: var(--on-primary, #fff);
background-color: var(--primary-400, var(--mainHoverColor));
}
&[disabled] {
pointer-events: none;
opacity: 0.6;
}
}
input[type="reset"],
button[type="reset"] {
color: var(--fg, var(--mainForegroundColor));
background-color: transparent;
border: 1px solid var(--bg-secondary-500, var(--inputBorderColor)) !important;
&:active,
&.active,
&:focus,
&:focus-visible {
color: var(--fg, var(--mainForegroundColor));
background-color: var(--bg-secondary-500, var(--inputBorderColor));
border-color: var(--bg-secondary-500, var(--inputBorderColor));
}
&:hover {
color: var(--fg, var(--mainForegroundColor));
background-color: var(--bg-secondary-450, var(--inputBorderColor));
}
&[disabled] {
pointer-events: none;
opacity: 0.8;
}
}
.peertube-livechat-admin-firewall-col-name {
width: 25%;
}
.peertube-livechat-admin-firewall-col-content {
width: 65%;
}
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -21,7 +21,7 @@ $small-view: 800px;
/* See Peertube sub-menu-h1 mixin */
font-size: 1.3rem;
border-bottom: 2px solid var(--greyBackgroundColor);
border-bottom: 2px solid var(--bg-secondary-400, var(--greyBackgroundColor));
padding-bottom: 15px;
}
@ -29,7 +29,7 @@ $small-view: 800px;
&.peertube-plugin-livechat-configuration-channel {
.peertube-plugin-livechat-configuration-channel-info {
/* stylelint-disable-next-line value-keyword-case */
color: var(--mainForegroundColor);
color: var(--fg, var(--mainForegroundColor));
span:first-child {
/* See Peertube .video-channel-display-name */
@ -48,7 +48,7 @@ $small-view: 800px;
h2 {
// See Peertube settings-big-title mixin
text-transform: uppercase;
color: var(--mainColor);
color: var(--primary, var(--mainColor));
font-weight: variables.$font-bold;
font-size: 1rem;
margin-bottom: 10px;
@ -82,35 +82,35 @@ $small-view: 800px;
&:active,
&:focus {
color: #fff;
background-color: var(--mainColor);
background-color: var(--primary, var(--mainColor));
}
&:hover {
color: #fff;
background-color: var(--mainHoverColor);
background-color: var(--fg-400, var(--mainHoverColor));
}
&[disabled],
&.disabled {
cursor: default;
color: #fff;
background-color: var(--inputBorderColor);
background-color: var(--input-border-color, var(--inputBorderColor));
}
}
input[type="reset"],
button[type="reset"] {
// Peertube grey-button mixin
background-color: var(--greyBackgroundColor);
color: var(--greyForegroundColor);
background-color: var(--bg-secondary-400, var(--greyBackgroundColor));
color: var(--fg-400, var(--greyForegroundColor));
&:hover,
&:active,
&:focus,
&[disabled],
&.disabled {
color: var(--greyForegroundColor);
background-color: var(--greySecondaryBackgroundColor);
color: var(--fg-400, var(--greyForegroundColor));
background-color: var(--bg-secondary-300, var(--greySecondaryBackgroundColor));
}
&[disabled],
@ -174,6 +174,12 @@ $small-view: 800px;
a {
/* See Peertube .video-channel-names */
width: fit-content;
display: flex;
align-items: baseline;
/* stylelint-disable-next-line value-keyword-case */
color: var(--fg, var(--mainForegroundColor));
&:hover,
&:focus,
&:active {
@ -184,12 +190,6 @@ $small-view: 800px;
outline: none !important;
}
width: fit-content;
display: flex;
align-items: baseline;
/* stylelint-disable-next-line value-keyword-case */
color: var(--mainForegroundColor);
div:first-child {
/* See Peertube .video-channel-display-name */
font-weight: variables.$font-semibold;

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -56,7 +56,7 @@ livechat-share-chat {
&.livechat-shareurl-suboptions-disabled {
label {
/* stylelint-disable-next-line custom-property-pattern */
color: var(--greyForegroundColor);
color: var(--fg-400, var(--greyForegroundColor));
}
}
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -15,9 +15,9 @@ livechat-spinner,
height: 48px;
margin: 20px;
/* stylelint-disable-next-line custom-property-pattern */
border: 5px solid var(--greyBackgroundColor);
border: 5px solid var(--bg-secondary-400, var(--greyBackgroundColor)) !important; // !important is required for it to work in ConverseJS
/* stylelint-disable-next-line custom-property-pattern */
border-bottom-color: var(--mainColor);
border-bottom-color: var(--primary, var(--mainColor)) !important; // !important is required for it to work in ConverseJS
border-radius: 50%;
display: inline-block;
box-sizing: border-box;

View File

@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -51,14 +51,14 @@ livechat-tags-input {
transition-duration: 0.3s;
@supports (scrollbar-width: auto) {
scrollbar-color: var(--greyForegroundColor) transparent;
scrollbar-color: var(--fg-400, var(--greyForegroundColor)) transparent;
scrollbar-width: thin;
}
}
.livechat-tags-container,
.livechat-tags-searched {
border-bottom: 1px dashed var(--greyForegroundColor);
border-bottom: 1px dashed var(--fg-400, var(--greyForegroundColor));
&.livechat-empty {
height: 0;
@ -104,7 +104,7 @@ livechat-tags-input {
text-align: center;
font-size: 10px;
margin-left: var(--tag-padding-horizontal);
color: var(--mainColor);
color: var(--primary, var(--mainColor));
border-radius: 50%;
background: #fff;
cursor: pointer;
@ -118,19 +118,19 @@ livechat-tags-input {
&:active,
&:focus {
color: #fff;
background-color: var(--mainColor);
background-color: var(--primary, var(--mainColor));
.livechat-tag-close {
color: var(--mainColor);
color: var(--primary, var(--mainColor));
}
}
&:hover {
color: #fff;
background-color: var(--mainHoverColor);
background-color: var(--fg-400, var(--mainHoverColor));
.livechat-tag-close {
color: var(--mainHoverColor);
color: var(--fg-400, var(--mainHoverColor));
}
}
@ -138,10 +138,10 @@ livechat-tags-input {
&.disabled {
cursor: default;
color: #fff;
background-color: var(--inputBorderColor);
background-color: var(--input-border-color, var(--inputBorderColor));
.livechat-tag-close {
color: var(--inputBorderColor);
color: var(--input-border-color, var(--inputBorderColor));
}
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -9,10 +9,10 @@
livechat-token-list {
table {
@include tables.data-table;
width: 100%;
@include tables.data-table;
tr th:first-child,
tr th:last-child {
width: 50px;

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -19,7 +19,7 @@ table.peertube-plugin-livechat-prosody-list-rooms tr:nth-child(even) {
table.peertube-plugin-livechat-prosody-list-rooms th {
/* stylelint-disable-next-line custom-property-pattern */
background-color: var(--mainHoverColor);
background-color: var(--fg-400, var(--mainHoverColor));
border: 1px solid black;
/* stylelint-disable-next-line custom-property-pattern */
color: var(--mainBackgroundColor);

View File

@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -54,7 +54,7 @@ $bs-green: #39cc0b;
&.disabled {
cursor: default;
color: #fff;
background-color: var(--inputBorderColor);
background-color: var(--input-border-color, var(--inputBorderColor));
}
}
@ -67,7 +67,7 @@ $bs-green: #39cc0b;
&:active,
&:focus {
color: #fff;
background-color: var(--mainColor);
background-color: var(--primary, var(--mainColor));
}
&:focus,
@ -77,13 +77,13 @@ $bs-green: #39cc0b;
&:hover {
color: #fff;
background-color: var(--mainHoverColor);
background-color: var(--fg-400, var(--mainHoverColor));
}
&[disabled],
&.disabled {
cursor: default;
color: #fff;
background-color: var(--inputBorderColor);
background-color: var(--input-border-color, var(--inputBorderColor));
}
}

View File

@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -13,7 +13,7 @@
text-align: center;
tr {
border: 1px var(--greyBackgroundColor) solid;
border: 1px var(--bg-secondary-400, var(--greyBackgroundColor)) solid;
}
td,
@ -34,6 +34,6 @@
}
tbody tr:nth-child(odd) {
background-color: var(--greySecondaryBackgroundColor);
background-color: var(--bg-secondary-300, var(--greySecondaryBackgroundColor));
}
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
@ -9,4 +9,5 @@
@use "elements/index";
@use "video";
@use "configuration/configuration";
@use "list-rooms/list-rooms.scss";
@use "admin/firewall/firewall";
@use "list-rooms/list-rooms";

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,10 +1,10 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
#peertube-plugin-livechat-container {
#peertube-plugin-livechat-container {
display: flex;
flex-direction: column;
height: 100%;
@ -18,16 +18,81 @@
/* Note: livechat-viewer-mode-content (the form where anonymous users can
choose nickname or log in with external account), can be something like
~180px height (at time of writing).
We must ensure that the 200px limit for converse-muc and converse-root is
We must ensure that the px height limit for converse-muc and converse-root is
always higher than livechat-viewer-mode-content max size.
Note: We also must ensure that when the user has choosen its nickname, and there is an
ongoing poll, the user can see the chat when the poll is folded.
*/
#peertube-plugin-livechat-container converse-root {
display: block;
border: 1px solid black;
min-height: max(30vh, 200px); // Always at least 200px, and ideally at least 30% of viewport.
min-height: max(30vh, 300px); // Always at least 200px, and ideally at least 30% of viewport.
height: 100%;
min-width: min(400px, 25vw);
converse-muc {
min-height: max(30vh, 200px);
min-height: max(30vh, 300px);
}
@media screen and (orientation: portrait) and (width <= 767px) {
/* On small screen, and when portrait mode, we are giving the chat more vertical space.
It should go under the video.
*/
min-height: max(58vh, 300px);
converse-muc {
min-height: max(58vh, 300px);
}
}
}
// /* Media query for mobile devices */
// @media only screen and (max-width: 767px) {
// #peertube-plugin-livechat-container converse-root {
// converse-muc {
// min-height: 58vh;
// /* 100vh - 30vh for video = 70vh remaining */
// }
// }
// }
// /* Media query for tablets in portrait mode */
// @media only screen and (min-width: 768px) and (max-width: 1023px) {
// #peertube-plugin-livechat-container converse-root {
// converse-muc {
// min-height: 25vh;
// /* Slightly less to account for other elements */
// }
// }
// }
// /* Media query for tablets in landscape mode */
// @media only screen and (min-width: 1024px) and (max-width: 1279px) {
// #peertube-plugin-livechat-container converse-root {
// converse-muc {
// min-height: 25vh;
// /* Assuming more height can be used */
// }
// }
// }
/* Media query for desktops */
@media only screen and (min-width: 1280px) {
#peertube-plugin-livechat-container converse-root {
converse-muc {
height: inherit;
/* Full desktop experience */
}
}
}
/* custom toolbar CSS */
.send-button {
border-radius: 0.25rem !important;
}
.send-button:hover {
background-color: #0067c1 !important;
}

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
* SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/

View File

@ -1,6 +1,7 @@
#!/bin/env node
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2025 Mehdi Benadel <https://mehdibenadel.com>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -58,6 +59,9 @@ const avatarPartsDef = {
fur: 10,
eyes: 15,
mouth: 10
},
'nctv': {
body: null,
}
}
@ -169,6 +173,23 @@ async function generateAvatars (part) {
}
}
const generateNigbotAvatar = async () => {
console.log('Starting generating nigbot avatar');
const inputDir = './assets/images/avatars/nctv/';
const outputDir = './dist/server/avatars/nctv/';
fs.mkdirSync(outputDir, { recursive: true });
const buff = await sharp(path.join(inputDir, 'nigbot.png')).toBuffer();
await sharp(buff)
.resize(60, 60)
.png({ palette: true })
.toFile(path.join(outputDir, '1.png'));
}
async function generateBotsAvatars () {
{
// Moderation bot avatar: choosing some parts, and turning it so it is facing left.
@ -294,6 +315,21 @@ async function generateBotsAvatars () {
})
.toFile(path.join(botOutputDir, '1.png'))
}
{
// Nigbot avatar for users
const inputDir = './assets/images/avatars/nctv'
const botOutputDir = './dist/server/bot_avatars/nctv/'
fs.mkdirSync(botOutputDir, { recursive: true })
const buff = await sharp(path.join(inputDir, 'nigbot.png'))
.toBuffer()
await sharp(buff)
// .resize(60, 60)
.png()
.toFile(path.join(botOutputDir, '1.png'))
}
}
if (isMainThread) {
@ -337,6 +373,9 @@ if (isMainThread) {
throw err
}
)
} else if (part === 'nctv') {
generateNigbotAvatar();
parentPort.postMessage('done');
} else {
generateAvatars(part).then(
() => {

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -15,7 +15,7 @@ const clientFiles = [
'admin-plugin-client-plugin'
]
function loadLocs() {
function loadLocs(globalFile) {
// Loading english strings, so we can inject them as constants.
const refFile = path.resolve(__dirname, 'dist', 'languages', 'en.reference.json')
if (!fs.existsSync(refFile)) {
@ -25,7 +25,6 @@ function loadLocs() {
// Reading client/@types/global.d.ts, to have a list of needed localized strings.
const r = {}
const globalFile = path.resolve(__dirname, 'client', '@types', 'global.d.ts')
const globalFileContent = '' + fs.readFileSync(globalFile)
const matches = globalFileContent.matchAll(/^declare const LOC_(\w+)\b/gm)
for (const match of matches) {
@ -41,7 +40,7 @@ function loadLocs() {
const define = Object.assign({
PLUGIN_CHAT_PACKAGE_NAME: JSON.stringify(packagejson.name),
PLUGIN_CHAT_SHORT_NAME: JSON.stringify(packagejson.name.replace(/^peertube-plugin-/, ''))
}, loadLocs())
}, loadLocs(path.resolve(__dirname, 'client', '@types', 'global.d.ts')))
const configs = clientFiles.map(f => ({
entryPoints: [ path.resolve(__dirname, 'client', f + '.ts') ],
@ -59,8 +58,14 @@ const configs = clientFiles.map(f => ({
outfile: path.resolve(__dirname, 'dist/client', f + '.js'),
}))
const defineBuiltin = Object.assign(
{},
loadLocs(path.resolve(__dirname, 'conversejs', 'lib', '@types', 'global.d.ts'))
)
configs.push({
entryPoints: ["./conversejs/builtin.ts"],
define: defineBuiltin,
bundle: true,
minify: true,
sourcemap,

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,6 +1,7 @@
#!/bin/bash
#!/usr/bin/env bash
# SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
# SPDX-FileCopyrightText: 2025 Mehdi Benadel <https://mehdibenadel.com>
#
# SPDX-License-Identifier: AGPL-3.0-only
@ -10,12 +11,12 @@ set -euo pipefail
# This script download the Prosody AppImage from the https://github.com/JohnXLivingston/prosody-appimage project.
repo_base_url='https://github.com/JohnXLivingston/prosody-appimage/releases/download'
wanted_release='v0.12.3-1'
wanted_release='v0.12.4-3'
x86_64_filename='prosody-x86_64.AppImage'
x86_64_sha256sum='f4af9bfefa2f804ad7e8b03a68f04194abb801f070ae620b3d4bcedb144e8523'
x86_64_sha256sum='83a583ac7036387514bed17afab257dab4161ccdd0ab7453818c78b51f830357'
aarch64_filename='prosody-aarch64.AppImage'
aarch64_sha256sum='878c5be719e1e36a84d637fd2bd44e3059aa91ddb6906ad05f1dd0334078df09'
aarch64_sha256sum='7b7e6bf30d4498fc99a40022232c3065707ee4f4df24dc17947b007621634304'
download_dir="$(pwd)/vendor/prosody-appimage"
dist_dir="$(pwd)/dist/server/prosody"

View File

@ -1,41 +0,0 @@
{
"root": true,
"env": {
"browser": true,
"es6": true
},
"extends": [
"standard-with-typescript",
"plugin:lit/recommended"
],
"globals": {},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2018,
"project": [
"./client/tsconfig.json"
]
},
"plugins": [
"@typescript-eslint"
],
"ignorePatterns": [],
"rules": {
"@typescript-eslint/no-unused-vars": [2, {"argsIgnorePattern": "^_"}],
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/strict-boolean-expressions": "off",
"@typescript-eslint/return-await": [2, "in-try-catch"], // FIXME: correct?
"@typescript-eslint/no-invalid-void-type": "off",
"@typescript-eslint/triple-slash-reference": "off",
"max-len": [
"error",
{
"code": 120,
"comments": 120
}
],
"no-unused-vars": "off"
}
}

View File

@ -1,3 +0,0 @@
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -12,6 +12,7 @@ declare const MUSTACHE_CONFIGURATION_CHANNEL: string
// Constants that begins with "LOC_" are loaded by build-client.js, reading the english locale file.
// See the online documentation: https://livingston.frama.io/peertube-plugin-livechat/contributing/translate/
declare const LOC_ONLINE_HELP: string
declare const LOC_CHAT: string
declare const LOC_OPEN_CHAT: string
declare const LOC_OPEN_CHAT_NEW_WINDOW: string
declare const LOC_CLOSE_CHAT: string
@ -55,13 +56,12 @@ declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_ENABLE_BOT_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_OPTIONS_TITLE: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC2: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_COMMENTS_LABEL: string
@ -133,3 +133,29 @@ declare const LOC_POLL_VOTE_OK: string
declare const LOC_MODERATION_DELAY: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_MODERATION_DELAY_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_ANONYMIZE_MODERATION_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_ANONYMIZE_MODERATION_DESC: string
declare const LOC_PROSODY_FIREWALL_CONFIGURATION: string
declare const LOC_PROSODY_FIREWALL_CONFIGURATION_HELP: string
declare const LOC_PROSODY_FIREWALL_DISABLED_WARNING: string
declare const LOC_PROSODY_FIREWALL_FILE_ENABLED: string
declare const LOC_PROSODY_FIREWALL_NAME: string
declare const LOC_PROSODY_FIREWALL_NAME_DESC: string
declare const LOC_PROSODY_FIREWALL_CONTENT: string
declare const LOC_EMOJI_ONLY_MODE_TITLE: string
declare const LOC_EMOJI_ONLY_MODE_DESC_1: string
declare const LOC_EMOJI_ONLY_MODE_DESC_2: string
declare const LOC_EMOJI_ONLY_MODE_DESC_3: string
declare const LOC_EMOJI_ONLY_ENABLE_ALL_ROOMS: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_TOLERANCE_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_TOLERANCE_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DELAY_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DELAY_DESC: string

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -143,7 +143,7 @@ function register (clientOptions: RegisterClientOptions): void {
lastActivityEl.textContent = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
}
const promoteButton = document.createElement('a')
promoteButton.classList.add('orange-button', 'peertube-button-link')
promoteButton.classList.add('primary-button', 'orange-button', 'peertube-button-link')
promoteButton.style.margin = '5px'
promoteButton.onclick = async () => {
await fetch(
@ -243,7 +243,10 @@ function register (clientOptions: RegisterClientOptions): void {
}
} catch (error: any) {
console.error(error)
peertubeHelpers.notifier.error(error.toString(), await peertubeHelpers.translate(LOC_LOADING_ERROR))
peertubeHelpers.notifier.error(
(error as Error).toString(),
await peertubeHelpers.translate(LOC_LOADING_ERROR)
)
}
}
})
@ -266,10 +269,15 @@ function register (clientOptions: RegisterClientOptions): void {
return options.formValues['prosody-components'] !== true
case 'converse-autocolors':
return options.formValues['converse-theme'] !== 'peertube'
case 'converse-theme-warning':
return options.formValues['converse-theme'] === 'peertube' &&
options.formValues['converse-autocolors'] === true
case 'chat-per-live-video-warning':
return !(options.formValues['chat-all-lives'] === true && options.formValues['chat-per-live-video'] === true)
case 'auto-ban-anonymous-ip':
return options.formValues['chat-no-anonymous'] !== false
case 'prosody-firewall-configure-button':
return options.formValues['prosody-firewall-enabled'] !== true
}
if (name?.startsWith('external-auth-')) {

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -8,6 +8,7 @@ import { registerConfiguration } from './common/configuration/register'
import { registerVideoWatch } from './common/videowatch/register'
import { registerRoom } from './common/room/register'
import { initPtContext } from './common/lib/contexts/peertube'
import { registerAdminFirewall } from './common/admin/firewall/register'
import './common/lib/elements' // Import shared elements.
async function register (clientOptions: RegisterClientOptions): Promise<void> {
@ -45,7 +46,7 @@ async function register (clientOptions: RegisterClientOptions): Promise<void> {
])
const webchatFieldOptions: RegisterClientFormFieldOptions = {
name: 'livechat-active',
label: label,
label,
descriptionHTML: description,
type: 'input-checkbox',
default: true,
@ -69,7 +70,8 @@ async function register (clientOptions: RegisterClientOptions): Promise<void> {
await Promise.all([
registerVideoWatch(),
registerRoom(clientOptions),
registerConfiguration(clientOptions)
registerConfiguration(clientOptions),
registerAdminFirewall(clientOptions)
])
}

View File

@ -0,0 +1,131 @@
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import type { AdminFirewallConfiguration } from 'shared/lib/types'
import { AdminFirewallService } from '../services/admin-firewall'
import { LivechatElement } from '../../../lib/elements/livechat'
import { ValidationError, ValidationErrorType } from '../../../lib/models/validation'
import { tplAdminFirewall } from '../templates/admin-firewall'
import { TemplateResult, html, nothing } from 'lit'
import { customElement, state } from 'lit/decorators.js'
import { Task } from '@lit/task'
@customElement('livechat-admin-firewall')
export class AdminFirewallElement extends LivechatElement {
private _adminFirewallService?: AdminFirewallService
@state()
public firewallConfiguration?: AdminFirewallConfiguration
@state()
public validationError?: ValidationError
@state()
public actionDisabled = false
private _asyncTaskRender: Task
constructor () {
super()
this._asyncTaskRender = this._initTask()
}
protected _initTask (): Task {
return new Task(this, {
task: async () => {
this._adminFirewallService = new AdminFirewallService(this.ptOptions)
this.firewallConfiguration = await this._adminFirewallService.fetchConfiguration()
this.actionDisabled = false // in case of reset
},
args: () => []
})
}
/**
* Resets the form by reloading data from backend.
*/
public async reset (event?: Event): Promise<void> {
event?.preventDefault()
this.actionDisabled = true
this._asyncTaskRender = this._initTask()
this.requestUpdate()
}
/**
* Resets the validation errors.
* @param ev the vent
*/
public resetValidation (_ev?: Event): void {
if (this.validationError) {
this.validationError = undefined
this.requestUpdate('_validationError')
}
}
/**
* Saves the configuration.
* @param event event
*/
public readonly saveConfig = async (event?: Event): Promise<void> => {
event?.preventDefault()
if (!this.firewallConfiguration || !this._adminFirewallService) {
return
}
this.actionDisabled = true
this._adminFirewallService.saveConfiguration(this.firewallConfiguration)
.then((result: AdminFirewallConfiguration) => {
this.validationError = undefined
this.ptTranslate(LOC_SUCCESSFULLY_SAVED).then((msg) => {
this.ptNotifier.info(msg)
}, () => {})
this.firewallConfiguration = result
this.requestUpdate('firewallConfiguration')
this.requestUpdate('_validationError')
})
.catch(async (error: Error) => {
this.validationError = undefined
if (error instanceof ValidationError) {
this.validationError = error
}
this.logger.warn(`A validation error occurred in saving configuration. ${error.name}: ${error.message}`)
this.ptNotifier.error(
error.message
? error.message
: await this.ptTranslate(LOC_ERROR)
)
this.requestUpdate('_validationError')
})
.finally(() => {
this.actionDisabled = false
})
}
public readonly getInputValidationClass = (propertyName: string): Record<string, boolean> => {
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validationError?.properties[propertyName]
return validationErrorTypes ? (validationErrorTypes.length ? { 'is-invalid': true } : { 'is-valid': true }) : {}
}
public readonly renderFeedback = (feedbackId: string,
propertyName: string): TemplateResult | typeof nothing => {
const errorMessages: TemplateResult[] = []
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validationError?.properties[propertyName] ?? undefined
// FIXME: this code is duplicated in dymamic table form
if (validationErrorTypes && validationErrorTypes.length !== 0) {
return html`<div id=${feedbackId} class="invalid-feedback">${errorMessages}</div>`
} else {
return nothing
}
}
protected override render = (): unknown => {
return this._asyncTaskRender.render({
pending: () => html`<livechat-spinner></livechat-spinner>`,
error: () => html`<livechat-error></livechat-error>`,
complete: () => tplAdminFirewall(this)
})
}
}

View File

@ -0,0 +1,5 @@
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import './admin-firewall'

View File

@ -0,0 +1,26 @@
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import type { RegisterClientOptions } from '@peertube/peertube-types/client'
import { html, render } from 'lit'
import './elements' // Import all needed elements.
/**
* Registers stuff related to mod_firewall configuration.
* @param clientOptions Peertube client options
*/
async function registerAdminFirewall (clientOptions: RegisterClientOptions): Promise<void> {
const { registerClientRoute } = clientOptions
registerClientRoute({
route: 'livechat/admin/firewall',
onMount: async ({ rootEl }) => {
render(html`<livechat-admin-firewall .registerClientOptions=${clientOptions}></livechat-admin-firewall>`, rootEl)
}
})
}
export {
registerAdminFirewall
}

View File

@ -0,0 +1,108 @@
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import type { RegisterClientOptions } from '@peertube/peertube-types/client'
import type { AdminFirewallConfiguration } from 'shared/lib/types'
import {
maxFirewallFileSize, maxFirewallNameLength, maxFirewallFiles, firewallNameRegexp
} from 'shared/lib/admin-firewall'
import { ValidationError, ValidationErrorType } from '../../../lib/models/validation'
import { getBaseRoute } from '../../../../utils/uri'
export class AdminFirewallService {
public _registerClientOptions: RegisterClientOptions
private readonly _headers: any = {}
constructor (registerClientOptions: RegisterClientOptions) {
this._registerClientOptions = registerClientOptions
this._headers = this._registerClientOptions.peertubeHelpers.getAuthHeader() ?? {}
this._headers['content-type'] = 'application/json;charset=UTF-8'
}
async validateConfiguration (adminFirewallConfiguration: AdminFirewallConfiguration): Promise<boolean> {
const propertiesError: ValidationError['properties'] = {}
if (adminFirewallConfiguration.files.length > maxFirewallFiles) {
const validationError = new ValidationError(
'AdminFirewallConfigurationValidationError',
await this._registerClientOptions.peertubeHelpers.translate(LOC_TOO_MANY_ENTRIES),
propertiesError
)
throw validationError
}
const seen = new Map<string, true>()
for (const [i, e] of adminFirewallConfiguration.files.entries()) {
propertiesError[`files.${i}.name`] = []
if (e.name === '') {
propertiesError[`files.${i}.name`].push(ValidationErrorType.Missing)
} else if (e.name.length > maxFirewallNameLength) {
propertiesError[`files.${i}.name`].push(ValidationErrorType.TooLong)
} else if (!firewallNameRegexp.test(e.name)) {
propertiesError[`files.${i}.name`].push(ValidationErrorType.WrongFormat)
} else if (seen.has(e.name)) {
propertiesError[`files.${i}.name`].push(ValidationErrorType.Duplicate)
} else {
seen.set(e.name, true)
}
propertiesError[`files.${i}.content`] = []
if (e.content.length > maxFirewallFileSize) {
propertiesError[`files.${i}.content`].push(ValidationErrorType.TooLong)
}
}
if (Object.values(propertiesError).find(e => e.length > 0)) {
const validationError = new ValidationError(
'AdminFirewallConfigurationValidationError',
await this._registerClientOptions.peertubeHelpers.translate(LOC_VALIDATION_ERROR),
propertiesError
)
throw validationError
}
return true
}
async saveConfiguration (
adminFirewallConfiguration: AdminFirewallConfiguration
): Promise<AdminFirewallConfiguration> {
if (!await this.validateConfiguration(adminFirewallConfiguration)) {
throw new Error('Invalid form data')
}
const response = await fetch(
getBaseRoute(this._registerClientOptions) + '/api/admin/firewall/',
{
method: 'POST',
headers: this._headers,
body: JSON.stringify(adminFirewallConfiguration)
}
)
if (!response.ok) {
throw new Error('Failed to save configuration.')
}
return response.json()
}
async fetchConfiguration (): Promise<AdminFirewallConfiguration> {
const response = await fetch(
getBaseRoute(this._registerClientOptions) + '/api/admin/firewall/',
{
method: 'GET',
headers: this._headers
}
)
if (!response.ok) {
throw new Error('Can\'t get firewall configuration.')
}
return response.json()
}
}

View File

@ -0,0 +1,91 @@
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { AdminFirewallElement } from '../elements/admin-firewall'
import type { TemplateResult } from 'lit'
import type { DynamicFormHeader, DynamicFormSchema } from '../../../lib/elements/dynamic-table-form'
import { maxFirewallFiles, maxFirewallNameLength, maxFirewallFileSize } from 'shared/lib/admin-firewall'
import { ptTr } from '../../../lib/directives/translation'
import { html } from 'lit'
export function tplAdminFirewall (el: AdminFirewallElement): TemplateResult {
const tableHeaderList: DynamicFormHeader = {
enabled: {
colName: ptTr(LOC_PROSODY_FIREWALL_FILE_ENABLED)
},
name: {
colName: ptTr(LOC_PROSODY_FIREWALL_NAME),
description: ptTr(LOC_PROSODY_FIREWALL_NAME_DESC),
headerClassList: ['peertube-livechat-admin-firewall-col-name']
},
content: {
colName: ptTr(LOC_PROSODY_FIREWALL_CONTENT),
headerClassList: ['peertube-livechat-admin-firewall-col-content']
}
}
const tableSchema: DynamicFormSchema = {
enabled: {
inputType: 'checkbox',
default: true
},
name: {
inputType: 'text',
default: '',
maxlength: maxFirewallNameLength
},
content: {
inputType: 'textarea',
default: '',
maxlength: maxFirewallFileSize
}
}
return html`
<div class="margin-content peertube-plugin-livechat-admin-firewall">
<h1>
${ptTr(LOC_PROSODY_FIREWALL_CONFIGURATION)}
</h1>
<p>
${ptTr(LOC_PROSODY_FIREWALL_CONFIGURATION_HELP, true)}
<livechat-help-button .page=${'documentation/admin/mod_firewall'}>
</livechat-help-button>
</p>
${
el.firewallConfiguration?.enabled
? ''
: html`<p class="peertube-plugin-livechat-warning">${ptTr(LOC_PROSODY_FIREWALL_DISABLED_WARNING, true)}</p>`
}
<form role="form" @submit=${el.saveConfig} @change=${el.resetValidation}>
<livechat-dynamic-table-form
.header=${tableHeaderList}
.schema=${tableSchema}
.maxLines=${maxFirewallFiles}
.validation=${el.validationError?.properties}
.validationPrefix=${'files'}
.rows=${el.firewallConfiguration?.files ?? []}
@update=${(e: CustomEvent) => {
el.resetValidation(e)
if (el.firewallConfiguration) {
el.firewallConfiguration.files = e.detail
el.requestUpdate('firewallConfiguration')
}
}
}
></livechat-dynamic-table-form>
<div class="form-group mt-5">
<button type="reset" @click=${el.reset} ?disabled=${el.actionDisabled}>
${ptTr(LOC_CANCEL)}
</button>
<button type="submit" ?disabled=${el.actionDisabled}>
${ptTr(LOC_SAVE)}
</button>
</div>
</form>
</div>`
}

View File

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -32,7 +32,7 @@ export class ChannelConfigurationElement extends LivechatElement {
public validationError?: ValidationError
@state()
public actionDisabled: boolean = false
public actionDisabled = false
private _asyncTaskRender: Task
@ -113,9 +113,9 @@ export class ChannelConfigurationElement extends LivechatElement {
}
}
public readonly getInputValidationClass = (propertyName: string): { [key: string]: boolean } => {
public readonly getInputValidationClass = (propertyName: string): Record<string, boolean> => {
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validationError?.properties[`${propertyName}`]
this.validationError?.properties[propertyName]
return validationErrorTypes ? (validationErrorTypes.length ? { 'is-invalid': true } : { 'is-valid': true }) : {}
}
@ -123,7 +123,7 @@ export class ChannelConfigurationElement extends LivechatElement {
propertyName: string): TemplateResult | typeof nothing => {
const errorMessages: TemplateResult[] = []
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validationError?.properties[`${propertyName}`] ?? undefined
this.validationError?.properties[propertyName] ?? undefined
// FIXME: this code is duplicated in dymamic table form
if (validationErrorTypes && validationErrorTypes.length !== 0) {

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -30,7 +30,7 @@ export class ChannelEmojisElement extends LivechatElement {
public validationError?: ValidationError
@state()
public actionDisabled: boolean = false
public actionDisabled = false
private _asyncTaskRender: Task
@ -192,7 +192,7 @@ export class ChannelEmojisElement extends LivechatElement {
throw new Error('Invalid data')
}
const url = await this._convertImageToDataUrl(entry.url)
const url = await this._convertImageToDataUrl(entry.url as string)
const sn = entry.sn as string
const item: ChannelEmojisConfiguration['emojis']['customEmojis'][0] = {
@ -211,7 +211,7 @@ export class ChannelEmojisElement extends LivechatElement {
await this.ptTranslate(LOC_ACTION_IMPORT_EMOJIS_INFO)
)
} catch (err: any) {
this.ptNotifier.error(err.toString(), await this.ptTranslate(LOC_ERROR))
this.ptNotifier.error((err as Error).toString(), await this.ptTranslate(LOC_ERROR))
} finally {
this.actionDisabled = false
}
@ -250,12 +250,27 @@ export class ChannelEmojisElement extends LivechatElement {
a.remove()
} catch (err: any) {
this.logger.error(err)
this.ptNotifier.error(err.toString())
this.ptNotifier.error((err as Error).toString())
} finally {
this.actionDisabled = false
}
}
public async enableEmojisOnlyModeOnAllRooms (ev: Event): Promise<void> {
ev.preventDefault()
if (!this._channelDetailsService || !this.channelId) {
this.ptNotifier.error(await this.ptTranslate(LOC_ERROR))
return
}
try {
await this._channelDetailsService.enableEmojisOnlyModeOnAllRooms(this.channelId)
this.ptNotifier.info(await this.ptTranslate(LOC_SUCCESSFULLY_SAVED))
} catch (err) {
console.error(err)
this.ptNotifier.error(await this.ptTranslate(LOC_ERROR))
}
}
/**
* Takes an url (or dataUrl), download the image, and converts to dataUrl.
* @param url the url

View File

@ -2,6 +2,9 @@
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import { html } from 'lit'
import { customElement, state } from 'lit/decorators.js'
import { ptTr } from '../../lib/directives/translation'
@ -50,7 +53,7 @@ export class ChannelHomeElement extends LivechatElement {
<ul class="peertube-plugin-livechat-configuration-home-channels">
${this._channels?.map((channel) => html`
<li>
<a href="${channel.livechatConfigurationUri}">
<a href="${channel.livechatConfigurationUri}" aria-hidden="true">
${channel.avatar
? html`<img class="avatar channel" src="${channel.avatar.path}">`
: html`<div class="avatar channel initial gray"></div>`

View File

@ -1,7 +1,10 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import { LivechatElement } from '../../lib/elements/livechat'
import { ptTr } from '../../lib/directives/translation'
import { html, TemplateResult } from 'lit'

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,35 +1,38 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { ChannelConfigurationElement } from '../channel-configuration'
import type { DynamicFormHeader, DynamicFormSchema } from '../../../lib/elements/dynamic-table-form'
import { ptTr } from '../../../lib/directives/translation'
import { html, TemplateResult } from 'lit'
import { classMap } from 'lit/directives/class-map.js'
import { noDuplicateMaxDelay, forbidSpecialCharsMaxTolerance } from 'shared/lib/constants'
export function tplChannelConfiguration (el: ChannelConfigurationElement): TemplateResult {
const tableHeaderList: {[key: string]: DynamicFormHeader} = {
const tableHeaderList: Record<string, DynamicFormHeader> = {
forbiddenWords: {
entries: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC2)
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL)
},
regexp: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_DESC)
},
applyToModerators: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_DESC)
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_DESC)
},
label: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_DESC)
},
reason: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_DESC)
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_LABEL),
description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_DESC)
},
comments: {
colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_COMMENTS_LABEL),
@ -57,7 +60,7 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
}
}
}
const tableSchema: {[key: string]: DynamicFormSchema} = {
const tableSchema: Record<string, DynamicFormSchema> = {
forbiddenWords: {
entries: {
inputType: 'tags',
@ -93,7 +96,8 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
},
delay: {
inputType: 'number',
default: 10
default: 10,
min: 1
}
},
commands: {
@ -135,6 +139,7 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
</livechat-configuration-section-header>
<div class="form-group">
<textarea
.title=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_TERMS_LABEL) as any}
name="terms"
id="peertube-livechat-terms"
.value=${el.channelConfiguration?.configuration.terms ?? ''}
@ -167,7 +172,7 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
<label>
<input
type="checkbox"
name="bot"
name="mute_anonymous"
id="peertube-livechat-mute-anonymous"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
@ -254,6 +259,32 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
${el.renderFeedback('peertube-livechat-moderation-delay-feedback', 'moderation.delay')}
</div>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_ANONYMIZE_MODERATION_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_ANONYMIZE_MODERATION_DESC, true)}
.helpPage=${'documentation/user/streamers/moderation'}>
</livechat-configuration-section-header>
<div class="form-group">
<label>
<input
type="checkbox"
name="anonymize-moderation"
id="peertube-livechat-anonymize-moderation"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.moderation.anonymize =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.moderation.anonymize}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_ANONYMIZE_MODERATION_LABEL)}
</label>
</div>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_OPTIONS_TITLE)}
.description=${''}
@ -310,6 +341,246 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
${el.renderFeedback('peertube-livechat-bot-nickname-feedback', 'bot.nickname')}
</div>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_DESC)}
.helpPage=${'documentation/user/streamers/bot/special_chars'}>
</livechat-configuration-section-header>
<div class="form-group">
<label>
<input
type="checkbox"
name="forbid_special_chars"
id="peertube-livechat-forbid-special-chars"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.forbidSpecialChars.enabled =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.bot.forbidSpecialChars.enabled}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_LABEL)}
</label>
</div>
${!el.channelConfiguration?.configuration.bot.forbidSpecialChars.enabled
? ''
: html`
<div class="form-group">
<label>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_TOLERANCE_LABEL)}
<input
type="number"
name="special_chars_tolerance"
class=${classMap(
Object.assign(
{ 'form-control': true },
el.getInputValidationClass('bot.forbidSpecialChars.tolerance')
)
)}
min="0"
max="${forbidSpecialCharsMaxTolerance}"
id="peertube-livechat-forbid-special-chars-tolerance"
aria-describedby="peertube-livechat-forbid-special-chars-tolerance-feedback"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.forbidSpecialChars.tolerance =
Number((event.target as HTMLInputElement).value)
}
el.requestUpdate('channelConfiguration')
}
}
value="${el.channelConfiguration?.configuration.bot.forbidSpecialChars.tolerance ?? '0'}"
/>
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SPECIAL_CHARS_TOLERANCE_DESC)}
</small>
${el.renderFeedback('peertube-livechat-forbid-special-chars-tolerance-feedback',
'bot.forbidSpecialChars.tolerance')
}
</div>
<div class="form-group">
<label>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_LABEL)}
<input
type="text"
name="special_chars_reason"
class=${classMap(
Object.assign(
{ 'form-control': true },
el.getInputValidationClass('bot.forbidSpecialChars.reason')
)
)}
id="peertube-livechat-forbid-special-chars-reason"
aria-describedby="peertube-livechat-forbid-special-chars-reason-feedback"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.forbidSpecialChars.reason =
(event.target as HTMLInputElement).value
}
el.requestUpdate('channelConfiguration')
}
}
value="${el.channelConfiguration?.configuration.bot.forbidSpecialChars.reason ?? ''}"
/>
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_DESC)}
</small>
${el.renderFeedback('peertube-livechat-forbid-special-chars-reason-feedback',
'bot.forbidSpecialChars.reason')
}
</div>
<div class="form-group">
<label>
<input
type="checkbox"
name="forbid_special_chars_applyToModerators"
id="peertube-livechat-forbid-special-chars-applyToModerators"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.forbidSpecialChars.applyToModerators =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.bot.forbidSpecialChars.applyToModerators}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_LABEL)}
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_DESC)}
</small>
</div>
`
}
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DESC)}
.helpPage=${'documentation/user/streamers/bot/no_duplicate'}>
</livechat-configuration-section-header>
<div class="form-group">
<label>
<input
type="checkbox"
name="no_duplicate"
id="peertube-livechat-no-duplicate"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.noDuplicate.enabled =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.bot.noDuplicate.enabled}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_LABEL)}
</label>
</div>
${!el.channelConfiguration?.configuration.bot.noDuplicate.enabled
? ''
: html`
<div class="form-group">
<label>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DELAY_LABEL)}
<input
type="number"
name="no_duplicate_delay"
class=${classMap(
Object.assign(
{ 'form-control': true },
el.getInputValidationClass('bot.noDuplicate.delay')
)
)}
min="0"
max="${noDuplicateMaxDelay.toString()}"
id="peertube-livechat-no-duplicate-delay"
aria-describedby="peertube-livechat-no-duplicate-delay-feedback"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.noDuplicate.delay =
Number((event.target as HTMLInputElement).value)
}
el.requestUpdate('channelConfiguration')
}
}
value="${el.channelConfiguration?.configuration.bot.noDuplicate.delay ?? '0'}"
/>
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_NO_DUPLICATE_DELAY_DESC)}
</small>
${el.renderFeedback('peertube-livechat-no-duplicate-delay-feedback',
'bot.noDuplicate.delay')
}
</div>
<div class="form-group">
<label>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_LABEL)}
<input
type="text"
name="no_duplicate_reason"
class=${classMap(
Object.assign(
{ 'form-control': true },
el.getInputValidationClass('bot.noDuplicate.reason')
)
)}
id="peertube-livechat-no-duplicate-reason"
aria-describedby="peertube-livechat-no-duplicate-reason-feedback"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.noDuplicate.reason =
(event.target as HTMLInputElement).value
}
el.requestUpdate('channelConfiguration')
}
}
value="${el.channelConfiguration?.configuration.bot.noDuplicate.reason ?? ''}"
/>
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_RETRACTATION_REASON_DESC)}
</small>
${el.renderFeedback('peertube-livechat-no-duplicate-reason-feedback',
'bot.noDuplicate.reason')
}
</div>
<div class="form-group">
<label>
<input
type="checkbox"
name="no_duplicate_applyToModerators"
id="peertube-livechat-no-duplicate-applyToModerators"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.bot.noDuplicate.applyToModerators =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.bot.noDuplicate.applyToModerators}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_LABEL)}
</label>
<small class="form-text text-muted">
${ptTr(LOC_LIVECHAT_CONFIGURATION_APPLYTOMODERATORS_DESC)}
</small>
</div>
`
}
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC)}

View File

@ -1,7 +1,10 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { ChannelEmojisElement } from '../channel-emojis'
import type { DynamicFormHeader, DynamicFormSchema } from '../../../lib/elements/dynamic-table-form'
import { maxEmojisPerChannel } from 'shared/lib/emojis'
@ -45,13 +48,14 @@ export function tplChannelEmojis (el: ChannelEmojisElement): TemplateResult {
<livechat-channel-tabs .active=${'emojis'} .channelId=${el.channelId}></livechat-channel-tabs>
<h2>${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_EMOJIS_TITLE)}</h2>
<p>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_EMOJIS_DESC)}
<livechat-help-button .page=${'documentation/user/streamers/emojis'}>
</livechat-help-button>
</p>
<form role="form" @submit=${el.saveEmojis} @change=${el.resetValidation}>
<div class="peertube-plugin-livechat-configuration-actions">
${
@ -86,7 +90,7 @@ export function tplChannelEmojis (el: ChannelEmojisElement): TemplateResult {
.maxLines=${maxEmojisPerChannel}
.validation=${el.validationError?.properties}
.validationPrefix=${'emojis'}
.rows=${el.channelEmojisConfiguration?.emojis.customEmojis}
.rows=${el.channelEmojisConfiguration?.emojis.customEmojis ?? []}
@update=${(e: CustomEvent) => {
el.resetValidation(e)
if (el.channelEmojisConfiguration) {
@ -106,5 +110,23 @@ export function tplChannelEmojis (el: ChannelEmojisElement): TemplateResult {
</button>
</div>
</form>
<h2>${ptTr(LOC_EMOJI_ONLY_MODE_TITLE)}</h2>
<p>
${ptTr(LOC_EMOJI_ONLY_MODE_DESC_1, true)}
</p>
<p>
${ptTr(LOC_EMOJI_ONLY_MODE_DESC_2, true)}
</p>
<p>
${ptTr(LOC_EMOJI_ONLY_MODE_DESC_3, true)}
</p>
<div class="peertube-plugin-livechat-configuration-actions">
<button type="button" @click=${el.enableEmojisOnlyModeOnAllRooms}>
${ptTr(LOC_EMOJI_ONLY_ENABLE_ALL_ROOMS)}
</button>
</div>
</div>`
}

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -66,15 +66,16 @@ async function registerConfiguration (clientOptions: RegisterClientOptions): Pro
for (const link of links) {
if (typeof link !== 'object') { continue }
if (!('key' in link)) { continue }
if (link.key !== 'in-my-library') { continue }
myLibraryLinks = link
break
if (link.key === 'in-my-library' || link.key === 'my-video-space') {
myLibraryLinks = link
break
}
}
if (!myLibraryLinks) { return links }
if (!Array.isArray(myLibraryLinks.links)) { return links }
const label = await peertubeHelpers.translate(LOC_MENU_CONFIGURATION_LABEL)
myLibraryLinks.links.push({
myLibraryLinks.links.unshift({
label,
shortLabel: label,
path: '/p/livechat/configuration',

View File

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -11,7 +11,7 @@ import type {
import { ValidationError, ValidationErrorType } from '../../lib/models/validation'
import { getBaseRoute } from '../../../utils/uri'
import { maxEmojisPerChannel } from 'shared/lib/emojis'
import { channelTermsMaxLength } from 'shared/lib/constants'
import { channelTermsMaxLength, noDuplicateMaxDelay, forbidSpecialCharsMaxTolerance } from 'shared/lib/constants'
export class ChannelDetailsService {
public _registerClientOptions: RegisterClientOptions
@ -67,11 +67,43 @@ export class ChannelDetailsService {
// The backend will ignore those values.
if (botConf.enabled) {
propertiesError['bot.nickname'] = []
propertiesError['bot.forbidSpecialChars.tolerance'] = []
propertiesError['bot.noDuplicate.delay'] = []
if (/[^\p{L}\p{N}\p{Z}_-]/u.test(botConf.nickname ?? '')) {
propertiesError['bot.nickname'].push(ValidationErrorType.WrongFormat)
}
if (botConf.forbidSpecialChars.enabled) {
const forbidSpecialCharsTolerance = channelConfigurationOptions.bot.forbidSpecialChars.tolerance
if (
(typeof forbidSpecialCharsTolerance !== 'number') ||
isNaN(forbidSpecialCharsTolerance)
) {
propertiesError['bot.forbidSpecialChars.tolerance'].push(ValidationErrorType.WrongType)
} else if (
forbidSpecialCharsTolerance < 0 ||
forbidSpecialCharsTolerance > forbidSpecialCharsMaxTolerance
) {
propertiesError['bot.forbidSpecialChars.tolerance'].push(ValidationErrorType.NotInRange)
}
}
if (botConf.noDuplicate.enabled) {
const noDuplicateDelay = channelConfigurationOptions.bot.noDuplicate.delay
if (
(typeof noDuplicateDelay !== 'number') ||
isNaN(noDuplicateDelay)
) {
propertiesError['bot.noDuplicate.delay'].push(ValidationErrorType.WrongType)
} else if (
noDuplicateDelay < 0 ||
noDuplicateDelay > noDuplicateMaxDelay
) {
propertiesError['bot.noDuplicate.delay'].push(ValidationErrorType.NotInRange)
}
}
for (const [i, fw] of botConf.forbiddenWords.entries()) {
for (const v of fw.entries) {
propertiesError[`bot.forbiddenWords.${i}.entries`] = []
@ -89,6 +121,15 @@ export class ChannelDetailsService {
}
}
for (const [i, q] of botConf.quotes.entries()) {
propertiesError[`bot.quotes.${i}.delay`] = []
if ((typeof q.delay !== 'number') || isNaN(q.delay)) {
propertiesError[`bot.quotes.${i}.delay`].push(ValidationErrorType.WrongFormat)
} else if (q.delay <= 0) {
propertiesError[`bot.quotes.${i}.delay`].push(ValidationErrorType.NotInRange)
}
}
for (const [i, cd] of botConf.commands.entries()) {
propertiesError[`bot.commands.${i}.command`] = []
@ -110,6 +151,29 @@ export class ChannelDetailsService {
return true
}
frontToBack = (channelConfigurationOptions: ChannelConfigurationOptions): ChannelConfigurationOptions => {
// // This is a dirty hack, because backend wants seconds for botConf.quotes.delay, and front wants minutes.
const c = JSON.parse(JSON.stringify(channelConfigurationOptions)) as ChannelConfigurationOptions // clone
c.bot?.quotes.forEach(q => {
if (typeof q.delay === 'number') {
q.delay = Math.round(q.delay * 60)
}
})
return c
}
backToFront = (channelConfiguration: any): ChannelConfiguration => {
// This is a dirty hack, because backend wants seconds for botConf.quotes.delay, and front wants minutes.
const c = JSON.parse(JSON.stringify(channelConfiguration)) as ChannelConfiguration // clone
c.configuration.bot?.quotes.forEach(q => {
if (typeof q.delay === 'number') {
q.delay = Math.round(q.delay / 60)
if (q.delay < 1) { q.delay = 1 }
}
})
return c
}
saveOptions = async (channelId: number,
channelConfigurationOptions: ChannelConfigurationOptions): Promise<Response> => {
if (!await this.validateOptions(channelConfigurationOptions)) {
@ -121,11 +185,21 @@ export class ChannelDetailsService {
{
method: 'POST',
headers: this._headers,
body: JSON.stringify(channelConfigurationOptions)
body: JSON.stringify(
this.frontToBack(channelConfigurationOptions)
)
}
)
if (!response.ok) {
let e
try {
// checking if there are some json data in the response, with custom error message.
e = await response.json()
} catch (_err) {}
if (e?.validationErrorMessage && (typeof e.validationErrorMessage === 'string')) {
throw new Error('Failed to save configuration options: ' + e.validationErrorMessage)
}
throw new Error('Failed to save configuration options.')
}
@ -146,7 +220,8 @@ export class ChannelDetailsService {
}
for (const channel of channels.data) {
channel.livechatConfigurationUri = '/p/livechat/configuration/channel?channelId=' + encodeURIComponent(channel.id)
channel.livechatConfigurationUri =
'/p/livechat/configuration/channel?channelId=' + encodeURIComponent(channel.id as string | number)
// Note: since Peertube v6.0.0, channel.avatar is dropped, and we have to use channel.avatars.
// So, if !channel.avatar, we will search a suitable one in channel.avatars, and fill channel.avatar.
@ -176,14 +251,15 @@ export class ChannelDetailsService {
throw new Error('Can\'t get channel configuration options.')
}
return response.json()
return this.backToFront(await response.json())
}
public async fetchEmojisConfiguration (channelId: number): Promise<ChannelEmojisConfiguration> {
const url = getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
encodeURIComponent(channelId)
const response = await fetch(
getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
encodeURIComponent(channelId),
url,
{
method: 'GET',
headers: this._headers
@ -295,10 +371,11 @@ export class ChannelDetailsService {
channelId: number,
channelEmojis: ChannelEmojis
): Promise<ChannelEmojisConfiguration> {
const url = getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
encodeURIComponent(channelId)
const response = await fetch(
getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
encodeURIComponent(channelId),
url,
{
method: 'POST',
headers: this._headers,
@ -312,4 +389,24 @@ export class ChannelDetailsService {
return response.json()
}
public async enableEmojisOnlyModeOnAllRooms (channelId: number): Promise<void> {
const url = getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
encodeURIComponent(channelId) +
'/enable_emoji_only'
const response = await fetch(
url,
{
method: 'POST',
headers: this._headers
}
)
if (!response.ok) {
throw new Error('Can\'t enable Emojis Only Mode on all rooms.')
}
return response.json()
}
}

View File

@ -1,11 +1,12 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// This content comes from the file assets/images/plus-square.svg, from the Feather icons set https://feathericons.com/
export const AddSVG: string =
export const AddSVG =
`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
aria-hidden="true"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" class="feather feather-plus-square">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
@ -13,8 +14,9 @@ export const AddSVG: string =
</svg>`
// This content comes from the file assets/images/x-square.svg, from the Feather icons set https://feathericons.com/
export const RemoveSVG: string =
export const RemoveSVG =
`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
aria-hidden="true"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" class="feather feather-x-square">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>

View File

@ -39,9 +39,7 @@ export class PtContext {
* Keep them in cache after first request.
*/
public async getSettings (): Promise<LiveChatSettings> {
if (!this._settings) {
this._settings = await this.ptOptions.peertubeHelpers.getSettings() as LiveChatSettings
}
this._settings ??= await this.ptOptions.peertubeHelpers.getSettings() as LiveChatSettings
return this._settings
}
}

View File

@ -13,8 +13,8 @@ import { getPtContext } from '../contexts/peertube'
export class TranslationDirective extends AsyncDirective {
private readonly _peertubeHelpers: RegisterClientHelpers
private _translatedValue: string = ''
private _localizationId: string = ''
private _translatedValue = ''
private _localizationId = ''
private _allowUnsafeHTML = false
@ -25,7 +25,7 @@ export class TranslationDirective extends AsyncDirective {
this._asyncUpdateTranslation().then(() => {}, () => {})
}
public override render = (locId: string, allowHTML: boolean = false): TemplateResult | string => {
public override render = (locId: string, allowHTML = false): TemplateResult | string => {
this._localizationId = locId // TODO Check current component for context (to infer the prefix)
this._allowUnsafeHTML = allowHTML

View File

@ -1,8 +1,11 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import { ptTr } from '../directives/translation'
import { html } from 'lit'
import { customElement, property } from 'lit/decorators.js'

View File

@ -1,8 +1,11 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { TagsInputElement } from './tags-input'
import type { DirectiveResult } from 'lit/directive'
import { ValidationErrorType } from '../models/validation'
@ -20,26 +23,26 @@ import { AddSVG, RemoveSVG } from '../buttons'
type DynamicTableAcceptedTypes = number | string | boolean | Date | Array<number | string>
type DynamicTableAcceptedInputTypes = 'textarea'
| 'select'
| 'checkbox'
| 'range'
| 'color'
| 'date'
| 'datetime'
| 'datetime-local'
| 'email'
| 'file'
| 'image'
| 'month'
| 'number'
| 'password'
| 'tel'
| 'text'
| 'time'
| 'url'
| 'week'
| 'tags'
| 'image-file'
| 'select'
| 'checkbox'
| 'range'
| 'color'
| 'date'
| 'datetime'
| 'datetime-local'
| 'email'
| 'file'
| 'image'
| 'month'
| 'number'
| 'password'
| 'tel'
| 'text'
| 'time'
| 'url'
| 'week'
| 'tags'
| 'image-file'
interface CellDataSchema {
min?: number
@ -47,11 +50,11 @@ interface CellDataSchema {
minlength?: number
maxlength?: number
size?: number
label?: TemplateResult | string
options?: { [key: string]: string }
options?: Record<string, string>
datalist?: DynamicTableAcceptedTypes[]
separator?: string
inputType?: DynamicTableAcceptedInputTypes
inputTitle?: string
default?: DynamicTableAcceptedTypes
colClassList?: string[] // CSS classes to add to the <td> element.
}
@ -59,19 +62,17 @@ interface CellDataSchema {
interface DynamicTableRowData {
_id: number
_originalIndex: number
row: { [key: string]: DynamicTableAcceptedTypes }
row: Record<string, DynamicTableAcceptedTypes>
}
interface DynamicFormHeaderCellData {
colName: TemplateResult | DirectiveResult
description: TemplateResult | DirectiveResult
description?: TemplateResult | DirectiveResult
headerClassList?: string[]
}
export interface DynamicFormHeader {
[key: string]: DynamicFormHeaderCellData
}
export interface DynamicFormSchema { [key: string]: CellDataSchema }
export type DynamicFormHeader = Record<string, DynamicFormHeaderCellData>
export type DynamicFormSchema = Record<string, CellDataSchema>
@customElement('livechat-dynamic-table-form')
export class DynamicTableFormElement extends LivechatElement {
@ -85,19 +86,19 @@ export class DynamicTableFormElement extends LivechatElement {
public maxLines?: number = undefined
@property()
public validation?: {[key: string]: ValidationErrorType[] }
public validation?: Record<string, ValidationErrorType[]>
@property({ attribute: false })
public validationPrefix: string = ''
public validationPrefix = ''
@property({ attribute: false })
public rows: Array<{ [key: string]: DynamicTableAcceptedTypes }> = []
public rows: Array<Record<string, DynamicTableAcceptedTypes>> = []
@state()
public _rowsById: DynamicTableRowData[] = []
@property({ attribute: false })
public formName: string = ''
public formName = ''
@state()
private _lastRowId = 1
@ -112,7 +113,7 @@ export class DynamicTableFormElement extends LivechatElement {
}
}
private readonly _getDefaultRow = (): { [key: string]: DynamicTableAcceptedTypes } => {
private readonly _getDefaultRow = (): Record<string, DynamicTableAcceptedTypes> => {
this._updateLastRowId()
return Object.fromEntries([...Object.entries(this.schema).map((entry) => [entry[0], entry[1].default ?? ''])])
}
@ -236,7 +237,7 @@ export class DynamicTableFormElement extends LivechatElement {
classList.push(...headerCellData.headerClassList)
}
return html`<th scope="col" class=${classList.join(' ')}>
${headerCellData.description}
${headerCellData.description ?? ''}
</th>`
}
@ -245,11 +246,11 @@ export class DynamicTableFormElement extends LivechatElement {
return html`<tr id=${inputId}>
${Object.keys(this.header)
.sort((k1, k2) => this.columnOrder.indexOf(k1) - this.columnOrder.indexOf(k2))
.map(key => this.renderDataCell(key,
rowData.row[key] ?? this.schema[key].default,
rowData._id,
rowData._originalIndex))}
.sort((k1, k2) => this.columnOrder.indexOf(k1) - this.columnOrder.indexOf(k2))
.map(key => this.renderDataCell(key,
rowData.row[key] ?? this.schema[key].default,
rowData._id,
rowData._originalIndex))}
<td class="form-group">
<button type="button"
class="dynamic-table-remove-row"
@ -295,6 +296,7 @@ export class DynamicTableFormElement extends LivechatElement {
const inputId =
`peertube-livechat-${this.formName.replace(/_/g, '-')}-${propertyName.toString().replace(/_/g, '-')}-${rowId}`
const inputTitle: DirectiveResult | undefined = propertySchema.inputTitle ?? this.header[propertyName]?.colName
const feedback = this._renderFeedback(inputId, propertyName, originalIndex)
switch (propertySchema.default?.constructor) {
@ -320,6 +322,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue as string,
@ -332,6 +335,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderTextarea(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue as string,
@ -344,6 +348,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderSelect(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue as string,
@ -356,6 +361,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderImageFileInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue?.toString(),
@ -376,6 +382,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
(propertyValue as Date).toISOString(),
@ -394,6 +401,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue as string,
@ -411,6 +419,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderCheckbox(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue as boolean,
@ -446,10 +455,10 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
(propertyValue)?.join(propertySchema.separator ?? ',') ??
propertyValue ?? propertySchema.default ?? '',
(propertyValue)?.join(propertySchema.separator ?? ',') ?? propertyValue ?? propertySchema.default ?? '',
originalIndex)}
${feedback}
`
@ -461,10 +470,10 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderTextarea(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
(propertyValue)?.join(propertySchema.separator ?? ',') ??
propertyValue ?? propertySchema.default ?? '',
(propertyValue)?.join(propertySchema.separator ?? ',') ?? propertyValue ?? propertySchema.default ?? '',
originalIndex)}
${feedback}
`
@ -476,6 +485,7 @@ export class DynamicTableFormElement extends LivechatElement {
formElement = html`${this._renderTagsInput(rowId,
inputId,
inputName,
inputTitle,
propertyName,
propertySchema,
propertyValue,
@ -487,8 +497,10 @@ export class DynamicTableFormElement extends LivechatElement {
}
if (!formElement) {
this.logger.warn(`value type '${(propertyValue.constructor.toString())}' is incompatible` +
`with field type '${propertySchema.inputType as string}' for form entry '${propertyName.toString()}'.`)
this.logger.warn(
`value type '${(propertyValue.constructor.toString())}' is incompatible` +
`with field type '${propertySchema.inputType as string}' for form entry '${propertyName.toString()}'.`
)
}
const classList = ['form-group']
@ -501,6 +513,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderInput = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: string,
@ -515,6 +528,7 @@ export class DynamicTableFormElement extends LivechatElement {
)
)}
id=${inputId}
title=${ifDefined(inputTitle)}
aria-describedby="${inputId}-feedback"
list=${ifDefined(propertySchema.datalist ? inputId + '-datalist' : undefined)}
min=${ifDefined(propertySchema.min)}
@ -534,6 +548,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderTagsInput = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: Array<string | number>,
@ -547,7 +562,7 @@ export class DynamicTableFormElement extends LivechatElement {
)
)}
id=${inputId}
.inputPlaceholder=${propertySchema.label as any}
.inputTitle=${inputTitle as any}
aria-describedby="${inputId}-feedback"
.min=${propertySchema.min}
.max=${propertySchema.max}
@ -563,6 +578,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderTextarea = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: string,
@ -576,6 +592,7 @@ export class DynamicTableFormElement extends LivechatElement {
)
)}
id=${inputId}
title=${ifDefined(inputTitle)}
aria-describedby="${inputId}-feedback"
min=${ifDefined(propertySchema.min)}
max=${ifDefined(propertySchema.max)}
@ -588,6 +605,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderCheckbox = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: boolean,
@ -602,6 +620,7 @@ export class DynamicTableFormElement extends LivechatElement {
)
)}
id=${inputId}
title=${ifDefined(inputTitle)}
aria-describedby="${inputId}-feedback"
@change=${(event: Event) => this._updatePropertyFromValue(event, propertyName, propertySchema, rowId)}
value="1"
@ -611,6 +630,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderSelect = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: string,
@ -623,11 +643,12 @@ export class DynamicTableFormElement extends LivechatElement {
)
)}
id=${inputId}
title=${ifDefined(inputTitle)}
aria-describedby="${inputId}-feedback"
aria-label=${inputName}
@change=${(event: Event) => this._updatePropertyFromValue(event, propertyName, propertySchema, rowId)}
>
<option ?selected=${!propertyValue}>${propertySchema.label ?? 'Choose your option'}</option>
<option ?selected=${!propertyValue}>${inputTitle ?? ''}</option>
${Object.entries(propertySchema.options ?? {})
?.map(([value, name]) =>
html`<option ?selected=${propertyValue === value} value=${value}>${name}</option>`
@ -638,6 +659,7 @@ export class DynamicTableFormElement extends LivechatElement {
_renderImageFileInput = (rowId: number,
inputId: string,
inputName: string,
inputTitle: string | DirectiveResult | undefined,
propertyName: string,
propertySchema: CellDataSchema,
propertyValue: string,
@ -647,6 +669,7 @@ export class DynamicTableFormElement extends LivechatElement {
.name=${inputName}
class=${classMap(this._getInputValidationClass(propertyName, originalIndex))}
id=${inputId}
.inputTitle=${inputTitle as any}
aria-describedby="${inputId}-feedback"
@change=${(event: Event) => this._updatePropertyFromValue(event, propertyName, propertySchema, rowId)}
.value=${propertyValue}
@ -656,7 +679,7 @@ export class DynamicTableFormElement extends LivechatElement {
}
_getInputValidationClass = (propertyName: string,
originalIndex: number): { [key: string]: boolean } => {
originalIndex: number): Record<string, boolean> => {
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validation?.[`${this.validationPrefix}.${originalIndex}.${propertyName}`]
@ -730,6 +753,9 @@ export class DynamicTableFormElement extends LivechatElement {
.split(propertySchema.separator)
}
break
case Number:
rowById.row[propertyName] = Number(value)
break
default:
rowById.row[propertyName] = value
break

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -18,7 +18,7 @@ export class HelpButtonElement extends LivechatElement {
public buttonTitle: string | DirectiveResult = ptTr(LOC_ONLINE_HELP)
@property({ attribute: false })
public page: string = ''
public page = ''
@state()
public url: URL = new URL('https://lmddgtfy.net/')
@ -38,7 +38,7 @@ export class HelpButtonElement extends LivechatElement {
href="${this.url.href}"
target=_blank
title="${this.buttonTitle}"
class="orange-button peertube-button-link"
class="primary-button orange-button peertube-button-link"
>${unsafeHTML(helpButtonSVG())}</a>`
})
}

View File

@ -1,11 +1,15 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import { LivechatElement } from './livechat'
import { html } from 'lit'
import type { DirectiveResult } from 'lit/directive'
import { customElement, property } from 'lit/decorators.js'
import { ifDefined } from 'lit/directives/if-defined.js'
/**
* Special element to upload image files.
* If no current value, displays an input type="file" field.
@ -29,13 +33,16 @@ export class ImageFileInputElement extends LivechatElement {
@property({ attribute: false })
public maxSize?: number
@property({ attribute: false })
public inputTitle?: string | DirectiveResult
@property({ attribute: false })
public accept: string[] = ['image/jpg', 'image/png', 'image/gif']
protected override render = (): unknown => {
return html`
${this.value
? html`<img src=${this.value} @click=${(ev: Event) => {
? html`<img src=${this.value} alt=${ifDefined(this.inputTitle)} @click=${(ev: Event) => {
ev.preventDefault()
const upload: HTMLInputElement | null | undefined = this.parentElement?.querySelector('input[type="file"]')
upload?.click()
@ -44,6 +51,7 @@ export class ImageFileInputElement extends LivechatElement {
}
<input
type="file"
title=${ifDefined(this.inputTitle)}
accept="${this.accept.join(',')}"
class="form-control"
style=${this.value ? 'display: none;' : ''}

View File

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -26,7 +26,7 @@ export class LivechatElement extends LitElement {
this.logger = this.ptContext.logger.createLogger(this.tagName.toLowerCase())
}
protected override createRenderRoot = (): Element | ShadowRoot => {
protected override createRenderRoot = (): HTMLElement | DocumentFragment => {
return this
}
}

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,8 +1,11 @@
// SPDX-FileCopyrightText: 2024 Mehdi Benadel <https://mehdibenadel.com>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import { LivechatElement } from './livechat'
import { ptTr } from '../directives/translation'
import { html } from 'lit'
@ -12,6 +15,7 @@ import { ifDefined } from 'lit/directives/if-defined.js'
import { classMap } from 'lit/directives/class-map.js'
import { animate, fadeOut, fadeIn } from '@lit-labs/motion'
import { repeat } from 'lit/directives/repeat.js'
import type { DirectiveResult } from 'lit/directive'
// FIXME: find a better way to store this image.
// This content comes from the file assets/images/copy.svg, after svgo cleaning.
@ -20,10 +24,11 @@ import { repeat } from 'lit/directives/repeat.js'
// Then replace the main color by «currentColor»
const copySVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233">
<g style="stroke-width:1.00021;stroke-miterlimit:4;stroke-dasharray:none">` +
// eslint-disable-next-line max-len
// eslint-disable-next-line max-len, @stylistic/indent-binary-ops
'<path style="opacity:.998;fill:none;fill-opacity:1;stroke:currentColor;stroke-width:1.17052;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m4.084 4.046-.616.015-.645-.004a.942.942 0 0 1-.942-.942v-4.398a.94.94 0 0 1 .942-.943H7.22a.94.94 0 0 1 .942.943l-.006.334-.08.962" transform="matrix(.45208 0 0 .45208 -.528 1.295)"/>' +
// eslint-disable-next-line max-len
'<path style="opacity:.998;fill:none;fill-opacity:1;stroke:currentColor;stroke-width:1.17052;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M8.434 5.85c-.422.009-1.338.009-1.76.01-.733.004-2.199 0-2.199 0a.94.94 0 0 1-.942-.941V.52a.94.94 0 0 1 .942-.942h4.398a.94.94 0 0 1 .943.942s.004 1.466 0 2.2c-.003.418-.019 1.251-.006 1.67.024.812-.382 1.439-1.376 1.46z" transform="matrix(.45208 0 0 .45208 -.528 1.295)"/>' +
// eslint-disable-next-line @stylistic/indent-binary-ops
`</g>
</svg>`
@ -48,7 +53,7 @@ export class TagsInputElement extends LivechatElement {
private _inputValue?: string = ''
@property({ attribute: false })
public inputPlaceholder?: string = ''
public inputTitle?: string | DirectiveResult = ''
@property({ attribute: false })
public datalist?: string[]
@ -63,10 +68,10 @@ export class TagsInputElement extends LivechatElement {
private readonly _isPressingKey: string[] = []
@property({ attribute: false })
public separator: string = '\n'
public separator = '\n'
@property({ attribute: false })
public animDuration: number = 200
public animDuration = 200
/**
* Overloading the standard focus method.
@ -166,7 +171,7 @@ export class TagsInputElement extends LivechatElement {
@input=${(e: InputEvent) => this._handleInputEvent(e)}
@change=${(e: Event) => e.stopPropagation()}
.value=${this._inputValue ?? ''}
placeholder=${ifDefined(this.inputPlaceholder)} />
title=${ifDefined(this.inputTitle)} />
${(this.datalist)
? html`<datalist id="${this.id ?? 'tags-input'}-datalist">
${(this.datalist ?? []).map((value) => html`<option value=${value}>`)}
@ -244,8 +249,9 @@ export class TagsInputElement extends LivechatElement {
if (!this._isPressingKey.includes(e.key)) {
this._isPressingKey.push(e.key)
if ((target.selectionStart === target.selectionEnd) &&
target.selectionStart === 0) {
if (
(target.selectionStart === target.selectionEnd) && target.selectionStart === 0
) {
this._handleDeleteTag((this._searchedTagsIndex.length)
? this._searchedTagsIndex.slice(-1)[0]
: (this.value.length - 1))
@ -258,8 +264,9 @@ export class TagsInputElement extends LivechatElement {
if (!this._isPressingKey.includes(e.key)) {
this._isPressingKey.push(e.key)
if ((target.selectionStart === target.selectionEnd) &&
target.selectionStart === target.value.length) {
if (
(target.selectionStart === target.selectionEnd) && target.selectionStart === target.value.length
) {
this._handleDeleteTag((this._searchedTagsIndex.length)
? this._searchedTagsIndex[0]
: 0)

View File

@ -1,7 +1,10 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { LivechatTokenListElement } from '../token-list'
import { html, TemplateResult } from 'lit'
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
@ -23,11 +26,11 @@ export function tplTokenList (el: LivechatTokenListElement): TemplateResult {
<tbody>
${
repeat(el.tokenList ?? [], (token) => token.id, (token) => {
let dateStr: string = ''
let dateStr = ''
try {
const date = new Date(token.date)
dateStr = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
} catch (err) {}
} catch (_err) {}
return html`<tr>
<td>${
el.mode === 'select'

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -27,7 +27,7 @@ export class LivechatTokenListElement extends LivechatElement {
public currentSelectedToken?: LivechatToken
@property({ attribute: false })
public actionDisabled: boolean = false
public actionDisabled = false
private readonly _tokenListService: TokenListService
private readonly _asyncTaskRender: Task
@ -83,7 +83,7 @@ export class LivechatTokenListElement extends LivechatElement {
this.dispatchEvent(new CustomEvent('update', {}))
} catch (err: any) {
this.logger.error(err)
this.ptNotifier.error(err.toString(), await this.ptTranslate(LOC_ERROR))
this.ptNotifier.error((err as Error).toString(), await this.ptTranslate(LOC_ERROR))
} finally {
this.actionDisabled = false
}
@ -102,7 +102,7 @@ export class LivechatTokenListElement extends LivechatElement {
this.dispatchEvent(new CustomEvent('update', {}))
} catch (err: any) {
this.logger.error(err)
this.ptNotifier.error(err.toString(), await this.ptTranslate(LOC_ERROR))
this.ptNotifier.error((err as Error).toString(), await this.ptTranslate(LOC_ERROR))
} finally {
this.actionDisabled = false
}

View File

@ -12,7 +12,7 @@ export enum ValidationErrorType {
}
export class ValidationError extends Error {
properties: {[key: string]: ValidationErrorType[] } = {}
properties: Record<string, ValidationErrorType[]> = {}
constructor (name: string, message: string | undefined, properties: ValidationError['properties']) {
super(message)

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -27,7 +27,7 @@ type displayButtonOptions = displayButtonOptionsCallback | displayButtonOptionsH
function displayButton (dbo: displayButtonOptions): void {
const button = document.createElement('a')
button.classList.add(
'orange-button', 'peertube-button-link',
'primary-button', 'orange-button', 'peertube-button-link',
'peertube-plugin-livechat-button',
'peertube-plugin-livechat-button-' + dbo.name
)
@ -42,6 +42,23 @@ function displayButton (dbo: displayButtonOptions): void {
if ('href' in dbo) {
button.href = dbo.href
}
if (!button.href || button.href === '#') {
// No href => it is not a link.
button.role = 'button'
button.tabIndex = 0
// We must also ensure that the enter key is triggering the onclick
if (button.onclick) {
button.onkeydown = ev => {
if (ev.key === 'Enter') {
ev.preventDefault()
button.click()
}
}
}
}
if (('targetBlank' in dbo) && dbo.targetBlank) {
button.target = '_blank'
}
@ -52,6 +69,10 @@ function displayButton (dbo: displayButtonOptions): void {
tmp.innerHTML = svg.trim()
const svgDom = tmp.firstChild
if (svgDom) {
if ('ariaHidden' in (svgDom as HTMLElement)) {
// Icon must be hidden for screen readers.
(svgDom as HTMLElement).ariaHidden = 'true'
}
button.prepend(svgDom)
}
} catch (err) {

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -16,8 +16,6 @@ import { localizedHelpUrl } from '../../utils/help'
import { getBaseRoute } from '../../utils/uri'
import { displayConverseJS } from '../../utils/conversejs'
let savedMyPluginFlexGrow: string | undefined
/**
* Initialize the chat for the current video
* @param video the video
@ -25,7 +23,6 @@ let savedMyPluginFlexGrow: string | undefined
async function initChat (video: Video): Promise<void> {
const ptContext = getPtContext()
const logger = ptContext.logger
savedMyPluginFlexGrow = undefined
if (!video) {
logger.error('No video provided')
@ -46,6 +43,8 @@ async function initChat (video: Video): Promise<void> {
container.setAttribute('id', 'peertube-plugin-livechat-container')
container.setAttribute('peertube-plugin-livechat-state', 'initializing')
container.setAttribute('peertube-plugin-livechat-current-url', window.location.href)
container.role = 'region'
container.ariaLabel = await ptContext.ptOptions.peertubeHelpers.translate(LOC_CHAT)
placeholder.append(container)
try {
@ -61,8 +60,8 @@ async function initChat (video: Video): Promise<void> {
return
}
let showShareUrlButton: boolean = false
let showPromote: boolean = false
let showShareUrlButton = false
let showPromote = false
if (video.isLocal) { // No need for shareButton on remote chats.
const chatShareUrl = settings['chat-share-url'] ?? ''
if (chatShareUrl === 'everyone') {
@ -188,9 +187,10 @@ async function _insertChatDom (
callback: async () => {
try {
// First we must get the room JID (can be video.uuid@ or channel.id@)
const url = getBaseRoute(ptContext.ptOptions) + '/api/configuration/room/' +
encodeURIComponent(video.uuid)
const response = await fetch(
getBaseRoute(ptContext.ptOptions) + '/api/configuration/room/' +
encodeURIComponent(video.uuid),
url,
{
method: 'GET',
headers: peertubeHelpers.getAuthHeader()
@ -304,7 +304,7 @@ async function _openChat (video: Video): Promise<void | false> {
// Loading converseJS...
await displayConverseJS(ptContext.ptOptions, container, roomkey, 'peertube-video', false)
} catch (err) {
} catch (_err) {
// Displaying an error page.
if (container) {
const message = document.createElement('div')
@ -353,19 +353,6 @@ function _hackStyles (on: boolean): void {
buttons.classList.remove('peertube-plugin-livechat-buttons-open')
}
})
const myPluginPlaceholder: HTMLElement | null = document.querySelector('my-plugin-placeholder')
if (on) {
// Saving current style attributes and maximazing space for the chat
if (myPluginPlaceholder) {
savedMyPluginFlexGrow = myPluginPlaceholder.style.flexGrow // Should be "", but can be anything else.
myPluginPlaceholder.style.flexGrow = '1'
}
} else {
// restoring values...
if (savedMyPluginFlexGrow !== undefined && myPluginPlaceholder) {
myPluginPlaceholder.style.flexGrow = savedMyPluginFlexGrow
}
}
} catch (err) {
getPtContext().logger.error(`Failed hacking styles: '${err as string}'`)
}

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -14,7 +14,7 @@ import { getIframeUri, getXMPPAddr, UriOptions } from '../uri'
import { isAnonymousUser } from '../../../utils/user'
// First is default tab.
const validTabNames = ['embed', 'dock', 'peertube', 'xmpp'] as const
const validTabNames: string[] = ['embed', 'dock', 'peertube', 'xmpp'] as const
type ValidTabNames = typeof validTabNames[number]
@ -61,49 +61,49 @@ export class ShareChatElement extends LivechatElement {
* Should we render the XMPP tab?
*/
@property({ attribute: false })
public xmppUriEnabled: boolean = false
public xmppUriEnabled = false
/**
* Should we render the Dock tab?
*/
@property({ attribute: false })
public dockEnabled: boolean = false
public dockEnabled = false
/**
* Can we use autocolors?
*/
@property({ attribute: false })
public autocolorsAvailable: boolean = false
public autocolorsAvailable = false
/**
* In the Embed tab, should we generated an iframe link.
*/
@property({ attribute: false })
public embedIFrame: boolean = false
public embedIFrame = false
/**
* In the Embed tab, should we generated a read-only chat link.
*/
@property({ attribute: false })
public embedReadOnly: boolean = false
public embedReadOnly = false
/**
* Read-only, with scrollbar?
*/
@property({ attribute: false })
public embedReadOnlyScrollbar: boolean = false
public embedReadOnlyScrollbar = false
/**
* Read-only, transparent background?
*/
@property({ attribute: false })
public embedReadOnlyTransparentBackground: boolean = false
public embedReadOnlyTransparentBackground = false
/**
* In the Embed tab, should we use current theme color?
*/
@property({ attribute: false })
public embedAutocolors: boolean = false
public embedAutocolors = false
protected override firstUpdated (changedProperties: PropertyValues): void {
super.firstUpdated(changedProperties)
@ -156,7 +156,7 @@ export class ShareChatElement extends LivechatElement {
return
}
this.logger.log('Restoring previous state')
if (validTabNames.includes(v.currentTab)) {
if (validTabNames.includes(v.currentTab as string)) {
this.currentTab = v.currentTab
}
this.embedIFrame = !!v.embedIFrame

View File

@ -1,7 +1,10 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
// FIXME: @stylistic/indent is buggy with strings literrals.
/* eslint-disable @stylistic/indent */
import type { ShareChatElement } from '../share-chat'
import { html, TemplateResult } from 'lit'
import { ptTr } from '../../../lib/directives/translation'

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
// SPDX-FileCopyrightText: 2024-2025 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
@ -71,8 +71,7 @@ async function shareChatUrl (
addedNodes.forEach(node => {
if ((node as HTMLElement).localName === 'ngb-modal-window') {
logger.info('Detecting a new modal, checking if this is the good one...')
if (!(node as HTMLElement).querySelector) { return }
const title = (node as HTMLElement).querySelector('.modal-title')
const title = (node as HTMLElement).querySelector?.('.modal-title')
if (!(title?.textContent === labelShare)) {
return
}

Some files were not shown because too many files have changed in this diff Show More