Compare commits

...

284 Commits

Author SHA1 Message Date
jhqwqmc 8b2f32bb7d
Update locale_CN.yml (#3616) 2024-05-13 21:55:21 +03:00
Aurora Lahtela ca9870d9fe Fix CorrectWrongCharacterEncodingPatch failing on mysql.user table being a view 2024-05-11 18:58:22 +03:00
Aurora Lahtela 9e25f2b26c Sanitize and validate more join address variations
- Added Data_gathering.Preserve_invalid_join_addresses to allow overriding this behavior.

Affects issues:
- Fixed #3545
2024-04-27 10:08:18 +03:00
Aurora Lahtela 24a8c75b67 Add support for configuring the plugin using environment variables.
Examples:
- Plugin.ServerName -> PLAN_PLUGIN_SERVERNAME
- Database.MySQL.Password -> PLAN_DATABASE_MYSQL_PASSWORD

Affects issues:
- Close #1353
- #1991
2024-04-21 20:35:41 +03:00
Sniper_TVmc 132fa2f919
Update locale_FR.yml (#3578) 2024-04-21 09:25:28 +03:00
Aurora Lahtela 7f268d9a07
Update versions.txt 2024-04-20 20:42:27 +03:00
Aurora Lahtela be8c8951c9 Update jitpack.yml to use JDK 21 2024-04-20 10:34:03 +03:00
AuroraLS3 e630db1b71 Update versions.txt 5.6 DEV build 2850 2024-04-20 07:26:27 +00:00
Aurora Lahtela 0d5d9adb77 Bump Extension-PlaceholderAPI to R1.6
Allows configuring invalid placeholder values that should not overwrite existing values.

Affects issues:
- Fixed #3566
2024-04-20 10:12:15 +03:00
jhqwqmc 590e0445cb
Update locale CN by jhqwqmc (#3567) 2024-04-20 10:04:24 +03:00
Aurora Lahtela bd4108a367 Update dependencies
- @testing-library/react
- i18next
- i18next-http-backend
- sass
- swagger-ui
- org.apache.commons.commons-text
- slf4j
2024-04-20 10:02:35 +03:00
Drex faa911e232
Update to 1.20.5 Fabric by DrexHD (#3424)
* Update to 24w03b
* Update to 1.20.5-rc2
* Bump minecraft dependency
2024-04-20 09:48:33 +03:00
dependabot[bot] 6776c79a14
Bump org.sonarqube from 4.4.1.3373 to 5.0.0.4638 in /Plan (#3542)
Bumps org.sonarqube from 4.4.1.3373 to 5.0.0.4638.

---
updated-dependencies:
- dependency-name: org.sonarqube
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-07 14:40:15 +03:00
dependabot[bot] 13d168a593
Bump daggerVersion from 2.51 to 2.51.1 in /Plan (#3555)
Bumps `daggerVersion` from 2.51 to 2.51.1.

Updates `com.google.dagger:dagger` from 2.51 to 2.51.1
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.51...dagger-2.51.1)

Updates `com.google.dagger:dagger-compiler` from 2.51 to 2.51.1
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.51...dagger-2.51.1)

---
updated-dependencies:
- dependency-name: com.google.dagger:dagger
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: com.google.dagger:dagger-compiler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-07 13:41:33 +03:00
Aurora Lahtela 634d6f2a77 Update javascript dependencies
- font awesome
- sass
- swagger-ui
2024-04-07 13:40:41 +03:00
Aurora Lahtela 74ae2dcf40 Fix server allowlist bounces not being exported 2024-04-07 11:18:38 +03:00
Aurora Lahtela f40e1498c1
3268/redesign join address visualization (#3558)
- Join address pie removed
- Join address group mechanism added
  - User can select multiple addresses for each group
  - User can rename each group to their liking
  - The groups are stored in preferences so that user doesn't need to add them back every time
- Use the join address group mechanism for time series of Join Addresses
- Use the join address group mechanism for Player Retention
- Small improvement to retention graph: Show multiple labels
- Small improvement to site clock: Can now hover to show actual date

Affected issues:
- Close #3268
2024-04-07 11:13:18 +03:00
dependabot[bot] b6f68936cf
Bump org.seleniumhq.selenium:selenium-java in /Plan (#3554)
Bumps [org.seleniumhq.selenium:selenium-java](https://github.com/SeleniumHQ/selenium) from 4.18.1 to 4.19.1.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Commits](https://github.com/SeleniumHQ/selenium/commits)

---
updated-dependencies:
- dependency-name: org.seleniumhq.selenium:selenium-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:34:01 +03:00
dependabot[bot] 55799eafa0
Bump vite from 5.2.2 to 5.2.8 in /Plan/react/dashboard (#3548)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.2 to 5.2.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.2.8/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:31:45 +03:00
Aurora Lahtela 8c36f318c7 Prevent duplicate key exception from being thrown entirely
Affects issues:
- Fixed #3543
2024-03-30 10:11:15 +02:00
Aurora Lahtela 49269d3aab Attempt to fix duplicate key issue in UpdateWebPermissionsPatch
Affects issues:
- #3543
2024-03-30 09:48:19 +02:00
dependabot[bot] 95a20b54a3
Bump @testing-library/react in /Plan/react/dashboard (#3528)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 14.2.1 to 14.2.2.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.2.1...v14.2.2)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:25:36 +02:00
dependabot[bot] 2b9314a104
Bump sass from 1.71.1 to 1.72.0 in /Plan/react/dashboard (#3520)
Bumps [sass](https://github.com/sass/dart-sass) from 1.71.1 to 1.72.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.71.1...1.72.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:25:29 +02:00
dependabot[bot] 5a80c6482b
Bump io.swagger.core.v3.swagger-gradle-plugin in /Plan (#3533)
Bumps io.swagger.core.v3.swagger-gradle-plugin from 2.2.20 to 2.2.21.

---
updated-dependencies:
- dependency-name: io.swagger.core.v3.swagger-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:09:06 +02:00
dependabot[bot] 92f887b4a0
Bump react-bootstrap from 2.10.1 to 2.10.2 in /Plan/react/dashboard (#3529)
Bumps [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) from 2.10.1 to 2.10.2.
- [Release notes](https://github.com/react-bootstrap/react-bootstrap/releases)
- [Changelog](https://github.com/react-bootstrap/react-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-bootstrap/react-bootstrap/compare/v2.10.1...v2.10.2)

---
updated-dependencies:
- dependency-name: react-bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:08:53 +02:00
dependabot[bot] 5af89eb787
Bump swaggerVersion from 2.2.20 to 2.2.21 in /Plan (#3532)
Bumps `swaggerVersion` from 2.2.20 to 2.2.21.

Updates `io.swagger.core.v3:swagger-core-jakarta` from 2.2.20 to 2.2.21

Updates `io.swagger.core.v3:swagger-jaxrs2-jakarta` from 2.2.20 to 2.2.21

---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-core-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.swagger.core.v3:swagger-jaxrs2-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:07:54 +02:00
dependabot[bot] d5fc213523
Bump vite from 5.1.5 to 5.2.2 in /Plan/react/dashboard (#3531)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.5 to 5.2.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@5.2.2/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:07:38 +02:00
dependabot[bot] e4a43af3ef
Bump org.apache.commons:commons-compress from 1.26.0 to 1.26.1 in /Plan (#3522)
Bumps org.apache.commons:commons-compress from 1.26.0 to 1.26.1.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-compress
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:06:46 +02:00
dependabot[bot] a543af9562
Bump i18next from 23.10.0 to 23.10.1 in /Plan/react/dashboard (#3518)
Bumps [i18next](https://github.com/i18next/i18next) from 23.10.0 to 23.10.1.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.10.0...v23.10.1)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:06:31 +02:00
dependabot[bot] 9a605994e8
Bump axios from 1.6.7 to 1.6.8 in /Plan/react/dashboard (#3530)
Bumps [axios](https://github.com/axios/axios) from 1.6.7 to 1.6.8.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.7...v1.6.8)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:05:43 +02:00
dependabot[bot] aac41547db
Bump swagger-ui from 5.11.10 to 5.12.0 in /Plan/react/dashboard (#3517)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.11.10 to 5.12.0.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.11.10...v5.12.0)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-23 13:04:19 +02:00
Aurora Lahtela 6d9494d680
Add mcmdev as contributor
For this contribution https://github.com/plan-player-analytics/Extension-LibertyBans/pull/9
2024-03-21 21:28:17 +02:00
Aurora Lahtela b800a9b3ee Bump Extension-LibertyBans to 1.1.0-R1.5 2024-03-20 17:13:05 +02:00
jhqwqmc bd8d92b45c
Update locale_CN.yml (#3516) 2024-03-17 20:15:14 +02:00
Aurora Lahtela 4fb67d7ba7 Update French Locale (FR) by Sniper_TVmc 2024-03-14 20:44:50 +02:00
Aurora Lahtela a4cd8257e2 Fix New Query view not opening at all
The Edit Query effect broke when view wasn't present somewhere
2024-03-14 20:43:23 +02:00
Aurora Lahtela 20b8ab9baa Add 'Edit Query' button to Query Results
This allows easier editing of existing query results
2024-03-14 20:17:08 +02:00
AuroraLS3 e021162729 Update versions.txt 5.6 build 2820 2024-03-14 15:16:46 +00:00
Aurora Lahtela 7463d4e440 Fix exception related to CONCAT on SQLite in Extension boolean storage
Affects issues:
- Fixed #3514
2024-03-11 20:52:41 +02:00
Aurora Lahtela 9fa1a94301 Fix join address not appearing in /plan ingame
Affects issues:
- Fixed #3513
2024-03-11 20:30:31 +02:00
jhqwqmc 30532acf46
Update locale_CN.yml (#3512) 2024-03-11 20:18:30 +02:00
AuroraLS3 4617876e44 Update versions.txt 5.6 build 2816 2024-03-10 08:46:34 +00:00
Aurora Lahtela 252832fcf6 Bump Extension-FastLogin to R1.3
Increase wait up to 9 seconds, until not unknown anymore

Affects issues:
- Close #3485
2024-03-10 10:27:13 +02:00
Aurora Lahtela 8116063e62
Whitelist bounce gathering (#3511)
* Store bounced whitelist logins

* Add allowlist bounce endpoint

* Restore locale file indent from master branch

* Add UI for allowlist

* Update locale

* Fix sonar detected bug and implement database tests

Affects issues:
- Close #2233
2024-03-10 10:25:42 +02:00
Aurora Lahtela 24e6af2d03 Bump Extension-Quests to 5.0.1-R1.0
Affects issues:
- Fixed #3347
- Close https://github.com/PikaMug/Quests/issues/2192
2024-03-10 10:22:23 +02:00
Aurora Lahtela 7299e10064 Fix InstalledPluginGatheringTask running on server thread 2024-03-09 21:15:43 +02:00
Aurora Lahtela de9f9ec5b4
Sonar fixes (#3510)
* Remove deprecated code

- RemoveUnsatisfiedConditionalPlayerResultsTransaction.java
- RemoveUnsatisfiedConditionalServerResultsTransaction.java

* Fix apache compress deprecations

- Use org.apache.commons.io.IOUtils instead of org.apache.commons.compress.utils.IOUtils
- Use TarArchiveInputStream#getNextEntry instead of getNextTarEntry

* Rename variable in BukkitPingCounter

* Extract ApiServices from PlanSystem
2024-03-09 14:43:41 +02:00
Aurora Lahtela 670ef2aff3 Fix exception when storing Extension boolean values with MySQL
Query was using reserved keyword 'stored' as a table alias

Changed it to use 'indb' as the alias

Affects issues:
- Fixed #3508
2024-03-09 10:51:53 +02:00
Aurora Lahtela 9c43287f60 Add Join Address to /plan ingame and placeholders
Adds a %plan_player_join_address% placeholder

Affects issues:
- Close #3463
2024-03-09 10:44:33 +02:00
Aurora Lahtela 9ade3fbf01 Skip yarn build steps on Jitpack
Jitpack doesn't have gclib required for Node 20 which means all builds fail there when yarn build is attempted.

This makes yarn tasks conditional dependency with -PisJitpack flag which skips the problematic section

Affects issues:
- Possibly fixed #3411
2024-03-09 10:29:44 +02:00
Aurora Lahtela 3aa8a71501 Bump Extension-FastLogin to R1.2
Wait one second before asking premium status

Affects issues:
- Possibly fixed #3485
2024-03-09 10:21:14 +02:00
dependabot[bot] 9e29b5aa6b
Bump mockitoVersion from 5.10.0 to 5.11.0 in /Plan (#3505)
Bumps `mockitoVersion` from 5.10.0 to 5.11.0.

Updates `org.mockito:mockito-core` from 5.10.0 to 5.11.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.10.0...v5.11.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.10.0 to 5.11.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.10.0...v5.11.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:12:03 +02:00
dependabot[bot] 94c13f38e4
Bump export-to-csv from 1.2.3 to 1.2.4 in /Plan/react/dashboard (#3503)
Bumps [export-to-csv](https://github.com/alexcaza/export-to-csv) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/alexcaza/export-to-csv/releases)
- [Commits](https://github.com/alexcaza/export-to-csv/compare/v1.2.3...v1.2.4)

---
updated-dependencies:
- dependency-name: export-to-csv
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:52 +02:00
dependabot[bot] b244d43635
Bump react-router-dom from 6.22.2 to 6.22.3 in /Plan/react/dashboard (#3500)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.22.2 to 6.22.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.22.3/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:37 +02:00
dependabot[bot] 05a61ec75a
Bump swagger-ui from 5.11.8 to 5.11.10 in /Plan/react/dashboard (#3501)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.11.8 to 5.11.10.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.11.8...v5.11.10)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:30 +02:00
dependabot[bot] 51d31daa81
Bump react-i18next from 14.0.5 to 14.1.0 in /Plan/react/dashboard (#3502)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 14.0.5 to 14.1.0.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v14.0.5...v14.1.0)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:23 +02:00
dependabot[bot] 0c2b4e1b3e
Bump com.github.seancfoley:ipaddress from 5.4.2 to 5.5.0 in /Plan (#3507)
Bumps [com.github.seancfoley:ipaddress](https://github.com/seancfoley/IPAddress) from 5.4.2 to 5.5.0.
- [Release notes](https://github.com/seancfoley/IPAddress/releases)
- [Commits](https://github.com/seancfoley/IPAddress/compare/v5.4.2...v5.5.0)

---
updated-dependencies:
- dependency-name: com.github.seancfoley:ipaddress
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:16 +02:00
dependabot[bot] 520adf6ca8
Bump testContainersVersion from 1.19.6 to 1.19.7 in /Plan (#3506)
Bumps `testContainersVersion` from 1.19.6 to 1.19.7.

Updates `org.testcontainers:testcontainers` from 1.19.6 to 1.19.7
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.6...1.19.7)

Updates `org.testcontainers:junit-jupiter` from 1.19.6 to 1.19.7
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.6...1.19.7)

Updates `org.testcontainers:nginx` from 1.19.6 to 1.19.7
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.6...1.19.7)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:11:02 +02:00
dependabot[bot] 1a0f0f33a7
Bump vite from 5.1.4 to 5.1.5 in /Plan/react/dashboard (#3504)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.4 to 5.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.1.5/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-09 10:10:54 +02:00
Aurora Lahtela 1beb1ec4bd Revert SQLite driver back to 3.42.0.1
Affects issues:
- #3436
2024-03-09 10:10:01 +02:00
Aurora Lahtela 70e3f394ba Change player ping graph data format
HighCharts error 12 was occurring due to too many data points

This commit changes player ping graph data to be served in format expected by turbo-mode so that it renders.

Affects issues:
- Fixed #3498
2024-03-05 20:10:20 +02:00
AuroraLS3 e1b4e34e77 Update versions.txt 5.6 DEV build 2796 2024-03-03 08:39:26 +00:00
dependabot[bot] a9ab23347a
Bump @fullcalendar/react from 6.1.10 to 6.1.11 in /Plan/react/dashboard (#3495)
Bumps [@fullcalendar/react](https://github.com/fullcalendar/fullcalendar-react) from 6.1.10 to 6.1.11.
- [Release notes](https://github.com/fullcalendar/fullcalendar-react/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar-react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar-react/compare/v6.1.10...v6.1.11)

---
updated-dependencies:
- dependency-name: "@fullcalendar/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:21:23 +02:00
dependabot[bot] c764b2cb31
Bump @fullcalendar/daygrid in /Plan/react/dashboard (#3496)
Bumps [@fullcalendar/daygrid](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/daygrid) from 6.1.10 to 6.1.11.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.11/packages/daygrid)

---
updated-dependencies:
- dependency-name: "@fullcalendar/daygrid"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:21:07 +02:00
dependabot[bot] e10185f344
Bump @fullcalendar/bootstrap in /Plan/react/dashboard (#3491)
Bumps [@fullcalendar/bootstrap](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/bootstrap4) from 6.1.10 to 6.1.11.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.11/packages/bootstrap4)

---
updated-dependencies:
- dependency-name: "@fullcalendar/bootstrap"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:19:47 +02:00
dependabot[bot] bdbd403e3b
Bump daggerVersion from 2.50 to 2.51 in /Plan (#3490)
Bumps `daggerVersion` from 2.50 to 2.51.

Updates `com.google.dagger:dagger` from 2.50 to 2.51
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.50...dagger-2.51)

Updates `com.google.dagger:dagger-compiler` from 2.50 to 2.51
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.50...dagger-2.51)

---
updated-dependencies:
- dependency-name: com.google.dagger:dagger
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:dagger-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:19:38 +02:00
dependabot[bot] 2c7813e795
Bump react-router-dom from 6.22.1 to 6.22.2 in /Plan/react/dashboard (#3492)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.22.1 to 6.22.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.22.2/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:19:08 +02:00
dependabot[bot] 0467c0ddd1
Bump swagger-ui from 5.11.7 to 5.11.8 in /Plan/react/dashboard (#3493)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.11.7 to 5.11.8.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.11.7...v5.11.8)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:18:57 +02:00
dependabot[bot] e33033808c
Bump @fullcalendar/interaction in /Plan/react/dashboard (#3494)
Bumps [@fullcalendar/interaction](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/interaction) from 6.1.10 to 6.1.11.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.11/packages/interaction)

---
updated-dependencies:
- dependency-name: "@fullcalendar/interaction"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-03 10:18:33 +02:00
Aurora Lahtela 5044b6e365 Fix server/network calendar being editable 2024-03-03 10:18:36 +02:00
Aurora Lahtela 12cf9ea414 Fix Today/Yesterday wrong with negative timezones
Applied offset to "now" when comparing with offset timestamps.

Affects issues:
- Possibly fixed #3420
2024-03-03 10:16:02 +02:00
Aurora Lahtela 701866cc6a Don't try to delete conditional providers if there's nothing to delete 2024-03-02 09:14:27 +02:00
Aurora Lahtela 7368eccbbd Optimize unsatisfied extension conditional value cleanup
Extensions support @Conditional value where a boolean provider determines if other values should exist.
Unsatisfied values were being removed during database cleanup task.
The cleanup transaction was very slow and could hang the server if it was performed near shutdown.

The cleanup is now performed on boolean value change (individual value for one player)
instead of with large cleanup transaction (all values and all players).

Affects issues:
- #3436
2024-03-02 08:53:38 +02:00
dependabot[bot] 3ddfe6b166
Bump org.mariadb.jdbc:mariadb-java-client from 3.3.2 to 3.3.3 in /Plan (#3484)
Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.3.2 to 3.3.3.
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.3.2...3.3.3)

---
updated-dependencies:
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 20:21:44 +02:00
dependabot[bot] 68140ba7f9
Bump org.apache.commons:commons-compress from 1.25.0 to 1.26.0 in /Plan (#3473)
Bumps org.apache.commons:commons-compress from 1.25.0 to 1.26.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-compress
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 20:21:28 +02:00
dependabot[bot] b03a4be38b
Bump react-router-dom from 6.22.0 to 6.22.1 in /Plan/react/dashboard (#3476)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.22.0 to 6.22.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/react-router-dom@6.22.1/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.22.1/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 20:21:19 +02:00
dependabot[bot] d4aa1e254d
Bump export-to-csv from 1.2.2 to 1.2.3 in /Plan/react/dashboard (#3480)
Bumps [export-to-csv](https://github.com/alexcaza/export-to-csv) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/alexcaza/export-to-csv/releases)
- [Commits](https://github.com/alexcaza/export-to-csv/compare/v1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: export-to-csv
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 20:21:13 +02:00
dependabot[bot] 7fd7f704bf
Bump i18next from 23.8.2 to 23.10.0 in /Plan/react/dashboard (#3477)
Bumps [i18next](https://github.com/i18next/i18next) from 23.8.2 to 23.10.0.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.8.2...v23.10.0)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 20:20:56 +02:00
dependabot[bot] 2cfd0bff2f
Bump testContainersVersion from 1.19.5 to 1.19.6 in /Plan (#3474)
Bumps `testContainersVersion` from 1.19.5 to 1.19.6.

Updates `org.testcontainers:testcontainers` from 1.19.5 to 1.19.6
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.5...1.19.6)

Updates `org.testcontainers:junit-jupiter` from 1.19.5 to 1.19.6
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.5...1.19.6)

Updates `org.testcontainers:nginx` from 1.19.5 to 1.19.6
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.5...1.19.6)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:40:22 +02:00
dependabot[bot] f2749a33ff
Bump sass from 1.70.0 to 1.71.1 in /Plan/react/dashboard (#3478)
Bumps [sass](https://github.com/sass/dart-sass) from 1.70.0 to 1.71.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.70.0...1.71.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:40:05 +02:00
dependabot[bot] f69a2858ee
Bump org.seleniumhq.selenium:selenium-java in /Plan (#3475)
Bumps [org.seleniumhq.selenium:selenium-java](https://github.com/SeleniumHQ/selenium) from 4.17.0 to 4.18.1.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.17.0...selenium-4.18.1)

---
updated-dependencies:
- dependency-name: org.seleniumhq.selenium:selenium-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:39:37 +02:00
dependabot[bot] f78dca306c
Bump vite from 5.1.3 to 5.1.4 in /Plan/react/dashboard (#3479)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.3 to 5.1.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.1.4/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:39:12 +02:00
dependabot[bot] 8861e99abc
Bump @fullcalendar/core from 6.1.10 to 6.1.11 in /Plan/react/dashboard (#3481)
Bumps [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core) from 6.1.10 to 6.1.11.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.11/packages/core)

---
updated-dependencies:
- dependency-name: "@fullcalendar/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:38:47 +02:00
dependabot[bot] 34013901c7
Bump i18next-http-backend from 2.4.3 to 2.5.0 in /Plan/react/dashboard (#3482)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.4.3 to 2.5.0.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.4.3...v2.5.0)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:38:16 +02:00
dependabot[bot] a2147f2fab
Bump bootstrap from 5.3.2 to 5.3.3 in /Plan/react/dashboard (#3483)
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 5.3.2 to 5.3.3.
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v5.3.2...v5.3.3)

---
updated-dependencies:
- dependency-name: bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-28 19:38:06 +02:00
Aurora Lahtela 367d8af59a
Update action versions 2024-02-28 17:23:47 +02:00
Aurora Lahtela 6ed23f0c0b Download GeoLite2 Country database from playeranalytics.net
Affects issues:
- Fixed #3452
2024-02-28 11:47:16 +02:00
Aurora Lahtela 4042980379 Fix build issue 2024-02-28 10:10:35 +02:00
Aurora Lahtela 092533d0b7 Change order of guards to allow IP blocklisted requests to be rate-limited 2024-02-28 10:09:21 +02:00
Aurora Lahtela ab94ab9125 Rate limit against simple DDoS
Affects issues:
- Close #1846
- Close #3486
2024-02-28 10:02:26 +02:00
Aurora Lahtela b50fa10e12 Reduce DDoS impact of access log transactions
Made Plan skip access logging if transaction queue is larger than 500 transactions
Reduced amount of objects held by access log transaction by serializing request properties to objects before passing to transaction.

Affects issues:
- #3486
2024-02-27 10:11:45 +02:00
dependabot[bot] a3a2085c8a
Bump vite from 5.0.12 to 5.1.3 in /Plan/react/dashboard (#3465)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.12 to 5.1.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.1.3/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 10:32:20 +02:00
dependabot[bot] 8170f4f974
Bump react-bootstrap from 2.10.0 to 2.10.1 in /Plan/react/dashboard (#3464)
Bumps [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/react-bootstrap/react-bootstrap/releases)
- [Changelog](https://github.com/react-bootstrap/react-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-bootstrap/react-bootstrap/compare/v2.10.0...v2.10.1)

---
updated-dependencies:
- dependency-name: react-bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 10:12:51 +02:00
dependabot[bot] d15cf82e9c
Bump undici from 5.26.3 to 5.28.3 in /Plan/react/dashboard (#3467)
Bumps [undici](https://github.com/nodejs/undici) from 5.26.3 to 5.28.3.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.28.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 10:12:05 +02:00
dependabot[bot] b1566dfe80
Bump swagger-ui from 5.11.2 to 5.11.7 in /Plan/react/dashboard (#3468)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.11.2 to 5.11.7.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.11.2...v5.11.7)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 10:11:56 +02:00
dependabot[bot] 1297ede72d
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3458)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.4.1...v6.4.2)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:26:02 +02:00
dependabot[bot] f8553009f3
Bump org.junit.jupiter:junit-jupiter from 5.10.1 to 5.10.2 in /Plan (#3454)
Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.1 to 5.10.2.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.10.1...r5.10.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:25:38 +02:00
dependabot[bot] 7d3ab667d8
Bump testContainersVersion from 1.19.4 to 1.19.5 in /Plan (#3453)
Bumps `testContainersVersion` from 1.19.4 to 1.19.5.

Updates `org.testcontainers:testcontainers` from 1.19.4 to 1.19.5
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.4...1.19.5)

Updates `org.testcontainers:junit-jupiter` from 1.19.4 to 1.19.5
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.4...1.19.5)

Updates `org.testcontainers:nginx` from 1.19.4 to 1.19.5
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.4...1.19.5)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:25:24 +02:00
dependabot[bot] a4e2f0d6f7
Bump react-i18next from 14.0.1 to 14.0.5 in /Plan/react/dashboard (#3459)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 14.0.1 to 14.0.5.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v14.0.1...v14.0.5)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:24:13 +02:00
dependabot[bot] e955f80daa
Bump commons-codec:commons-codec from 1.16.0 to 1.16.1 in /Plan (#3457)
Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.16.0 to 1.16.1.
- [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt)
- [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.16.0...rel/commons-codec-1.16.1)

---
updated-dependencies:
- dependency-name: commons-codec:commons-codec
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:24:00 +02:00
dependabot[bot] aad3073c92
Bump com.github.node-gradle.node from 7.0.1 to 7.0.2 in /Plan (#3456)
Bumps com.github.node-gradle.node from 7.0.1 to 7.0.2.

---
updated-dependencies:
- dependency-name: com.github.node-gradle.node
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 09:23:25 +02:00
Aurora Lahtela b867bcebdb Don't save sessions on server shutdown if database already closed
Affects issues:
- #3436
2024-02-17 09:19:38 +02:00
Aurora Lahtela bede36957b Fix ShutdownSaveTest 2024-02-17 09:11:37 +02:00
Aurora Lahtela 2daf3943b7 Make call-site for SQLite JVM wait more accurate
Affects issues:
- #3436
2024-02-17 09:06:45 +02:00
Aurora Lahtela e041e193fc Close transaction queue after connection wait on SQLite
Affects issues:
- #3436
2024-02-11 15:47:39 +02:00
Aurora Lahtela bf3bdb599d Log connection waiting sites without dev mode 2024-02-04 10:05:48 +02:00
dependabot[bot] 8ced48d815
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3444)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.3.0 to 6.4.1.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.3.0...v6.4.1)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 14:49:19 +02:00
dependabot[bot] 45833d5fc7
Bump com.github.seancfoley:ipaddress from 5.4.0 to 5.4.2 in /Plan (#3451)
Bumps [com.github.seancfoley:ipaddress](https://github.com/seancfoley/IPAddress) from 5.4.0 to 5.4.2.
- [Release notes](https://github.com/seancfoley/IPAddress/releases)
- [Commits](https://github.com/seancfoley/IPAddress/compare/v5.4.0...v5.4.2)

---
updated-dependencies:
- dependency-name: com.github.seancfoley:ipaddress
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 14:49:10 +02:00
dependabot[bot] ad8256cf04
Bump swagger-ui from 5.11.0 to 5.11.2 in /Plan/react/dashboard (#3443)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.11.0 to 5.11.2.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.11.0...v5.11.2)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:53:58 +02:00
dependabot[bot] 0ccafd9050
Bump react-router-dom from 6.21.3 to 6.22.0 in /Plan/react/dashboard (#3447)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.3 to 6.22.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.22.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:53:21 +02:00
dependabot[bot] 60f2aa6c42
Bump i18next-http-backend from 2.4.2 to 2.4.3 in /Plan/react/dashboard (#3446)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.4.2 to 2.4.3.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.4.2...v2.4.3)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:53:06 +02:00
dependabot[bot] 468bd32111
Bump i18next from 23.7.19 to 23.8.2 in /Plan/react/dashboard (#3442)
Bumps [i18next](https://github.com/i18next/i18next) from 23.7.19 to 23.8.2.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.7.19...v23.8.2)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:52:45 +02:00
dependabot[bot] ed543e460e
Bump @testing-library/react in /Plan/react/dashboard (#3445)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 14.1.2 to 14.2.1.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.1.2...v14.2.1)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:52:35 +02:00
dependabot[bot] cac627a2f7
Bump jettyVersion from 11.0.19 to 11.0.20 in /Plan (#3450)
Bumps `jettyVersion` from 11.0.19 to 11.0.20.

Updates `org.eclipse.jetty:jetty-server` from 11.0.19 to 11.0.20

Updates `org.eclipse.jetty:jetty-alpn-java-server` from 11.0.19 to 11.0.20

Updates `org.eclipse.jetty.http2:http2-server` from 11.0.19 to 11.0.20

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-alpn-java-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.http2:http2-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:52:07 +02:00
dependabot[bot] a0a430507e
Bump org.xerial:sqlite-jdbc from 3.45.0.0 to 3.45.1.0 in /Plan (#3448)
Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.45.0.0 to 3.45.1.0.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.45.0.0...3.45.1.0)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 13:51:55 +02:00
Aurora Lahtela 5ddbd52d37 Log connection holding call sites in dev-mode 2024-02-03 10:17:31 +02:00
Aurora Lahtela 4615c6b6b0 Optimize unsatisfied condition removal for players with user_id join
The query was joining based on UUID which can be slow since it's a string.
2024-02-03 09:13:00 +02:00
Aurora Lahtela 47d74eee8c Add slf4j-nop:1.7.36 to SQLite driver dependencies
SQLite driver 3.43.2.1 downgraded to slf4j 1.7

Adding the nop library to be loaded by the dependency downloader
will stop the error message since slf4j-nop 1.7 is loaded.

Affects issues:
- Fixed #3435
2024-01-28 12:34:37 +02:00
甜力怕 bda96726f8
Update locale_CN.yml by liuzhen932 (#3437) 2024-01-28 09:05:07 +02:00
Aurora Lahtela 2b93919b5e Use better loader for PlayerTable 2024-01-27 21:04:16 +02:00
Aurora Lahtela a8decff8e8 Make Ping Table use DataTablesTable
Also fixed issue where server ping table never loaded
2024-01-27 21:02:04 +02:00
Aurora Lahtela 67c487b820 Fix Best and Worst ping formatting on player table 2024-01-27 14:21:34 +02:00
Aurora Lahtela ff7e7791f3 Refactor PlayerListCard to also have PlayerTable 2024-01-27 14:13:08 +02:00
Aurora Lahtela 3ad5d577d4 Make Query view affect ping data retrieved
All ping data was being used to create average.

This allows comparing ping over time
2024-01-27 14:01:14 +02:00
Aurora Lahtela 7494902e46 Add regular_players and network_regular_players placeholders
Affects issues:
- Close #3425
2024-01-27 13:38:06 +02:00
Aurora Lahtela 01ce503c77 Add network session placeholders
Affects issues:
- Close #2267
2024-01-27 13:35:03 +02:00
AuroraLS3 465af8e803 Update versions.txt 2024-01-27 08:08:01 +00:00
dependabot[bot] 512defb3f8
Bump org.seleniumhq.selenium:selenium-java from 4.12.1 to 4.17.0 in /Plan (#3434)
* Bump org.seleniumhq.selenium:selenium-java in /Plan

Bumps [org.seleniumhq.selenium:selenium-java](https://github.com/SeleniumHQ/selenium) from 4.12.1 to 4.17.0.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Commits](https://github.com/SeleniumHQ/selenium/commits/selenium-4.17.0)

---
updated-dependencies:
- dependency-name: org.seleniumhq.selenium:selenium-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Use new headless setup method

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com>
2024-01-27 09:49:50 +02:00
dependabot[bot] 89355d4975
Bump testContainersVersion from 1.19.3 to 1.19.4 in /Plan (#3431)
Bumps `testContainersVersion` from 1.19.3 to 1.19.4.

Updates `org.testcontainers:testcontainers` from 1.19.3 to 1.19.4
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.3...1.19.4)

Updates `org.testcontainers:junit-jupiter` from 1.19.3 to 1.19.4
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.3...1.19.4)

Updates `org.testcontainers:nginx` from 1.19.3 to 1.19.4
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.3...1.19.4)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:26:00 +02:00
dependabot[bot] 4a6987710f
Bump org.xerial:sqlite-jdbc from 3.42.0.1 to 3.45.0.0 in /Plan (#3430)
Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.42.0.1 to 3.45.0.0.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.42.0.1...3.45.0.0)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:25:52 +02:00
dependabot[bot] 79ba13b6fc
Bump react-i18next from 14.0.0 to 14.0.1 in /Plan/react/dashboard (#3427)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 14.0.0 to 14.0.1.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v14.0.0...v14.0.1)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:14:23 +02:00
dependabot[bot] 7bbc18934a
Bump i18next from 23.7.16 to 23.7.19 in /Plan/react/dashboard (#3428)
Bumps [i18next](https://github.com/i18next/i18next) from 23.7.16 to 23.7.19.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.7.16...v23.7.19)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:14:09 +02:00
dependabot[bot] 66844d4c56
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3429)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.2.0...v6.3.0)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:13:47 +02:00
dependabot[bot] d68bf9fca9
Bump axios from 1.6.5 to 1.6.7 in /Plan/react/dashboard (#3426)
Bumps [axios](https://github.com/axios/axios) from 1.6.5 to 1.6.7.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.5...v1.6.7)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:13:22 +02:00
dependabot[bot] 6584ca0cb7
Bump mockitoVersion from 5.9.0 to 5.10.0 in /Plan (#3433)
Bumps `mockitoVersion` from 5.9.0 to 5.10.0.

Updates `org.mockito:mockito-core` from 5.9.0 to 5.10.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.9.0...v5.10.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.9.0 to 5.10.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.9.0...v5.10.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 09:12:53 +02:00
Aurora Lahtela 8356a0d52e Test and fix top_ placeholders
Affects issues:
- Fixed #3369
2024-01-21 20:08:46 +02:00
Aurora Lahtela c8d0cc91b6 Fixed react bundle getting exported when export is disabled
Caused by missing checks before react export.

Affects issues:
- #3384
2024-01-21 19:33:24 +02:00
Aurora Lahtela ae85f39871 Stop JSON cache mismatch when UUID is missing
The check for {identifier}- meant that lookup for "PLAYERS_ONLINE-"
would also match "PLAYERS_ONLINE-{uuid}-" since start is the same

Fixed this by changing identifiers to PLAYERS_ONLINE_{uuid}-{timestamp}

Affects issues:
- Fixed #3404
2024-01-21 19:21:41 +02:00
Aurora Lahtela 1fdd3289a6 Move fabric command registration earlier
This prevents situation where Plan disables due to an error but reload command is not available

Affects issues:
- Fixed #3392
2024-01-21 13:44:47 +02:00
Aurora Lahtela 9e08794ddd Update locale files 2024-01-21 10:04:17 +02:00
Aurora Lahtela 34a731b70a Add CSV export to all DataTables
Affects issues:
- Close #3413
2024-01-21 10:02:39 +02:00
Aurora Lahtela 673cb4cfdb Remove console log 2024-01-20 11:34:39 +02:00
Aurora Lahtela 8e94d26ff3 Format Server/Network Overview values in the frontend 2024-01-20 11:34:20 +02:00
dependabot[bot] f9d2b0767f
Bump react-router-dom from 6.21.2 to 6.21.3 in /Plan/react/dashboard (#3414)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.2 to 6.21.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.3/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:12:49 +02:00
dependabot[bot] 7dfb933295
Bump sass from 1.69.7 to 1.70.0 in /Plan/react/dashboard (#3415)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.7 to 1.70.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.69.7...1.70.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:12:33 +02:00
dependabot[bot] 8e0b2d2734
Bump react-bootstrap from 2.9.2 to 2.10.0 in /Plan/react/dashboard (#3416)
Bumps [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) from 2.9.2 to 2.10.0.
- [Release notes](https://github.com/react-bootstrap/react-bootstrap/releases)
- [Changelog](https://github.com/react-bootstrap/react-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-bootstrap/react-bootstrap/compare/v2.9.2...v2.10.0)

---
updated-dependencies:
- dependency-name: react-bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:12:14 +02:00
dependabot[bot] 3717eacad1
Bump mockitoVersion from 5.8.0 to 5.9.0 in /Plan (#3417)
Bumps `mockitoVersion` from 5.8.0 to 5.9.0.

Updates `org.mockito:mockito-core` from 5.8.0 to 5.9.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.8.0...v5.9.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.8.0 to 5.9.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.8.0...v5.9.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:11:57 +02:00
dependabot[bot] 6f179a133b
Bump com.mysql:mysql-connector-j from 8.2.0 to 8.3.0 in /Plan (#3418)
Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 8.3.0.
- [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.x/CHANGES)
- [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...8.3.0)

---
updated-dependencies:
- dependency-name: com.mysql:mysql-connector-j
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:11:47 +02:00
dependabot[bot] 0ec5552d90
Bump vite from 5.0.11 to 5.0.12 in /Plan/react/dashboard (#3419)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.11 to 5.0.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.0.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.12/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 09:11:11 +02:00
dependabot[bot] 2a387bd0dd
Bump swagger-ui from 5.10.5 to 5.11.0 in /Plan/react/dashboard (#3409)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.10.5 to 5.11.0.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.10.5...v5.11.0)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 11:36:29 +02:00
dependabot[bot] 26b69e604c
Bump react-router-dom from 6.21.1 to 6.21.2 in /Plan/react/dashboard (#3407)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.1 to 6.21.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.2/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 11:36:06 +02:00
dependabot[bot] 3e41c4dccf
Bump slf4jVersion from 2.0.10 to 2.0.11 in /Plan (#3405)
Bumps `slf4jVersion` from 2.0.10 to 2.0.11.

Updates `org.slf4j:slf4j-nop` from 2.0.10 to 2.0.11

Updates `org.slf4j:slf4j-api` from 2.0.10 to 2.0.11

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-nop
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.slf4j:slf4j-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 11:35:12 +02:00
dependabot[bot] ae98bcfd69
Bump axios from 1.6.4 to 1.6.5 in /Plan/react/dashboard (#3406)
Bumps [axios](https://github.com/axios/axios) from 1.6.4 to 1.6.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.4...v1.6.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 11:35:04 +02:00
dependabot[bot] 05f07da915
Bump vite from 5.0.10 to 5.0.11 in /Plan/react/dashboard (#3408)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.10 to 5.0.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.11/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 11:34:51 +02:00
AuroraLS3 d4ab5a53f8 Update versions.txt 5.6 DEV build 2703 2024-01-07 10:10:44 +00:00
dependabot[bot] 29ed71f81c
Bump @fullcalendar/react from 6.1.9 to 6.1.10 in /Plan/react/dashboard (#3361)
Bumps [@fullcalendar/react](https://github.com/fullcalendar/fullcalendar-react) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/fullcalendar/fullcalendar-react/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar-react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar-react/compare/v6.1.9...v6.1.10)

---
updated-dependencies:
- dependency-name: "@fullcalendar/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-07 11:51:43 +02:00
Aurora Lahtela 28f3f356cc Use getGameProfile().getName() for player name on Fabric 2024-01-07 11:44:53 +02:00
Jeroen Bollen fa1ec4f4f6
Fabric 1.20.4 (#3366) 2024-01-07 11:39:06 +02:00
dependabot[bot] 23d2cc046e
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3396)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.6 to 6.2.0.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.1.6...v6.2.0)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-07 11:38:31 +02:00
dependabot[bot] 5602706cfa
Bump @testing-library/user-event in /Plan/react/dashboard (#3397)
Bumps [@testing-library/user-event](https://github.com/testing-library/user-event) from 14.5.1 to 14.5.2.
- [Release notes](https://github.com/testing-library/user-event/releases)
- [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/user-event/compare/v14.5.1...v14.5.2)

---
updated-dependencies:
- dependency-name: "@testing-library/user-event"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-07 11:38:23 +02:00
dependabot[bot] 9dc4bbdb64
Bump sass from 1.69.6 to 1.69.7 in /Plan/react/dashboard (#3398)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.6 to 1.69.7.
- [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.69.6...1.69.7)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-07 11:38:16 +02:00
Aurora Lahtela feb8118002 Bump Extension-DiscordSRV to 1.27.0-R1.4
Affects issues:
- Fixed #3399
2024-01-06 18:01:51 +02:00
Aurora Lahtela bc4aef8b2b Add some missing javadocs to not generate warnings 2024-01-06 18:01:50 +02:00
dependabot[bot] 6fa2d0ab87
Bump @vitejs/plugin-react from 4.2.0 to 4.2.1 in /Plan/react/dashboard (#3356)
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.2.1/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 17:01:18 +02:00
dependabot[bot] c638600d0a
Bump swagger-ui from 5.10.3 to 5.10.5 in /Plan/react/dashboard (#3360)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.10.3 to 5.10.5.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.10.3...v5.10.5)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 17:01:12 +02:00
dependabot[bot] 3d95541f8e
Bump axios from 1.6.3 to 1.6.4 in /Plan/react/dashboard (#3394)
Bumps [axios](https://github.com/axios/axios) from 1.6.3 to 1.6.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.3...v1.6.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 17:00:57 +02:00
dependabot[bot] 38e9909b23
Bump i18next from 23.7.12 to 23.7.16 in /Plan/react/dashboard (#3393)
Bumps [i18next](https://github.com/i18next/i18next) from 23.7.12 to 23.7.16.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.7.12...v23.7.16)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 17:00:47 +02:00
dependabot[bot] 3e5dbd4ca3
Bump react-router-dom from 6.20.1 to 6.21.1 in /Plan/react/dashboard (#3382)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.20.1 to 6.21.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.1/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 17:00:35 +02:00
dependabot[bot] 9e8d93820a
Bump @fullcalendar/interaction in /Plan/react/dashboard (#3362)
Bumps [@fullcalendar/interaction](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/interaction) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.10/packages/interaction)

---
updated-dependencies:
- dependency-name: "@fullcalendar/interaction"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:59:59 +02:00
dependabot[bot] 775347574f
Bump org.mariadb.jdbc:mariadb-java-client from 3.3.1 to 3.3.2 in /Plan (#3379)
Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.3.1...3.3.2)

---
updated-dependencies:
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:05:34 +02:00
dependabot[bot] fec0471edd
Bump @fullcalendar/bootstrap in /Plan/react/dashboard (#3357)
Bumps [@fullcalendar/bootstrap](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/bootstrap4) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.10/packages/bootstrap4)

---
updated-dependencies:
- dependency-name: "@fullcalendar/bootstrap"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:04:56 +02:00
dependabot[bot] e6c97c0d81
Bump jettyVersion from 11.0.18 to 11.0.19 in /Plan (#3375)
Bumps `jettyVersion` from 11.0.18 to 11.0.19.

Updates `org.eclipse.jetty:jetty-server` from 11.0.18 to 11.0.19
- [Release notes](https://github.com/jetty/jetty.project/releases)
- [Commits](https://github.com/jetty/jetty.project/compare/jetty-11.0.18...jetty-11.0.19)

Updates `org.eclipse.jetty:jetty-alpn-java-server` from 11.0.18 to 11.0.19

Updates `org.eclipse.jetty.http2:http2-server` from 11.0.18 to 11.0.19

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-alpn-java-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.http2:http2-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:04:40 +02:00
dependabot[bot] f50b915a23
Bump @fullcalendar/daygrid from 6.1.9 to 6.1.10 in /Plan/react/dashboard (#3363)
Bumps [@fullcalendar/daygrid](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/daygrid) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.10/packages/daygrid)

---
updated-dependencies:
- dependency-name: "@fullcalendar/daygrid"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:03:34 +02:00
dependabot[bot] d204b5cf75
Bump io.swagger.core.v3.swagger-gradle-plugin in /Plan (#3376)
Bumps io.swagger.core.v3.swagger-gradle-plugin from 2.2.19 to 2.2.20.

---
updated-dependencies:
- dependency-name: io.swagger.core.v3.swagger-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:03:04 +02:00
dependabot[bot] 9ece2ea4a5
Bump swaggerVersion from 2.2.19 to 2.2.20 in /Plan (#3377)
Bumps `swaggerVersion` from 2.2.19 to 2.2.20.

Updates `io.swagger.core.v3:swagger-core-jakarta` from 2.2.19 to 2.2.20

Updates `io.swagger.core.v3:swagger-jaxrs2-jakarta` from 2.2.19 to 2.2.20

---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-core-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.swagger.core.v3:swagger-jaxrs2-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:02:53 +02:00
dependabot[bot] 82894e05ba
Bump daggerVersion from 2.49 to 2.50 in /Plan (#3378)
Bumps `daggerVersion` from 2.49 to 2.50.

Updates `com.google.dagger:dagger` from 2.49 to 2.50
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.49...dagger-2.50)

Updates `com.google.dagger:dagger-compiler` from 2.49 to 2.50
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.49...dagger-2.50)

---
updated-dependencies:
- dependency-name: com.google.dagger:dagger
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:dagger-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:02:42 +02:00
dependabot[bot] e771db2f3a
Bump vite from 5.0.5 to 5.0.10 in /Plan/react/dashboard (#3380)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.5 to 5.0.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.10/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:02:03 +02:00
dependabot[bot] 3ee3335ccf
Bump react-i18next from 13.5.0 to 14.0.0 in /Plan/react/dashboard (#3381)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 13.5.0 to 14.0.0.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v13.5.0...v14.0.0)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:01:47 +02:00
dependabot[bot] 4564b04fec
Bump slf4jVersion from 2.0.9 to 2.0.10 in /Plan (#3385)
Bumps `slf4jVersion` from 2.0.9 to 2.0.10.

Updates `org.slf4j:slf4j-nop` from 2.0.9 to 2.0.10

Updates `org.slf4j:slf4j-api` from 2.0.9 to 2.0.10

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-nop
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.slf4j:slf4j-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:01:31 +02:00
dependabot[bot] 2b57902111
Bump i18next from 23.7.8 to 23.7.12 in /Plan/react/dashboard (#3386)
Bumps [i18next](https://github.com/i18next/i18next) from 23.7.8 to 23.7.12.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.7.8...v23.7.12)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:01:11 +02:00
dependabot[bot] cad820b925
Bump axios from 1.6.2 to 1.6.3 in /Plan/react/dashboard (#3387)
Bumps [axios](https://github.com/axios/axios) from 1.6.2 to 1.6.3.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.2...v1.6.3)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:01:00 +02:00
dependabot[bot] edbbf682f0
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3388)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.5 to 6.1.6.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.1.5...v6.1.6)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:00:49 +02:00
dependabot[bot] cddb06b6db
Bump react-bootstrap from 2.9.1 to 2.9.2 in /Plan/react/dashboard (#3389)
Bumps [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) from 2.9.1 to 2.9.2.
- [Release notes](https://github.com/react-bootstrap/react-bootstrap/releases)
- [Changelog](https://github.com/react-bootstrap/react-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-bootstrap/react-bootstrap/compare/v2.9.1...v2.9.2)

---
updated-dependencies:
- dependency-name: react-bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:00:40 +02:00
dependabot[bot] 9e6ed14498
Bump sass from 1.69.5 to 1.69.6 in /Plan/react/dashboard (#3390)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.5 to 1.69.6.
- [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.69.5...1.69.6)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:00:20 +02:00
dependabot[bot] f25886250c
Bump moment from 2.29.4 to 2.30.1 in /Plan/react/dashboard (#3391)
Bumps [moment](https://github.com/moment/moment) from 2.29.4 to 2.30.1.
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.4...2.30.1)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-04 16:00:04 +02:00
dependabot[bot] 122e35b9c3
Bump vite from 5.0.0 to 5.0.5 in /Plan/react/dashboard (#3355)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.0 to 5.0.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.5/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-10 10:39:01 +02:00
Aurora Lahtela bc424f062f
3236/vite migration (#3354)
* Migrate to Vite
* Remove asset-manifest.json which vite doesn't generate
* Fix tree-shaking removing Export URL if-blocks from services
* Implement address correction for the vite bundle
* Fixed issue with single proxy online graph 403 without page.server.overview.players.online.graph

Affects issues:
- Close #3236
2023-12-10 09:29:01 +02:00
dependabot[bot] 05cf96de0e
Bump org.mariadb.jdbc:mariadb-java-client from 3.3.0 to 3.3.1 in /Plan (#3332)
Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.3.0...3.3.1)

---
updated-dependencies:
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:35:21 +02:00
dependabot[bot] c2849e4ad8
Bump @fortawesome/free-brands-svg-icons in /Plan/react/dashboard (#3337)
Bumps [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/free-brands-svg-icons"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:35:05 +02:00
dependabot[bot] 633d29a8c2
Bump @fortawesome/free-solid-svg-icons in /Plan/react/dashboard (#3336)
Bumps [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/free-solid-svg-icons"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:34:58 +02:00
dependabot[bot] 22705289b2
Bump @fortawesome/fontawesome-free in /Plan/react/dashboard (#3335)
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:34:49 +02:00
dependabot[bot] 2d5bb874f1
Bump react-router-dom from 6.20.0 to 6.20.1 in /Plan/react/dashboard (#3352)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.20.0 to 6.20.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.20.1/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:12:23 +02:00
dependabot[bot] 9e829ef649
Bump @fortawesome/fontawesome-svg-core in /Plan/react/dashboard (#3334)
Bumps [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-svg-core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:11:32 +02:00
dependabot[bot] 087c22235c
Bump @fortawesome/free-regular-svg-icons in /Plan/react/dashboard (#3338)
Bumps [@fortawesome/free-regular-svg-icons](https://github.com/FortAwesome/Font-Awesome) from 6.4.2 to 6.5.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.2...6.5.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/free-regular-svg-icons"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:11:11 +02:00
dependabot[bot] 09a61d39e3
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3340)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.4 to 6.1.5.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.1.4...v6.1.5)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:11:02 +02:00
dependabot[bot] e7b421bed2
Bump @fullcalendar/core from 6.1.9 to 6.1.10 in /Plan/react/dashboard (#3339)
Bumps [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/fullcalendar/fullcalendar/releases)
- [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.10/packages/core)

---
updated-dependencies:
- dependency-name: "@fullcalendar/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:10:51 +02:00
dependabot[bot] 157b4bed9d
Bump @adobe/css-tools from 4.3.1 to 4.3.2 in /Plan/react/dashboard (#3342)
Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1 to 4.3.2.
- [Changelog](https://github.com/adobe/css-tools/blob/main/History.md)
- [Commits](https://github.com/adobe/css-tools/commits)

---
updated-dependencies:
- dependency-name: "@adobe/css-tools"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:10:38 +02:00
dependabot[bot] 584ac9880e
Bump mockitoVersion from 5.7.0 to 5.8.0 in /Plan (#3348)
Bumps `mockitoVersion` from 5.7.0 to 5.8.0.

Updates `org.mockito:mockito-core` from 5.7.0 to 5.8.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.7.0...v5.8.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.7.0 to 5.8.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.7.0...v5.8.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:10:26 +02:00
dependabot[bot] 1731c28022
Bump daggerVersion from 2.48.1 to 2.49 in /Plan (#3349)
Bumps `daggerVersion` from 2.48.1 to 2.49.

Updates `com.google.dagger:dagger` from 2.48.1 to 2.49
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.48.1...dagger-2.49)

Updates `com.google.dagger:dagger-compiler` from 2.48.1 to 2.49
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.48.1...dagger-2.49)

---
updated-dependencies:
- dependency-name: com.google.dagger:dagger
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:dagger-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:10:08 +02:00
dependabot[bot] c3a1b215ab
Bump com.maxmind.geoip2:geoip2 from 4.1.0 to 4.2.0 in /Plan (#3351)
Bumps [com.maxmind.geoip2:geoip2](https://github.com/maxmind/GeoIP2-java) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/maxmind/GeoIP2-java/releases)
- [Changelog](https://github.com/maxmind/GeoIP2-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/maxmind/GeoIP2-java/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: com.maxmind.geoip2:geoip2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:09:06 +02:00
dependabot[bot] 3374250493
Bump i18next from 23.7.6 to 23.7.8 in /Plan/react/dashboard (#3353)
Bumps [i18next](https://github.com/i18next/i18next) from 23.7.6 to 23.7.8.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.7.6...v23.7.8)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-09 09:08:30 +02:00
jhqwqmc 26854c37cc
Update locale_CN.yml (#3345) 2023-12-06 11:42:06 +02:00
dependabot[bot] bf46b1123c
Bump testContainersVersion from 1.19.2 to 1.19.3 in /Plan (#3322)
Bumps `testContainersVersion` from 1.19.2 to 1.19.3.

Updates `org.testcontainers:testcontainers` from 1.19.2 to 1.19.3
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.2...1.19.3)

Updates `org.testcontainers:junit-jupiter` from 1.19.2 to 1.19.3
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.2...1.19.3)

Updates `org.testcontainers:nginx` from 1.19.2 to 1.19.3
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.2...1.19.3)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-25 13:56:48 +02:00
dependabot[bot] 4627337bb5
Bump i18next-http-backend from 2.4.1 to 2.4.2 in /Plan/react/dashboard (#3323)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.4.1 to 2.4.2.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.4.1...v2.4.2)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-25 13:56:35 +02:00
dependabot[bot] 5074fba1a4
Bump react-router-dom from 6.19.0 to 6.20.0 in /Plan/react/dashboard (#3324)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.19.0 to 6.20.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.20.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-25 13:56:27 +02:00
dependabot[bot] 6e7f64610a
Bump swagger-ui from 5.10.0 to 5.10.3 in /Plan/react/dashboard (#3325)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.10.0 to 5.10.3.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.10.0...v5.10.3)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-25 13:56:13 +02:00
dependabot[bot] 15c5ea32d4
Bump @testing-library/react in /Plan/react/dashboard (#3326)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 14.1.0 to 14.1.2.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.1.0...v14.1.2)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-25 13:56:06 +02:00
dependabot[bot] d45c04c502
Bump i18next-chained-backend in /Plan/react/dashboard (#3316)
Bumps [i18next-chained-backend](https://github.com/i18next/i18next-chained-backend) from 4.5.0 to 4.6.2.
- [Changelog](https://github.com/i18next/i18next-chained-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-chained-backend/compare/v4.5.0...v4.6.2)

---
updated-dependencies:
- dependency-name: i18next-chained-backend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:18:26 +02:00
dependabot[bot] 3146a19e30
Bump testContainersVersion from 1.19.1 to 1.19.2 in /Plan (#3317)
Bumps `testContainersVersion` from 1.19.1 to 1.19.2.

Updates `org.testcontainers:testcontainers` from 1.19.1 to 1.19.2
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.1...1.19.2)

Updates `org.testcontainers:junit-jupiter` from 1.19.1 to 1.19.2
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.1...1.19.2)

Updates `org.testcontainers:nginx` from 1.19.1 to 1.19.2
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.1...1.19.2)

---
updated-dependencies:
- dependency-name: org.testcontainers:testcontainers
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.testcontainers:nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:18:12 +02:00
dependabot[bot] e15b9b9ceb
Bump i18next from 23.6.0 to 23.7.6 in /Plan/react/dashboard (#3310)
Bumps [i18next](https://github.com/i18next/i18next) from 23.6.0 to 23.7.6.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.6.0...v23.7.6)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:07:13 +02:00
dependabot[bot] e6aec3d6e0
Bump i18next-http-backend from 2.3.1 to 2.4.1 in /Plan/react/dashboard (#3311)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.3.1 to 2.4.1.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.3.1...v2.4.1)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:07:04 +02:00
dependabot[bot] 66af4723cc
Bump axios from 1.6.1 to 1.6.2 in /Plan/react/dashboard (#3312)
Bumps [axios](https://github.com/axios/axios) from 1.6.1 to 1.6.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.1...v1.6.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:06:54 +02:00
dependabot[bot] 0ab3988541
Bump react-i18next from 13.3.1 to 13.5.0 in /Plan/react/dashboard (#3314)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 13.3.1 to 13.5.0.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v13.3.1...v13.5.0)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:06:24 +02:00
dependabot[bot] a9226b3c1b
Bump swagger-ui from 5.9.3 to 5.10.0 in /Plan/react/dashboard (#3313)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.9.3 to 5.10.0.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.9.3...v5.10.0)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:06:13 +02:00
dependabot[bot] ef6262f7ac
Bump react-router-dom from 6.18.0 to 6.19.0 in /Plan/react/dashboard (#3315)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.18.0 to 6.19.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.19.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:05:59 +02:00
dependabot[bot] c5408ffa71
Bump io.swagger.core.v3.swagger-gradle-plugin in /Plan (#3318)
Bumps io.swagger.core.v3.swagger-gradle-plugin from 2.2.18 to 2.2.19.

---
updated-dependencies:
- dependency-name: io.swagger.core.v3.swagger-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:05:06 +02:00
dependabot[bot] bbdb88ea65
Bump swaggerVersion from 2.2.18 to 2.2.19 in /Plan (#3319)
Bumps `swaggerVersion` from 2.2.18 to 2.2.19.

Updates `io.swagger.core.v3:swagger-core-jakarta` from 2.2.18 to 2.2.19

Updates `io.swagger.core.v3:swagger-jaxrs2-jakarta` from 2.2.18 to 2.2.19

---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-core-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.swagger.core.v3:swagger-jaxrs2-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:04:58 +02:00
dependabot[bot] 08e57c0264
Bump org.apache.commons:commons-compress from 1.24.0 to 1.25.0 in /Plan (#3320)
Bumps org.apache.commons:commons-compress from 1.24.0 to 1.25.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-compress
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-18 14:04:51 +02:00
dependabot[bot] de31166248
Bump swagger-ui from 5.9.1 to 5.9.3 in /Plan/react/dashboard (#3302)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.9.1 to 5.9.3.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.9.1...v5.9.3)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:27:44 +02:00
dependabot[bot] e7eff36a9c
Bump @testing-library/react in /Plan/react/dashboard (#3303)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 14.0.0 to 14.1.0.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.0.0...v14.1.0)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:27:24 +02:00
dependabot[bot] 8e2e86e4a7
Bump axios from 1.6.0 to 1.6.1 in /Plan/react/dashboard (#3304)
Bumps [axios](https://github.com/axios/axios) from 1.6.0 to 1.6.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.0...v1.6.1)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:27:13 +02:00
dependabot[bot] 969e33bd10
Bump org.mariadb.jdbc:mariadb-java-client from 3.2.0 to 3.3.0 in /Plan (#3305)
Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.2.0...3.3.0)

---
updated-dependencies:
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:26:54 +02:00
dependabot[bot] 3b2a75bc46
Bump org.junit.jupiter:junit-jupiter from 5.10.0 to 5.10.1 in /Plan (#3306)
Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.0 to 5.10.1.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.1)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:26:34 +02:00
dependabot[bot] 8b5e628aa7
Bump com.zaxxer:HikariCP from 5.0.1 to 5.1.0 in /Plan (#3307)
Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 5.0.1 to 5.1.0.
- [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES)
- [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-5.0.1...HikariCP-5.1.0)

---
updated-dependencies:
- dependency-name: com.zaxxer:HikariCP
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 16:26:14 +02:00
dependabot[bot] c44e7ed540
Bump mockitoVersion from 5.6.0 to 5.7.0 in /Plan (#3296)
Bumps `mockitoVersion` from 5.6.0 to 5.7.0.

Updates `org.mockito:mockito-core` from 5.6.0 to 5.7.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.6.0...v5.7.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.6.0 to 5.7.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.6.0...v5.7.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-07 15:24:49 +02:00
dependabot[bot] 40f693163a
Bump me.clip:placeholderapi from 2.11.4 to 2.11.5 in /Plan (#3300)
Bumps me.clip:placeholderapi from 2.11.4 to 2.11.5.

---
updated-dependencies:
- dependency-name: me.clip:placeholderapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-07 15:24:27 +02:00
dependabot[bot] ce51e28945
Bump react-router-dom from 6.17.0 to 6.18.0 in /Plan/react/dashboard (#3295)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.17.0 to 6.18.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.18.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-07 15:24:17 +02:00
dependabot[bot] 9ed1def1c6
Bump org.apache.commons:commons-text from 1.10.0 to 1.11.0 in /Plan (#3301)
Bumps org.apache.commons:commons-text from 1.10.0 to 1.11.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-text
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-07 15:23:50 +02:00
dependabot[bot] 2e92abdbdd
Bump jettyVersion from 11.0.17 to 11.0.18 in /Plan (#3299)
Bumps `jettyVersion` from 11.0.17 to 11.0.18.

Updates `org.eclipse.jetty:jetty-server` from 11.0.17 to 11.0.18
- [Release notes](https://github.com/eclipse/jetty.project/releases)
- [Commits](https://github.com/eclipse/jetty.project/compare/jetty-11.0.17...jetty-11.0.18)

Updates `org.eclipse.jetty:jetty-alpn-java-server` from 11.0.17 to 11.0.18

Updates `org.eclipse.jetty.http2:http2-server` from 11.0.17 to 11.0.18

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-alpn-java-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.http2:http2-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-07 15:23:38 +02:00
dependabot[bot] 5e43ea4ad8
Bump i18next-http-backend from 2.2.2 to 2.3.1 in /Plan/react/dashboard (#3293)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.2.2 to 2.3.1.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.2.2...v2.3.1)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 15:47:35 +02:00
dependabot[bot] 0c12e83253
Bump react-router-dom from 6.16.0 to 6.17.0 in /Plan/react/dashboard (#3273)
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 15:46:35 +02:00
dependabot[bot] b1d84bd1bb
Bump com.mysql:mysql-connector-j from 8.1.0 to 8.2.0 in /Plan (#3283)
Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.1.0 to 8.2.0.
- [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.x/CHANGES)
- [Commits](https://github.com/mysql/mysql-connector-j/compare/8.1.0...8.2.0)

---
updated-dependencies:
- dependency-name: com.mysql:mysql-connector-j
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:28:01 +02:00
dependabot[bot] 6a92bacfa3
Bump swaggerVersion from 2.2.17 to 2.2.18 in /Plan (#3284)
Bumps `swaggerVersion` from 2.2.17 to 2.2.18.

Updates `io.swagger.core.v3:swagger-core-jakarta` from 2.2.17 to 2.2.18

Updates `io.swagger.core.v3:swagger-jaxrs2-jakarta` from 2.2.17 to 2.2.18

---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-core-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.swagger.core.v3:swagger-jaxrs2-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:27:12 +02:00
dependabot[bot] 7ab8975b56
Bump io.swagger.core.v3.swagger-gradle-plugin in /Plan (#3285)
Bumps io.swagger.core.v3.swagger-gradle-plugin from 2.2.17 to 2.2.18.

---
updated-dependencies:
- dependency-name: io.swagger.core.v3.swagger-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:27:06 +02:00
dependabot[bot] 605f031227
Bump i18next-http-backend from 2.2.2 to 2.3.0 in /Plan/react/dashboard (#3286)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 2.2.2 to 2.3.0.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v2.2.2...v2.3.0)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:27:00 +02:00
dependabot[bot] a2623a0e4e
Bump swagger-ui from 5.9.0 to 5.9.1 in /Plan/react/dashboard (#3287)
Bumps [swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.9.0 to 5.9.1.
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.9.0...v5.9.1)

---
updated-dependencies:
- dependency-name: swagger-ui
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:26:52 +02:00
dependabot[bot] 069965f730
Bump axios from 1.5.1 to 1.6.0 in /Plan/react/dashboard (#3288)
Bumps [axios](https://github.com/axios/axios) from 1.5.1 to 1.6.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.5.1...v1.6.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:26:45 +02:00
dependabot[bot] bc3015dc3a
Bump react-bootstrap from 2.9.0 to 2.9.1 in /Plan/react/dashboard (#3289)
Bumps [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap) from 2.9.0 to 2.9.1.
- [Release notes](https://github.com/react-bootstrap/react-bootstrap/releases)
- [Changelog](https://github.com/react-bootstrap/react-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-bootstrap/react-bootstrap/compare/v2.9.0...v2.9.1)

---
updated-dependencies:
- dependency-name: react-bootstrap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:26:32 +02:00
dependabot[bot] 1d16491d57
Bump sass from 1.69.4 to 1.69.5 in /Plan/react/dashboard (#3290)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.4 to 1.69.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.69.4...1.69.5)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 14:26:20 +02:00
jhqwqmc db8d4c5700
Update locale_CN.yml (#3282)
修正翻译
2023-10-26 13:57:15 +03:00
jhqwqmc cb52a50695
Update locale_CN.yml (#3278) 2023-10-22 09:03:31 +03:00
Aurora Lahtela f1b2d1ec3c
Move some test preparation steps after jar build step 2023-10-21 19:31:15 +03:00
Aurora Lahtela 012b61c21d Reorganize some packages
- webserver.resolver.json
- database.sql.tables
- database.transactions
2023-10-21 19:19:08 +03:00
AuroraLS3 ce1705383b Update versions.txt 5.6 build 2614 2023-10-21 09:14:46 +00:00
Aurora Lahtela 53b1dc4e35 Fix small issues with PingTable 2023-10-21 11:13:37 +03:00
Aurora Lahtela edf86155d1 Fixed sorting for plugin tables that have raw numbers 2023-10-21 11:12:34 +03:00
Aurora Lahtela eac25b5e77 Made Player page plugins tabs cleaner
- Added a collapse
- Only show servers for which there's plugin data.
2023-10-21 11:04:09 +03:00
Aurora Lahtela 3d1c0f8d64 Make sure /v1/query checks access permissions for using filters. 2023-10-21 10:57:48 +03:00
Aurora Lahtela 65f706d3cc Fix date formatting showing 'undefinedNaN NaN NaN' 2023-10-21 10:31:23 +03:00
dependabot[bot] 185529678a
Bump sass from 1.69.3 to 1.69.4 in /Plan/react/dashboard (#3272)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.3 to 1.69.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.69.3...1.69.4)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-20 08:49:12 +03:00
dependabot[bot] df11ab8ea7
Bump i18next from 23.5.1 to 23.6.0 in /Plan/react/dashboard (#3274)
Bumps [i18next](https://github.com/i18next/i18next) from 23.5.1 to 23.6.0.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v23.5.1...v23.6.0)

---
updated-dependencies:
- dependency-name: i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-20 08:46:43 +03:00
dependabot[bot] 6eb7996b5d
Bump react-i18next from 13.2.2 to 13.3.1 in /Plan/react/dashboard (#3275)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 13.2.2 to 13.3.1.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v13.2.2...v13.3.1)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-20 08:46:35 +03:00
dependabot[bot] 230e92059c
Bump undici from 5.25.1 to 5.26.3 in /Plan/react/dashboard (#3270)
Bumps [undici](https://github.com/nodejs/undici) from 5.25.1 to 5.26.3.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.25.1...v5.26.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-19 14:05:16 +03:00
dependabot[bot] d8e177fbbf
Bump @babel/traverse from 7.22.11 to 7.23.2 in /Plan/react/dashboard (#3271)
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.11 to 7.23.2.
- [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.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-19 14:05:00 +03:00
Aurora Lahtela 4b3efe1378 Check for permission before linking to Query page from Query Modal 2023-10-18 19:17:20 +03:00
Aurora Lahtela c032009144 Add possibility of clicking geolocation map to Query players from there 2023-10-18 19:12:36 +03:00
Aurora Lahtela 9c9d029268 Add Ping to Players table
Affects issues:
- Close #2593
2023-10-18 18:12:12 +03:00
Aurora Lahtela 9c9058eda9 Add API to tell Plan what permissions an endpoint uses. 2023-10-18 17:28:23 +03:00
Aurora Lahtela 394c47ba6f Add %plan_player_geolocation% placeholder
Affects issues:
- Close #3269
2023-10-17 18:46:43 +03:00
Aurora Lahtela dae9ebe362 Various fixes to tables
- Fixed errors related to how sortBy changes when column visibility is toggled.
- Fixed player page links in extension tables
- All Extension tables are now colored DataTables instead of being different based on row count.
2023-10-15 18:16:23 +03:00
Aurora Lahtela b076308ec3 Add a 'Click and Drag' text to calendar to highlight new functionality 2023-10-15 17:31:39 +03:00
Aurora Lahtela 1f485cfbe5 Use semantic version for fabric 2023-10-15 17:19:06 +03:00
Aurora Lahtela fe59fa5a66 Fix 403 if user has no access to Query but has access to a Calendar and clicks it 2023-10-15 17:15:38 +03:00
Aurora Lahtela 499d82139a Fix some flaky tests due to NETWORK_CHANGED error 2023-10-15 13:25:58 +03:00
Aurora Lahtela aa06ac66f1 Obfuscate license key with jasypt
Affects issues:
- Close #3256
2023-10-15 12:52:28 +03:00
dependabot[bot] df1596b296
Bump sass from 1.69.0 to 1.69.3 in /Plan/react/dashboard (#3260)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.0 to 1.69.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.69.0...1.69.3)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:02:48 +03:00
dependabot[bot] a16b699155
Bump @testing-library/jest-dom in /Plan/react/dashboard (#3261)
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.1.3...v6.1.4)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:02:30 +03:00
dependabot[bot] 1aa39c5b83
Bump mockitoVersion from 5.5.0 to 5.6.0 in /Plan (#3263)
Bumps `mockitoVersion` from 5.5.0 to 5.6.0.

Updates `org.mockito:mockito-core` from 5.5.0 to 5.6.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.5.0...v5.6.0)

Updates `org.mockito:mockito-junit-jupiter` from 5.5.0 to 5.6.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.5.0...v5.6.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.mockito:mockito-junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:02:18 +03:00
dependabot[bot] 5787cfb1ab
Bump jettyVersion from 11.0.16 to 11.0.17 in /Plan (#3264)
Bumps `jettyVersion` from 11.0.16 to 11.0.17.

Updates `org.eclipse.jetty:jetty-server` from 11.0.16 to 11.0.17
- [Release notes](https://github.com/eclipse/jetty.project/releases)
- [Commits](https://github.com/eclipse/jetty.project/compare/jetty-11.0.16...jetty-11.0.17)

Updates `org.eclipse.jetty:jetty-alpn-java-server` from 11.0.16 to 11.0.17

Updates `org.eclipse.jetty.http2:http2-server` from 11.0.16 to 11.0.17

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty:jetty-alpn-java-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.eclipse.jetty.http2:http2-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:02:01 +03:00
dependabot[bot] a1f07e98e0
Bump swaggerVersion from 2.2.16 to 2.2.17 in /Plan (#3265)
Bumps `swaggerVersion` from 2.2.16 to 2.2.17.

Updates `io.swagger.core.v3:swagger-core-jakarta` from 2.2.16 to 2.2.17

Updates `io.swagger.core.v3:swagger-jaxrs2-jakarta` from 2.2.16 to 2.2.17

---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-core-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.swagger.core.v3:swagger-jaxrs2-jakarta
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:01:09 +03:00
dependabot[bot] d7113d3cba
Bump io.swagger.core.v3.swagger-gradle-plugin in /Plan (#3266)
Bumps io.swagger.core.v3.swagger-gradle-plugin from 2.2.16 to 2.2.17.

---
updated-dependencies:
- dependency-name: io.swagger.core.v3.swagger-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-14 12:01:00 +03:00
Aurora Lahtela f9d28489c2 Update locale files with proxy webserver address language 2023-10-10 10:05:22 +03:00
Aurora Lahtela b92dfdb127 Fix webserver disabling always by accident 2023-10-10 10:03:50 +03:00
Aurora Lahtela 176c090f39 Bump Extension-Tebex to 2.4
Adds support for table formatting apis in DataExtension api

Affects issues:
- Fixed #3079
2023-10-10 09:53:03 +03:00
Aurora Lahtela 98188bbc96 Make Join Address Graph translate their legend properly 2023-10-10 09:28:20 +03:00
Aurora Lahtela 70cbab8f2d Make Activity Graphs translate their legend properly 2023-10-10 09:25:52 +03:00
Aurora Lahtela a74fb36b10 Fix Activity Index not showing up on Players Tables 2023-10-10 09:05:28 +03:00
Aurora Lahtela 549a26bcc8 Show any valid address if webserver is enabled (even game servers)
Affects issues:
- Fixed #3251
2023-10-10 08:40:09 +03:00
Aurora Lahtela d6065f497b Hide extra '0' when server has 0 player kills
The component shares rendering with Network as Numbers and player_kills is undefined on network.

Affects issues
- Fixed #3252
2023-10-10 08:24:49 +03:00
Aurora Lahtela 6a9a469adc Add link to query page from calendar query modal
Fixes to query page as well.
2023-10-08 14:35:39 +03:00
Aurora Lahtela 653ea6d481 Click & Drag on server calendar to query player data
Clicking and dragging on server calendar will select start and end time to use for
a Query Page View and Played Between filter.
This data is then displayed in a modal for easy viewing.

This allows viewing who was online on specific day(s), how much they played, and other information about the players.

Affects issues:
- Close #1531
2023-10-08 11:12:47 +03:00
Aurora Lahtela a937d64ca1 Add extra context to where it shows 'Unavailable'
Affects issues:
- Close #2819
2023-10-08 09:19:51 +03:00
Aurora Lahtela a419ef3c87 Fix dangerouslySetInnerHTML in ExtensionTable
Affects issues:
- Fixed #3250
2023-10-07 09:16:45 +03:00
AuroraLS3 a742e9fbf6 Update versions.txt 5.6 DEV build 2574 2023-10-07 06:11:27 +00:00
542 changed files with 6920 additions and 11072 deletions

View File

@ -23,30 +23,16 @@ jobs:
steps:
- name: 📥 Checkout git repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: ☕ Setup JDK
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: '17'
- name: 🚦 Setup Selenium Webdriver
uses: nanasess/setup-chromedriver@v2
- name: 🚦 Setup Selenium Webdriver settings
run: |
export DISPLAY=:99
chromedriver --url-base=/wd/hub &
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
- name: 📶 Verify MariaDB connection
env:
PORT: ${{ job.services.mariadb.ports[3306] }}
run: |
while ! mysqladmin ping -h"127.0.0.1" -P"$PORT" --silent; do
sleep 1
done
java-version: '21'
- name: 💼 Load Gradle Cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
@ -68,15 +54,29 @@ jobs:
echo "versionString=$(cat build/versions/jar.txt)" >> $GITHUB_ENV
echo "artifactPath=$(pwd)/builds" >> $GITHUB_ENV
- name: 📤 Upload Plan.jar
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: Plan-${{ env.versionString }}-${{ env.git_hash }}.jar
path: ${{ env.artifactPath }}/Plan-${{ env.snapshotVersion }}.jar
- name: 📤 Upload PlanFabric.jar
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: PlanFabric-${{ env.versionString }}-${{ env.git_hash }}.jar
path: ${{ env.artifactPath }}/PlanFabric-${{ env.snapshotVersion }}.jar
- name: 🚦 Setup Selenium Webdriver
uses: nanasess/setup-chromedriver@v2
- name: 🚦 Setup Selenium Webdriver settings
run: |
export DISPLAY=:99
chromedriver --url-base=/wd/hub &
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
- name: 📶 Verify MariaDB connection
env:
PORT: ${{ job.services.mariadb.ports[3306] }}
run: |
while ! mysqladmin ping -h"127.0.0.1" -P"$PORT" --silent; do
sleep 1
done
- name: 🩺 Test
env:
MYSQL_DB: test

View File

@ -64,6 +64,9 @@ public interface CapabilityService {
return Capability.getByName(capabilityName).isPresent();
}
/**
* Singleton holder for listeners.
*/
class ListHolder {
static final AtomicReference<List<Consumer<Boolean>>> enableListeners = new AtomicReference<>(
new CopyOnWriteArrayList<>()

View File

@ -89,7 +89,7 @@ public interface ComponentService {
* Converts the given input into a {@link Component}.
* Input example {@code §ctext}.
*
* @param legacy the input legacy
* @param legacy the input legacy
* @param character the character to use as the color prefix, usually {@code §}.
* @return a {@link Component}
* @see #fromLegacy(String)
@ -115,7 +115,7 @@ public interface ComponentService {
* Input example: {@code &#rrggbbtext}.
*
* @param adventureLegacy the input adventure legacy
* @param character the character to use as the color prefix, usually {@code &}.
* @param character the character to use as the color prefix, usually {@code &}.
* @return a {@link Component}
* @see #fromAdventureLegacy(String)
* @see Component#SECTION
@ -139,7 +139,7 @@ public interface ComponentService {
* Input example: {@code §x§r§r§g§g§b§btext}.
*
* @param bungeeLegacy the input bungee legacy
* @param character the character to use as the color prefix, usually {@code §}.
* @param character the character to use as the color prefix, usually {@code §}.
* @return a {@link Component}
* @see Component#SECTION
* @see Component#AMPERSAND
@ -164,6 +164,9 @@ public interface ComponentService {
*/
Component fromJson(String json);
/**
* Singleton holder for ComponentService.
*/
class Holder {
static final AtomicReference<ComponentService> service = new AtomicReference<>();

View File

@ -1,6 +1,5 @@
/**
* PageExtension API for extending the webserver and the website.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API">Documentation</a>
*/
package com.djrapitops.plan.delivery.web;

View File

@ -46,6 +46,11 @@ public final class CompositeResolver implements Resolver {
this.resolvers = new ArrayList<>();
}
/**
* Create a new builder for a .
*
* @return a builder.
*/
public static CompositeResolver.Builder builder() {
return new Builder();
}
@ -100,6 +105,9 @@ public final class CompositeResolver implements Resolver {
return getResolver(forThis.getPath()).map(resolver -> resolver.requiresAuth(forThis)).orElse(true);
}
/**
* Builder class for {@link CompositeResolver}.
*/
public static class Builder {
private final CompositeResolver composite;
@ -132,6 +140,11 @@ public final class CompositeResolver implements Resolver {
return this;
}
/**
* Build the final result after adding all resolvers.
*
* @return The {@link CompositeResolver}
*/
public CompositeResolver build() {
return composite;
}

View File

@ -22,11 +22,20 @@ import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* Utility class for constructing a {@link Resolver} with Functional Interfaces.
*/
public class FunctionalResolverWrapper implements Resolver {
private final Function<Request, Optional<Response>> resolver;
private final Predicate<Request> accessCheck;
/**
* Default constructor.
*
* @param resolver Function that solves the {@link Request} into an Optional {@link Response}.
* @param accessCheck Predicate that checks if {@link Request} is allowed or if 403 Forbidden should be given.
*/
public FunctionalResolverWrapper(Function<Request, Optional<Response>> resolver, Predicate<Request> accessCheck) {
this.resolver = resolver;
this.accessCheck = accessCheck;

View File

@ -19,7 +19,9 @@ package com.djrapitops.plan.delivery.web.resolver;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
/**
* Interface for resolving requests of Plan webserver.
@ -40,6 +42,25 @@ public interface Resolver {
*/
boolean canAccess(Request request);
/**
* Override this to tell Plan what web permissions this endpoint uses.
* <p>
* This allows:
* <ul>
* <li>Plan to store these permissions in the permission list</li>
* <li>Users can grant/deny the permission for a group</li>
* <li>Plan can show what endpoints specific permission gives access to</li>
* </ul>
* <p>
* Requires PAGE_EXTENSION_USER_PERMISSIONS capability
*
* @return Set of permissions eg. [plugin.custom.permission, plugin.custom.permission.child.node]
* @see com.djrapitops.plan.capability.CapabilityService for Capability checks
*/
default Set<String> usedWebPermissions() {
return new HashSet<>();
}
/**
* Implement request resolution.
*
@ -51,10 +72,21 @@ public interface Resolver {
*/
Optional<Response> resolve(Request request);
/**
* Creates a new {@link ResponseBuilder} for a {@link Response}.
*
* @return a new builder.
*/
default ResponseBuilder newResponseBuilder() {
return Response.builder();
}
/**
* Used to check if the resolver requires authentication to be used.
*
* @param request Incoming request that you can use to figure out if authentication is required.
* @return true if you want 401 to be given when user has not logged in.
*/
default boolean requiresAuth(Request request) {
return true;
}

View File

@ -33,7 +33,7 @@ public class ResponseBuilder {
/**
* Set MIME Type of the Response.
*
* @param mimeType MIME type of the Response https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types
* @param mimeType MIME type of the Response <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">Documentation</a>
* @return this builder.
* @see MimeType for common MIME types.
*/
@ -46,7 +46,7 @@ public class ResponseBuilder {
* <p>
* Default status code is 200 (OK) if not set.
*
* @param code 1xx, 2xx, 3xx, 4xx, 5xx, https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
* @param code 1xx, 2xx, 3xx, 4xx, 5xx, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">Documentation</a>
* @return this builder.
*/
public ResponseBuilder setStatus(int code) {
@ -57,7 +57,7 @@ public class ResponseBuilder {
/**
* Set HTTP Response header.
*
* @param header Key of the header. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
* @param header Key of the header. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @param value Value for the header.
* @return this builder.
*/
@ -75,7 +75,7 @@ public class ResponseBuilder {
* Utility method for building redirects.
*
* @param url URL to redirect the client to with 302 Found.
* @return https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location
* @return <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location">Documentation</a>
*/
public ResponseBuilder redirectTo(String url) {
return setStatus(302).setHeader("Location", url).setContent(new byte[0]);

View File

@ -26,6 +26,11 @@ package com.djrapitops.plan.delivery.web.resolver.exception;
*/
public class BadRequestException extends IllegalArgumentException {
/**
* Default constructor.
*
* @param message Error message - avoid including any input incoming in the request to prevent XSS.
*/
public BadRequestException(String message) {
super(message);
}

View File

@ -1,6 +1,5 @@
/**
* Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResolverService}.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resolverservice">Documentation</a>
*/
package com.djrapitops.plan.delivery.web.resolver;

View File

@ -43,7 +43,7 @@ public final class Request {
* @param path Requested path /example/target
* @param query Request parameters ?param=value etc
* @param user Web user doing the request (if authenticated)
* @param headers Request headers https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
* @param headers Request headers <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @param requestBody Raw body as bytes, if present
*/
public Request(String method, URIPath path, URIQuery query, WebUser user, Map<String, String> headers, byte[] requestBody) {
@ -57,6 +57,11 @@ public final class Request {
/**
* Special constructor that figures out URIPath and URIQuery from "/path/and?query=params" and has no request body.
*
* @param method HTTP requst method
* @param target The requested path and query, e.g. "/path/and?query=params"
* @param user User that made the request
* @param headers HTTP request headers
*/
public Request(String method, String target, WebUser user, Map<String, String> headers) {
this.method = method;
@ -121,7 +126,7 @@ public final class Request {
/**
* Get a header in the request.
*
* @param key https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
* @param key <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @return Value if it is present in the request.
*/
public Optional<String> getHeader(String key) {

View File

@ -1,6 +1,5 @@
/**
* Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResourceService}.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resourceservice">Documentation</a>
*/
package com.djrapitops.plan.delivery.web.resource;

View File

@ -113,6 +113,7 @@ public interface DataExtension {
* <p>
* Requires Capability DATA_EXTENSION_BUILDER_API
*
* @param text Text that is displayed next to the value.
* @return new builder.
*/
default ValueBuilder valueBuilder(String text) {

View File

@ -81,6 +81,9 @@ public interface ExtensionService {
*/
void unregister(DataExtension extension);
/**
* Singleton holder for {@link ExtensionService}.
*/
class Holder {
static final AtomicReference<ExtensionService> service = new AtomicReference<>();

View File

@ -42,6 +42,12 @@ public enum FormatType {
*/
NONE;
/**
* Get a format type by the enum name without exception.
*
* @param name FormatType#name()
* @return Optional if the format type is found by that name, empty if not found.
*/
public static Optional<FormatType> getByName(String name) {
if (name == null) {
return Optional.empty();
@ -51,4 +57,5 @@ public enum FormatType {
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}}
}
}

View File

@ -30,6 +30,11 @@ package com.djrapitops.plan.extension;
*/
public interface Group {
/**
* Get the name of the group.
*
* @return Name of the group given by a {@link com.djrapitops.plan.extension.annotation.GroupProvider}, e.g. "Miner"
*/
String getGroupName();
}

View File

@ -89,7 +89,7 @@ public @interface BooleanProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -98,7 +98,7 @@ public @interface BooleanProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -76,7 +76,7 @@ public @interface ComponentProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -85,7 +85,7 @@ public @interface ComponentProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -67,7 +67,7 @@ public @interface DoubleProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -76,7 +76,7 @@ public @interface DoubleProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -62,7 +62,7 @@ public @interface GroupProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -71,7 +71,7 @@ public @interface GroupProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -39,10 +39,18 @@ public @interface InvalidateMethod {
*/
String value();
/**
* Multiple {@link InvalidateMethod} annotations are supported per class.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Multiple {
/**
* All the annotations.
*
* @return All InvalidateMethod annotations in the class.
*/
InvalidateMethod[] value();
}

View File

@ -79,7 +79,7 @@ public @interface NumberProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -88,7 +88,7 @@ public @interface NumberProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -70,7 +70,7 @@ public @interface PercentageProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -79,7 +79,7 @@ public @interface PercentageProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -44,7 +44,7 @@ public @interface PluginInfo {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -53,7 +53,7 @@ public @interface PluginInfo {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -79,7 +79,7 @@ public @interface StringProvider {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -88,7 +88,7 @@ public @interface StringProvider {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -41,7 +41,7 @@ public @interface TabInfo {
/**
* Name of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Name of the icon, if name is not valid no icon is shown.
*/
@ -50,7 +50,7 @@ public @interface TabInfo {
/**
* Family of Font Awesome icon.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/

View File

@ -18,7 +18,10 @@ package com.djrapitops.plan.extension.builder;
import com.djrapitops.plan.component.Component;
import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.annotation.*;
import com.djrapitops.plan.extension.annotation.BooleanProvider;
import com.djrapitops.plan.extension.annotation.Conditional;
import com.djrapitops.plan.extension.annotation.StringProvider;
import com.djrapitops.plan.extension.annotation.Tab;
import com.djrapitops.plan.extension.extractor.ExtensionMethod;
import com.djrapitops.plan.extension.icon.Color;
import com.djrapitops.plan.extension.icon.Family;
@ -64,7 +67,7 @@ public interface ValueBuilder {
/**
* Icon displayed next to the value.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons
*
* @param iconName Name of the icon
* @param iconFamily Family of the icon
@ -78,7 +81,7 @@ public interface ValueBuilder {
/**
* Icon displayed next to the value.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons
*
* @param icon Icon built using the methods in {@link Icon}.
* @return This builder.

View File

@ -47,6 +47,12 @@ public enum Color {
BLACK,
NONE;
/**
* Get a color by the enum name without exception.
*
* @param name Color#name()
* @return Optional if the color is found by that name, empty if not found.
*/
public static Optional<Color> getByName(String name) {
if (name == null) {
return Optional.empty();
@ -56,4 +62,5 @@ public enum Color {
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}}
}
}

View File

@ -37,6 +37,12 @@ public enum Family {
*/
BRAND;
/**
* Get a family by the enum name without exception.
*
* @param name Family#name()
* @return Optional if the family is found by that name, empty if not found.
*/
public static Optional<Family> getByName(String name) {
if (name == null) {
return Optional.empty();

View File

@ -21,7 +21,7 @@ import java.util.Objects;
/**
* Object that represents an icon on the website.
* <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}.
* See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
*
* @author AuroraLS3
*/
@ -92,6 +92,9 @@ public class Icon {
return "Icon{" + type.name() + ", '" + name + '\'' + ", " + color.name() + '}';
}
/**
* Builder for an {@link Icon}.
*/
public static class Builder {
private final Icon icon;

View File

@ -1,6 +1,5 @@
/**
* DataExtension API and related classes.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">Documentation</a>
*/
package com.djrapitops.plan.extension;

View File

@ -62,14 +62,44 @@ public interface CommonQueries {
*/
long fetchLastSeen(UUID playerUUID, UUID serverUUID);
/**
* Get the UUIDs of all servers Plan has registered.
*
* @return Set of Server UUIDs
*/
Set<UUID> fetchServerUUIDs();
/**
* Fetch UUID of a player by name.
*
* @param playerName Name of the player
* @return UUID if it is found by Plan or empty if not found.
*/
Optional<UUID> fetchUUIDOf(String playerName);
/**
* Fetch name of a player by UUID.
*
* @param playerUUID UUID of the player
* @return Name if it is known by Plan or empty if not.
*/
Optional<String> fetchNameOf(UUID playerUUID);
/**
* Check that schema has table you are using in your queries.
*
* @param table Name of the table, e.g. plan_users.
* @return true if table exists.
*/
boolean doesDBHaveTable(String table);
/**
* Check that schema table has a column you are using in your queries.
*
* @param table Name of the table, e.g. plan_users.
* @param column Name of the column, e.g. id
* @return true if table and column exist.
*/
boolean doesDBHaveTableColumn(String table, String column);
/**

View File

@ -126,7 +126,7 @@ public interface QueryService {
CommonQueries getCommonQueries();
/**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
* See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/
@FunctionalInterface
interface ThrowingConsumer<T> {
@ -134,7 +134,7 @@ public interface QueryService {
}
/**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
* See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/
@FunctionalInterface
interface ThrowingFunction<T, R> {
@ -142,7 +142,7 @@ public interface QueryService {
}
/**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
* See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/
@FunctionalInterface
interface VoidFunction {

View File

@ -1,6 +1,5 @@
/**
* Query API related classes.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-Query-API">Documentation</a>
*/
package com.djrapitops.plan.query;

View File

@ -51,6 +51,9 @@ public interface ListenerService {
*/
void registerListenerForPlan(Object listener);
/**
* Singleton holder for listeners.
*/
class Holder {
static final AtomicReference<ListenerService> service = new AtomicReference<>();

View File

@ -16,8 +16,8 @@ plugins {
id 'java-library'
id "jacoco"
id "checkstyle"
id "org.sonarqube" version "4.4.1.3373"
id 'fabric-loom' version '1.3-SNAPSHOT' apply false
id "org.sonarqube" version "5.0.0.4638"
id 'fabric-loom' version '1.6-SNAPSHOT' apply false
}
apply plugin: 'nebula-aggregate-javadocs'
@ -42,6 +42,8 @@ allprojects {
ext.minorVersion = '6'
ext.buildVersion = buildVersion
ext.fullVersion = project.ext.majorVersion + '.' + project.ext.minorVersion + ' build ' + project.ext.buildVersion
ext.fullVersionFilename = project.ext.majorVersion + '.' + project.ext.minorVersion + '-build-' + project.ext.buildVersion
ext.fullVersionSemantic = project.ext.majorVersion + '.' + project.ext.minorVersion + '+build.' + project.ext.buildVersion
// Fix for UTF-8 files showing with wrong encoding when compiled on Windows machines.
compileJava { options.encoding = "UTF-8" }
@ -49,7 +51,7 @@ allprojects {
javadoc { options.encoding = 'UTF-8' }
}
logger.lifecycle("Building artifact for version $fullVersion")
logger.lifecycle("Building artifact for version $fullVersion / $fullVersionFilename / $fullVersionSemantic")
subprojects {
// Build plugins
@ -67,7 +69,7 @@ subprojects {
}
ext {
daggerVersion = "2.48.1"
daggerVersion = "2.51.1"
palVersion = "5.1.0"
@ -81,31 +83,32 @@ subprojects {
redisBungeeVersion = "0.3.8-SNAPSHOT"
redisBungeeProxioDevVersion = "0.7.3"
commonsTextVersion = "1.10.0"
commonsCompressVersion = "1.24.0"
commonsCodecVersion = "1.16.0"
commonsTextVersion = "1.12.0"
commonsCompressVersion = "1.26.1"
commonsCodecVersion = "1.16.1"
caffeineVersion = "3.1.8"
jettyVersion = "11.0.16"
jettyVersion = "11.0.20"
caffeineVersion = "2.9.2"
mysqlVersion = "8.1.0"
mariadbVersion = "3.2.0"
mysqlVersion = "8.3.0"
mariadbVersion = "3.3.3"
sqliteVersion = "3.42.0.1"
adventureVersion = "4.14.0"
hikariVersion = "5.0.1"
slf4jVersion = "2.0.9"
geoIpVersion = "4.1.0"
hikariVersion = "5.1.0"
slf4jVersion = "2.0.13"
geoIpVersion = "4.2.0"
gsonVersion = "2.10.1"
dependencyDownloadVersion = "1.3.1"
ipAddressMatcherVersion = "5.4.0"
ipAddressMatcherVersion = "5.5.0"
jasyptVersion = "1.9.3"
bstatsVersion = "3.0.2"
placeholderapiVersion = "2.11.4"
placeholderapiVersion = "2.11.5"
nkPlaceholderapiVersion = "1.4-SNAPSHOT"
junitVersion = "5.10.0"
mockitoVersion = "5.5.0"
testContainersVersion = "1.19.1"
swaggerVersion = "2.2.16"
junitVersion = "5.10.2"
mockitoVersion = "5.11.0"
testContainersVersion = "1.19.7"
swaggerVersion = "2.2.21"
}
repositories {

View File

@ -25,7 +25,7 @@ import java.util.stream.Collectors;
/**
* UserImportRefiner attempts to find any crucial information that is missing.
*
* <p>
* - Finds UUIDs if only name is present.
* - Finds Names if only UUID is present.
* - Removes any importers that do not have any identifiers.

View File

@ -16,6 +16,7 @@
*/
package com.djrapitops.plan.gathering.listeners.bukkit;
import com.djrapitops.plan.gathering.JoinAddressValidator;
import com.djrapitops.plan.gathering.cache.JoinAddressCache;
import com.djrapitops.plan.gathering.domain.BukkitPlayerData;
import com.djrapitops.plan.gathering.domain.event.PlayerJoin;
@ -28,6 +29,8 @@ import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.events.BanStatusTransaction;
import com.djrapitops.plan.storage.database.transactions.events.KickStoreTransaction;
import com.djrapitops.plan.storage.database.transactions.events.StoreAllowlistBounceTransaction;
import com.djrapitops.plan.utilities.dev.Untrusted;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import org.bukkit.event.EventHandler;
@ -50,6 +53,7 @@ public class PlayerOnlineListener implements Listener {
private final PlayerJoinEventConsumer playerJoinEventConsumer;
private final PlayerLeaveEventConsumer playerLeaveEventConsumer;
private final JoinAddressValidator joinAddressValidator;
private final JoinAddressCache joinAddressCache;
private final ServerInfo serverInfo;
@ -61,6 +65,7 @@ public class PlayerOnlineListener implements Listener {
public PlayerOnlineListener(
PlayerJoinEventConsumer playerJoinEventConsumer,
PlayerLeaveEventConsumer playerLeaveEventConsumer,
JoinAddressValidator joinAddressValidator,
JoinAddressCache joinAddressCache,
ServerInfo serverInfo,
DBSystem dbSystem,
@ -69,6 +74,7 @@ public class PlayerOnlineListener implements Listener {
) {
this.playerJoinEventConsumer = playerJoinEventConsumer;
this.playerLeaveEventConsumer = playerLeaveEventConsumer;
this.joinAddressValidator = joinAddressValidator;
this.joinAddressCache = joinAddressCache;
this.serverInfo = serverInfo;
this.dbSystem = dbSystem;
@ -82,18 +88,14 @@ public class PlayerOnlineListener implements Listener {
UUID playerUUID = event.getPlayer().getUniqueId();
ServerUUID serverUUID = serverInfo.getServerUUID();
boolean banned = PlayerLoginEvent.Result.KICK_BANNED == event.getResult();
boolean notWhitelisted = PlayerLoginEvent.Result.KICK_WHITELIST == event.getResult();
String address = event.getHostname();
if (!address.isEmpty()) {
if (address.contains(":")) {
address = address.substring(0, address.lastIndexOf(':'));
}
if (address.contains("\u0000")) {
address = address.substring(0, address.indexOf('\u0000'));
}
if (address.contains("fml")) {
address = address.substring(0, address.lastIndexOf("fml"));
}
if (notWhitelisted) {
dbSystem.getDatabase().executeTransaction(new StoreAllowlistBounceTransaction(playerUUID, event.getPlayer().getName(), serverUUID, System.currentTimeMillis()));
}
@Untrusted String address = joinAddressValidator.sanitize(event.getHostname());
if (joinAddressValidator.isValid(address)) {
joinAddressCache.put(playerUUID, address);
}
dbSystem.getDatabase().executeTransaction(new BanStatusTransaction(playerUUID, serverUUID, banned));

View File

@ -53,7 +53,7 @@ import java.util.logging.Logger;
* Task that handles player ping calculation on Bukkit based servers.
* <p>
* Modified PingManager from LagMonitor plugin.
* https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/task/PingManager.java
* <a href="https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/task/PingManager.java">original</a>
*
* @author games647
*/
@ -89,9 +89,9 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener {
startRecording = new ConcurrentHashMap<>();
playerHistory = new HashMap<>();
Optional<PingMethod> pingMethod = loadPingMethod();
if (pingMethod.isPresent()) {
this.pingMethod = pingMethod.get();
Optional<PingMethod> loaded = loadPingMethod();
if (loaded.isPresent()) {
this.pingMethod = loaded.get();
pingMethodAvailable = true;
} else {
pingMethodAvailable = false;

View File

@ -32,7 +32,7 @@ import java.lang.reflect.Field;
* An utility class that simplifies reflection in Bukkit plugins.
* <p>
* Modified Reflection utility from LagMonitor plugin.
* https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/traffic/Reflection.java
* <a href="https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/traffic/Reflection.java">original code</a>
*
* @author Kristian
*/

View File

@ -3,8 +3,8 @@ import org.apache.tools.ant.filters.ReplaceTokens
plugins {
id "dev.vankka.dependencydownload.plugin" version "$dependencyDownloadVersion"
id "com.github.node-gradle.node" version "7.0.1"
id "io.swagger.core.v3.swagger-gradle-plugin" version "2.2.16"
id "com.github.node-gradle.node" version "7.0.2"
id "io.swagger.core.v3.swagger-gradle-plugin" version "2.2.21"
}
configurations {
@ -64,6 +64,7 @@ dependencies {
mysqlDriver "com.mysql:mysql-connector-j:$mysqlVersion"
mariadbDriver "org.mariadb.jdbc:mariadb-java-client:$mariadbVersion"
sqliteDriver "org.xerial:sqlite-jdbc:$sqliteVersion"
sqliteDriver "org.slf4j:slf4j-nop:1.7.36"
ipAddressMatcher "com.github.seancfoley:ipaddress:$ipAddressMatcherVersion"
shadow "org.apache.commons:commons-text:$commonsTextVersion"
@ -82,6 +83,8 @@ dependencies {
// json-simple has junit (a test dependency) compile scoped
exclude group: "junit", module: "junit"
}
implementation "org.jasypt:jasypt:$jasyptVersion:lite"
// Swagger annotations
implementation "jakarta.ws.rs:jakarta.ws.rs-api:3.1.0"
@ -92,12 +95,21 @@ dependencies {
testArtifacts project(":extensions:adventure")
testImplementation project(":extensions:adventure")
testImplementation "com.google.code.gson:gson:$gsonVersion"
testImplementation "org.seleniumhq.selenium:selenium-java:4.12.1"
testImplementation "org.seleniumhq.selenium:selenium-java:4.19.1"
testImplementation "org.testcontainers:testcontainers:$testContainersVersion"
testImplementation "org.testcontainers:junit-jupiter:$testContainersVersion"
testImplementation "org.testcontainers:nginx:$testContainersVersion"
}
test {
environment "PLAN_TEST_NODE_STRING", "String"
environment "PLAN_TEST_NODE_BOOLEAN", "true"
environment "PLAN_TEST_NODE_INTEGER", "5"
environment "PLAN_TEST_NODE_DOUBLE", "0.5"
environment "PLAN_TEST_NODE_LONG", "9223372036854775807"
environment "PLAN_TEST_NODE_STRINGLIST", "- Test\n- Another"
}
task updateVersion(type: Copy) {
from('src/main/resources') {
include 'plugin.yml'
@ -111,13 +123,14 @@ task updateVersion(type: Copy) {
node {
download = true
version = "16.14.2"
version = "20.9.0"
nodeProjectDir = file("$rootDir/react/dashboard")
}
task yarnBundle(type: YarnTask) {
inputs.files(fileTree("$rootDir/react/dashboard/src"))
inputs.file("$rootDir/react/dashboard/package.json")
inputs.file("$rootDir/react/dashboard/vite.config.js")
outputs.dir("$rootDir/react/dashboard/build")
@ -229,8 +242,12 @@ artifacts {
}
processResources {
dependsOn copyYarnBuildResults
dependsOn determineAssetModifications
// Skips Yarn build on Jitpack since Jitpack doesn't offer gclib version compatible with Node 20
// Jitpack build is used mainly for java dependencies.
if (!project.hasProperty("isJitpack")) {
dependsOn copyYarnBuildResults
dependsOn determineAssetModifications
}
dependsOn generateResourceForMySQLDriver
dependsOn generateResourceForSQLiteDriver
dependsOn generateResourceForIpAddressMatcher

View File

@ -0,0 +1,119 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan;
import com.djrapitops.plan.component.ComponentSvc;
import com.djrapitops.plan.delivery.web.ResolverSvc;
import com.djrapitops.plan.delivery.web.ResourceSvc;
import com.djrapitops.plan.extension.ExtensionSvc;
import com.djrapitops.plan.query.QuerySvc;
import com.djrapitops.plan.settings.ListenerSvc;
import com.djrapitops.plan.settings.SchedulerSvc;
import com.djrapitops.plan.settings.SettingsSvc;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Breaks up {@link PlanSystem} to be a smaller class.
*
* @author AuroraLS3
*/
@Singleton
public class ApiServices {
private final ComponentSvc componentService;
private final ResolverSvc resolverService;
private final ResourceSvc resourceService;
private final ExtensionSvc extensionService;
private final QuerySvc queryService;
private final ListenerSvc listenerService;
private final SettingsSvc settingsService;
private final SchedulerSvc schedulerService;
@Inject
public ApiServices(
ComponentSvc componentService,
ResolverSvc resolverService,
ResourceSvc resourceService,
ExtensionSvc extensionService,
QuerySvc queryService,
ListenerSvc listenerService,
SettingsSvc settingsService,
SchedulerSvc schedulerService
) {
this.componentService = componentService;
this.resolverService = resolverService;
this.resourceService = resourceService;
this.extensionService = extensionService;
this.queryService = queryService;
this.listenerService = listenerService;
this.settingsService = settingsService;
this.schedulerService = schedulerService;
}
public void register() {
extensionService.register();
componentService.register();
resolverService.register();
resourceService.register();
listenerService.register();
settingsService.register();
schedulerService.register();
queryService.register();
}
public void registerExtensions() {
extensionService.registerExtensions();
}
public void disableExtensionDataUpdates() {
extensionService.disableUpdates();
}
public ComponentSvc getComponentService() {
return componentService;
}
public ResolverSvc getResolverService() {
return resolverService;
}
public ResourceSvc getResourceService() {
return resourceService;
}
public ExtensionSvc getExtensionService() {
return extensionService;
}
public QuerySvc getQueryService() {
return queryService;
}
public ListenerSvc getListenerService() {
return listenerService;
}
public SettingsSvc getSettingsService() {
return settingsService;
}
public SchedulerSvc getSchedulerService() {
return schedulerService;
}
}

View File

@ -17,25 +17,17 @@
package com.djrapitops.plan;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.component.ComponentSvc;
import com.djrapitops.plan.delivery.DeliveryUtilities;
import com.djrapitops.plan.delivery.export.ExportSystem;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.web.ResolverSvc;
import com.djrapitops.plan.delivery.web.ResourceSvc;
import com.djrapitops.plan.delivery.webserver.NonProxyWebserverDisableChecker;
import com.djrapitops.plan.delivery.webserver.WebServerSystem;
import com.djrapitops.plan.extension.ExtensionSvc;
import com.djrapitops.plan.gathering.cache.CacheSystem;
import com.djrapitops.plan.gathering.importing.ImportSystem;
import com.djrapitops.plan.gathering.listeners.ListenerSystem;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.processing.Processing;
import com.djrapitops.plan.query.QuerySvc;
import com.djrapitops.plan.settings.ConfigSystem;
import com.djrapitops.plan.settings.ListenerSvc;
import com.djrapitops.plan.settings.SchedulerSvc;
import com.djrapitops.plan.settings.SettingsSvc;
import com.djrapitops.plan.settings.locale.LocaleSystem;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.file.PlanFiles;
@ -77,14 +69,7 @@ public class PlanSystem implements SubSystem {
private final ImportSystem importSystem;
private final ExportSystem exportSystem;
private final DeliveryUtilities deliveryUtilities;
private final ComponentSvc componentService;
private final ResolverSvc resolverService;
private final ResourceSvc resourceService;
private final ExtensionSvc extensionService;
private final QuerySvc queryService;
private final ListenerSvc listenerService;
private final SettingsSvc settingsService;
private final SchedulerSvc schedulerService;
private final ApiServices apiServices;
private final PluginLogger logger;
private final ErrorLogger errorLogger;
@ -104,16 +89,9 @@ public class PlanSystem implements SubSystem {
ImportSystem importSystem,
ExportSystem exportSystem,
DeliveryUtilities deliveryUtilities,
ComponentSvc componentService,
ResolverSvc resolverService,
ResourceSvc resourceService,
ExtensionSvc extensionService,
QuerySvc queryService,
ListenerSvc listenerService,
SettingsSvc settingsService,
SchedulerSvc schedulerService,
PluginLogger logger,
ErrorLogger errorLogger,
ApiServices apiServices, // API v5
@SuppressWarnings("deprecation") PlanAPI.PlanAPIHolder apiHolder // Deprecated PlanAPI, backwards compatibility
) {
this.files = files;
@ -130,16 +108,9 @@ public class PlanSystem implements SubSystem {
this.importSystem = importSystem;
this.exportSystem = exportSystem;
this.deliveryUtilities = deliveryUtilities;
this.componentService = componentService;
this.resolverService = resolverService;
this.resourceService = resourceService;
this.extensionService = extensionService;
this.queryService = queryService;
this.listenerService = listenerService;
this.settingsService = settingsService;
this.schedulerService = schedulerService;
this.logger = logger;
this.errorLogger = errorLogger;
this.apiServices = apiServices;
logger.info("§2");
logger.info("§2 ██▌");
@ -162,14 +133,7 @@ public class PlanSystem implements SubSystem {
* Enables the rest of the systems that are not enabled in {@link #enableForCommands()}.
*/
public void enableOtherThanCommands() {
extensionService.register();
componentService.register();
resolverService.register();
resourceService.register();
listenerService.register();
settingsService.register();
schedulerService.register();
queryService.register();
apiServices.register();
enableSystems(
processing,
@ -189,11 +153,11 @@ public class PlanSystem implements SubSystem {
// Disables Webserver if Proxy is detected in the database
if (serverInfo.getServer().isNotProxy()) {
processing.submitNonCritical(new NonProxyWebserverDisableChecker(
configSystem.getConfig(), webServerSystem.getAddresses(), webServerSystem, logger, errorLogger
configSystem.getConfig(), localeSystem.getLocale(), webServerSystem.getAddresses(), webServerSystem, logger, errorLogger
));
}
extensionService.registerExtensions();
apiServices.registerExtensions();
enabled = true;
String javaVersion = System.getProperty("java.specification.version");
@ -223,7 +187,7 @@ public class PlanSystem implements SubSystem {
enabled = false;
Formatters.clearSingleton();
extensionService.disableUpdates();
apiServices.disableExtensionDataUpdates();
disableSystems(
taskSystem,
@ -316,12 +280,8 @@ public class PlanSystem implements SubSystem {
return enabled;
}
public ExtensionSvc getExtensionService() {
return extensionService;
}
public ComponentSvc getComponentService() {
return componentService;
public ApiServices getApiServices() {
return apiServices;
}
public static long getServerEnableTime() {

View File

@ -43,7 +43,7 @@ import java.util.stream.Collectors;
* PlanAPI extension for all implementations.
*
* @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5).
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/
@Singleton
@Deprecated(forRemoval = true, since = "5.0")

View File

@ -35,7 +35,7 @@ import java.util.UUID;
* Interface for PlanAPI methods.
*
* @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5).
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/
@Deprecated(since = "5.0")
public interface PlanAPI {
@ -65,7 +65,7 @@ public interface PlanAPI {
}
/**
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated
void addPluginDataSource(PluginData pluginData);

View File

@ -29,7 +29,7 @@ import java.util.Optional;
* The Keys might change in the future, but the Optional API should help dealing with those cases.
*
* @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5).
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/
@Deprecated(since = "5.0")
public class PlayerContainer {

View File

@ -28,7 +28,7 @@ import java.util.Optional;
* The Keys might change in the future, but the Optional API should help dealing with those cases.
*
* @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5).
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/
@Deprecated(forRemoval = true, since = "5.0")
public class ServerContainer {

View File

@ -29,6 +29,7 @@ import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.exceptions.ExportException;
import com.djrapitops.plan.gathering.domain.GeoInfo;
import com.djrapitops.plan.gathering.domain.event.JoinAddress;
import com.djrapitops.plan.gathering.importing.ImportSystem;
import com.djrapitops.plan.gathering.importing.importers.Importer;
import com.djrapitops.plan.identification.Identifiers;
@ -42,6 +43,7 @@ import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.CommandLang;
import com.djrapitops.plan.settings.locale.lang.GenericLang;
import com.djrapitops.plan.settings.locale.lang.HelpLang;
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.containers.ContainerFetchQueries;
@ -258,12 +260,17 @@ public class DataUtilityCommands {
Optional<GeoInfo> mostRecentGeoInfo = new GeoInfoMutator(geoInfo).mostRecent();
String geolocation = mostRecentGeoInfo.isPresent() ? mostRecentGeoInfo.get().getGeolocation() : "-";
SessionsMutator sessionsMutator = SessionsMutator.forContainer(player);
String latestJoinAddress = sessionsMutator.latestSession()
.flatMap(session -> session.getExtraData(JoinAddress.class))
.map(JoinAddress::getAddress)
.orElse("-");
String table = locale.getString(CommandLang.HEADER_INSPECT, playerName) + '\n' +
locale.getString(CommandLang.INGAME_ACTIVITY_INDEX, activityIndex.getFormattedValue(formatters.decimals()), activityIndex.getGroup()) + '\n' +
locale.getString(CommandLang.INGAME_REGISTERED, timestamp.apply(() -> registered)) + '\n' +
locale.getString(CommandLang.INGAME_LAST_SEEN, timestamp.apply(() -> lastSeen)) + '\n' +
locale.getString(CommandLang.INGAME_GEOLOCATION, geolocation) + '\n' +
" §2" + locale.getString(HtmlLang.LABEL_LABEL_JOIN_ADDRESS) + ": §f" + latestJoinAddress + '\n' +
locale.getString(CommandLang.INGAME_TIMES_KICKED, player.getValue(PlayerKeys.KICK_COUNT).orElse(0)) + '\n' +
'\n' +
locale.getString(CommandLang.INGAME_PLAYTIME, length.apply(sessionsMutator.toPlaytime())) + '\n' +

View File

@ -27,7 +27,7 @@ import java.util.UUID;
* @author AuroraLS3
* @see TableContainer
* @see InspectContainer
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated(since = "5.0")
public final class AnalysisContainer extends InspectContainer {

View File

@ -27,7 +27,7 @@ import java.util.TreeMap;
*
* @author AuroraLS3
* @see TableContainer
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated(since = "5.0")
public class InspectContainer {

View File

@ -26,7 +26,7 @@ import java.util.List;
* Container used for creating Html tables.
*
* @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated(since = "5.0")
public class TableContainer {

View File

@ -23,7 +23,7 @@ import java.util.UUID;
* Interface for PluginData objects that affect Ban state of players.
*
* @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated(since = "5.0")
public interface BanData {

View File

@ -20,7 +20,7 @@ package com.djrapitops.plan.data.plugin;
* Enum class for PluginData to estimate the required width of the contained items.
*
* @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated
public enum ContainerSize {

View File

@ -33,7 +33,7 @@ import java.util.UUID;
* to register objects extending this class.
*
* @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API.
* @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/
@Deprecated(since = "5.0")
public abstract class PluginData {

View File

@ -16,6 +16,8 @@
*/
package com.djrapitops.plan.delivery.domain;
import java.util.Objects;
/**
* Object that has a value tied to a date.
*
@ -39,4 +41,25 @@ public class DateObj<T> implements DateHolder {
public T getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateObj<?> dateObj = (DateObj<?>) o;
return getDate() == dateObj.getDate() && Objects.equals(getValue(), dateObj.getValue());
}
@Override
public int hashCode() {
return Objects.hash(getDate(), getValue());
}
@Override
public String toString() {
return "DateObj{" +
"date=" + date +
", value=" + value +
'}';
}
}

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.delivery.domain;
import com.djrapitops.plan.delivery.domain.mutators.ActivityIndex;
import com.djrapitops.plan.gathering.domain.BaseUser;
import com.djrapitops.plan.gathering.domain.Ping;
import java.util.Objects;
import java.util.Optional;
@ -38,6 +39,7 @@ public class TablePlayer implements Comparable<TablePlayer> {
private Long registered;
private Long lastSeen;
private String geolocation;
private Ping ping;
private boolean banned = false;
@ -87,6 +89,10 @@ public class TablePlayer implements Comparable<TablePlayer> {
return Optional.ofNullable(geolocation);
}
public Ping getPing() {
return ping;
}
public boolean isBanned() {
return banned;
}
@ -111,12 +117,13 @@ public class TablePlayer implements Comparable<TablePlayer> {
lastSeen.equals(that.lastSeen) &&
name.equals(that.name) &&
activityIndex.equals(that.activityIndex) &&
geolocation.equals(that.geolocation);
geolocation.equals(that.geolocation) &&
ping.equals(that.ping);
}
@Override
public int hashCode() {
return Objects.hash(name, activityIndex, activePlaytime, sessionCount, registered, lastSeen, geolocation);
return Objects.hash(name, activityIndex, activePlaytime, sessionCount, registered, lastSeen, geolocation, ping);
}
@Override
@ -130,6 +137,7 @@ public class TablePlayer implements Comparable<TablePlayer> {
", registered=" + registered +
", lastSeen=" + lastSeen +
", geolocation='" + geolocation + '\'' +
", ping='" + ping + '\'' +
", banned=" + banned +
'}';
}
@ -190,6 +198,11 @@ public class TablePlayer implements Comparable<TablePlayer> {
return this;
}
public Builder ping(Ping ping) {
player.ping = ping;
return this;
}
public TablePlayer build() {
return player;
}

View File

@ -19,6 +19,9 @@ package com.djrapitops.plan.delivery.domain.auth;
import com.djrapitops.plan.settings.locale.lang.Lang;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
@ -47,7 +50,8 @@ public enum WebPermission implements Supplier<String>, Lang {
PAGE_NETWORK_SESSIONS_LIST("See list of sessions"),
PAGE_NETWORK_JOIN_ADDRESSES("See Join Addresses -tab"),
PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS("See Join Address graphs"),
PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph"),
@Deprecated
PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph", true),
PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME("See Join Addresses over time graph"),
PAGE_NETWORK_RETENTION("See Player Retention -tab"),
PAGE_NETWORK_GEOLOCATIONS("See Geolocations tab"),
@ -82,7 +86,8 @@ public enum WebPermission implements Supplier<String>, Lang {
PAGE_SERVER_SESSIONS_LIST("See list of sessions"),
PAGE_SERVER_JOIN_ADDRESSES("See Join Addresses -tab"),
PAGE_SERVER_JOIN_ADDRESSES_GRAPHS("See Join Address graphs"),
PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph"),
@Deprecated
PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph", true),
PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME("See Join Addresses over time graph"),
PAGE_SERVER_RETENTION("See Player Retention -tab"),
PAGE_SERVER_GEOLOCATIONS("See Geolocations tab"),
@ -93,6 +98,7 @@ public enum WebPermission implements Supplier<String>, Lang {
PAGE_SERVER_PERFORMANCE_OVERVIEW("See Performance numbers"),
PAGE_SERVER_PLUGIN_HISTORY("See Plugin History"),
PAGE_SERVER_PLUGINS("See Plugins -tabs of servers"),
PAGE_SERVER_ALLOWLIST_BOUNCE("See list of Game allowlist bounces"),
PAGE_PLAYER("See all of player page"),
PAGE_PLAYER_OVERVIEW("See Player Overview -tab"),
@ -155,4 +161,23 @@ public enum WebPermission implements Supplier<String>, Lang {
public String getDefault() {
return description;
}
public static WebPermission[] nonDeprecatedValues() {
return Arrays.stream(values())
.filter(Predicate.not(WebPermission::isDeprecated))
.toArray(WebPermission[]::new);
}
public static Optional<WebPermission> findByPermission(String permission) {
String name = StringUtils.upperCase(permission).replace('.', '_');
try {
return Optional.of(valueOf(name));
} catch (IllegalArgumentException noSuchEnum) {
return Optional.empty();
}
}
public static boolean isDeprecated(String permission) {
return findByPermission(permission).map(WebPermission::isDeprecated).orElse(false);
}
}

View File

@ -139,7 +139,6 @@ public interface DataContainer {
/**
* Get formatted Value identified by the Key.
* <p>
*
* @param key Key that identifies the Value
* @param formatter Formatter for the Optional returned by {@link DataContainer#getValue(Key)}

View File

@ -0,0 +1,82 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.domain.datatransfer;
import com.djrapitops.plan.utilities.dev.Untrusted;
import java.util.Objects;
import java.util.UUID;
/**
* Represents an event where player bounced off the whitelist.
*
* @author AuroraLS3
*/
public class AllowlistBounce {
private final UUID playerUUID;
@Untrusted
private final String playerName;
private final int count;
private final long lastTime;
public AllowlistBounce(UUID playerUUID, String playerName, int count, long lastTime) {
this.playerUUID = playerUUID;
this.playerName = playerName;
this.count = count;
this.lastTime = lastTime;
}
public UUID getPlayerUUID() {
return playerUUID;
}
public String getPlayerName() {
return playerName;
}
public int getCount() {
return count;
}
public long getLastTime() {
return lastTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AllowlistBounce bounce = (AllowlistBounce) o;
return getCount() == bounce.getCount() && getLastTime() == bounce.getLastTime() && Objects.equals(getPlayerUUID(), bounce.getPlayerUUID()) && Objects.equals(getPlayerName(), bounce.getPlayerName());
}
@Override
public int hashCode() {
return Objects.hash(getPlayerUUID(), getPlayerName(), getCount(), getLastTime());
}
@Override
public String toString() {
return "AllowlistBounce{" +
"playerUUID=" + playerUUID +
", playerName='" + playerName + '\'' +
", count=" + count +
", lastTime=" + lastTime +
'}';
}
}

View File

@ -0,0 +1,67 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.domain.datatransfer;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
/**
* Represents data returned by {@link com.djrapitops.plan.delivery.webserver.resolver.json.PlayerJoinAddressJSONResolver}.
*
* @author AuroraLS3
*/
public class PlayerJoinAddresses {
private final List<String> joinAddresses;
private final Map<UUID, String> joinAddressByPlayer;
public PlayerJoinAddresses(List<String> joinAddresses, Map<UUID, String> joinAddressByPlayer) {
this.joinAddresses = joinAddresses;
this.joinAddressByPlayer = joinAddressByPlayer;
}
public List<String> getJoinAddresses() {
return joinAddresses;
}
public Map<UUID, String> getJoinAddressByPlayer() {
return joinAddressByPlayer;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PlayerJoinAddresses that = (PlayerJoinAddresses) o;
return Objects.equals(getJoinAddresses(), that.getJoinAddresses()) && Objects.equals(getJoinAddressByPlayer(), that.getJoinAddressByPlayer());
}
@Override
public int hashCode() {
return Objects.hash(getJoinAddresses(), getJoinAddressByPlayer());
}
@Override
public String toString() {
return "PlayerJoinAddresses{" +
"joinAddresses=" + joinAddresses +
", joinAddressByPlayer=" + joinAddressByPlayer +
'}';
}
}

View File

@ -17,6 +17,7 @@
package com.djrapitops.plan.delivery.domain.datatransfer;
import com.djrapitops.plan.delivery.domain.datatransfer.extension.ExtensionValueDataDto;
import com.djrapitops.plan.gathering.domain.Ping;
import java.util.Map;
import java.util.UUID;
@ -36,6 +37,9 @@ public class TablePlayerDto {
private Long lastSeen;
private Long registered;
private String country;
private Double pingAverage;
private Integer pingMax;
private Integer pingMin;
private Map<String, ExtensionValueDataDto> extensionValues;
@ -119,6 +123,30 @@ public class TablePlayerDto {
this.playerUUID = playerUUID;
}
public Double getPingAverage() {
return pingAverage;
}
public void setPingAverage(Double pingAverage) {
this.pingAverage = pingAverage;
}
public Integer getPingMax() {
return pingMax;
}
public void setPingMax(Integer pingMax) {
this.pingMax = pingMax;
}
public Integer getPingMin() {
return pingMin;
}
public void setPingMin(Integer pingMin) {
this.pingMin = pingMin;
}
public static final class TablePlayerDtoBuilder {
private final TablePlayerDto tablePlayerDto;
@ -169,6 +197,15 @@ public class TablePlayerDto {
return this;
}
public TablePlayerDtoBuilder withPing(Ping ping) {
if (ping != null) {
tablePlayerDto.setPingAverage(ping.getAverage());
tablePlayerDto.setPingMax(ping.getMax());
tablePlayerDto.setPingMin(ping.getMin());
}
return this;
}
public TablePlayerDto build() {return tablePlayerDto;}
}
}

View File

@ -20,6 +20,7 @@ import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.rendering.html.Html;
import com.djrapitops.plan.extension.table.Table;
import com.djrapitops.plan.extension.table.TableColumnFormat;
import org.apache.commons.text.StringEscapeUtils;
import java.util.ArrayList;
import java.util.Arrays;
@ -76,7 +77,7 @@ public class TableDto {
case DATE_SECOND:
return Formatters.getInstance().secondLong().apply(Long.parseLong(value.toString()));
case PLAYER_NAME:
return Html.LINK.create("../player/" + Html.encodeToURL(value.toString()));
return Html.LINK.create("../player/" + Html.encodeToURL(value.toString()), StringEscapeUtils.escapeHtml4(value.toString()));
default:
return value.toString();
}

View File

@ -28,15 +28,15 @@ import java.util.Objects;
*/
public class ServerSpecificLineGraph {
private final List<Double[]> points;
private final List<Number[]> points;
private final ServerDto server;
public ServerSpecificLineGraph(List<Double[]> points, ServerDto server) {
public ServerSpecificLineGraph(List<Number[]> points, ServerDto server) {
this.points = points;
this.server = server;
}
public List<Double[]> getPoints() {
public List<Number[]> getPoints() {
return points;
}

View File

@ -38,15 +38,16 @@ import java.util.concurrent.TimeUnit;
* <p>
* Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}.
* A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line.
* You can see the function plotted here https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2
* You can see the function plotted <a href="https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2">here</a>
* <p>
* To fine tune the curve pi/2 is used since it felt like a good curve.
* <p>
* Activity index A is calculated by using the formula:
* {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3}
* <p>
* <a href="https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3">
* Plot for A and limits
* https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3
* </a>
* <p>
* New Limits for A would thus be
* {@code < 1: Inactive}
@ -90,6 +91,16 @@ public class ActivityIndex {
return getGroups(null);
}
public static String[] getDefaultGroupLangKeys() {
return new String[]{
HtmlLang.INDEX_VERY_ACTIVE.getKey(),
HtmlLang.INDEX_ACTIVE.getKey(),
HtmlLang.INDEX_REGULAR.getKey(),
HtmlLang.INDEX_IRREGULAR.getKey(),
HtmlLang.INDEX_INACTIVE.getKey()
};
}
public static String[] getGroups(Locale locale) {
if (locale == null) {
return new String[]{

View File

@ -166,6 +166,12 @@ public class Exporter extends FileExporter {
}
public void exportReact() throws ExportException {
if (config.isFalse(ExportSettings.PLAYER_PAGES)
&& config.isFalse(ExportSettings.SERVER_PAGE)
&& config.isFalse(ExportSettings.PLAYERS_PAGE)) {
return;
}
Path toDirectory = config.getPageExportPath();
try {

View File

@ -121,7 +121,6 @@ public class NetworkPageExporter extends FileExporter {
"graph?type=uniqueAndNew",
"graph?type=hourlyUniqueAndNew",
"graph?type=serverPie",
"graph?type=joinAddressPie",
"graph?type=joinAddressByDay",
"graph?type=activity",
"graph?type=geolocation",

View File

@ -16,6 +16,7 @@
*/
package com.djrapitops.plan.delivery.export;
import com.djrapitops.plan.delivery.rendering.BundleAddressCorrection;
import com.djrapitops.plan.delivery.web.AssetVersions;
import com.djrapitops.plan.delivery.web.resolver.Response;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
@ -52,23 +53,25 @@ public class ReactExporter extends FileExporter {
private final PlanConfig config;
private final RootJSONResolver jsonHandler;
private final AssetVersions assetVersions;
private final BundleAddressCorrection bundleAddressCorrection;
@Inject
public ReactExporter(
PlanFiles files,
PlanConfig config,
RootJSONResolver jsonHandler,
AssetVersions assetVersions
AssetVersions assetVersions,
BundleAddressCorrection bundleAddressCorrection
) {
this.files = files;
this.config = config;
this.jsonHandler = jsonHandler;
this.assetVersions = assetVersions;
this.bundleAddressCorrection = bundleAddressCorrection;
}
public void exportReactFiles(Path toDirectory) throws IOException {
exportIndexHtml(toDirectory);
exportAsset(toDirectory, "asset-manifest.json");
exportAsset(toDirectory, "favicon.ico");
exportAsset(toDirectory, "logo192.png");
exportAsset(toDirectory, "logo512.png");
@ -104,17 +107,18 @@ public class ReactExporter extends FileExporter {
Path to = toDirectory.resolve(path);
Resource resource = files.getResourceFromJar("web/" + path);
// Make static asset loading work with subdirectory addresses
if (path.endsWith(".css") || "asset-manifest.json".equals(path)) {
if (path.endsWith(".css")) {
String contents = resource.asString();
String withReplacedStatic = StringUtils.replace(contents, "/static", getBasePath() + "/static");
export(to, withReplacedStatic);
String withReplaced = bundleAddressCorrection.correctAddressForExport(contents, path);
export(to, withReplaced);
} else if (path.endsWith(".js")) {
String withReplacedConstants = StringUtils.replaceEach(
resource.asString(),
new String[]{"PLAN_BASE_ADDRESS", "PLAN_EXPORTED_VERSION", ".p=\"/\""},
new String[]{config.get(WebserverSettings.EXTERNAL_LINK), "true", ".p=\"" + getBasePath() + "/\""}
new String[]{"PLAN_BASE_ADDRESS", "PLAN_EXPORTED_VERSION"},
new String[]{config.get(WebserverSettings.EXTERNAL_LINK), "true"}
);
export(to, withReplacedConstants);
String withReplaced = bundleAddressCorrection.correctAddressForExport(withReplacedConstants, path);
export(to, withReplaced);
} else {
export(to, resource);
}
@ -141,25 +145,11 @@ public class ReactExporter extends FileExporter {
private void exportIndexHtml(Path toDirectory) throws IOException {
String contents = files.getResourceFromJar("web/index.html")
.asString();
String basePath = getBasePath();
contents = StringUtils.replaceEach(contents,
new String[]{"/static", "/pageExtensionApi.js"},
new String[]{basePath + "/static", basePath + "/pageExtensionApi.js"});
contents = bundleAddressCorrection.correctAddressForExport(contents, "index.html");
export(toDirectory.resolve("index.html"), contents);
}
private String getBasePath() {
String basePath = config.get(WebserverSettings.EXTERNAL_LINK)
.replace("http://", "")
.replace("https://", "");
if (StringUtils.contains(basePath, '/')) {
return basePath.substring(StringUtils.indexOf(basePath, '/'));
} else {
return "";
}
}
private void exportAsset(Path toDirectory, String asset) throws IOException {
export(toDirectory.resolve(asset), files.getResourceFromJar("web/" + asset));
}

View File

@ -100,6 +100,7 @@ public class ServerPageExporter extends FileExporter {
server + serverUUID + "/playerbase",
server + serverUUID + "/join-addresses",
server + serverUUID + "/retention",
server + serverUUID + "/allowlist",
server + serverUUID + "/players",
server + serverUUID + "/geolocations",
server + serverUUID + "/performance",
@ -137,7 +138,6 @@ public class ServerPageExporter extends FileExporter {
"graph?type=geolocation&server=" + serverUUID,
"graph?type=uniqueAndNew&server=" + serverUUID,
"graph?type=hourlyUniqueAndNew&server=" + serverUUID,
"graph?type=joinAddressPie&server=" + serverUUID,
"graph?type=joinAddressByDay&server=" + serverUUID,
"graph?type=serverCalendar&server=" + serverUUID,
"graph?type=punchCard&server=" + serverUUID,
@ -148,7 +148,8 @@ public class ServerPageExporter extends FileExporter {
"extensionData?server=" + serverUUID,
"serverIdentity?server=" + serverUUID,
"retention?server=" + serverUUID,
"joinAddresses?server=" + serverUUID
"joinAddresses?server=" + serverUUID,
"gameAllowlistBounces?server=" + serverUUID
);
}

View File

@ -24,7 +24,7 @@ import java.util.TimeZone;
/**
* Formats timestamps to the Last-Modified header time format.
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified">Documentation for the header</a>
*
* @author AuroraLS3
*/

View File

@ -0,0 +1,155 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.rendering;
import com.djrapitops.plan.delivery.webserver.Addresses;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* In charge of correcting the root address in the javascript bundle.
* <p>
* The javascript bundle assumes everything is hosted at /,
* but hosting settings affect the address and it could be hosted at a subdirectory like /plan/
*
* @author AuroraLS3
*/
@Singleton
public class BundleAddressCorrection {
private static final String STATIC = "static";
private static final Pattern JAVASCRIPT_ADDRESS_PATTERN = Pattern.compile("\"(\\./|/?static)(.+?)\\.(json|js|css)\"");
private final PlanConfig config;
private final Addresses addresses;
@Inject
public BundleAddressCorrection(PlanConfig config, Addresses addresses) {
this.config = config;
this.addresses = addresses;
}
private String getExportBasePath() {
return addresses.getBasePath(config.get(WebserverSettings.EXTERNAL_LINK));
}
private String getWebserverBasePath() {
String address = addresses.getMainAddress()
.orElseGet(addresses::getFallbackLocalhostAddress);
return addresses.getBasePath(address);
}
public String correctAddressForWebserver(String content, String fileName) {
String basePath = getWebserverBasePath();
return correctAddress(content, fileName, basePath);
}
public String correctAddressForExport(String content, String fileName) {
String basePath = getExportBasePath();
return correctAddress(content, fileName, basePath);
}
// basePath is either empty if the address doesn't have a subdirectory, or a subdirectory.
@Nullable
private String correctAddress(String content, String fileName, String basePath) {
if (fileName.endsWith(".css")) {
return correctAddressInCss(content, basePath);
} else if (fileName.endsWith(".js")) {
return correctAddressInJavascript(content, basePath);
} else if ("index.html".equals(fileName)) {
return correctAddressInHtml(content, basePath);
}
return content;
}
private String correctAddressInHtml(String content, String basePath) {
String endingSlash = basePath.endsWith("/") ? "" : "/";
return StringUtils.replaceEach(content,
new String[]{"src=\"/", "href=\"/"},
new String[]{"src=\"" + basePath + endingSlash, "href=\"" + basePath + endingSlash});
}
private String correctAddressInCss(String content, String basePath) {
String endingSlash = basePath.endsWith("/") ? "" : "/";
return StringUtils.replace(content, "/static", basePath + endingSlash + STATIC);
}
private String correctAddressInJavascript(String content, String basePath) {
int lastIndex = 0;
StringBuilder output = new StringBuilder();
Matcher matcher = JAVASCRIPT_ADDRESS_PATTERN.matcher(content);
while (matcher.find()) {
String addressStart = matcher.group(1);
String file = matcher.group(2);
String extension = matcher.group(3);
int startIndex = matcher.start();
int endIndex = matcher.end();
// If basePath is empty the website is hosted at root of the tree /
boolean atUrlRoot = basePath.isEmpty();
// This handles /static and static representation
boolean startsWithSlash = addressStart.startsWith("/");
String startingSlash = startsWithSlash ? "/" : "";
// This handles basePath containing a slash after subdirectory, such as /plan/ instead of /plan
String endingSlash = basePath.endsWith("/") ? "" : "/";
// Without subdirectory we can use the address as is, and it doesn't need changes,
// otherwise we can add the directory to the start.
String staticReplacement = atUrlRoot
? startingSlash + STATIC
: basePath + endingSlash + STATIC;
String relativeReplacement = atUrlRoot
? "./"
: basePath + endingSlash + "static/";
// Replaces basePath starting slash if the replaced thing does not start with slash
if (!startsWithSlash && staticReplacement.startsWith("/")) {
staticReplacement = staticReplacement.substring(1);
}
// Replacement examples when basepath is empty, "/plan" or "/plan/"
// "./Filename-hash.js" -> "./Filename-hash.js" or "/plan/static/Filename-hash.js"
// "/static/Filename-hash.js" -> "/static/Filename-hash.js" or "/plan/static/Filename-hash.js"
// "static/Filename-hash.js" -> "static/Filename-hash.js" or "plan/static/Filename-hash.js"
String replacementAddress = StringUtils.equalsAny(addressStart, "/static", STATIC)
? staticReplacement
: relativeReplacement;
String replacement = '"' + replacementAddress + file + '.' + extension + '"';
output.append(content, lastIndex, startIndex) // Append non-match
.append(replacement); // Append replaced address
lastIndex = endIndex;
}
// Append rest of the content that didn't match
if (lastIndex < content.length()) {
output.append(content, lastIndex, content.length());
}
return output.toString();
}
}

View File

@ -36,6 +36,7 @@ public class Contributors {
new Contributor("Antonok", CODE),
new Contributor("Argetan", CODE),
new Contributor("Aurelien", CODE, LANG),
new Contributor("Binero", CODE),
new Contributor("BrainStone", CODE),
new Contributor("Catalina", LANG),
new Contributor("Elguerrero", LANG),
@ -109,7 +110,10 @@ public class Contributors {
new Contributor("xlanyleeet", LANG),
new Contributor("Jumala9163", LANG),
new Contributor("Dreeam-qwq", CODE),
new Contributor("jhqwqmc", LANG)
new Contributor("jhqwqmc", LANG),
new Contributor("liuzhen932", LANG),
new Contributor("Sniper_TVmc", LANG),
new Contributor("mcmdev", CODE),
};
private Contributors() {

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.delivery.rendering.json;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.delivery.domain.RetentionData;
import com.djrapitops.plan.delivery.domain.datatransfer.PlayerJoinAddresses;
import com.djrapitops.plan.delivery.domain.datatransfer.ServerDto;
import com.djrapitops.plan.delivery.domain.mutators.PlayerKillMutator;
import com.djrapitops.plan.delivery.domain.mutators.SessionsMutator;
@ -160,14 +161,25 @@ public class JSONFactory {
return db.query(PlayerRetentionQueries.fetchRetentionData());
}
public Map<UUID, String> playerJoinAddresses(ServerUUID serverUUID) {
public PlayerJoinAddresses playerJoinAddresses(ServerUUID serverUUID, boolean includeByPlayerMap) {
Database db = dbSystem.getDatabase();
return db.query(JoinAddressQueries.latestJoinAddressesOfPlayers(serverUUID));
if (includeByPlayerMap) {
Map<UUID, String> addresses = db.query(JoinAddressQueries.latestJoinAddressesOfPlayers(serverUUID));
return new PlayerJoinAddresses(
addresses.values().stream().distinct().sorted().collect(Collectors.toList()),
addresses
);
} else {
return new PlayerJoinAddresses(db.query(JoinAddressQueries.uniqueJoinAddresses(serverUUID)), null);
}
}
public Map<UUID, String> playerJoinAddresses() {
public PlayerJoinAddresses playerJoinAddresses(boolean includeByPlayerMap) {
Database db = dbSystem.getDatabase();
return db.query(JoinAddressQueries.latestJoinAddressesOfPlayers());
return new PlayerJoinAddresses(
db.query(JoinAddressQueries.uniqueJoinAddresses()),
includeByPlayerMap ? db.query(JoinAddressQueries.latestJoinAddressesOfPlayers()) : null
);
}
public List<Map<String, Object>> serverSessionsAsJSONMap(ServerUUID serverUUID) {
@ -320,9 +332,9 @@ public class JSONFactory {
tableEntries.add(Maps.builder(String.class, Object.class)
.put("country", geolocation)
.put("avg_ping", formatters.decimals().apply(ping.getAverage()) + " ms")
.put("min_ping", ping.getMin() + " ms")
.put("max_ping", ping.getMax() + " ms")
.put("avg_ping", ping.getAverage())
.put("min_ping", ping.getMin())
.put("max_ping", ping.getMax())
.build());
}
return tableEntries;

View File

@ -154,9 +154,9 @@ public class PlayerJSONCreator {
private Map<String, Object> createPingGraphJson(PlayerContainer player) {
PingGraph pingGraph = graphs.line().pingGraph(player.getUnsafe(PlayerKeys.PING));
return Maps.builder(String.class, Object.class)
.put("min_ping_series", pingGraph.getMinGraph().getPoints())
.put("avg_ping_series", pingGraph.getAvgGraph().getPoints())
.put("max_ping_series", pingGraph.getMaxGraph().getPoints())
.put("min_ping_series", pingGraph.getMinGraph().getPointArrays())
.put("avg_ping_series", pingGraph.getAvgGraph().getPointArrays())
.put("max_ping_series", pingGraph.getMaxGraph().getPointArrays())
.put("colors", Maps.builder(String.class, String.class)
.put("min", theme.getValue(ThemeVal.GRAPH_MIN_PING))
.put("avg", theme.getValue(ThemeVal.GRAPH_AVG_PING))

View File

@ -42,8 +42,6 @@ import java.util.stream.Collectors;
/**
* Utility for creating jQuery Datatables JSON for a Players Table.
* <p>
* See https://www.datatables.net/manual/data/orthogonal-data#HTML-5 for sort kinds
*
* @author AuroraLS3
*/
@ -137,12 +135,14 @@ public class PlayersTableJSONCreator {
.map(player -> TablePlayerDto.builder()
.withUuid(player.getPlayerUUID())
.withName(player.getName().orElseGet(() -> player.getPlayerUUID().toString()))
.withActivityIndex(player.getCurrentActivityIndex().map(ActivityIndex::getValue).orElse(0.0))
.withSessionCount((long) player.getSessionCount().orElse(0))
.withPlaytimeActive(player.getActivePlaytime().orElse(null))
.withLastSeen(player.getLastSeen().orElse(null))
.withRegistered(player.getRegistered().orElse(null))
.withCountry(player.getGeolocation().orElse(null))
.withExtensionValues(mapToExtensionValues(extensionData.get(player.getPlayerUUID())))
.withPing(player.getPing())
.build()
).collect(Collectors.toList());
}
@ -200,7 +200,9 @@ public class PlayersTableJSONCreator {
Html link = openPlayerPageInNewTab ? Html.LINK_EXTERNAL : Html.LINK;
putDataEntry(dataJson, link.create(url, StringUtils.replace(StringEscapeUtils.escapeHtml4(name), "\\", "\\\\") /* Backslashes escaped to prevent json errors */), "name");
/* Backslashes escaped to prevent json errors */
String escapedName = StringUtils.replace(StringEscapeUtils.escapeHtml4(name), "\\", "\\\\");
putDataEntry(dataJson, link.create(url, escapedName, escapedName), "name");
putDataEntry(dataJson, activityIndex.getValue(), activityString, "index");
putDataEntry(dataJson, activePlaytime, numberFormatters.get(FormatType.TIME_MILLISECONDS).apply(activePlaytime), "activePlaytime");
putDataEntry(dataJson, loginTimes, "sessions");

View File

@ -16,7 +16,6 @@
*/
package com.djrapitops.plan.delivery.rendering.json;
import com.djrapitops.plan.delivery.domain.DateHolder;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.delivery.domain.mutators.TPSMutator;
import com.djrapitops.plan.delivery.formatting.Formatter;
@ -55,17 +54,14 @@ import java.util.concurrent.TimeUnit;
@Singleton
public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<String, Object>> {
private final Formatter<Long> day;
private final PlanConfig config;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
private final ServerSensor<?> serverSensor;
private final Formatter<Long> timeAmount;
private final Formatter<Double> decimals;
private final Formatter<Double> percentage;
private final ServerUptimeCalculator serverUptimeCalculator;
private final Formatter<DateHolder> year;
@Inject
public ServerOverviewJSONCreator(
@ -82,9 +78,6 @@ public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<Strin
this.serverSensor = serverSensor;
this.serverUptimeCalculator = serverUptimeCalculator;
year = formatters.year();
day = formatters.dayLong();
timeAmount = formatters.timeAmount();
decimals = formatters.decimals();
percentage = formatters.percentage();
}
@ -118,7 +111,7 @@ public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<Strin
double averageTPS = tpsMutator.averageTPS();
sevenDays.put("average_tps", averageTPS != -1 ? decimals.apply(averageTPS) : GenericLang.UNAVAILABLE.getKey());
sevenDays.put("low_tps_spikes", tpsMutator.lowTpsSpikeCount(config.get(DisplaySettings.GRAPH_TPS_THRESHOLD_MED)));
sevenDays.put("downtime", timeAmount.apply(tpsMutator.serverDownTime()));
sevenDays.put("downtime", tpsMutator.serverDownTime());
return sevenDays;
}
@ -137,18 +130,19 @@ public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<Strin
numbers.put("online_players", getOnlinePlayers(serverUUID, db));
Optional<DateObj<Integer>> lastPeak = db.query(TPSQueries.fetchPeakPlayerCount(serverUUID, twoDaysAgo));
Optional<DateObj<Integer>> allTimePeak = db.query(TPSQueries.fetchAllTimePeakPlayerCount(serverUUID));
numbers.put("last_peak_date", lastPeak.map(year).orElse("-"));
numbers.put("last_peak_date", lastPeak.map(DateObj::getDate).map(Object.class::cast).orElse("-"));
numbers.put("last_peak_players", lastPeak.map(dateObj -> dateObj.getValue().toString()).orElse("-"));
numbers.put("best_peak_date", allTimePeak.map(year).orElse("-"));
numbers.put("best_peak_date", allTimePeak.map(DateObj::getDate).map(Object.class::cast).orElse("-"));
numbers.put("best_peak_players", allTimePeak.map(dateObj -> dateObj.getValue().toString()).orElse("-"));
Long totalPlaytime = db.query(SessionQueries.playtime(0L, now, serverUUID));
numbers.put("playtime", timeAmount.apply(totalPlaytime));
numbers.put("player_playtime", userCount != 0 ? timeAmount.apply(totalPlaytime / userCount) : "-");
numbers.put("playtime", totalPlaytime);
numbers.put("player_playtime", userCount != 0 ? totalPlaytime / userCount : "-");
numbers.put("sessions", db.query(SessionQueries.sessionCount(0L, now, serverUUID)));
numbers.put("player_kills", db.query(KillQueries.playerKillCount(0L, now, serverUUID)));
numbers.put("mob_kills", db.query(KillQueries.mobKillCount(0L, now, serverUUID)));
numbers.put("deaths", db.query(KillQueries.deathCount(0L, now, serverUUID)));
numbers.put("current_uptime", serverUptimeCalculator.getServerUptimeMillis(serverUUID).map(timeAmount)
numbers.put("current_uptime", serverUptimeCalculator.getServerUptimeMillis(serverUUID)
.map(Object.class::cast)
.orElse(GenericLang.UNAVAILABLE.getKey()));
return numbers;
@ -171,9 +165,9 @@ public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<Strin
Map<String, Object> weeks = new HashMap<>();
weeks.put("start", day.apply(twoWeeksAgo));
weeks.put("midpoint", day.apply(oneWeekAgo));
weeks.put("end", day.apply(now));
weeks.put("start", twoWeeksAgo);
weeks.put("midpoint", oneWeekAgo);
weeks.put("end", now);
Integer uniqueBefore = db.query(PlayerCountQueries.uniquePlayerCount(twoWeeksAgo, oneWeekAgo, serverUUID));
Integer uniqueAfter = db.query(PlayerCountQueries.uniquePlayerCount(oneWeekAgo, now, serverUUID));
@ -199,9 +193,9 @@ public class ServerOverviewJSONCreator implements ServerTabJSONCreator<Map<Strin
Long playtimeAfter = db.query(SessionQueries.playtime(oneWeekAgo, now, serverUUID));
long avgPlaytimeBefore = uniqueBefore != 0 ? playtimeBefore / uniqueBefore : 0L;
long avgPlaytimeAfter = uniqueAfter != 0 ? playtimeAfter / uniqueAfter : 0L;
Trend avgPlaytimeTrend = new Trend(avgPlaytimeBefore, avgPlaytimeAfter, false, timeAmount);
weeks.put("average_playtime_before", timeAmount.apply(avgPlaytimeBefore));
weeks.put("average_playtime_after", timeAmount.apply(avgPlaytimeAfter));
Trend avgPlaytimeTrend = new Trend(avgPlaytimeBefore, avgPlaytimeAfter, false);
weeks.put("average_playtime_before", avgPlaytimeBefore);
weeks.put("average_playtime_after", avgPlaytimeAfter);
weeks.put("average_playtime_trend", avgPlaytimeTrend);
Long sessionsBefore = db.query(SessionQueries.sessionCount(twoWeeksAgo, oneWeekAgo, serverUUID));

View File

@ -32,7 +32,6 @@ import com.djrapitops.plan.delivery.rendering.json.graphs.line.LineGraphFactory;
import com.djrapitops.plan.delivery.rendering.json.graphs.line.PingGraph;
import com.djrapitops.plan.delivery.rendering.json.graphs.line.Point;
import com.djrapitops.plan.delivery.rendering.json.graphs.pie.Pie;
import com.djrapitops.plan.delivery.rendering.json.graphs.pie.PieSlice;
import com.djrapitops.plan.delivery.rendering.json.graphs.pie.WorldPie;
import com.djrapitops.plan.delivery.rendering.json.graphs.special.WorldMap;
import com.djrapitops.plan.delivery.rendering.json.graphs.stack.StackGraph;
@ -57,7 +56,7 @@ import com.djrapitops.plan.storage.database.queries.analysis.PlayerCountQueries;
import com.djrapitops.plan.storage.database.queries.objects.*;
import com.djrapitops.plan.storage.database.sql.tables.JoinAddressTable;
import com.djrapitops.plan.utilities.comparators.DateHolderOldestComparator;
import com.djrapitops.plan.utilities.comparators.PieSliceComparator;
import com.djrapitops.plan.utilities.dev.Untrusted;
import com.djrapitops.plan.utilities.java.Lists;
import com.djrapitops.plan.utilities.java.Maps;
import net.playeranalytics.plugin.scheduling.TimeAmount;
@ -457,52 +456,24 @@ public class GraphJSONCreator {
.build();
}
public Map<String, Object> playerHostnamePieJSONAsMap() {
String[] pieColors = theme.getPieColors(ThemeVal.GRAPH_WORLD_PIE);
Map<String, Integer> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.latestJoinAddresses());
translateUnknown(joinAddresses);
List<PieSlice> slices = graphs.pie().joinAddressPie(joinAddresses).getSlices();
slices.sort(new PieSliceComparator());
return Maps.builder(String.class, Object.class)
.put("colors", pieColors)
.put("slices", slices)
.build();
}
public Map<String, Object> playerHostnamePieJSONAsMap(ServerUUID serverUUID) {
String[] pieColors = theme.getPieColors(ThemeVal.GRAPH_WORLD_PIE);
Map<String, Integer> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.latestJoinAddresses(serverUUID));
translateUnknown(joinAddresses);
List<PieSlice> slices = graphs.pie().joinAddressPie(joinAddresses).getSlices();
slices.sort(new PieSliceComparator());
return Maps.builder(String.class, Object.class)
.put("colors", pieColors)
.put("slices", slices)
.build();
}
public void translateUnknown(Map<String, Integer> joinAddresses) {
Integer unknown = joinAddresses.get(JoinAddressTable.DEFAULT_VALUE_FOR_LOOKUP);
if (unknown != null) {
joinAddresses.remove(JoinAddressTable.DEFAULT_VALUE_FOR_LOOKUP);
joinAddresses.put(locale.getString(GenericLang.UNKNOWN).toLowerCase(), unknown);
joinAddresses.put(GenericLang.UNKNOWN.getKey(), unknown);
}
}
public Map<String, Object> joinAddressesByDay(ServerUUID serverUUID, long after, long before) {
public Map<String, Object> joinAddressesByDay(ServerUUID serverUUID, long after, long before, @Untrusted List<String> addressFilter) {
String[] pieColors = theme.getPieColors(ThemeVal.GRAPH_WORLD_PIE);
List<DateObj<Map<String, Integer>>> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.joinAddressesPerDay(serverUUID, config.getTimeZone().getOffset(System.currentTimeMillis()), after, before));
List<DateObj<Map<String, Integer>>> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.joinAddressesPerDay(serverUUID, config.getTimeZone().getOffset(System.currentTimeMillis()), after, before, addressFilter));
return mapToJson(pieColors, joinAddresses);
}
public Map<String, Object> joinAddressesByDay(long after, long before) {
public Map<String, Object> joinAddressesByDay(long after, long before, @Untrusted List<String> addressFilter) {
String[] pieColors = theme.getPieColors(ThemeVal.GRAPH_WORLD_PIE);
List<DateObj<Map<String, Integer>>> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.joinAddressesPerDay(config.getTimeZone().getOffset(System.currentTimeMillis()), after, before));
List<DateObj<Map<String, Integer>>> joinAddresses = dbSystem.getDatabase().query(JoinAddressQueries.joinAddressesPerDay(config.getTimeZone().getOffset(System.currentTimeMillis()), after, before, addressFilter));
return mapToJson(pieColors, joinAddresses);
}
@ -537,7 +508,7 @@ public class GraphJSONCreator {
List<ServerSpecificLineGraph> proxyGraphs = new ArrayList<>();
for (Server proxy : db.query(ServerQueries.fetchProxyServers())) {
ServerUUID proxyUUID = proxy.getUuid();
List<Double[]> points = Lists.map(
List<Number[]> points = Lists.map(
db.query(TPSQueries.fetchPlayersOnlineOfServer(halfYearAgo, now, proxyUUID)),
point -> Point.fromDateObj(point).toArray()
);

View File

@ -21,6 +21,7 @@ import com.djrapitops.plan.delivery.rendering.json.graphs.HighChart;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* This is a LineGraph for any set of Points, thus it is Abstract.
@ -80,6 +81,10 @@ public class LineGraph implements HighChart {
return points;
}
public List<Number[]> getPointArrays() {
return getPoints().stream().map(Point::toArray).collect(Collectors.toList());
}
private void addMissingPoints(StringBuilder arrayBuilder, Long lastX, long date) {
long iterate = lastX + gapStrategy.diffToFirstGapPointMs;
while (iterate < date) {

View File

@ -75,7 +75,7 @@ public class Point {
"y=" + y + '}';
}
public Double[] toArray() {
return new Double[]{x, y};
public Number[] toArray() {
return new Number[]{x, y};
}
}

View File

@ -57,7 +57,7 @@ public class PieGraphFactory {
public Pie activityPie(Map<String, Integer> activityData) {
String[] colors = theme.getPieColors(ThemeVal.GRAPH_ACTIVITY_PIE);
return new ActivityPie(activityData, colors, ActivityIndex.getGroups(locale));
return new ActivityPie(activityData, colors, ActivityIndex.getDefaultGroupLangKeys());
}
public Pie serverPreferencePie(Map<ServerUUID, String> serverNames, Map<ServerUUID, WorldTimes> serverWorldTimes) {
@ -68,10 +68,6 @@ public class PieGraphFactory {
return new ServerPreferencePie(playtimeByServerName);
}
public Pie joinAddressPie(Map<String, Integer> joinAddresses) {
return new JoinAddressPie(joinAddresses);
}
public WorldPie worldPie(WorldTimes worldTimes) {
WorldAliasSettings worldAliasSettings = config.getWorldAliasSettings();
Map<String, Long> playtimePerAlias = worldAliasSettings.getPlaytimePerAlias(worldTimes);

View File

@ -78,4 +78,9 @@ public class SpecialGraphFactory {
}
}
public Map<String, String> getGeocodes() {
if (geoCodes == null) prepareGeocodes();
return geoCodes;
}
}

View File

@ -53,6 +53,6 @@ public class StackGraphFactory {
public StackGraph activityStackGraph(DateMap<Map<String, Integer>> activityData) {
String[] colors = theme.getPieColors(ThemeVal.GRAPH_ACTIVITY_PIE);
return new ActivityStackGraph(activityData, colors, dayFormatter, ActivityIndex.getGroups(locale));
return new ActivityStackGraph(activityData, colors, dayFormatter, ActivityIndex.getDefaultGroupLangKeys());
}
}

View File

@ -16,9 +16,7 @@
*/
package com.djrapitops.plan.delivery.rendering.json.network;
import com.djrapitops.plan.delivery.domain.DateHolder;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.rendering.json.Trend;
import com.djrapitops.plan.gathering.ServerSensor;
@ -50,14 +48,11 @@ import java.util.concurrent.TimeUnit;
@Singleton
public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<String, Object>> {
private final Formatter<Long> day;
private final PlanConfig config;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
private final ServerSensor<?> serverSensor;
private final Formatter<Long> timeAmount;
private final ServerUptimeCalculator serverUptimeCalculator;
private final Formatter<DateHolder> year;
@Inject
public NetworkOverviewJSONCreator(
@ -73,10 +68,6 @@ public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<Str
this.serverInfo = serverInfo;
this.serverSensor = serverSensor;
this.serverUptimeCalculator = serverUptimeCalculator;
year = formatters.year();
day = formatters.dayLong();
timeAmount = formatters.timeAmount();
}
public Map<String, Object> createJSONAsMap() {
@ -122,17 +113,18 @@ public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<Str
ServerUUID serverUUID = serverInfo.getServerUUID();
Optional<DateObj<Integer>> lastPeak = db.query(TPSQueries.fetchPeakPlayerCount(serverUUID, twoDaysAgo));
Optional<DateObj<Integer>> allTimePeak = db.query(TPSQueries.fetchAllTimePeakPlayerCount(serverUUID));
numbers.put("last_peak_date", lastPeak.map(year).orElse("-"));
numbers.put("last_peak_date", lastPeak.map(DateObj::getDate).map(Object.class::cast).orElse("-"));
numbers.put("last_peak_players", lastPeak.map(dateObj -> dateObj.getValue().toString()).orElse("-"));
numbers.put("best_peak_date", allTimePeak.map(year).orElse("-"));
numbers.put("best_peak_date", allTimePeak.map(DateObj::getDate).map(Object.class::cast).orElse("-"));
numbers.put("best_peak_players", allTimePeak.map(dateObj -> dateObj.getValue().toString()).orElse("-"));
Long totalPlaytime = db.query(SessionQueries.playtime(0L, now));
numbers.put("playtime", timeAmount.apply(totalPlaytime));
numbers.put("player_playtime", userCount != 0 ? timeAmount.apply(totalPlaytime / userCount) : "-");
numbers.put("playtime", totalPlaytime);
numbers.put("player_playtime", userCount != 0 ? totalPlaytime / userCount : "-");
Long sessionCount = db.query(SessionQueries.sessionCount(0L, now));
numbers.put("sessions", sessionCount);
numbers.put("session_length_avg", sessionCount != 0 ? timeAmount.apply(totalPlaytime / sessionCount) : "-");
numbers.put("current_uptime", serverUptimeCalculator.getServerUptimeMillis(serverUUID).map(timeAmount)
numbers.put("session_length_avg", sessionCount != 0 ? totalPlaytime / sessionCount : "-");
numbers.put("current_uptime", serverUptimeCalculator.getServerUptimeMillis(serverUUID)
.map(Object.class::cast)
.orElse(GenericLang.UNAVAILABLE.getKey()));
return numbers;
@ -147,9 +139,9 @@ public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<Str
Map<String, Object> weeks = new HashMap<>();
weeks.put("start", day.apply(twoWeeksAgo));
weeks.put("midpoint", day.apply(oneWeekAgo));
weeks.put("end", day.apply(now));
weeks.put("start", twoWeeksAgo);
weeks.put("midpoint", oneWeekAgo);
weeks.put("end", now);
Integer uniqueBefore = db.query(PlayerCountQueries.uniquePlayerCount(twoWeeksAgo, oneWeekAgo));
Integer uniqueAfter = db.query(PlayerCountQueries.uniquePlayerCount(oneWeekAgo, now));
@ -175,9 +167,9 @@ public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<Str
Long playtimeAfter = db.query(SessionQueries.playtime(oneWeekAgo, now));
long avgPlaytimeBefore = uniqueBefore != 0 ? playtimeBefore / uniqueBefore : 0L;
long avgPlaytimeAfter = uniqueAfter != 0 ? playtimeAfter / uniqueAfter : 0L;
Trend avgPlaytimeTrend = new Trend(avgPlaytimeBefore, avgPlaytimeAfter, false, timeAmount);
weeks.put("average_playtime_before", timeAmount.apply(avgPlaytimeBefore));
weeks.put("average_playtime_after", timeAmount.apply(avgPlaytimeAfter));
Trend avgPlaytimeTrend = new Trend(avgPlaytimeBefore, avgPlaytimeAfter, false);
weeks.put("average_playtime_before", avgPlaytimeBefore);
weeks.put("average_playtime_after", avgPlaytimeAfter);
weeks.put("average_playtime_trend", avgPlaytimeTrend);
Long sessionsBefore = db.query(SessionQueries.sessionCount(twoWeeksAgo, oneWeekAgo));
@ -189,9 +181,9 @@ public class NetworkOverviewJSONCreator implements NetworkTabJSONCreator<Map<Str
long avgSessionLengthBefore = sessionsBefore != 0 ? playtimeBefore / sessionsBefore : 0;
long avgSessionLengthAfter = sessionsAfter != 0 ? playtimeAfter / sessionsAfter : 0;
Trend avgSessionLengthTrend = new Trend(avgSessionLengthBefore, avgSessionLengthAfter, false, timeAmount);
weeks.put("session_length_average_before", timeAmount.apply(avgSessionLengthBefore));
weeks.put("session_length_average_after", timeAmount.apply(avgSessionLengthAfter));
Trend avgSessionLengthTrend = new Trend(avgSessionLengthBefore, avgSessionLengthAfter, false);
weeks.put("session_length_average_before", avgSessionLengthBefore);
weeks.put("session_length_average_after", avgSessionLengthAfter);
weeks.put("session_length_average_trend", avgSessionLengthTrend);
return weeks;

View File

@ -16,11 +16,11 @@
*/
package com.djrapitops.plan.delivery.rendering.pages;
import com.djrapitops.plan.delivery.rendering.BundleAddressCorrection;
import com.djrapitops.plan.delivery.rendering.html.icon.Icon;
import com.djrapitops.plan.delivery.web.ResourceService;
import com.djrapitops.plan.delivery.web.resolver.exception.NotFoundException;
import com.djrapitops.plan.delivery.web.resource.WebResource;
import com.djrapitops.plan.delivery.webserver.Addresses;
import com.djrapitops.plan.identification.ServerInfo;
import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.settings.theme.Theme;
@ -50,7 +50,7 @@ public class PageFactory {
private final Lazy<PublicHtmlFiles> publicHtmlFiles;
private final Lazy<Theme> theme;
private final Lazy<DBSystem> dbSystem;
private final Lazy<Addresses> addresses;
private final Lazy<BundleAddressCorrection> bundleAddressCorrection;
private static final String ERROR_HTML_FILE = "error.html";
@Inject
@ -61,14 +61,14 @@ public class PageFactory {
Lazy<Theme> theme,
Lazy<DBSystem> dbSystem,
Lazy<ServerInfo> serverInfo,
Lazy<Addresses> addresses
Lazy<BundleAddressCorrection> bundleAddressCorrection
) {
this.versionChecker = versionChecker;
this.files = files;
this.publicHtmlFiles = publicHtmlFiles;
this.theme = theme;
this.dbSystem = dbSystem;
this.addresses = addresses;
this.bundleAddressCorrection = bundleAddressCorrection;
}
public Page playersPage() throws IOException {
@ -81,18 +81,12 @@ public class PageFactory {
WebResource resource = ResourceService.getInstance().getResource(
"Plan", fileName, () -> getPublicHtmlOrJarResource(fileName)
);
return new ReactPage(getBasePath(), resource);
return new ReactPage(bundleAddressCorrection.get(), resource);
} catch (UncheckedIOException readFail) {
throw readFail.getCause();
}
}
private String getBasePath() {
String address = addresses.get().getMainAddress()
.orElseGet(addresses.get()::getFallbackLocalhostAddress);
return addresses.get().getBasePath(address);
}
/**
* Create a server page.
*

View File

@ -16,8 +16,8 @@
*/
package com.djrapitops.plan.delivery.rendering.pages;
import com.djrapitops.plan.delivery.rendering.BundleAddressCorrection;
import com.djrapitops.plan.delivery.web.resource.WebResource;
import org.apache.commons.lang3.StringUtils;
/**
* Represents React index.html.
@ -26,20 +26,17 @@ import org.apache.commons.lang3.StringUtils;
*/
public class ReactPage implements Page {
private final String basePath;
private final BundleAddressCorrection bundleAddressCorrection;
private final WebResource reactHtml;
public ReactPage(String basePath, WebResource reactHtml) {
this.basePath = basePath;
public ReactPage(BundleAddressCorrection bundleAddressCorrection, WebResource reactHtml) {
this.bundleAddressCorrection = bundleAddressCorrection;
this.reactHtml = reactHtml;
}
@Override
public String toHtml() {
return StringUtils.replaceEach(
reactHtml.asString(),
new String[]{"/static", "/pageExtensionApi.js"},
new String[]{basePath + "/static", basePath + "/pageExtensionApi.js"});
return bundleAddressCorrection.correctAddressForWebserver(reactHtml.asString(), "index.html");
}
@Override

View File

@ -20,8 +20,8 @@ import com.djrapitops.plan.delivery.web.resolver.Resolver;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.PluginSettings;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.transactions.GrantWebPermissionToGroupsWithPermissionTransaction;
import com.djrapitops.plan.storage.database.transactions.StoreMissingWebPermissionsTransaction;
import com.djrapitops.plan.storage.database.transactions.webuser.GrantWebPermissionToGroupsWithPermissionTransaction;
import com.djrapitops.plan.storage.database.transactions.webuser.StoreMissingWebPermissionsTransaction;
import com.djrapitops.plan.utilities.dev.Untrusted;
import net.playeranalytics.plugin.server.PluginLogger;
@ -64,6 +64,8 @@ public class ResolverSvc implements ResolverService {
public void registerResolver(String pluginName, String start, Resolver resolver) {
basicResolvers.add(new Container(pluginName, checking -> checking.startsWith(start), resolver, start));
Collections.sort(basicResolvers);
Set<String> usedWebPermissions = resolver.usedWebPermissions();
dbSystem.getDatabase().executeTransaction(new StoreMissingWebPermissionsTransaction(usedWebPermissions));
if (config.isTrue(PluginSettings.DEV_MODE)) {
logger.info("Registered basic resolver '" + start + "' for plugin " + pluginName);
}

View File

@ -72,7 +72,7 @@ public class Addresses {
}
public Optional<String> getMainAddress() {
Optional<String> proxyServerAddress = getProxyServerAddress();
Optional<String> proxyServerAddress = getAnyValidServerAddress();
return proxyServerAddress.isPresent() ? proxyServerAddress : getAccessAddress();
}
@ -112,8 +112,21 @@ public class Addresses {
.findAny();
}
public Optional<String> getAnyValidServerAddress() {
return dbSystem.getDatabase().query(ServerQueries.fetchPlanServerInformationCollection())
.stream()
.map(Server::getWebAddress)
.filter(this::isValidAddress)
.findAny();
}
private boolean isValidAddress(String address) {
return address != null && !address.isEmpty() && !"0.0.0.0".equals(address);
return address != null
&& !address.isEmpty()
&& !"0.0.0.0".equals(address)
&& !"https://www.example.address".equals(address)
&& !"http://www.example.address".equals(address)
&& !"http://localhost:0".equals(address);
}
public Optional<String> getServerPropertyIP() {

View File

@ -20,6 +20,8 @@ import com.djrapitops.plan.delivery.webserver.http.WebServer;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.PluginSettings;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import net.playeranalytics.plugin.server.PluginLogger;
@ -34,6 +36,7 @@ import java.io.IOException;
public class NonProxyWebserverDisableChecker implements Runnable {
private final PlanConfig config;
private final Locale locale;
private final Addresses addresses;
private final WebServerSystem webServerSystem;
private final PluginLogger logger;
@ -41,12 +44,14 @@ public class NonProxyWebserverDisableChecker implements Runnable {
public NonProxyWebserverDisableChecker(
PlanConfig config,
Locale locale,
Addresses addresses,
WebServerSystem webServerSystem,
PluginLogger logger,
ErrorLogger errorLogger
) {
this.config = config;
this.locale = locale;
this.addresses = addresses;
this.webServerSystem = webServerSystem;
this.logger = logger;
@ -58,7 +63,7 @@ public class NonProxyWebserverDisableChecker implements Runnable {
if (config.isFalse(PluginSettings.PROXY_COPY_CONFIG)) return;
addresses.getProxyServerAddress().ifPresent(address -> {
logger.info("Proxy server detected in the database - Proxy Webserver address is '" + address + "'.");
logger.info(locale.getString(PluginLang.ENABLE_NOTIFY_PROXY_ADDRESS, address));
WebServer webServer = webServerSystem.getWebServer();
if (webServer.isEnabled()) {
@ -68,12 +73,12 @@ public class NonProxyWebserverDisableChecker implements Runnable {
}
private void disableWebserver(WebServer webServer) {
logger.warn("Disabling Webserver on this server - You can override this behavior by setting '" + PluginSettings.PROXY_COPY_CONFIG.getPath() + "' to false.");
logger.warn(locale.getString(PluginLang.ENABLE_NOTIFY_PROXY_DISABLED_WEBSERVER, PluginSettings.PROXY_COPY_CONFIG.getPath()));
webServer.disable();
try {
config.set(WebserverSettings.DISABLED, true);
config.save();
logger.warn("Note: Set '" + WebserverSettings.DISABLED.getPath() + "' to true");
logger.warn(locale.getString(PluginLang.ENABLE_NOTIFY_SETTING_CHANGE, WebserverSettings.DISABLED.getPath(), "true"));
} catch (IOException e) {
errorLogger.warn(e, ErrorContext.builder()
.whatToDo("Set '" + WebserverSettings.DISABLED.getPath() + "' to true manually.")

View File

@ -0,0 +1,84 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.webserver;
import com.djrapitops.plan.utilities.dev.Untrusted;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* Simple guard against DDoS attacks to single endpoint.
* <p>
* This only protects against a DDoS that doesn't follow redirects.
*
* @author AuroraLS3
*/
public class RateLimitGuard {
private static final int ATTEMPT_LIMIT = 30;
private final Cache<String, Integer> requests = Caffeine.newBuilder()
.expireAfterWrite(120, TimeUnit.SECONDS)
.build();
private final Cache<String, String> lastRequestPath = Caffeine.newBuilder()
.expireAfterWrite(120, TimeUnit.SECONDS)
.build();
public boolean shouldPreventRequest(@Untrusted String accessor) {
Integer attempts = requests.getIfPresent(accessor);
if (attempts == null) return false;
// Too many attempts, forbid further attempts.
return attempts >= ATTEMPT_LIMIT;
}
public void increaseAttemptCount(@Untrusted String requestPath, @Untrusted String accessor) {
String previous = lastRequestPath.getIfPresent(accessor);
if (!Objects.equals(previous, requestPath)) {
resetAttemptCount(accessor);
}
Integer attempts = requests.getIfPresent(accessor);
if (attempts == null) {
attempts = 0;
}
lastRequestPath.put(accessor, requestPath);
requests.put(accessor, attempts + 1);
}
public void resetAttemptCount(@Untrusted String accessor) {
// previous request changed
requests.cleanUp();
requests.invalidate(accessor);
}
public static class Disabled extends RateLimitGuard {
@Override
public boolean shouldPreventRequest(String accessor) {
return false;
}
@Override
public void increaseAttemptCount(String requestPath, String accessor) { /* Disabled */ }
@Override
public void resetAttemptCount(String accessor) { /* Disabled */ }
}
}

View File

@ -20,6 +20,7 @@ import com.djrapitops.plan.delivery.domain.container.PlayerContainer;
import com.djrapitops.plan.delivery.domain.keys.PlayerKeys;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.formatting.Formatters;
import com.djrapitops.plan.delivery.rendering.BundleAddressCorrection;
import com.djrapitops.plan.delivery.rendering.html.icon.Family;
import com.djrapitops.plan.delivery.rendering.html.icon.Icon;
import com.djrapitops.plan.delivery.rendering.pages.Page;
@ -75,6 +76,7 @@ public class ResponseFactory {
private final DBSystem dbSystem;
private final Theme theme;
private final Lazy<Addresses> addresses;
private final Lazy<BundleAddressCorrection> bundleAddressCorrection;
private final Formatter<Long> httpLastModifiedFormatter;
@Inject
@ -86,7 +88,8 @@ public class ResponseFactory {
DBSystem dbSystem,
Formatters formatters,
Theme theme,
Lazy<Addresses> addresses
Lazy<Addresses> addresses,
Lazy<BundleAddressCorrection> bundleAddressCorrection
) {
this.files = files;
this.publicHtmlFiles = publicHtmlFiles;
@ -97,6 +100,7 @@ public class ResponseFactory {
this.addresses = addresses;
httpLastModifiedFormatter = formatters.httpLastModifiedLong();
this.bundleAddressCorrection = bundleAddressCorrection;
}
/**
@ -232,9 +236,7 @@ public class ResponseFactory {
String content = UnaryChain.of(resource.asString())
.chain(this::replaceMainAddressPlaceholder)
.chain(theme::replaceThemeColors)
.chain(contents -> StringUtils.replace(contents,
".p=\"/\"",
".p=\"" + getBasePath() + "/\""))
.chain(contents -> bundleAddressCorrection.get().correctAddressForWebserver(contents, fileName))
.apply();
ResponseBuilder responseBuilder = Response.builder()
.setMimeType(MimeType.JS)
@ -244,7 +246,7 @@ public class ResponseFactory {
if (fileName.contains(STATIC_BUNDLE_FOLDER)) {
resource.getLastModified().ifPresent(lastModified -> responseBuilder
// Can't cache main bundle in browser since base path might change
.setHeader(HttpHeader.CACHE_CONTROL.asString(), fileName.contains("main") ? CacheStrategy.CHECK_ETAG : CacheStrategy.CACHE_IN_BROWSER)
.setHeader(HttpHeader.CACHE_CONTROL.asString(), fileName.contains("index") ? CacheStrategy.CHECK_ETAG : CacheStrategy.CACHE_IN_BROWSER)
.setHeader(HttpHeader.LAST_MODIFIED.asString(), httpLastModifiedFormatter.apply(lastModified))
.setHeader(HttpHeader.ETAG.asString(), lastModified));
}
@ -254,12 +256,6 @@ public class ResponseFactory {
}
}
private String getBasePath() {
String address = addresses.get().getMainAddress()
.orElseGet(addresses.get()::getFallbackLocalhostAddress);
return addresses.get().getBasePath(address);
}
private String replaceMainAddressPlaceholder(String resource) {
String address = addresses.get().getAccessAddress()
.orElseGet(addresses.get()::getFallbackLocalhostAddress);
@ -275,7 +271,7 @@ public class ResponseFactory {
WebResource resource = getPublicOrJarResource(fileName);
String content = UnaryChain.of(resource.asString())
.chain(theme::replaceThemeColors)
.chain(contents -> StringUtils.replace(contents, "/static", getBasePath() + "/static"))
.chain(contents -> bundleAddressCorrection.get().correctAddressForWebserver(contents, fileName))
.apply();
ResponseBuilder responseBuilder = Response.builder()
@ -479,6 +475,14 @@ public class ResponseFactory {
.build();
}
public Response failedRateLimit403() {
return Response.builder()
.setMimeType(MimeType.HTML)
.setContent("<h1>403 Forbidden</h1><p>You are being rate-limited.</p>")
.setStatus(403)
.build();
}
public Response ipWhitelist403(@Untrusted String accessor) {
return Response.builder()
.setMimeType(MimeType.HTML)

View File

@ -147,8 +147,9 @@ public class ResponseResolver {
String plugin = "Plan";
resolverService.registerResolver(plugin, "/robots.txt", fileResolver(responseFactory::robotsResponse));
resolverService.registerResolver(plugin, "/manifest.json", fileResolver(() -> responseFactory.jsonFileResponse("manifest.json")));
resolverService.registerResolver(plugin, "/asset-manifest.json", fileResolver(() -> responseFactory.jsonFileResponse("asset-manifest.json")));
resolverService.registerResolver(plugin, "/favicon.ico", fileResolver(responseFactory::faviconResponse));
resolverService.registerResolver(plugin, "/logo192.png", fileResolver(() -> responseFactory.imageResponse("logo192.png")));
resolverService.registerResolver(plugin, "/logo512.png", fileResolver(() -> responseFactory.imageResponse("logo512.png")));
resolverService.registerResolver(plugin, "/pageExtensionApi.js", fileResolver(() -> responseFactory.javaScriptResponse("pageExtensionApi.js")));
resolverService.registerResolver(plugin, "/query", queryPageResolver);

View File

@ -42,7 +42,6 @@ public enum DataID {
GRAPH_ACTIVITY,
GRAPH_PING,
GRAPH_SERVER_PIE,
GRAPH_HOSTNAME_PIE,
GRAPH_PUNCHCARD,
SERVER_OVERVIEW,
ONLINE_OVERVIEW,
@ -54,13 +53,28 @@ public enum DataID {
EXTENSION_TABS,
EXTENSION_JSON,
LIST_SERVERS,
JOIN_ADDRESSES_BY_DAY,
JOIN_ADDRESSES_BY_DAY(false),
PLAYER_RETENTION,
PLAYER_JOIN_ADDRESSES,
PLAYER_ALLOWLIST_BOUNCES,
;
private final boolean cacheable;
DataID() {
this(true);
}
DataID(boolean cacheable) {
this.cacheable = cacheable;
}
public boolean isCacheable() {
return cacheable;
}
public String of(ServerUUID serverUUID) {
if (serverUUID == null) return name();
return name() + '-' + serverUUID;
return name() + "_" + serverUUID;
}
}

View File

@ -74,6 +74,10 @@ public interface JSONStorage extends SubSystem {
this.timestamp = timestamp;
}
public static StoredJSON fromObject(Object json, long timestamp) {
return new StoredJSON(new Gson().toJson(json), timestamp);
}
public String getJson() {
return json;
}

View File

@ -75,8 +75,14 @@ public class AccessLogger {
}
}
try {
long timestamp = internalRequest.getTimestamp();
String accessAddress = internalRequest.getAccessAddress(webserverConfiguration);
String method = internalRequest.getMethod();
method = method != null ? method : "?";
String url = StoreRequestTransaction.getTruncatedURI(request, internalRequest);
int responseCode = response.getCode();
dbSystem.getDatabase().executeTransaction(
new StoreRequestTransaction(webserverConfiguration, internalRequest, request, response)
new StoreRequestTransaction(timestamp, accessAddress, method, url, responseCode)
);
} catch (CompletionException | DBOpException e) {
errorLogger.warn(e, ErrorContext.builder()

View File

@ -81,4 +81,6 @@ public interface InternalRequest {
}
return authenticationExtractor.extractAuthentication(this);
}
String getRequestedPath();
}

View File

@ -129,6 +129,11 @@ public class JettyInternalRequest implements InternalRequest {
return baseRequest.getRequestURI();
}
@Override
public String getRequestedPath() {
return baseRequest.getHttpURI().getDecodedPath();
}
@Override
public String toString() {
return "JettyInternalRequest{" +

View File

@ -19,6 +19,7 @@ package com.djrapitops.plan.delivery.webserver.http;
import com.djrapitops.plan.delivery.web.resolver.Response;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.delivery.webserver.PassBruteForceGuard;
import com.djrapitops.plan.delivery.webserver.RateLimitGuard;
import com.djrapitops.plan.delivery.webserver.ResponseFactory;
import com.djrapitops.plan.delivery.webserver.ResponseResolver;
import com.djrapitops.plan.delivery.webserver.auth.FailReason;
@ -40,6 +41,7 @@ public class RequestHandler {
private final ResponseResolver responseResolver;
private final PassBruteForceGuard bruteForceGuard;
private final RateLimitGuard rateLimitGuard;
private final AccessLogger accessLogger;
@Inject
@ -50,15 +52,23 @@ public class RequestHandler {
this.accessLogger = accessLogger;
bruteForceGuard = new PassBruteForceGuard();
rateLimitGuard = new RateLimitGuard();
}
public Response getResponse(InternalRequest internalRequest) {
@Untrusted String accessAddress = internalRequest.getAccessAddress(webserverConfiguration);
@Untrusted String requestedPath = internalRequest.getRequestedPath();
rateLimitGuard.increaseAttemptCount(requestedPath, accessAddress);
boolean blocked = false;
Response response;
@Untrusted Request request = null;
if (bruteForceGuard.shouldPreventRequest(accessAddress)) {
response = responseFactory.failedLoginAttempts403();
blocked = true;
} else if (rateLimitGuard.shouldPreventRequest(accessAddress)) {
response = responseFactory.failedRateLimit403();
blocked = true;
} else if (!webserverConfiguration.getAllowedIpList().isAllowed(accessAddress)) {
webserverConfiguration.getWebserverLogMessages()
.warnAboutWhitelistBlock(accessAddress, internalRequest.getRequestedURIString());
@ -77,7 +87,9 @@ public class RequestHandler {
response.getHeaders().putIfAbsent("Access-Control-Allow-Credentials", "true");
response.getHeaders().putIfAbsent("X-Robots-Tag", "noindex, nofollow");
accessLogger.log(internalRequest, request, response);
if (!blocked) {
accessLogger.log(internalRequest, request, response);
}
return response;
}

View File

@ -37,7 +37,7 @@ import java.util.Optional;
@Singleton
public class StaticResourceResolver implements NoAuthResolver {
private static final String PART_REGEX = "(vendor|css|js|img|static)";
private static final String PART_REGEX = "(static)";
public static final String PATH_REGEX = "^.*/" + PART_REGEX + "/.*";
private final ResponseFactory responseFactory;

View File

@ -0,0 +1,119 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.delivery.webserver.resolver.json;
import com.djrapitops.plan.delivery.domain.auth.WebPermission;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.web.resolver.MimeType;
import com.djrapitops.plan.delivery.web.resolver.Response;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService;
import com.djrapitops.plan.delivery.webserver.cache.DataID;
import com.djrapitops.plan.delivery.webserver.cache.JSONStorage;
import com.djrapitops.plan.identification.Identifiers;
import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.queries.objects.AllowlistQueries;
import com.djrapitops.plan.storage.database.queries.objects.SessionQueries;
import com.djrapitops.plan.utilities.dev.Untrusted;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.jetbrains.annotations.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Map;
import java.util.Optional;
/**
* Response resolver to get game allowlist bounces.
*
* @author AuroraLS3
*/
@Singleton
@Path("/v1/gameAllowlistBounces")
public class AllowlistJSONResolver extends JSONResolver {
private final DBSystem dbSystem;
private final Identifiers identifiers;
private final AsyncJSONResolverService jsonResolverService;
@Inject
public AllowlistJSONResolver(DBSystem dbSystem, Identifiers identifiers, AsyncJSONResolverService jsonResolverService) {
this.dbSystem = dbSystem;
this.identifiers = identifiers;
this.jsonResolverService = jsonResolverService;
}
@Override
public Formatter<Long> getHttpLastModifiedFormatter() {return jsonResolverService.getHttpLastModifiedFormatter();}
@Override
public boolean canAccess(@Untrusted Request request) {
WebUser user = request.getUser().orElse(new WebUser(""));
return user.hasPermission(WebPermission.PAGE_SERVER_ALLOWLIST_BOUNCE);
}
@GET
@Operation(
description = "Get allowlist bounce data for server",
responses = {
@ApiResponse(responseCode = "200", content = @Content(mediaType = MimeType.JSON)),
@ApiResponse(responseCode = "400", description = "If 'server' parameter is not an existing server")
},
parameters = @Parameter(in = ParameterIn.QUERY, name = "server", description = "Server identifier to get data for (optional)", examples = {
@ExampleObject("Server 1"),
@ExampleObject("1"),
@ExampleObject("1fb39d2a-eb82-4868-b245-1fad17d823b3"),
}),
requestBody = @RequestBody(content = @Content(examples = @ExampleObject()))
)
@Override
public Optional<Response> resolve(@Untrusted Request request) {
return Optional.of(getResponse(request));
}
private Response getResponse(@Untrusted Request request) {
JSONStorage.StoredJSON result = getStoredJSON(request);
return getCachedOrNewResponse(request, result);
}
@Nullable
private JSONStorage.StoredJSON getStoredJSON(Request request) {
Optional<Long> timestamp = Identifiers.getTimestamp(request);
ServerUUID serverUUID = identifiers.getServerUUID(request);
Database database = dbSystem.getDatabase();
return jsonResolverService.resolve(timestamp, DataID.PLAYER_ALLOWLIST_BOUNCES, serverUUID,
theUUID -> Map.of(
"allowlist_bounces", database.query(AllowlistQueries.getBounces(serverUUID)),
"last_seen_by_uuid", database.query(SessionQueries.lastSeen(serverUUID))
)
);
}
}

View File

@ -39,11 +39,16 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.apache.commons.lang3.StringUtils;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Resolves /v1/graph JSON requests.
@ -117,7 +122,6 @@ public class GraphsJSONResolver extends JSONResolver {
@ExampleObject("aggregatedPing"),
@ExampleObject("punchCard"),
@ExampleObject("serverPie"),
@ExampleObject("joinAddressPie"),
@ExampleObject("joinAddressByDay"),
}),
@Parameter(in = ParameterIn.QUERY, name = "server", description = "Server identifier to get data for", examples = {
@ -156,15 +160,22 @@ public class GraphsJSONResolver extends JSONResolver {
JSONStorage.StoredJSON storedJSON;
if (request.getQuery().get("server").isPresent()) {
ServerUUID serverUUID = identifiers.getServerUUID(request); // Can throw BadRequestException
storedJSON = jsonResolverService.resolve(
timestamp, dataID, serverUUID,
theServerUUID -> generateGraphDataJSONOfType(dataID, theServerUUID, request.getQuery())
);
Function<ServerUUID, Object> generationFunction = theServerUUID -> generateGraphDataJSONOfType(dataID, theServerUUID, request.getQuery());
if (dataID.isCacheable()) {
storedJSON = jsonResolverService.resolve(timestamp, dataID, serverUUID, generationFunction);
} else {
storedJSON = JSONStorage.StoredJSON.fromObject(generationFunction.apply(serverUUID), System.currentTimeMillis());
}
} else {
// Assume network
storedJSON = jsonResolverService.resolve(
timestamp, dataID, () -> generateGraphDataJSONOfType(dataID, request.getQuery())
);
Supplier<Object> generationFunction = () -> generateGraphDataJSONOfType(dataID, request.getQuery());
if (dataID.isCacheable()) {
storedJSON = jsonResolverService.resolve(
timestamp, dataID, generationFunction
);
} else {
storedJSON = JSONStorage.StoredJSON.fromObject(generationFunction.get(), System.currentTimeMillis());
}
}
return storedJSON;
}
@ -197,8 +208,6 @@ public class GraphsJSONResolver extends JSONResolver {
return DataID.GRAPH_PUNCHCARD;
case "serverPie":
return DataID.GRAPH_SERVER_PIE;
case "joinAddressPie":
return DataID.GRAPH_HOSTNAME_PIE;
case "joinAddressByDay":
return DataID.JOIN_ADDRESSES_BY_DAY;
default:
@ -214,7 +223,7 @@ public class GraphsJSONResolver extends JSONResolver {
case GRAPH_OPTIMIZED_PERFORMANCE:
return List.of(WebPermission.PAGE_SERVER_PERFORMANCE_GRAPHS, WebPermission.PAGE_NETWORK_PERFORMANCE);
case GRAPH_ONLINE:
return List.of(WebPermission.PAGE_SERVER_OVERVIEW_PLAYERS_ONLINE_GRAPH);
return List.of(WebPermission.PAGE_SERVER_OVERVIEW_PLAYERS_ONLINE_GRAPH, WebPermission.PAGE_NETWORK_OVERVIEW_GRAPHS_ONLINE);
case GRAPH_UNIQUE_NEW:
return List.of(WebPermission.PAGE_SERVER_ONLINE_ACTIVITY_GRAPHS_DAY_BY_DAY);
case GRAPH_HOURLY_UNIQUE_NEW:
@ -229,8 +238,6 @@ public class GraphsJSONResolver extends JSONResolver {
return List.of(WebPermission.PAGE_SERVER_PLAYERBASE_GRAPHS);
case GRAPH_WORLD_MAP:
return List.of(WebPermission.PAGE_SERVER_GEOLOCATIONS_MAP);
case GRAPH_HOSTNAME_PIE:
return List.of(WebPermission.PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_PIE);
case JOIN_ADDRESSES_BY_DAY:
return List.of(WebPermission.PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME);
default:
@ -258,8 +265,6 @@ public class GraphsJSONResolver extends JSONResolver {
return List.of(WebPermission.PAGE_NETWORK_GEOLOCATIONS_MAP);
case GRAPH_ONLINE_PROXIES:
return List.of(WebPermission.PAGE_NETWORK_OVERVIEW_GRAPHS_ONLINE);
case GRAPH_HOSTNAME_PIE:
return List.of(WebPermission.PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_PIE);
case JOIN_ADDRESSES_BY_DAY:
return List.of(WebPermission.PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME);
default:
@ -283,8 +288,6 @@ public class GraphsJSONResolver extends JSONResolver {
return graphJSON.serverCalendarJSON(serverUUID);
case GRAPH_WORLD_PIE:
return graphJSON.serverWorldPieJSONAsMap(serverUUID);
case GRAPH_HOSTNAME_PIE:
return graphJSON.playerHostnamePieJSONAsMap(serverUUID);
case GRAPH_ACTIVITY:
return graphJSON.activityGraphsJSONAsMap(serverUUID);
case GRAPH_WORLD_MAP:
@ -294,19 +297,24 @@ public class GraphsJSONResolver extends JSONResolver {
case GRAPH_PUNCHCARD:
return graphJSON.punchCardJSONAsMap(serverUUID);
case JOIN_ADDRESSES_BY_DAY:
try {
return graphJSON.joinAddressesByDay(serverUUID,
query.get("after").map(Long::parseLong).orElse(0L),
query.get("before").map(Long::parseLong).orElse(System.currentTimeMillis())
);
} catch (@Untrusted NumberFormatException e) {
throw new BadRequestException("'after' or 'before' is not a epoch millisecond (number)");
}
return joinAddressGraph(serverUUID, query);
default:
throw new BadRequestException("Graph type not supported with server-parameter (" + id.name() + ")");
}
}
private Map<String, Object> joinAddressGraph(ServerUUID serverUUID, @Untrusted URIQuery query) {
try {
Long after = query.get("after").map(Long::parseLong).orElse(0L);
Long before = query.get("before").map(Long::parseLong).orElse(System.currentTimeMillis());
@Untrusted List<String> addressFilter = query.get("addresses").map(s -> StringUtils.split(s, ','))
.map(Arrays::asList).orElse(List.of());
return graphJSON.joinAddressesByDay(serverUUID, after, before, addressFilter);
} catch (@Untrusted NumberFormatException e) {
throw new BadRequestException("'after' or 'before' is not a epoch millisecond (number)");
}
}
private Object generateGraphDataJSONOfType(DataID id, @Untrusted URIQuery query) {
switch (id) {
case GRAPH_ACTIVITY:
@ -319,23 +327,26 @@ public class GraphsJSONResolver extends JSONResolver {
return graphJSON.networkCalendarJSON();
case GRAPH_SERVER_PIE:
return graphJSON.serverPreferencePieJSONAsMap();
case GRAPH_HOSTNAME_PIE:
return graphJSON.playerHostnamePieJSONAsMap();
case GRAPH_WORLD_MAP:
return graphJSON.geolocationGraphsJSONAsMap();
case GRAPH_ONLINE_PROXIES:
return graphJSON.proxyPlayersOnlineGraphs();
case JOIN_ADDRESSES_BY_DAY:
try {
return graphJSON.joinAddressesByDay(
query.get("after").map(Long::parseLong).orElse(0L),
query.get("before").map(Long::parseLong).orElse(System.currentTimeMillis())
);
} catch (@Untrusted NumberFormatException e) {
throw new BadRequestException("'after' or 'before' is not a epoch millisecond (number)");
}
return joinAddressGraph(query);
default:
throw new BadRequestException("Graph type not supported without server-parameter (" + id.name() + ")");
}
}
private Map<String, Object> joinAddressGraph(URIQuery query) {
try {
Long after = query.get("after").map(Long::parseLong).orElse(0L);
Long before = query.get("before").map(Long::parseLong).orElse(System.currentTimeMillis());
@Untrusted List<String> addressFilter = query.get("addresses").map(s -> StringUtils.split(s, ','))
.map(Arrays::asList).orElse(List.of());
return graphJSON.joinAddressesByDay(after, before, addressFilter);
} catch (@Untrusted NumberFormatException e) {
throw new BadRequestException("'after' or 'before' is not a epoch millisecond (number)");
}
}
}

View File

@ -17,11 +17,13 @@
package com.djrapitops.plan.delivery.webserver.resolver.json;
import com.djrapitops.plan.delivery.domain.auth.WebPermission;
import com.djrapitops.plan.delivery.domain.datatransfer.PlayerJoinAddresses;
import com.djrapitops.plan.delivery.formatting.Formatter;
import com.djrapitops.plan.delivery.rendering.json.JSONFactory;
import com.djrapitops.plan.delivery.web.resolver.MimeType;
import com.djrapitops.plan.delivery.web.resolver.Response;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.delivery.web.resolver.request.URIQuery;
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService;
import com.djrapitops.plan.delivery.webserver.cache.DataID;
@ -34,6 +36,7 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.GET;
@ -42,7 +45,6 @@ import org.jetbrains.annotations.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collections;
import java.util.Optional;
/**
@ -69,17 +71,27 @@ public class PlayerJoinAddressJSONResolver extends JSONResolver {
@Override
public boolean canAccess(@Untrusted Request request) {
WebUser user = request.getUser().orElse(new WebUser(""));
if (request.getQuery().get("server").isPresent()) {
return user.hasPermission(WebPermission.PAGE_SERVER_RETENTION);
@Untrusted URIQuery query = request.getQuery();
Optional<String> listOnly = query.get("listOnly");
if (query.get("server").isPresent()) {
if (listOnly.isEmpty()) {
return user.hasPermission(WebPermission.PAGE_SERVER_RETENTION);
} else {
return user.hasPermission(WebPermission.PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME);
}
}
if (listOnly.isEmpty()) {
return user.hasPermission(WebPermission.PAGE_NETWORK_RETENTION);
} else {
return user.hasPermission(WebPermission.PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME);
}
return user.hasPermission(WebPermission.PAGE_NETWORK_RETENTION);
}
@GET
@Operation(
description = "Get join address information of players for server or network",
responses = {
@ApiResponse(responseCode = "200", content = @Content(mediaType = MimeType.JSON)),
@ApiResponse(responseCode = "200", content = @Content(mediaType = MimeType.JSON, schema = @Schema(implementation = PlayerJoinAddresses.class))),
@ApiResponse(responseCode = "400", description = "If 'server' parameter is not an existing server")
},
parameters = @Parameter(in = ParameterIn.QUERY, name = "server", description = "Server identifier to get data for (optional)", examples = {
@ -105,12 +117,12 @@ public class PlayerJoinAddressJSONResolver extends JSONResolver {
if (request.getQuery().get("server").isPresent()) {
ServerUUID serverUUID = identifiers.getServerUUID(request);
return jsonResolverService.resolve(timestamp, DataID.PLAYER_JOIN_ADDRESSES, serverUUID,
theUUID -> Collections.singletonMap("join_address_by_player", jsonFactory.playerJoinAddresses(theUUID))
serverUUID1 -> jsonFactory.playerJoinAddresses(serverUUID1, request.getQuery().get("listOnly").isEmpty())
);
}
// Assume network
return jsonResolverService.resolve(timestamp, DataID.PLAYER_JOIN_ADDRESSES,
() -> Collections.singletonMap("join_address_by_player", jsonFactory.playerJoinAddresses())
() -> jsonFactory.playerJoinAddresses(request.getQuery().get("listOnly").isEmpty())
);
}
}

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