Compare commits

...
164 Commits
Author SHA1 Message Date
Andre601 e50ec1632d Add LiteBans support for BanPlugins addon 2024-05-15 17:06:09 +02:00
Andre601 a0d4dedc9d Merge pull request 'Update dependency mkdocs-material to v9.5.22' (#285) from renovate/mkdocs-material-9.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/285
2024-05-13 12:07:09 +00:00
Andre601's Bot 9eda026738 Update dependency mkdocs-material to v9.5.22 2024-05-13 12:01:27 +00:00
Andre601 f3b81b7cb6 Fix a typo in the migration page of slp 2024-05-13 11:56:42 +00:00
Andre601 cf766ddd9a Bump version to 4.8.0 2024-05-13 13:38:11 +02:00
Andre601 12cd2f5e6b Use PAPIProxyBridge 1.6.1 2024-05-13 00:32:52 +02:00
Andre601 04ef50ea91 Use a unified Caching util 2024-05-12 14:41:28 +02:00
Andre601 d4c627fa79 Remove outdated info 2024-05-12 12:39:49 +02:00
Andre601 deffc28ab6 Implement workaround for 16 character limit on paper 2024-05-12 12:35:32 +02:00
Andre601 833f8f5dbb Fix PAPIProxyBridge breaking change 2024-05-11 15:30:04 +02:00
Andre601 5bdf2fa301 Merge pull request 'Update dependency net.william278:papiproxybridge to v1.6' (#284) from renovate/net.william278-papiproxybridge-1.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/284
2024-05-11 12:16:13 +00:00
Andre601's Bot d13607873c Update dependency net.william278:papiproxybridge to v1.6 2024-05-11 12:01:04 +00:00
Andre601 a1f11dac03 Update docs 2024-05-10 20:38:20 +02:00
Andre601 74f1805441 Merge pull request 'Limit character length to 16 for player entries' (#283) from fix/282-profile-name-limit into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/283
2024-05-10 17:48:53 +00:00
Andre601 21046d8eee Fix index out of bounds issue 2024-05-10 19:43:01 +02:00
Andre601 0c37e3bb35 Actually truncate text after serialization [SKIP CI] 2024-05-10 17:42:48 +02:00
Andre601 3f9ea7035f Add info box to docs 2024-05-10 17:35:59 +02:00
Andre601 b55c56af12 Add note to option description. 2024-05-10 17:30:28 +02:00
Andre601 498a948605 Limit character length to 16 for player entries 2024-05-10 17:23:37 +02:00
Andre601 76a1890bba Make the migrator not create a single profiles entry 2024-05-10 15:34:33 +02:00
Andre601 8899770518 Improve SLP Migration page 2024-05-10 15:28:30 +02:00
Andre601 a7d29d292f Merge pull request 'Update dependency com.viaversion:viaversion-api to v4.10.2' (#281) from renovate/com.viaversion-viaversion-api-4.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/281
2024-05-10 12:09:48 +00:00
Andre601's Bot a9ca388f4e Update dependency com.viaversion:viaversion-api to v4.10.2 2024-05-10 12:01:34 +00:00
Andre601 c42a88142c Include names for external dependencies 2024-05-09 15:14:53 +02:00
Andre601 9fe78d3e6e Slightly better error message. 2024-05-09 15:09:38 +02:00
Andre601 816a58493a Include response body in error 2024-05-09 14:47:50 +02:00
Andre601 bc84cd2ec9 Add SLP dependency to Hangar, Update MC version and bump version 2024-05-09 14:36:13 +02:00
Andre601 5f7fda250c Merge branch 'renovate/dependency.adventure-text-serializer-legacy' 2024-05-09 14:21:19 +02:00
Andre601 03b58da260 Improve migration messages 2024-05-09 14:19:20 +02:00
Andre601 238049b58c Merge pull request 'Update dependency net.kyori:adventure-text-minimessage to v4.17.0' (#279) from renovate/dependency.adventure-text-minimessage into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/279
2024-05-09 12:16:19 +00:00
Andre601's Bot 34a701cbe9 Update dependency net.kyori:adventure-text-serializer-legacy to v4.17.0 2024-05-09 12:01:37 +00:00
Andre601's Bot bdf42b3ef1 Update dependency net.kyori:adventure-text-minimessage to v4.17.0 2024-05-09 12:01:32 +00:00
Andre601 7b82fa17d0 Merge pull request 'ServerListPlus migration support' (#276) from feature/slp-migrator into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/276
2024-05-08 15:28:19 +00:00
Andre601 05f1f285d0 Add SLP as softdependency to plugin configurations 2024-05-08 17:23:36 +02:00
Andre601 12813a4a00 Add migration guide for SLP to docs 2024-05-08 15:34:46 +02:00
Andre601 176b02ebe3 Remove unused files 2024-05-08 14:58:36 +02:00
Andre601 bd53bf7eb2 Bump version to 4.8.0-b1 2024-05-08 14:51:56 +02:00
Andre601 ae17d965e6 Merge remote-tracking branch 'origin/feature/slp-migrator' into feature/slp-migrator 2024-05-08 14:49:53 +02:00
Andre601 17b69fd38c Make single method to apply content to builders 2024-05-08 14:49:29 +02:00
Andre601 ee9c6f77ec Merge branch 'refs/heads/master' into feature/slp-migrator 2024-05-08 14:42:19 +02:00
Andre601 ddeb523154 Merge pull request 'Update dependency net.kyori:adventure-api to v4.17.0' (#278) from renovate/net.kyori-adventure-api-4.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/278
2024-05-08 12:41:18 +00:00
Andre601 04ec8e1927 Merge pull request 'Update dependency net.kyori:adventure-api to v4.17.0' (#277) from renovate/dependency.adventure-api into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/277
2024-05-08 12:41:07 +00:00
Andre601's Bot f3f3cc7927 Update dependency net.kyori:adventure-api to v4.17.0 2024-05-08 12:01:37 +00:00
Andre601's Bot c7dd3f5344 Update dependency net.kyori:adventure-api to v4.17.0 2024-05-08 12:01:31 +00:00
Andre601 19f534845f Merge branch 'master' into feature/slp-migrator 2024-05-07 23:43:46 +00:00
Andre601 3c3110a3f8 Change command output. 2024-05-08 01:38:48 +02:00
Andre601 2aa551090c Use the SLP Internal API for migration 2024-05-08 01:31:40 +02:00
Andre601 57861e435c Merge pull request 'Update dependency mkdocs-glightbox to v0.4.0' (#275) from renovate/mkdocs-glightbox-0.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/275
2024-05-07 12:05:11 +00:00
Andre601's Bot 205e1e065d Update dependency mkdocs-glightbox to v0.4.0 2024-05-07 12:01:58 +00:00
Andre601 79ee776167 Merge pull request 'Update dependency com.viaversion:viaversion-api to v4.10.1' (#274) from renovate/com.viaversion-viaversion-api-4.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/274
2024-05-06 12:03:26 +00:00
Andre601's Bot 19869084e5 Update dependency com.viaversion:viaversion-api to v4.10.1 2024-05-06 12:01:35 +00:00
Andre601 f1bd608fca Merge branch 'refs/heads/master' into feature/slp-migrator
# Conflicts:
#	.woodpecker/pr_preview.yml
#	bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/BungeeCordCore.java
#	requirements.txt
2024-05-05 22:59:22 +02:00
Andre601 2474e390f7 Update config.yml comments 2024-05-05 01:57:00 +02:00
Andre601 ef737d5566 Revert "First steps on an SLP migrator"
This reverts commit cda72b3b3a.
2024-05-05 00:02:47 +02:00
Andre601 9c64d3521e Remove dependencies.maven file 2024-05-05 00:02:41 +02:00
Andre601 c7c8636720 Use file-based library loading 2024-05-04 23:59:40 +02:00
Andre601 cda72b3b3a First steps on an SLP migrator 2024-05-04 23:57:40 +02:00
Andre601 04a1101045 Merge pull request 'Update dependency mkdocs-material to v9.5.21' (#272) from renovate/mkdocs-material-9.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/272
2024-05-04 12:07:23 +00:00
Andre601 44e3e51bbc Fix missing repo 2024-05-04 12:04:54 +00:00
Andre601 40f2c44b5d Forgot publish_docs.yml 2024-05-04 14:01:27 +02:00
Andre601 16c26af04e Without the {} I guess... 2024-05-04 14:01:26 +02:00
Andre601 85aa30f82c Set git user and name globally 2024-05-04 14:01:26 +02:00
Andre601 0ad119b6e0 Manually re-write all files 2024-05-04 14:01:26 +02:00
Andre601 a612e2216b Revert changes to old file format 2024-05-04 14:01:25 +02:00
Andre601 2c0d3db9f4 This step contained spaces in name 2024-05-04 14:01:25 +02:00
Andre601's Bot 8de820747a Update dependency com.google.guava:guava to v33.2.0-jre 2024-05-04 14:01:25 +02:00
Andre601 6469893b15 Final test 2024-05-04 14:01:24 +02:00
Andre601 a46feb5e03 Maybe this? 2024-05-04 14:01:24 +02:00
Andre601 2e39683687 ...and finally here. 2024-05-04 14:01:23 +02:00
Andre601 78464ac222 Change here too 2024-05-04 14:01:23 +02:00
Andre601 92b12fd612 Try without spaces in name. 2024-05-04 14:01:23 +02:00
Andre601 5e90191aa4 Change workflow file structures. 2024-05-04 14:01:23 +02:00
Andre601 1b4ee54b73 Bump version 2024-05-04 14:01:22 +02:00
Andre601 409c007759 Remove the temp fix from CodebergReleaseFetcher 2024-05-04 14:01:22 +02:00
Andre601 49cd7410cf Use a library loader system 2024-05-04 14:01:22 +02:00
Andre601 978b21360e Use - instead of / 2024-05-04 14:01:21 +02:00
Andre601 0d1fbc15ce Add preview-domains file 2024-05-04 14:01:21 +02:00
Andre601 1cf3ba543d Maybe this works... 2024-05-04 14:01:20 +02:00
Andre601 358830cbfb Remove source command 2024-05-04 14:01:20 +02:00
Andre601 ea193d7bd3 Set target branch env using reusable 2024-05-04 14:01:20 +02:00
Andre601 8e59336833 fixing missing closing brace 2024-05-04 14:01:19 +02:00
Andre601 5083f0a3d2 Comment (Trigger workflow) 2024-05-04 14:01:19 +02:00
Andre601 d20fdd3086 Use preview repository for PR previews. 2024-05-04 14:01:19 +02:00
Andre601's Bot e005d80192 Update dependency ch.andre601:expressionparser to v1.4.2 2024-05-04 14:01:18 +02:00
Andre601 afd791b808 Update e-mail to noreply one by codeberg 2024-05-04 14:01:18 +02:00
Andre601 0acdcba09b Change e-mail to noreply one by codeberg 2024-05-04 14:01:18 +02:00
Andre601 872078ff05 Stupid typo. -_- 2024-05-04 14:01:17 +02:00
Andre601 4bfb1ec29b Apply workaround for broken Tags ENV variable 2024-05-04 14:01:17 +02:00
Andre601 97f073685e Update ExpressionParser 2024-05-04 14:01:16 +02:00
Andre601's Bot 08ab52d7f0 Update dependency mkdocs-material to v9.5.20 2024-05-04 14:01:16 +02:00
Andre601's Bot e7b7c78b11 Update dependency com.viaversion:viaversion-api to v4.10.0 2024-05-04 14:01:16 +02:00
Andre601's Bot 7df02868ad Update dependency mkdocs-material to v9.5.19 2024-05-04 14:01:15 +02:00
Andre601's Bot 063b5f90e9 Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.5.3 2024-05-04 14:01:15 +02:00
Andre601's Bot dd700f99e2 Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.1 2024-05-04 14:01:10 +02:00
Andre601's Bot 7b9f418b23 Update dependency mkdocs-material to v9.5.21 2024-05-04 12:01:08 +00:00
Andre601 fa163e0593 Forgot publish_docs.yml 2024-05-03 17:39:38 +02:00
Andre601 8ba86bec71 Without the {} I guess... 2024-05-03 17:38:43 +02:00
Andre601 971f404f20 Set git user and name globally 2024-05-03 17:34:46 +02:00
Andre601 f378b1e10a Manually re-write all files 2024-05-03 17:31:43 +02:00
Andre601 13a281ebf7 Revert changes to old file format 2024-05-03 16:53:12 +02:00
Andre601 e7f210739f This step contained spaces in name 2024-05-03 16:50:58 +02:00
Andre601 addca59c39 Merge pull request 'Update dependency com.google.guava:guava to v33.2.0-jre' (#271) from renovate/com.google.guava-guava-33.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/271
2024-05-03 12:17:55 +00:00
Andre601's Bot f93880a0f5 Update dependency com.google.guava:guava to v33.2.0-jre 2024-05-03 12:01:09 +00:00
Andre601 489e8b60aa Final test 2024-05-02 21:56:09 +00:00
Andre601 bf418d8a9a Maybe this? 2024-05-02 21:55:39 +00:00
Andre601 1e1f11cde9 ...and finally here. 2024-05-02 21:33:34 +00:00
Andre601 34179eb850 Change here too 2024-05-02 21:32:22 +00:00
Andre601 cfcd488d44 Try without spaces in name. 2024-05-02 21:28:23 +00:00
Andre601 a49b838b83 Change workflow file structures. 2024-05-02 23:17:31 +02:00
Andre601 fdeec1e97c Bump version 2024-05-02 21:07:37 +02:00
Andre601 39ba75410e Remove the temp fix from CodebergReleaseFetcher 2024-05-02 21:07:13 +02:00
Andre601 c20d6be447 Use a library loader system 2024-05-02 20:40:31 +02:00
Andre601 d2f7f256d3 Merge pull request 'Use preview repository for PR previews.' (#267) from feature/use-preview-repo into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/267
2024-05-02 12:08:34 +00:00
Andre601 fb6abf7161 Merge pull request 'Update dependency ch.andre601:expressionparser to v1.4.2' (#270) from renovate/ch.andre601-expressionparser-1.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/270
2024-05-02 12:04:02 +00:00
Andre601's Bot 445bdac8a7 Update dependency ch.andre601:expressionparser to v1.4.2 2024-05-02 12:01:26 +00:00
Andre601 7bdabf93b8 Update e-mail to noreply one by codeberg 2024-05-01 15:03:01 +00:00
Andre601 8d9c0549b7 Change e-mail to noreply one by codeberg 2024-05-01 15:02:25 +00:00
Andre601 4d94a4879b Stupid typo. -_- 2024-04-29 21:11:47 +02:00
Andre601 924a72c537 Apply workaround for broken Tags ENV variable 2024-04-29 21:08:05 +02:00
Andre601 75abdccd06 Update ExpressionParser 2024-04-29 20:46:26 +02:00
Andre601 bb4b92e37e First steps on an SLP migrator 2024-04-29 20:32:47 +02:00
Andre601 880616135f Use - instead of / 2024-04-29 12:55:28 +00:00
Andre601 be72744651 Merge pull request 'Update dependency mkdocs-material to v9.5.20' (#269) from renovate/mkdocs-material-9.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/269
2024-04-29 12:09:31 +00:00
Andre601's Bot c43090bdd8 Update dependency mkdocs-material to v9.5.20 2024-04-29 12:01:16 +00:00
Andre601 50143c2374 Merge pull request 'Update dependency com.viaversion:viaversion-api to v4.10.0' (#268) from renovate/com.viaversion-viaversion-api-4.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/268
2024-04-28 12:32:05 +00:00
Andre601's Bot 951f1853fc Update dependency com.viaversion:viaversion-api to v4.10.0 2024-04-28 12:00:58 +00:00
Andre601 a69962dd86 Add preview-domains file 2024-04-27 15:26:03 +02:00
Andre601 29e0bf8476 Maybe this works... 2024-04-27 13:20:59 +00:00
Andre601 ee41a234e8 Remove source command 2024-04-27 13:18:57 +00:00
Andre601 c8cf01319a Set target branch env using reusable 2024-04-27 13:18:15 +00:00
Andre601 3f4da7884f fixing missing closing brace 2024-04-27 13:11:15 +00:00
Andre601 965df44783 Comment (Trigger workflow) 2024-04-27 13:10:22 +00:00
Andre601 b9b8f8b36d Use preview repository for PR previews. 2024-04-27 13:05:07 +00:00
Andre601 d293cdfb39 Merge pull request 'Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.5.3' (#266) from renovate/org.apache.maven.plugins-maven-shade-plugin-3.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/266
2024-04-27 12:41:01 +00:00
Andre601 e3dc3ea548 Merge branch 'master' into renovate/org.apache.maven.plugins-maven-shade-plugin-3.x 2024-04-27 12:40:49 +00:00
Andre601 3037d3a742 Merge pull request 'Update dependency mkdocs-material to v9.5.19' (#265) from renovate/mkdocs-material-9.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/265
2024-04-27 12:40:24 +00:00
Andre601's Bot 2230800deb Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.5.3 2024-04-27 12:35:30 +00:00
Andre601's Bot 1f0b8f783f Update dependency mkdocs-material to v9.5.19 2024-04-27 12:35:23 +00:00
Andre601 da8d4e93ab Merge pull request 'Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.1' (#264) from renovate/org.apache.maven.plugins-maven-jar-plugin-3.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/264
2024-04-20 12:10:35 +00:00
Andre601's Bot aa38567232 Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.1 2024-04-20 12:01:15 +00:00
Andre601 b6757b9622 Add PremiumVanishAPI to jitpack in packageRules 2024-04-18 12:05:17 +00:00
Andre601 ca288fdf75 Merge pull request 'Update dependency ch.qos.logback:logback-classic to v1.5.6' (#263) from renovate/ch.qos.logback-logback-classic-1.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/263
2024-04-18 12:03:15 +00:00
Andre601's Bot 8b74c29bbe Update dependency ch.qos.logback:logback-classic to v1.5.6 2024-04-18 12:01:14 +00:00
Andre601 5aae4a17ef Update title for Discord icon 2024-04-18 11:57:41 +00:00
Andre601 778212d48a Improve description of Discord Server 2024-04-17 22:46:26 +02:00
Andre601 8d126436ea Remove api_support.yml file 2024-04-17 22:26:42 +02:00
Andre601 ec40db1b26 Clean up repository files a bit 2024-04-17 22:19:17 +02:00
Andre601 263c197845 Update ExpressionParserTests 2024-04-17 22:16:04 +02:00
Andre601 7bdc14aa30 Merge pull request 'Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.0' (#262) from renovate/org.apache.maven.plugins-maven-jar-plugin-3.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/262
2024-04-16 12:26:38 +00:00
Andre601 7ba5209222 Merge pull request 'Update dependency mkdocs-material to v9.5.18' (#261) from renovate/mkdocs-material-9.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/261
2024-04-16 12:26:13 +00:00
Andre601's Bot 71e62e0bae Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.0 2024-04-16 12:06:14 +00:00
Andre601's Bot 4a8029ec31 Update dependency mkdocs-material to v9.5.18 2024-04-16 12:06:07 +00:00
Andre601 382038b9a4 Merge pull request 'Update dependency ch.qos.logback:logback-classic to v1.5.5' (#259) from renovate/ch.qos.logback-logback-classic-1.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/259
2024-04-15 12:52:28 +00:00
Andre601 7f59851a3b Update ExpressionParser and ProfileConditionParser 2024-04-15 14:51:55 +02:00
Andre601's Bot 0ebcc449f8 Update dependency ch.qos.logback:logback-classic to v1.5.5 2024-04-15 12:05:32 +00:00
Andre601 323614d8c5 Only change cb_token. 2024-04-13 12:16:05 +00:00
Andre601 264dedca34 Remove useless secrets option 2024-04-13 12:13:29 +00:00
Andre601 ce26decb7d Use environment instead of secret 2024-04-13 12:08:50 +00:00
Andre601 37085e82f0 Merge pull request 'Add message on join for new versions' (#258) from feature/update-message-on-join into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/258
2024-04-13 11:58:23 +00:00
Andre601 041430e842 Bump version 2024-04-13 13:57:42 +02:00
Andre601 6762cbc245 Make delay for VersionCache 5 minutes (300k ms) 2024-04-12 22:45:18 +02:00
Andre601 917d3640f0 Add message on join for new versions 2024-04-12 22:37:10 +02:00
Andre601 0cece71f37 Include tag in release webhook message. 2024-04-10 17:30:58 +02:00
Andre601 d9c9f30cea Update invites to M.O.S.S. Discord. 2024-04-10 17:27:11 +02:00
81 changed files with 1910 additions and 553 deletions

No files matched your search

File renamed without changes.
+11
View File
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: API Support
about: For API support, please create an issue in the `asl-api` repository.
url: https://codeberg.org/Andre601/asl-api
- name: Discord Server
about: Please ask questions in the `#asl-support` channel on the M.O.S.S. Discord Server.
url: https://discord.gg/MyPTjpsgGH
- name: Wiki
about: Check the Wiki for explanations about the features and examples.
url: https://asl.andre601.ch
@@ -80,7 +80,7 @@ Spanish Video by Ajneb97
</a>
## Support
<a href="https://discord.gg/6dazXp6" target="_blank">
<a href="https://discord.gg/MyPTjpsgGH" target="_blank">
<img src="https://wsrv.nl/?url=https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact-minimal/social/discord-singular_vector.svg&w=64" alt="discord" title="Join my Discord Server">
</a>
<a href="https://app.revolt.chat/invite/74TpERXA" target="_blank">
File renamed without changes.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

File renamed without changes.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

File renamed without changes.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

-2
View File
@@ -1,2 +0,0 @@
patreon: andre_601
ko_fi: andre_601
-41
View File
@@ -1,41 +0,0 @@
name: API support
description: Ask for help with the API.
body:
- type: markdown
attributes:
value: |-
## Before opening
Please make sure you've checked the following things first:
- You're using the latest release of AdvancedServerList [[Download from Modrinth](https://modrinth.com/plugin/advancedserverlist)] and the right API version.
- You're using a supported Proxy/Server version. As of right now is only 1.19+ supported.
- The Feature you suggest hasn't been suggested before.
- type: dropdown
attributes:
label: Platforms
description: On what platform(s) are you using the API?
multiple: true
options:
- Proxy (BungeeCord, Waterfall, ...)
- Proxy (Velocity)
- Server (Spigot, Paper, ...)
validations:
required: true
- type: textarea
attributes:
label: Description
description: |-
Give a detailed description of what exactly you try to do, what steps you did and what you need help with.
placeholder: I tried to...
validations:
required: true
- type: textarea
attributes:
label: Code
description: |-
Provide code-snippets to help us better understand what you tried.
The code is automatically parsed as Java Code.
render: java
validations:
required: true
-8
View File
@@ -1,8 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Discord Server
about: Ask questions about the plugin in the `#advancedserverlist` channel.
url: https://discord.gg/6dazXp6
- name: Wiki
about: Check the Wiki for explanations about the features and examples.
url: https://docs.andre601.ch/AdvancedServerList
-14
View File
@@ -1,14 +0,0 @@
"Target: All":
- all: ["bukkit/**", "bungeecord/**", "core/**", "velocity/**"]
"Target: Bukkit":
- all: ["bukkit/**", "!bungeecord/**", "!core/**", "!velocity/**"]
"Target: BungeeCord":
- all: ["!bukkit/**", "bungeecord/**", "!core/**", "!velocity/**"]
"Target: Core":
- all: ["!bukkit/**", "!bungeecord/**", "core/**", "!velocity/**"]
"Target: Velocity":
- all: ["!bukkit/**", "!bungeecord/**", "!core/**", "velocity/**"]
-49
View File
@@ -1,49 +0,0 @@
name: 'Deploy Site (Push)'
on:
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
env:
GITHUB_REPO_INSTANCE: true
jobs:
build:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.7
uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Create/Get Cache
uses: actions/cache@v4
with:
key: ${{ github.ref }}
path: .cache
- name: Install dependencies
run: |
python -m pip install --upgrade pip setuptools
python -m pip install -r requirements.txt
- name: Build docs
run: mkdocs build
- name: Configure GitHub Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: 'site/'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+25 -28
View File
@@ -1,67 +1,64 @@
when:
- event: pull_request
path:
include: ['.woodpecker/pr_preview.yml', 'requirements.txt', 'mkdocs.yml', 'docs/**']
include: [".woodpecker/pr_preview.yml", "docs/**", "mkdocs.yml", "requirements.txt"]
variables:
setup_git: &setup_git
- apk add git
- git config --global user.email "andre@andre601.ch"
- git config --global user.name "ASL Docs Builder"
- git config --global user.email "andre_601-bot@noreply.codeberg.org"
- git config --global user.name "PR Docs Preview Builder"
steps:
cloneTargetRepo:
- name: "Clone Preview Repository"
image: alpine:3.18.4
commands:
- chmod -R a+w .
- <<: *setup_git
- git clone https://codeberg.org/Andre601/asl-docs.git site
- git clone https://codeberg.org/Andre601/preview.git site
- chmod -R a+w site
- cd site
- git switch pr-${CI_COMMIT_PULL_REQUEST} 2>/dev/null || git switch -c pr-${CI_COMMIT_PULL_REQUEST}
buildDocs:
- git switch ${CI_REPO_NAME,,}/${CI_COMMIT_PULL_REQUEST} 2>/dev/null || git switch -c ${CI_REPO_NAME,,}/${CI_COMMIT_PULL_REQUEST}
- name: "Build Docs"
image: woodpeckerci/plugin-mkdocs:latest
settings:
pip_install_file: requirements.txt
commitAndPush:
- name: "Commit and Push"
image: alpine:3.18.4
secrets:
- bot_token
commands:
- <<: *setup_git
- mv domains site/.domains
- mv preview-domains site/.domains
- cd site
- git remote add upstream https://$BOT_TOKEN@codeberg.org/Andre601/asl-docs.git
- git remote add upstream https://$BOT_TOKEN@codeberg.org/Andre601/preview.git
- git add --all
- git commit -m "Update Preview for PR ${CI_COMMIT_PULL_REQUEST} ($( env TZ=Europe/Zurich date +"%d.%m.%Y %Z" )) [SKIP CI]"
- git push --set-upstream upstream pr-${CI_COMMIT_PULL_REQUEST} -f
commentOnSuccess:
- git commit -m "Update Preview for ${CI_REPO_NAME}/${CI_COMMIT_PULL_REQUEST} ($( env TZ=Europe/Zurich date +"%d.%m.%Y %Z" )) [SKIP CI]"
- git push --set-upstream upstream ${CI_REPO_NAME,,}/${CI_COMMIT_PULL_REQUEST} -f
- name: "Comment on Success"
image: mcs94/gitea-comment
when:
- status: ['success']
secrets:
- bot_token
- status: ["success"]
settings:
gitea_address: https://codeberg.org
gitea_token:
from_secret: BOT_TOKEN
comment: |-
Pull request Preview ready!
| Name | Value |
|--------|-------------------------------------------------------|
| Commit | ${CI_COMMIT_SHA} |
| Link | https://asl.andre601.ch/@pr-${CI_COMMIT_PULL_REQUEST} |
commentOnFailure:
Pull request Preview Ready!
| Name | Value |
|--------|--------------------------------------------------------------------------|
| Commit | ${CI_COMMIT_SHA} |
| Link | https://preview.andre601.ch/@${CI_REPO_NAME,,}~${CI_COMMIT_PULL_REQUEST} |
- name: "Comment on Failure"
image: mcs94/gitea-comment
when:
- status: ['failure']
secrets:
- bot_token
- status: ["failure"]
settings:
gitea_address: https://codeberg.org
gitea_token:
from_secret: BOT_TOKEN
comment: |-
Issue while creating Pull request preview.
Please check the CI logs for any reasons: ${CI_PIPELINE_URL}
Pull request Preview **failed**!
Please check the CI logs for details: ${CI_PIPELINE_URL}
+20 -20
View File
@@ -1,29 +1,24 @@
when:
- event: tag
branch: master
branch: ${CI_REPO_DEFAULT_BRANCH}
steps:
createFiles:
- name: "Build Jar and Upload"
image: maven:3.9.6-eclipse-temurin-17
secrets:
- source: cb_token
target: codeberg_api_token
- source: modrinth_api_token
target: modrinth_api_token
- source: hangar_api_token
target: hangar_api_token
- source: discord_webhook_url
target: discord_webhook_url
- modrinth_api_token
- hangar_api_token
- discord_webhook_url
environment:
CODEBERG_API_TOKEN:
from_secret: cb_token
commands:
# Create the jar files.
- mvn clean install
# Move VersionUploader jar file
- cd version-uploader/target/
- cd version-uploader/target
- mv VersionUploader.jar ../../
- cd ../../
# Execute Jar file
- java -jar VersionUploader.jar --all
uploadToCodeberg:
- name: "Upload Jars to Codeber"
image: woodpeckerci/plugin-gitea-release
settings:
base_url: https://codeberg.org
@@ -33,14 +28,19 @@ steps:
- "velocity/target/AdvancedServerList-*.jar"
- "addons/banplugins/target/AdvancedServerList-*.jar"
api_key:
from_secret: CB_TOKEN
postOnMastodon:
from_secret: cb_token
- name: "Create Post on Mastodon"
image: woodpeckerci/plugin-mastodon-post
when:
- status: ['success']
- status: ["success"]
settings:
server_url: https://blobfox.coffee
access_token:
from_secret: MASTODON_TOKEN
status: '${CI_COMMIT_TAG} of #AdvancedServerList has been released and can be found on Modrinth (https://modrinth.com/plugin/AdvancedServerList), Hangar (https://hangar.papermc.io/Andre_601/AdvancedServerList) and Codeberg (https://codeberg.org/Andre601/AdvancedServerList).'
from_secret: mastodon_token
status: |-
#AdvancedServerList was updated to ${CI_COMMIT_TAG} and can be downloaded from #Modrinth, #Hangar and #Codeberg!
Modrinth - https://modrinth.com/plugin/advancedserverlist
Hangar - https://hangar.papermc.io/Andre_601/AdvancedServerList
Codeberg - https://codeberg.org/Andre601/AdvancedServerList
visibility: public
+8 -8
View File
@@ -1,28 +1,28 @@
when:
- branch: '${CI_REPO_DEFAULT_BRANCH}'
event: push
- event: push
branch: ${CI_REPO_DEFAULT_BRANCH}
path:
include: ['.woodpecker/publish_docs.yml', 'requirements.txt', 'mkdocs.yml', 'docs/**']
include: [".woodpecker/publish_docs.yml", "docs/**", "mkdocs.yml", "requirements.txt"]
variables:
setup_git: &setup_git
- apk add git
- git config --global user.email "github@andre601.ch"
- git config --global user.email "andre_601-bot@noreply.codeberg.org"
- git config --global user.name "ASL Docs Builder"
steps:
cloneTargetRepo:
- name: "Clone target Repository"
image: alpine:3.18.4
commands:
- chmod -R a+w .
- <<: *setup_git
- git clone -b pages https://codeberg.org/Andre601/asl-docs site
- git clone -b pages https://codeberg.org/Andre601/asl-docs.git site
- chmod -R a+w site
buildDocs:
- name: "Build Docs"
image: woodpeckerci/plugin-mkdocs:latest
settings:
pip_install_file: requirements.txt
commitAndPush:
- name: "Commit and Push"
image: alpine:3.18.4
secrets:
- bot_token
+2 -2
View File
@@ -88,8 +88,8 @@ You can disable this in the global bStats config file located in `/plugins/bstat
## Support
<a href="https://discord.gg/6dazXp6" target="_blank">
<img src="https://cdn.jsdelivr.net/gh/Andre601/devins-badges@13e0142/assets/compact-minimal/social/discord-singular_vector.svg" height="64" alt="discord" title="Join my Discord Server">
<a href="https://discord.gg/MyPTjpsgGH" target="_blank">
<img src="https://cdn.jsdelivr.net/gh/Andre601/devins-badges@13e0142/assets/compact-minimal/social/discord-singular_vector.svg" height="64" alt="discord" title="Join the M.O.S.S. Discord Server">
</a>
<a href="https://app.revolt.chat/invite/74TpERXA" target="_blank">
<img src="https://cdn.jsdelivr.net/gh/Andre601/devins-badges@13e0142/assets/compact-minimal/social/revolt-singular_vector.svg" height="64" alt="revolt" title="Join my Revolt Server">
+6
View File
@@ -102,6 +102,12 @@
<version>1.1.0-RC1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gitlab.ruany</groupId>
<artifactId>LiteBansAPI</artifactId>
<version>0.5.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ch.andre601.asl-api</groupId>
<artifactId>api</artifactId>
@@ -23,35 +23,48 @@
*
*/
package ch.andre601.advancedserverlist.banplugins.bungeecord;
package ch.andre601.advancedserverlist.banplugins;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.placeholders.AdvancedBanPlaceholders;
import ch.andre601.advancedserverlist.banplugins.placeholders.LibertyBansPlaceholders;
import ch.andre601.advancedserverlist.banplugins.placeholders.LiteBansPlaceholders;
import java.util.HashMap;
import java.util.Map;
public enum BungeeCordBanPlugins{
public enum BanPluginsList{
ADVANCED_BAN("AdvancedBan", new AdvancedBanPlaceholders()),
LIBERTY_BANS("LibertyBans", new LibertyBansPlaceholders());
ADVANCED_BAN("AdvancedBan", new AdvancedBanPlaceholders(), true, true, false),
LIBERTY_BANS("LibertyBans", new LibertyBansPlaceholders(), true, true, true),
LITE_BANS("LiteBans", new LiteBansPlaceholders(), true, true, true);
private final String plugin;
private final String name;
private final PlaceholderProvider placeholderProvider;
private final boolean paper, bungeecord, velocity;
BungeeCordBanPlugins(String plugin, PlaceholderProvider placeholderProvider){
this.plugin = plugin;
BanPluginsList(String name, PlaceholderProvider placeholderProvider, boolean paper, boolean bungeecord, boolean velocity){
this.name = name;
this.placeholderProvider = placeholderProvider;
this.paper = paper;
this.bungeecord = bungeecord;
this.velocity = velocity;
}
public static Map<String, PlaceholderProvider> getBanPlugins(){
Map<String, PlaceholderProvider> content = new HashMap<>();
for(BungeeCordBanPlugins bungeeCordBanPlugins : BungeeCordBanPlugins.values()){
content.put(bungeeCordBanPlugins.plugin, bungeeCordBanPlugins.placeholderProvider);
}
return content;
public String getName(){
return name;
}
public PlaceholderProvider getPlaceholderProvider(){
return placeholderProvider;
}
public boolean supportsPaper(){
return paper;
}
public boolean supportsBungeeCord(){
return bungeecord;
}
public boolean supportsVelocity(){
return velocity;
}
}
@@ -26,11 +26,9 @@
package ch.andre601.advancedserverlist.banplugins.bungeecord;
import ch.andre601.advancedserverlist.api.AdvancedServerListAPI;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.BanPluginsList;
import net.md_5.bungee.api.plugin.Plugin;
import java.util.Map;
public class BungeeCordBanPluginsAddon extends Plugin{
@Override
@@ -50,14 +48,16 @@ public class BungeeCordBanPluginsAddon extends Plugin{
private int loadPlaceholderProviders(){
int loaded = 0;
Map<String, PlaceholderProvider> banPlugins = BungeeCordBanPlugins.getBanPlugins();
AdvancedServerListAPI api = AdvancedServerListAPI.get();
for(Map.Entry<String, PlaceholderProvider> entry : banPlugins.entrySet()){
if(getProxy().getPluginManager().getPlugin(entry.getKey()) != null){
getLogger().info("Registering Placeholders for " + entry.getKey() + "...");
api.addPlaceholderProvider(entry.getValue());
getLogger().info("Placeholder successfully registered!");
for(BanPluginsList entry : BanPluginsList.values()){
if(!entry.supportsBungeeCord())
continue;
if(getProxy().getPluginManager().getPlugin(entry.getName()) != null){
getLogger().info("Registering Placeholders for " + entry.getName() + "...");
api.addPlaceholderProvider(entry.getPlaceholderProvider());
getLogger().info("Placeholders successfully registered!");
loaded++;
}
@@ -1,57 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.banplugins.paper;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.placeholders.AdvancedBanPlaceholders;
import ch.andre601.advancedserverlist.banplugins.placeholders.LibertyBansPlaceholders;
import java.util.HashMap;
import java.util.Map;
public enum PaperBanPlugins{
ADVANCED_BAN("AdvancedBan", new AdvancedBanPlaceholders()),
LIBERTY_BANS("LibertyBans", new LibertyBansPlaceholders());
private final String plugin;
private final PlaceholderProvider placeholderProvider;
PaperBanPlugins(String plugin, PlaceholderProvider placeholderProvider){
this.plugin = plugin;
this.placeholderProvider = placeholderProvider;
}
public static Map<String, PlaceholderProvider> getBanPlugins(){
Map<String, PlaceholderProvider> content = new HashMap<>();
for(PaperBanPlugins paperBanPlugins : PaperBanPlugins.values()){
content.put(paperBanPlugins.plugin, paperBanPlugins.placeholderProvider);
}
return content;
}
}
@@ -26,11 +26,9 @@
package ch.andre601.advancedserverlist.banplugins.paper;
import ch.andre601.advancedserverlist.api.AdvancedServerListAPI;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.BanPluginsList;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Map;
public class PaperBanPluginsAddon extends JavaPlugin{
@Override
@@ -53,14 +51,16 @@ public class PaperBanPluginsAddon extends JavaPlugin{
private int loadPlaceholderProviders(){
int loaded = 0;
Map<String, PlaceholderProvider> banPlugins = PaperBanPlugins.getBanPlugins();
AdvancedServerListAPI api = AdvancedServerListAPI.get();
for(Map.Entry<String, PlaceholderProvider> entry : banPlugins.entrySet()){
if(getServer().getPluginManager().isPluginEnabled(entry.getKey())){
getLogger().info("Registering Placeholders for " + entry.getKey() + "...");
api.addPlaceholderProvider(entry.getValue());
getLogger().info("Placeholder successfully registered!");
for(BanPluginsList entry : BanPluginsList.values()){
if(!entry.supportsPaper())
continue;
if(getServer().getPluginManager().isPluginEnabled(entry.getName())){
getLogger().info("Registering Placeholders for " + entry.getName() + "...");
api.addPlaceholderProvider(entry.getPlaceholderProvider());
getLogger().info("Placeholders successfully registered!");
loaded++;
}
@@ -32,7 +32,7 @@ import ch.andre601.advancedserverlist.banplugins.providers.AdvancedBanProvider;
public class AdvancedBanPlaceholders extends PlaceholderProvider{
private final AdvancedBanProvider provider = new AdvancedBanProvider();
private AdvancedBanProvider provider = null;
public AdvancedBanPlaceholders(){
super("advancedban");
@@ -40,6 +40,9 @@ public class AdvancedBanPlaceholders extends PlaceholderProvider{
@Override
public String parsePlaceholder(String placeholder, GenericPlayer player, GenericServer server){
if(provider == null)
provider = new AdvancedBanProvider();
String[] args = placeholder.split("\\s", 2);
return switch(args[0]) {
@@ -32,7 +32,7 @@ import ch.andre601.advancedserverlist.banplugins.providers.LibertyBansProvider;
public class LibertyBansPlaceholders extends PlaceholderProvider{
private final LibertyBansProvider provider = LibertyBansProvider.create();
private LibertyBansProvider provider = null;
public LibertyBansPlaceholders(){
super("libertybans");
@@ -40,6 +40,9 @@ public class LibertyBansPlaceholders extends PlaceholderProvider{
@Override
public String parsePlaceholder(String placeholder, GenericPlayer player, GenericServer server){
if(provider == null)
provider = LibertyBansProvider.create();
String[] args = placeholder.split("\\s", 2);
return switch(args[0]){
@@ -0,0 +1,85 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.banplugins.placeholders;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.advancedserverlist.banplugins.providers.LiteBansProvider;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
public class LiteBansPlaceholders extends PlaceholderProvider{
private LiteBansProvider provider = null;
public LiteBansPlaceholders(){
super("litebans");
}
@Override
public String parsePlaceholder(String placeholder, GenericPlayer player, GenericServer server){
if(provider == null)
provider = new LiteBansProvider();
String[] args = placeholder.split("\\s", 2);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() ->
switch(args[0]){
// Mute-related placeholders
case "isMuted" -> String.valueOf(provider.muted(player));
case "muteReason" -> provider.muteReason(player);
case "muteExpiration" -> {
if(args.length == 1)
yield provider.muteExpirationDate(player);
yield provider.muteExpirationDate(player, args[1]);
}
// Ban-related placeholders
case "isBanned" -> String.valueOf(provider.banned(player));
case "banReason" -> provider.banReason(player);
case "banExpiration" -> {
if(args.length == 1)
yield provider.banExpirationDate(player);
yield provider.banExpirationDate(player, args[1]);
}
//Unknown/Invalid placeholder
default -> null;
}
);
try{
return future.join();
}catch(CancellationException | CompletionException ex){
return null;
}
}
}
@@ -0,0 +1,103 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.banplugins.providers;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import litebans.api.Database;
import litebans.api.Entry;
public class LiteBansProvider implements PunishmentProvider{
@Override
public boolean muted(GenericPlayer player){
return Database.get().isPlayerMuted(player.getUUID(), null);
}
@Override
public boolean banned(GenericPlayer player){
return Database.get().isPlayerBanned(player.getUUID(), null);
}
@Override
public String muteReason(GenericPlayer player){
Entry mute = Database.get().getMute(player.getUUID(), null, null);
if(mute == null)
return null;
return mute.getReason();
}
@Override
public String banReason(GenericPlayer player){
Entry ban = Database.get().getBan(player.getUUID(), null, null);
if(ban == null)
return null;
return ban.getReason();
}
@Override
public String muteDuration(GenericPlayer player){
Entry mute = Database.get().getMute(player.getUUID(), null, null);
if(mute == null)
return null;
return mute.getDurationString();
}
@Override
public String banDuration(GenericPlayer player){
Entry ban = Database.get().getBan(player.getUUID(), null, null);
if(ban == null)
return null;
return ban.getDurationString();
}
@Override
public String muteExpirationDate(GenericPlayer player, String pattern){
Entry mute = Database.get().getMute(player.getUUID(), null, null);
if(mute == null)
return null;
if(mute.isPermanent())
return "never";
return this.returnDate(pattern, mute.getDateEnd());
}
@Override
public String banExpirationDate(GenericPlayer player, String pattern){
Entry ban = Database.get().getBan(player.getUUID(), null, null);
if(ban == null)
return null;
if(ban.isPermanent())
return "never";
return this.returnDate(pattern, ban.getDateEnd());
}
}
@@ -1,56 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.banplugins.velocity;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.paper.PaperBanPlugins;
import ch.andre601.advancedserverlist.banplugins.placeholders.LibertyBansPlaceholders;
import java.util.HashMap;
import java.util.Map;
public enum VelocityBanPlugins{
LIBERTY_BANS("libertybans", new LibertyBansPlaceholders());
private final String plugin;
private final PlaceholderProvider placeholderProvider;
VelocityBanPlugins(String plugin, PlaceholderProvider placeholderProvider){
this.plugin = plugin;
this.placeholderProvider = placeholderProvider;
}
public static Map<String, PlaceholderProvider> getBanPlugins(){
Map<String, PlaceholderProvider> content = new HashMap<>();
for(VelocityBanPlugins velocityBanPlugins : VelocityBanPlugins.values()){
content.put(velocityBanPlugins.plugin, velocityBanPlugins.placeholderProvider);
}
return content;
}
}
@@ -26,15 +26,15 @@
package ch.andre601.advancedserverlist.banplugins.velocity;
import ch.andre601.advancedserverlist.api.AdvancedServerListAPI;
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
import ch.andre601.advancedserverlist.banplugins.BanPluginsList;
import com.google.inject.Inject;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import net.md_5.bungee.api.ProxyServer;
import com.velocitypowered.api.proxy.ProxyServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.Locale;
public class VelocityBanPluginsAddon{
@@ -49,7 +49,7 @@ public class VelocityBanPluginsAddon{
@Subscribe
public void init(ProxyInitializeEvent event){
if(proxy.getPluginManager().getPlugin("advancedserverlist") == null){
if(!proxy.getPluginManager().isLoaded("advancedserverlist")){
logger.warn("AdvancedServerList is not enabled. This plugin requires it to function!");
return;
}
@@ -64,14 +64,16 @@ public class VelocityBanPluginsAddon{
private int loadPlaceholderProviders(){
int loaded = 0;
Map<String, PlaceholderProvider> banPlugins = VelocityBanPlugins.getBanPlugins();
AdvancedServerListAPI api = AdvancedServerListAPI.get();
for(Map.Entry<String, PlaceholderProvider> entry : banPlugins.entrySet()){
if(proxy.getPluginManager().getPlugin(entry.getKey()) != null){
logger.info("Registering placeholders for {}...", entry.getKey());
api.addPlaceholderProvider(entry.getValue());
logger.info("Placeholder successfully registered!");
for(BanPluginsList entry : BanPluginsList.values()){
if(!entry.supportsVelocity())
continue;
if(proxy.getPluginManager().isLoaded(entry.getName().toLowerCase(Locale.ROOT))){
logger.info("Registering Placeholders for " + entry.getName() + "...");
api.addPlaceholderProvider(entry.getPlaceholderProvider());
logger.info("Placeholders successfully registered!");
loaded++;
}
@@ -7,5 +7,6 @@ softDepends:
- AdvancedServerList
- AdvancedBan
- LibertyBans
- LiteBans
main: 'ch.andre601.advancedserverlist.banplugins.bungeecord.BungeeCordBanPluginsAddon'
@@ -15,5 +15,8 @@ dependencies:
required: false
load: BEFORE
LibertyBans:
required: false
load: BEFORE
LiteBans:
required: false
load: BEFORE
@@ -14,6 +14,10 @@
{
"id": "libertybans",
"optional": true
},
{
"id": "litebans",
"optional": true
}
],
"main": "ch.andre601.advancedserverlist.banplugins.velocity.VelocityBanPluginsAddon"
+26 -17
View File
@@ -49,6 +49,10 @@
<id>sonatype</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype-snapshots</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
@@ -85,20 +89,20 @@
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.16.0</version>
<scope>compile</scope>
<version>${dependency.adventure-api}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.16.0</version>
<scope>compile</scope>
<version>${dependency.adventure-text-minimessage}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bungeecord</artifactId>
<version>4.3.2</version>
<scope>compile</scope>
<version>${dependency.adventure-platform-bungeecord}</version>
<scope>provided</scope>
</dependency>
<!-- Metrics -->
@@ -113,8 +117,8 @@
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>configurate-yaml</artifactId>
<version>4.1.2</version>
<scope>compile</scope>
<version>${dependency.configurate-yaml}</version>
<scope>provided</scope>
</dependency>
<!-- Plugins -->
@@ -124,6 +128,14 @@
<version>2.9.0-4</version>
<scope>provided</scope>
</dependency>
<!-- Other -->
<dependency>
<groupId>com.alessiodp.libby</groupId>
<artifactId>libby-bungee</artifactId>
<version>2.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
@@ -143,28 +155,25 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>org.spongepowered.configurate</pattern>
<shadedPattern>ch.andre601.advancedserverlist.bungeecord.depends.configurate</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori</pattern>
<shadedPattern>ch.andre601.advancedserverlist.bungeecord.depends.kyori</shadedPattern>
</relocation>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>ch.andre601.advancedserverlist.bungeecord.depends.bstats</shadedPattern>
</relocation>
<relocation>
<pattern>net.byteflux.libby</pattern>
<shadedPattern>ch.andre601.advancedserverlist.bungeecord.depends.libby</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
@@ -35,7 +35,9 @@ import ch.andre601.advancedserverlist.core.AdvancedServerList;
import ch.andre601.advancedserverlist.core.interfaces.PluginLogger;
import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore;
import ch.andre601.advancedserverlist.core.profiles.favicon.FaviconHandler;
import com.alessiodp.libby.BungeeLibraryManager;
import de.myzelyam.api.vanish.BungeeVanishAPI;
import net.kyori.adventure.platform.bungeecord.BungeeAudiences;
import net.md_5.bungee.api.Favicon;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
@@ -50,12 +52,33 @@ import java.util.List;
public class BungeeCordCore extends Plugin implements PluginCore<Favicon>{
private boolean successfulLoad = false;
private AdvancedServerList<Favicon> core;
private FaviconHandler<Favicon> faviconHandler = null;
private BungeeAudiences audiences = null;
private final PluginLogger logger = new BungeeLogger(this);
@Override
public void onLoad(){
logger.info("Loading libraries. This may take a while...");
successfulLoad = loadLibs();
if(successfulLoad){
logger.info("Library loading completed successfully!");
}else{
logger.warn("Library loading completed with errors!");
}
}
@Override
public void onEnable(){
if(!successfulLoad){
logger.warn("There were issues during the plugins Loading-phase! Please see the console for possible reasons.");
logger.warn("The plugin won't be enabled to avoid problems.");
return;
}
this.audiences = BungeeAudiences.create(this);
this.core = AdvancedServerList.init(this, BungeePlayerPlaceholders.init(), BungeeServerPlaceholders.init(this));
}
@@ -134,11 +157,20 @@ public class BungeeCordCore extends Plugin implements PluginCore<Favicon>{
return "bungeecord";
}
@Override
public boolean isPluginEnabled(String plugin){
return getProxy().getPluginManager().getPlugin(plugin) != null;
}
@Override
public Favicon createFavicon(BufferedImage image) throws IllegalArgumentException{
return Favicon.create(image);
}
public BungeeAudiences getAudiences(){
return audiences;
}
public int getOnlinePlayers(ServerInfo server){
List<ProxiedPlayer> players = new ArrayList<>(server == null ? getProxy().getPlayers() : server.getPlayers());
@@ -149,4 +181,16 @@ public class BungeeCordCore extends Plugin implements PluginCore<Favicon>{
return players.size();
}
private boolean loadLibs(){
try{
BungeeLibraryManager libraryManager = new BungeeLibraryManager(this);
libraryManager.configureFromJSON("dependencies.json");
return true;
}catch(Exception ex){
logger.warn("Encountered an Exception while trying to load dependencies.", ex);
return false;
}
}
}
@@ -33,16 +33,14 @@ import net.md_5.bungee.api.plugin.Command;
public class CmdAdvancedServerList extends Command{
private final BungeeCordCore plugin;
private final BungeeAudiences audiences;
public CmdAdvancedServerList(BungeeCordCore plugin){
super("advancedserverlist", "advancedserverlist.command.asl", "asl");
this.plugin = plugin;
this.audiences = BungeeAudiences.create(plugin);
}
@Override
public void execute(CommandSender sender, String[] args){
plugin.getCore().getCommandHandler().handle(new BungeeCmdSender(sender, audiences), args);
plugin.getCore().getCommandHandler().handle(new BungeeCmdSender(sender, plugin.getAudiences()), args);
}
}
@@ -102,7 +102,7 @@ public class BungeeEventWrapper implements GenericEventWrapper<Favicon, BungeePl
String parsed = ComponentParser.text(lines.get(i))
.modifyText(text -> StringReplacer.replace(text, player, server))
.toString();
ServerPing.PlayerInfo pi = new ServerPing.PlayerInfo(parsed, UUID.randomUUID());
players[i] = pi;
}
@@ -26,6 +26,7 @@
package ch.andre601.advancedserverlist.bungeecord.listeners;
import ch.andre601.advancedserverlist.bungeecord.BungeeCordCore;
import ch.andre601.advancedserverlist.bungeecord.commands.BungeeCmdSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
@@ -34,7 +35,6 @@ import net.md_5.bungee.event.EventHandler;
import java.net.InetSocketAddress;
public class JoinEvent implements Listener{
private final BungeeCordCore plugin;
public JoinEvent(BungeeCordCore plugin){
@@ -48,5 +48,14 @@ public class JoinEvent implements Listener{
ProxiedPlayer player = event.getPlayer();
plugin.getCore().getPlayerHandler().addPlayer(address.getHostString(), player.getName(), player.getUniqueId());
if(player.hasPermission("advancedserverlist.admin") || player.hasPermission("advancedserverlist.updatecheck")){
if(plugin.getAudiences() == null || plugin.getCore().getUpdateChecker() == null)
return;
BungeeCmdSender sender = new BungeeCmdSender(player, plugin.getAudiences());
plugin.getCore().getUpdateChecker().performCachedUpdateCheck(sender);
}
}
}
+1
View File
@@ -6,5 +6,6 @@ description: '${plugin.description}'
softDepends:
- PAPIProxyBridge
- Maintenance
- ServerListPlus
main: 'ch.andre601.advancedserverlist.bungeecord.BungeeCordCore'
@@ -0,0 +1,31 @@
{
"repositories": [
"https://repo.papermc.io/repository/maven-public"
],
"libraries": [
{
"groupId": "net{}kyori",
"artifactId": "adventure-api",
"version": "${dependency.adventure-api}",
"resolveTransitiveDependencies": true
},
{
"groupId": "net{}kyori",
"artifactId": "adventure-text-minimessage",
"version": "${dependency.adventure-text-minimessage}",
"resolveTransitiveDependencies": true
},
{
"groupId": "net{}kyori",
"artifactId": "adventure-platform-bungeecord",
"version": "${dependency.adventure-platform-bungeecord}",
"resolveTransitiveDependencies": true
},
{
"groupId": "org{}spongepowered",
"artifactId": "configurate-yaml",
"version": "${dependency.configurate-yaml}",
"resolveTransitiveDependencies": true
}
]
}
+19 -8
View File
@@ -61,6 +61,10 @@
<id>codeberg</id>
<url>https://codeberg.org/api/packages/Andre601/maven/</url>
</repository>
<repository>
<id>codemc</id>
<url>https://repo.codemc.io/repository/maven-releases/</url>
</repository>
</repositories>
<dependencies>
@@ -73,13 +77,13 @@
<dependency>
<groupId>ch.andre601</groupId>
<artifactId>expressionparser</artifactId>
<version>1.3.0</version>
<version>1.4.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>configurate-yaml</artifactId>
<version>4.1.2</version>
<version>${dependency.configurate-yaml}</version>
<scope>provided</scope>
</dependency>
@@ -87,19 +91,19 @@
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.16.0</version>
<version>${dependency.adventure-api}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.16.0</version>
<version>${dependency.adventure-text-minimessage}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-legacy</artifactId>
<version>4.16.0</version>
<version>${dependency.adventure-text-serializer-legacy}</version>
<scope>provided</scope>
</dependency>
@@ -119,7 +123,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.1.0-jre</version>
<version>33.2.0-jre</version>
<scope>provided</scope>
</dependency>
@@ -127,7 +131,7 @@
<dependency>
<groupId>net.william278</groupId>
<artifactId>papiproxybridge</artifactId>
<version>1.5</version>
<version>1.6.1</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -136,6 +140,12 @@
<version>4.2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.minecrell</groupId>
<artifactId>ServerListPlus</artifactId>
<version>3.5.0</version>
<scope>provided</scope>
</dependency>
<!-- Test dependencies -->
<dependency>
@@ -163,7 +173,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<filters>
@@ -171,6 +181,7 @@
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
@@ -96,6 +96,10 @@ public class AdvancedServerList<F>{
return parser;
}
public UpdateChecker getUpdateChecker(){
return updateChecker;
}
public void disable(){
getPlugin().getPluginLogger().info("Saving playercache.json file...");
getPlayerHandler().save();
@@ -27,6 +27,8 @@ package ch.andre601.advancedserverlist.core.check;
import ch.andre601.advancedserverlist.core.AdvancedServerList;
import ch.andre601.advancedserverlist.core.interfaces.PluginLogger;
import ch.andre601.advancedserverlist.core.interfaces.commands.CmdSender;
import ch.andre601.advancedserverlist.core.objects.CacheUtil;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -40,6 +42,7 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
@@ -62,6 +65,8 @@ public class UpdateChecker{
private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new UpdateCheckThread());
private final CacheUtil<ModrinthVersion> cache = new CacheUtil<>(Duration.ofMinutes(5));
private final AdvancedServerList<?> core;
private final PluginLogger logger;
private final String loader;
@@ -74,6 +79,31 @@ public class UpdateChecker{
startUpdateChecker();
}
public void performCachedUpdateCheck(CmdSender sender){
ModrinthVersion version = cache.get(() -> {
try{
return performUpdateCheck().join();
}catch(Exception ex){
return null;
}
});
if(version == null)
return;
int result = version.compare(core.getVersion());
if(result == -1){
sender.sendPrefixedMsg("<green>A new version of AdvancedServerList is available!");
sender.sendPrefixedMsg("<green>Your version: <white>%s", core.getVersion());
sender.sendPrefixedMsg("<green>Modrinth: <white>%s", version.versionNumber());
sender.sendPrefixedMsg("<click:open_url:'https://modrinth.com/plugin/advancedserverlist/version/%s'><green>[<white>Download Page</white>]</click>", version.id());
}else
if(result == 1){
sender.sendPrefixedMsg("Your version (<white>%s</white>) seems newer than the latest release on Modrinth (<white>%s</white>)", core.getVersion(), version.versionNumber);
sender.sendPrefixedMsg("Are you running a dev-build?");
}
}
public void disable(){
executor.shutdown();
try{
@@ -144,22 +174,22 @@ public class UpdateChecker{
}
private void printUpdateBanner(ModrinthVersion version){
logger.info("==================================================================");
logger.info("You are running an outdated version of AdvancedServerList!");
logger.info("");
logger.info("Your version: %s", core.getVersion());
logger.info("Modrinth: %s", version.versionNumber());
logger.info("");
logger.warn("=======================================================================");
logger.warn("You are running an outdated version of AdvancedServerList!");
logger.warn("");
logger.warn("Your version: %s", core.getVersion());
logger.warn("Modrinth: %s", version.versionNumber());
logger.warn("");
if(!version.isRelease()){
logger.info("WARNING!");
logger.info("This is a %s version and may contain breaking changes and/or bugs!", version.versionType());
logger.info("");
logger.warn("WARNING!");
logger.warn("This is a %s version and may contain breaking changes and/or bugs!", version.versionType());
logger.warn("");
}
logger.info("Download the latest version from here:");
logger.info("https://modrinth.com/plugin/advancedserverlist/version/%s", version.id());
logger.info("==================================================================");
logger.warn("Download the latest version from here:");
logger.warn("https://modrinth.com/plugin/advancedserverlist/version/%s", version.id());
logger.warn("=======================================================================");
}
public record ModrinthVersion(String id, String versionNumber, String versionType){
@@ -171,10 +201,5 @@ public class UpdateChecker{
public int compare(String version){
return FlexVerComparator.compare(version, versionNumber());
}
@Override
public String toString(){
return String.format("ModrinthVersion{id=%s,versionNumber=%s,versionType=%s}", id, versionNumber, versionType);
}
}
}
@@ -28,18 +28,22 @@ package ch.andre601.advancedserverlist.core.commands;
import ch.andre601.advancedserverlist.core.AdvancedServerList;
import ch.andre601.advancedserverlist.core.interfaces.commands.CmdSender;
import ch.andre601.advancedserverlist.core.interfaces.commands.PluginCommand;
import ch.andre601.advancedserverlist.core.migration.serverlistplus.SLPConfigMigrator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommandHandler{
private final List<PluginCommand> subCommands = new ArrayList<>();
private final List<PluginCommand> subCommands;
public CommandHandler(AdvancedServerList<?> core){
subCommands.add(new Help());
subCommands.add(new Reload(core));
subCommands.add(new ClearCache(core));
subCommands = List.of(
new Help(),
new Reload(core),
new ClearCache(core),
new Migrate(core)
);
}
public void handle(CmdSender sender, String[] args){
@@ -58,7 +62,7 @@ public class CommandHandler{
return;
}
subCommand.handle(sender);
subCommand.handle(sender, Arrays.copyOfRange(args, 1, args.length));
return;
}
}
@@ -73,7 +77,7 @@ public class CommandHandler{
}
@Override
public void handle(CmdSender sender){
public void handle(CmdSender sender, String[] args){
sender.sendPrefixedMsg("- Commands");
sender.sendMsg();
sender.sendMsg("<aqua>/asl <white>help <grey>- Shows this help");
@@ -81,6 +85,8 @@ public class CommandHandler{
sender.sendMsg("<aqua>/asl <white>reload <grey>- Reloads the config.yml and profiles");
sender.sendMsg();
sender.sendMsg("<aqua>/asl <white>clearCache <grey>- Clears the Player and Favicon cache");
sender.sendMsg();
sender.sendMsg("<aqua>/asl <white>migrate <grey><</grey>plugin<grey>> - Migrates configuration of another plugin");
}
}
@@ -95,7 +101,7 @@ public class CommandHandler{
}
@Override
public void handle(CmdSender sender){
public void handle(CmdSender sender, String[] args){
sender.sendPrefixedMsg("Reloading plugin...");
if(core.getFileHandler().reloadConfig()){
@@ -125,7 +131,7 @@ public class CommandHandler{
}
@Override
public void handle(CmdSender sender){
public void handle(CmdSender sender, String[] args){
sender.sendPrefixedMsg("Clearing caches...");
core.clearFaviconCache();
@@ -137,4 +143,45 @@ public class CommandHandler{
sender.sendPrefixedMsg("<green>Cache clearing complete!");
}
}
private static class Migrate extends PluginCommand{
private final AdvancedServerList<?> core;
public Migrate(AdvancedServerList<?> core){
super("migrate");
this.core = core;
}
@Override
public void handle(CmdSender sender, String[] args){
if(args.length == 0){
sender.sendErrorMsg("<red>Insufficient arguments! Please provide a plugin to migrate from.");
sender.sendErrorMsg("<red>Available options:");
sender.sendErrorMsg(" - ServerListPlus");
return;
}
if(args[0].equalsIgnoreCase("serverlistplus")){
if(!core.getPlugin().isPluginEnabled("ServerListPlus")){
sender.sendErrorMsg("<red>Plugin ServerListPlus is not enabled.");
sender.sendErrorMsg("<red>It needs to be active for the migration to work!");
return;
}
sender.sendPrefixedMsg("Migrating ServerListPlus configuration file...");
int migrated = SLPConfigMigrator.migrate(core, sender);
if(migrated == 0){
sender.sendErrorMsg("<red>Unable to migrate any ServerListPlus configuration. Check console for details!");
}else{
sender.sendPrefixedMsg("<green>Migration complete!");
}
}else{
sender.sendErrorMsg("<red>Unknown plugin <grey>%s</grey>. Available Options:", args[0]);
sender.sendErrorMsg(" - ServerListPlus");
}
}
}
}
@@ -25,11 +25,13 @@
package ch.andre601.advancedserverlist.core.compat.papi;
import ch.andre601.advancedserverlist.core.objects.CacheUtil;
import net.william278.papiproxybridge.api.PlaceholderAPI;
import java.time.Duration;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
@@ -39,7 +41,7 @@ public class PAPIUtil{
private final PlaceholderAPI papi;
private final PAPICache cache = new PAPICache();
private final CacheUtil<String> cache = new CacheUtil<>(Duration.ofSeconds(5));
public PAPIUtil(){
this.papi = PlaceholderAPI.createInstance();
@@ -49,7 +51,7 @@ public class PAPIUtil{
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean isCompatible(){
try{
papi.getClass().getMethod("findServers");
papi.getClass().getMethod("getServers");
return true;
}catch(NoSuchMethodException ex){
return false;
@@ -59,8 +61,13 @@ public class PAPIUtil{
public String getServer(){
return cache.get(() -> {
List<String> servers;
try{
servers = papi.findServers().getNow(Collections.emptyList());
Set<String> value = papi.getServers().getNow(null);
if(value == null)
return null;
servers = List.copyOf(value);
}catch(CancellationException | CompletionException ex){
return null;
}
@@ -43,5 +43,5 @@ public abstract class PluginCommand{
return "advancedserverlist.command." + getArgument().toLowerCase(Locale.ROOT);
}
public abstract void handle(CmdSender sender);
public abstract void handle(CmdSender sender, String[] args);
}
@@ -58,6 +58,8 @@ public interface PluginCore<F>{
String getLoader();
boolean isPluginEnabled(String plugin);
F createFavicon(BufferedImage image) throws Exception;
default boolean isDebugEnabled(){
@@ -0,0 +1,460 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.core.migration.serverlistplus;
import ch.andre601.advancedserverlist.api.objects.NullBool;
import ch.andre601.advancedserverlist.api.profiles.ProfileEntry;
import ch.andre601.advancedserverlist.core.AdvancedServerList;
import ch.andre601.advancedserverlist.core.interfaces.PluginLogger;
import ch.andre601.advancedserverlist.core.interfaces.commands.CmdSender;
import ch.andre601.advancedserverlist.core.profiles.profile.ProfileSerializer;
import net.minecrell.serverlistplus.core.ServerListPlusCore;
import net.minecrell.serverlistplus.core.config.PersonalizedStatusConf;
import net.minecrell.serverlistplus.core.config.ServerStatusConf;
import net.minecrell.serverlistplus.core.util.BooleanOrList;
import net.minecrell.serverlistplus.core.util.IntegerRange;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.serialize.SerializationException;
import org.spongepowered.configurate.yaml.NodeStyle;
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SLPConfigMigrator{
private static final Pattern RGB_COLOR_PATTERN = Pattern.compile("&(?<color>#[a-fA-F0-9]{6})");
private static final Pattern COLOR_CODE_PATTERN = Pattern.compile("&(?<color>[abcdefklmnorABCDEFKLMNOR0123456789])");
private static final Pattern RGB_GRADIENT_PATTERN = Pattern.compile(
"%gradient" +
"(?<start>#[a-fA-F0-9]{6})" + // Starting color
"(?<end>#[a-fA-F0-9]{6})" + // Ending color
"%" +
"(?<text>.+?)" + // Text
"%gradient%");
private static final Map<String, String> STATIC_REPLACEMENTS = Map.of(
"%player%", "${player name}",
"%uuid%", "${player uuid}",
"%_uuid_%", "${player uuid}",
"%online%", "${server playersOnline}",
"%max%", "${server playersMax}");
public static int migrate(AdvancedServerList<?> core, CmdSender sender){
ServerListPlusCore slpCore = ServerListPlusCore.getInstance();
PluginLogger logger = core.getPlugin().getPluginLogger();
if(slpCore == null){
logger.warn("[Migrator - ServerListPlus] Cannot migrate ServerListPlus config. ServerListPlus is not active!");
return 0;
}
ServerStatusConf conf = slpCore.getConf(ServerStatusConf.class);
if(conf == null){
logger.warn("[Migrator - ServerListPlus] Cannot migrate ServerListPlus configuration. Received configuration was null.");
return 0;
}
PersonalizedStatusConf.StatusConf defConf = conf.Default;
PersonalizedStatusConf.StatusConf personalizedConf = conf.Personalized;
PersonalizedStatusConf.StatusConf banned = conf.Banned;
sender.sendPrefixedMsg("Migrating <white>Default</white>...");
int defConfParsed = parseConf(core, sender, defConf, Type.DEFAULT);
sender.sendPrefixedMsg("Migrating <white>Personalized</white>...");
int personalizedParsed = parseConf(core, sender, personalizedConf, Type.PERSONALIZED);
sender.sendPrefixedMsg("Migrating <white>Banned</white>...");
int bannedParsed = parseConf(core, sender, banned, Type.BANNED);
return defConfParsed + personalizedParsed + bannedParsed;
}
private static int parseConf(AdvancedServerList<?> core, CmdSender sender, PersonalizedStatusConf.StatusConf conf, Type type){
PluginLogger logger = core.getPlugin().getPluginLogger();
if(conf == null){
logger.info("[Migrator - ServerListPlus] No StatusConf found for type %s. Skipping...", type.getName());
sender.sendPrefixedMsg(" -> Not found! Skipping...");
return 0;
}
ProfileEntry.Builder builder = ProfileEntry.empty().builder();
List<ProfileEntry.Builder> profiles = new ArrayList<>();
List<List<String>> motds = resolveMotds(conf.Description);
List<String> favicons = resolveFavicons(conf.Favicon);
List<List<String>> hovers = resolveHover(conf.Players);
NullBool hidePlayers = conf.Players != null ? NullBool.resolve(conf.Players.Hidden) : NullBool.NOT_SET;
List<Integer> maxPlayers = resolveMaxPlayers(conf.Players);
List<String> playerCount = resolvePlayerCounts(conf.Players);
int size = getMaxListSize(motds, favicons, hovers, maxPlayers, playerCount);
// Only add profiles entries when there are more than 2 entries of an option.
// Avoids a profiles option with a single entry that has no options whatsoever.
if(size > 1){
for(int i = 0; i < size; i++){
profiles.add(ProfileEntry.empty().builder());
}
}
apply(motds, builder, profiles, ProfileEntry.Builder::motd);
apply(favicons, builder, profiles, ProfileEntry.Builder::favicon);
apply(hovers, builder, profiles, ProfileEntry.Builder::players);
apply(maxPlayers, builder, profiles, (build, count) -> build.maxPlayersEnabled(NullBool.TRUE).maxPlayersCount(count));
apply(playerCount, builder, profiles, ProfileEntry.Builder::playerCountText);
builder.hidePlayersEnabled(hidePlayers);
ProfileEntry entry = builder.build();
List<ProfileEntry> profileEntries = profiles.stream()
.map(ProfileEntry.Builder::build)
.toList();
if(entry.isInvalid() && profileEntries.isEmpty()){
logger.warn("[Migrator - ServerListPlus] Unable to parse ServerListPlus configuration of type %s. Generated ProfileEntry was invalid.", type.getName());
sender.sendErrorMsg(" -> <red>Received invalid Configuration.");
return 0;
}
Path profile = core.getPlugin().getFolderPath().resolve("profiles").resolve(type.getFile());
if(Files.exists(profile)){
logger.warn("[Migrator - ServerListPlus] Cannot create new file %s. One with the same name is already present", type.getFile());
sender.sendErrorMsg(" -> <red>File</red> %s <red>already present.", type.getFile());
return 0;
}
try{
Files.createFile(profile);
}catch(IOException ex){
logger.warn("[Migrator - ServerListPlus] Encountered an IOException while trying to create file %s.", ex, type.getFile());
sender.sendErrorMsg(" -> <red>File creation error.");
return 0;
}
YamlConfigurationLoader loader = YamlConfigurationLoader.builder()
.path(profile)
.indent(2)
.nodeStyle(NodeStyle.BLOCK)
.defaultOptions(opt -> opt.serializers(build -> build.register(ProfileEntry.class, ProfileSerializer.INSTANCE)))
.build();
ConfigurationNode node;
try{
node = loader.load();
}catch(IOException ex){
logger.warn("[Migrator - ServerListPlus] Encountered an IOException while trying to load file %s.", ex, type.getFile());
sender.sendErrorMsg(" -> <red>File loading error.");
return 0;
}
if(node == null){
logger.warn("[Migrator - ServerListPlus] Cannot migrate Configuration of type %s. ConfigurationNode was null.", type.getName());
sender.sendErrorMsg(" -> <red>File loading error.");
return 0;
}
try{
node.node("priority")
.set(type != Type.DEFAULT ? 1 : 0);
if(type == Type.PERSONALIZED){
node.node("condition")
.set("${player name} != \"" +
core.getFileHandler().getString("Anonymous", "unknownPlayer", "name") +
"\"");
}else
if(type == Type.BANNED){
node.node("condition")
.set("${player isBanned}");
}
if(!profiles.isEmpty()){
node.node("profiles").setList(ProfileEntry.class, profileEntries);
}
node.set(entry);
}catch(SerializationException ex){
logger.warn("Encountered a SerializationException while setting values.", ex);
sender.sendErrorMsg(" -> <red>Error while updating file</red> %s<red>.", type.getFile());
return 0;
}
try{
loader.save(node);
sender.sendPrefixedMsg(" -> <green>Completed!");
return 1;
}catch(IOException ex){
logger.warn("[Migrator - ServerListPlus] Encountered an IOException while trying to save new file %s.", ex, type.getFile());
sender.sendErrorMsg(" -> <red>File saving error.");
return 0;
}
}
private static int getMaxListSize(List<?>... lists){
int size = 0;
for(List<?> list : lists){
if(list.size() > size)
size = list.size();
}
return size;
}
private static List<List<String>> resolveMotds(List<String> descriptions){
if(descriptions == null || descriptions.isEmpty())
return Collections.emptyList();
List<List<String>> motds = new ArrayList<>();
for(String line : descriptions){
motds.add(getList(line));
}
return motds;
}
private static List<String> resolveFavicons(PersonalizedStatusConf.StatusConf.FaviconConf faviconConf){
if(faviconConf == null || faviconConf.Disabled != null && faviconConf.Disabled)
return Collections.emptyList();
List<String> list = new ArrayList<>();
if(faviconConf.Heads != null){
for(String head : faviconConf.Heads){
list.add(
"https://mc-heads.net/avatar/" +
replacePlaceholders(head) +
"/64/nohelm"
);
}
}
if(faviconConf.Helms != null){
for(String helm : faviconConf.Helms){
list.add(replacePlaceholders(helm));
}
}
if(faviconConf.Files != null){
for(String file : faviconConf.Files){
if(!file.toLowerCase(Locale.ROOT).endsWith(".png"))
continue;
list.add(replacePlaceholders(file));
}
}
return list;
}
private static List<List<String>> resolveHover(PersonalizedStatusConf.StatusConf.PlayersConf playersConf){
if(playersConf == null)
return Collections.emptyList();
BooleanOrList<String> booleanOrList = playersConf.Hover;
if(booleanOrList == null)
return Collections.emptyList();
if(booleanOrList.getList() != null){
List<List<String>> hovers = new ArrayList<>();
for(String line : booleanOrList.getList()){
if(line == null)
continue;
hovers.add(getList(line));
}
return hovers;
}
return Collections.emptyList();
}
private static List<Integer> resolveMaxPlayers(PersonalizedStatusConf.StatusConf.PlayersConf playersConf){
if(playersConf == null)
return Collections.emptyList();
List<IntegerRange> maxPlayers = playersConf.Max;
if(maxPlayers == null)
return Collections.emptyList();
List<Integer> values = new ArrayList<>();
for(IntegerRange range : maxPlayers){
if(range == null)
continue;
values.add(range.to());
}
return values;
}
private static List<String> resolvePlayerCounts(PersonalizedStatusConf.StatusConf.PlayersConf playersConf){
if(playersConf == null)
return Collections.emptyList();
if(playersConf.Slots == null)
return Collections.emptyList();
return playersConf.Slots.stream()
.map(SLPConfigMigrator::replacePlaceholders)
.toList();
}
private static <T> void apply(List<T> list, ProfileEntry.Builder builder, List<ProfileEntry.Builder> profiles,
BiConsumer<ProfileEntry.Builder, T> builderConsumer){
if(list.size() == 1){
builderConsumer.accept(builder, list.get(0));
}else
if(list.size() > 1){
for(int i = 0; i < list.size(); i++){
builderConsumer.accept(profiles.get(i), list.get(i));
}
}
}
private static List<String> getList(String line){
return Arrays.asList(replacePlaceholders(line).split("\n"));
}
private static String replacePlaceholders(String input){
StringBuilder parsed = new StringBuilder(input);
StringBuilder builder = new StringBuilder();
Matcher rgbColorMatcher = RGB_COLOR_PATTERN.matcher(parsed.toString());
if(rgbColorMatcher.find()){
do{
rgbColorMatcher.appendReplacement(builder, "<" + rgbColorMatcher.group("color") + ">");
}while(rgbColorMatcher.find());
rgbColorMatcher.appendTail(builder);
parsed = builder;
}
Matcher colorCodeMatcher = COLOR_CODE_PATTERN.matcher(parsed.toString());
if(colorCodeMatcher.find()){
builder.setLength(0);
do{
String color = colorCodeMatcher.group("color").toLowerCase(Locale.ROOT);
switch(color){
case "a" -> colorCodeMatcher.appendReplacement(builder, "<green>");
case "b" -> colorCodeMatcher.appendReplacement(builder, "<aqua>");
case "c" -> colorCodeMatcher.appendReplacement(builder, "<red>");
case "d" -> colorCodeMatcher.appendReplacement(builder, "<light_purple>");
case "e" -> colorCodeMatcher.appendReplacement(builder, "<yellow>");
case "f" -> colorCodeMatcher.appendReplacement(builder, "<white>");
case "k" -> colorCodeMatcher.appendReplacement(builder, "<obfuscated>");
case "l" -> colorCodeMatcher.appendReplacement(builder, "<bold>");
case "m" -> colorCodeMatcher.appendReplacement(builder, "<strikethrough>");
case "n" -> colorCodeMatcher.appendReplacement(builder, "<underlined>");
case "o" -> colorCodeMatcher.appendReplacement(builder, "<italic>");
case "r" -> colorCodeMatcher.appendReplacement(builder, "<reset>");
case "0" -> colorCodeMatcher.appendReplacement(builder, "<black>");
case "1" -> colorCodeMatcher.appendReplacement(builder, "<dark_blue>");
case "2" -> colorCodeMatcher.appendReplacement(builder, "<dark_green>");
case "3" -> colorCodeMatcher.appendReplacement(builder, "<dark_aqua>");
case "4" -> colorCodeMatcher.appendReplacement(builder, "<dark_red>");
case "5" -> colorCodeMatcher.appendReplacement(builder, "<dark_purple>");
case "6" -> colorCodeMatcher.appendReplacement(builder, "<gold>");
case "7" -> colorCodeMatcher.appendReplacement(builder, "<grey>");
case "8" -> colorCodeMatcher.appendReplacement(builder, "<dark_grey>");
case "9" -> colorCodeMatcher.appendReplacement(builder, "<blue>");
// This one shouldn't be reachable given the pattern, but you never know...
default -> colorCodeMatcher.appendReplacement(builder, "&" + color);
}
}while(colorCodeMatcher.find());
colorCodeMatcher.appendTail(builder);
parsed = builder;
}
Matcher rgbGradientMatcher = RGB_GRADIENT_PATTERN.matcher(parsed.toString());
if(rgbGradientMatcher.find()){
builder.setLength(0);
do{
String start = rgbGradientMatcher.group("start");
String end = rgbGradientMatcher.group("end");
String text = rgbGradientMatcher.group("text");
rgbGradientMatcher.appendReplacement(builder, "<gradient:" + start + ":" + end + ">" + text + "</gradient>");
}while(rgbGradientMatcher.find());
rgbGradientMatcher.appendTail(builder);
parsed = builder;
}
return replaceStaticPlaceholders(parsed);
}
private static String replaceStaticPlaceholders(StringBuilder input){
if(input.isEmpty())
return "";
for(Map.Entry<String, String> entry : STATIC_REPLACEMENTS.entrySet()){
int index = 0;
while((index = input.indexOf(entry.getKey(), index)) != -1){
input.replace(index, index + entry.getKey().length(), entry.getValue());
index += entry.getValue().length();
}
}
return input.toString();
}
private enum Type{
DEFAULT("Default", "slp_default.yml"),
PERSONALIZED("Personalized", "slp_personalized.yml"),
BANNED("Banned", "slp_banned.yml");
private final String name, file;
Type(String name, String file){
this.name = name;
this.file = file;
}
public String getName(){
return name;
}
public String getFile(){
return file;
}
}
}
@@ -1,7 +1,7 @@
/*
* MIT License
*
* Copyright (c) 2022-2023 Andre_601
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -23,27 +23,30 @@
*
*/
package ch.andre601.advancedserverlist.core.compat.papi;
package ch.andre601.advancedserverlist.core.objects;
import java.time.Duration;
import java.util.function.Supplier;
public class PAPICache{
public class CacheUtil<T>{
private CacheValue cache = null;
private final Duration duration;
private CacheValue<T> cache = null;
public PAPICache(){}
public String get(Supplier<String> supplier){
if(cache == null || cache.isExpired())
cache = new CacheValue(supplier.get(), System.currentTimeMillis());
return cache.server();
public CacheUtil(Duration duration){
this.duration = duration;
}
private record CacheValue(String server, long timestamp){
// Consider the cache expired if it is older than 5 seconds.
public boolean isExpired(){
return (timestamp < 0L) || System.currentTimeMillis() - timestamp >= 5000L;
public T get(Supplier<T> supplier){
if(cache == null || cache.expired())
cache = new CacheValue<>(System.currentTimeMillis(), duration, supplier.get());
return cache.value();
}
private record CacheValue<T>(long timestamp, Duration duration, T value){
public boolean expired(){
return (timestamp < 0L) || System.currentTimeMillis() - timestamp >= duration.toMillis();
}
}
}
@@ -31,7 +31,6 @@ import ch.andre601.advancedserverlist.api.profiles.ProfileEntry;
import ch.andre601.advancedserverlist.core.interfaces.PluginLogger;
import ch.andre601.advancedserverlist.core.profiles.conditions.ProfileConditionParser;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.templates.ExpressionTemplate;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.serialize.SerializationException;
@@ -47,7 +46,8 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
return true;
ParseWarnCollector collector = new ParseWarnCollector(condition);
ExpressionTemplate template = parser.compile(condition, player, server, collector);
boolean result = parser.evaluate(condition, player, server, collector);
if(collector.hasWarnings()){
logger.warn("Encountered %d Error(s) while parsing condition for file '%s':", collector.getWarnings().size(), file);
@@ -61,10 +61,7 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
}
}
if(template == null)
return false;
return template.returnBooleanExpression().evaluate();
return result;
}
public ProfileEntry getRandomProfile(){
@@ -123,6 +120,13 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
this.logger = logger;
}
public Builder(String filename, int priority, PluginLogger logger){
this.fileName = filename;
this.node = null;
this.priority = priority;
this.logger = logger;
}
public static Builder resolve(String fileName, ConfigurationNode node, PluginLogger logger){
return new Builder(fileName, node, logger)
.resolveCondition()
@@ -131,6 +135,9 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
}
private Builder resolveCondition(){
if(node == null)
throw new IllegalStateException("ConfigurationNode was null!");
String condition = node.node("condition").getString();
if(condition == null || condition.isEmpty())
return this;
@@ -140,6 +147,9 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
}
private Builder resolveProfiles(){
if(node == null)
throw new IllegalStateException("ConfigurationNode was null!");
try{
this.profiles = node.node("profiles").getList(ProfileEntry.class);
}catch(SerializationException ex){
@@ -150,6 +160,9 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
}
private Builder resolveDefaultProfile(){
if(node == null)
throw new IllegalStateException("ConfigurationNode was null!");
try{
this.defaultProfile = node.get(ProfileEntry.class);
}catch(SerializationException ex){
@@ -60,8 +60,12 @@ public class ProfileConditionParser implements ExpressionParserEngine{
.build();
}
public ExpressionTemplate compile(String text, GenericPlayer player, GenericServer server, ParseWarnCollector collector){
return parser.parse(tokenizer.parse(text, player, server, collector), collector);
public boolean evaluate(String text, GenericPlayer player, GenericServer server, ParseWarnCollector collector){
ExpressionTemplate result = parser.parse(tokenizer.parse(text, player, server, collector), collector);
if(result == null)
return false;
return result.returnBooleanExpression().evaluate();
}
@Override
+47 -25
View File
@@ -3,86 +3,108 @@
#
unknownPlayer:
#
# The name to use. Defaults to Anonymous.
# The name to use.
#
# Default: Anonymous
#
name: "Anonymous"
#
# The UUID to use. Defaults to 606e2ff0-ed77-4842-9d6c-e1d3321c7838 (UUID of MHF_Question).
# The UUID to use.
#
# Default: 606e2ff0-ed77-4842-9d6c-e1d3321c7838 (UUID of MHF_Question).
#
uuid: "606e2ff0-ed77-4842-9d6c-e1d3321c7838"
#
# Should the Caching of players be disabled?
#
# When set to true will AdvancedServerList not load any players from the cache.data file (if present) nor save any to it.
# Placeholders that rely on the player being cached (such as ${player name}) will not work while this option is enabled.
# When set to true will no player joining the server be cached and saved to the playercache.json file.
# This will also cause placeholders using a cached player such as ${player name} to no longer work.
#
# Defaults to false when not present.
# Default: false
#
disableCache: false
#
# Should AdvancedServerList check for new versions?
#
# When set to true will AdvancedServerList check for a new version on modrinth.com every 12 hours and inform you in the
# console about whether it found any new update or not.
# When set to true will AdvancedServerList look for a new update on startup and repeat that check
# every 12 hours after that.
# It uses Modrinth to check for updates.
#
# Defaults to false when not present.
# Default: true
#
checkUpdates: true
#
# Should debug mode be enabled?
#
# When set to true will AdvancedServerList print additional messages to the console prefixed with "[DEBUG]".
# It is recommended to only enable this when having problems or when being told to by the plugin dev, as it could
# otherwise cause significant spam in your console.
# Additional messages prefixed with [DEBUG] will be printed in the console when this option is set
# to true.
# Enabling this option is only recommended for when you have problems, or have been told to enable
# it by the plugin developer, as it can otherwise spam your console.
#
# Defaults to false when not present.
# Default: false
#
debug: false
#
# Sets the time in minutes for favicons to be cached.
# The number cannot be less than 1.
# Sets how long Favicons should be cached. Value is in minutes with the lowest possible value being 1.
#
# Defaults to 1 if not set.
# This option only affects dynamic favicons created from a placeholder or URL. Local favicons will
# not be affected.
#
# Default: 1
#
faviconCacheTime: 1
#
# List of options that should be disabled while the Maintenance Mode of the plugin Maintenance is active.
# Any option not listed here will NOT be disabled, meaning AdvancedServerList will continue to handle it.
# Options to disable while the Maintenance Plugin is present and Maintenance Mode is active.
#
# Each option defaults to true when not present, disabling said option while Maintenance is active.
# Should an option be removed from this section will AdvancedServerList continue to set it, as if
# the Maintenance plugin isn't active.
#
disableDuringMaintenance:
#
# When true (Default), disables handling of MOTD while Maintenance is enabled.
# Whether MOTD changing should be disabled while Maintenance mode is active.
#
# Default: true
#
motd: true
#
# When true (Default), disables handling of Favicon while Maintenance is enabled.
# Whether favicon changing should be disabled while Maintenance mode is active.
#
# Default: true
#
favicon: true
#
# When true (Default), disables hiding of player count while Maintenance is enabled.
# Whether player hiding should be disabled while Maintenance mode is active.
#
# Default: true
#
hidePlayers: true
#
# When true (Default), disables handling of player count text while Maintenance is enabled.
# Whether player count text changing should be disabled while Maintenance mode is active.
#
# Default: true
#
playerCountText: true
#
# When true (Default), disables handling of player count hover while Maintenance is enabled.
# Whether player count hover changing should be disabled while Maintenance mode is active.
#
# Default: true
#
playerCountHover: true
#
# When true (Default), disables use of extra players feature while Maintenance is enabled.
# Whether the extra players feature should be disabled while Maintenance mode is active.
#
# Default: true
#
extraPlayers: true
#
# When true (Default), disables use of max players feature while Maintenance is enabled.
# Whether the max players feature should be disabled while Maintenance mode is active.
#
# Default: true
#
maxPlayers: true
@@ -27,7 +27,6 @@ package ch.andre601.advancedserverlist.test;
import ch.andre601.advancedserverlist.core.profiles.conditions.ProfileConditionParser;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.templates.ExpressionTemplate;
import org.junit.jupiter.api.Test;
import java.util.Map;
@@ -46,15 +45,9 @@ public class ExpressionParserTests{
logger.info("TEST[expression=\"%s\", expected=%b]", values.getKey(), values.getValue());
ParseWarnCollector collector = new ParseWarnCollector(values.getKey());
ExpressionTemplate template = parser.compile(values.getKey(), null, null, collector);
boolean result;
if(template == null){
result = false;
}else{
result = template.returnBooleanExpression().evaluate();
}
boolean result = parser.evaluate(values.getKey(), null, null, collector);
logger.info("Result (output, isExpected): " + result + ", " + (result == values.getValue()));
logger.info("Result (Output, Expected?): %b, %b", result, (result == values.getValue()));
assertEquals(result, values.getValue());
}
}
+102 -43
View File
@@ -4,55 +4,34 @@ The BanPlugins Addon was made to provide placeholders for different punishment p
## Placeholders
### AdvancedBan
/// tab | AdvancedBan
[Plugin Page](https://www.spigotmc.org/resources/8695/){ target="_blank" rel="nofollow" }
Placeholders for the plugin [AdvancedBan](https://www.spigotmc.org/resources/8695/){ target="_blank" rel="nofollow" } are available to use.
**Supported Platforms:**
| Placeholder | Description |
|---------------------------------|-------------------------------------------------------------------------------------------|
| `${advancedban isMuted}` | Whether the player is muted or not. |
| `${advancedban muteReason}` | The reason for why the player was muted. Returns invalid placeholder if no mute was set. |
| `${advancedban muteDuration}` | Relative time until the mute expires.[^1] Returns invalid placeholder if no mute was set. |
| `${advancedban muteExpiration}` | Date on when the mute will expire.[^2] |
| `${advancedban isBanned}` | Whether the player is banned or not. |
| `${advancedban banReason}` | The reason for why the player was banned. Returns invalid placeholder if no ban was set. |
| `${advancedban banDuration}` | Relative time until the ban expires.[^3] Returns invalid placeholder if no ban was set. |
| `${advancedban banExpiration}` | Date on when the ban will expire.[^4] |
[^1]:
An optional boolean can be added to set whether the duration should be from the start or not. `false` is the default.
Example: `${advancedban muteDuration true}`
[^2]:
An optional Date and time Pattern can be set to change the displayed output. The default is `dd, MMM yyyy HH:mm:ss`.
Example: `${advancedban muteExpiration yyyy-MM-dd HH:mm:ss}`
[^3]:
An optional boolean can be added to set whether the duration should be from the start or not. `false` is the default.
Example: `${advancedban banDuration true}`
[^4]:
An optional Date and time Pattern can be set to change the displayed output. The default is `dd, MMM yyyy HH:mm:ss`.
Example: `${advancedban banExpiration yyyy-MM-dd HH:mm:ss}`
### LibertyBans
Placeholders for the plugin [LibertyBans](https://modrinth.com/plugin/libertybans/){ target="_blank" rel="nofollow" } are available to use.
- :fontawesome-solid-paper-plane: Paper
- :simple-spigotmc: BungeeCord
| Placeholder | Description |
|---------------------------------|------------------------------------------------------------------------------------------|
| `${libertybans isMuted}` | Whether the player is muted or not. |
| `${libertybans muteReason}` | The reason for why the player was muted. Returns invalid placeholder if no mute was set. |
| `${libertybans muteExpiration}` | Date on when the mute will expire.[^5] |
| `${libertybans isBanned}` | Whether the player is banned or not. |
| `${libertybans banReason}` | The reason for why the player was banned. Returns invalid placeholder if no ban was set. |
| `${libertybans banExpiration}` | Date on when the ban will expire.[^6] |
| `${advancedban isMuted}` | Whether the player is muted or not. |
| `${advancedban muteReason}` | The reason for why the player was muted. Returns invalid placeholder if no mute was set. |
| `${advancedban muteDuration}` | Relative time until the mute expires. Returns invalid placeholder if no mute was set. |
| `${advancedban muteExpiration}` | Date on when the mute will expire- |
| `${advancedban isBanned}` | Whether the player is banned or not. |
| `${advancedban banReason}` | The reason for why the player was banned. Returns invalid placeholder if no ban was set. |
| `${advancedban banDuration}` | Relative time until the ban expires. Returns invalid placeholder if no ban was set. |
| `${advancedban banExpiration}` | Date on when the ban will expire. |
[^5]:
An optional Date and time Pattern can be set to change the displayed output. The default is `dd, MMM yyyy HH:mm:ss`.
Example: `${libertybans muteExpiration yyyy-MM-dd HH:mm:ss}`
[^6]:
An optional Date and time Pattern can be set to change the displayed output. The default is `dd, MMM yyyy HH:mm:ss`.
Example: `${libertybans banExpiration yyyy-MM-dd HH:mm:ss}`
//// note | Notes
- `${advancedban muteDuration}` and `${advancedban banDuration}` accept an optional boolean to set, whether the mute/ban duration should be from the start.
Default is `false`.
- `${advancedban muteExpiration}` and `${advancedban banExpiration}` accept an optional Date and Time pattern to format the time into.
Default is `dd, MMM yyyy HH:mm:ss`.
////
## Example
//// details | Example
type: example
```yaml title="banned.yml"
priority: 1
@@ -61,4 +40,84 @@ condition: '${advancedban isBanned}'
motd:
- '<red>You were <bold>BANNED</bold>!'
- '<red>Expires: <grey>${advancedban banExpiration}'
```
```
////
///
/// tab | LibertyBans
[Plugin Page](https://modrinth.com/plugin/libertybans/){ target="_blank" rel="nofollow" }
**Supported Platforms:**
- :fontawesome-solid-paper-plane: Paper
- :simple-spigotmc: BungeeCord
- :fontawesome-solid-paper-plane: Velocity
| Placeholder | Description |
|---------------------------------|------------------------------------------------------------------------------------------|
| `${libertybans isMuted}` | Whether the player is muted or not. |
| `${libertybans muteReason}` | The reason for why the player was muted. Returns invalid placeholder if no mute was set. |
| `${libertybans muteExpiration}` | Date on when the mute will expire. |
| `${libertybans isBanned}` | Whether the player is banned or not. |
| `${libertybans banReason}` | The reason for why the player was banned. Returns invalid placeholder if no ban was set. |
| `${libertybans banExpiration}` | Date on when the ban will expire. |
//// note | Notes
- `${libertybans muteExpiration}` and `${libertybans banExpiration}` accept an optional Date and Time pattern to format the time into.
Default is `dd, MMM yyyy HH:mm:ss`.
////
//// details | Example
type: example
```yaml title="banned.yml"
priority: 1
condition: '${libertybans isBanned}'
motd:
- '<red>You were <bold>BANNED</bold>!'
- '<red>Expires: <grey>${libertybans banExpiration}'
```
////
///
/// tab | LiteBans
[Plugin Page](https://www.spigotmc.org/resources/3715/){ target="_blank" rel="nofollow" }
**Supported Platforms:**
- :fontawesome-solid-paper-plane: Paper
- :simple-spigotmc: BungeeCord
- :fontawesome-solid-paper-plane: Velocity
| Placeholder | Description |
|------------------------------|------------------------------------------------------------------------------------------|
| `${litebans isMuted}` | Whether the player is muted or not. |
| `${litebans muteReason}` | The reason for why the player was muted. Returns invalid placeholder if no mute was set. |
| `${litebans muteDuration}` | Relative time until the mute expires. Returns invalid placeholder if no mute was set. |
| `${litebans muteExpiration}` | Date on when the mute will expire- |
| `${litebans isBanned}` | Whether the player is banned or not. |
| `${litebans banReason}` | The reason for why the player was banned. Returns invalid placeholder if no ban was set. |
| `${litebans banDuration}` | Relative time until the ban expires. Returns invalid placeholder if no ban was set. |
| `${litebans banExpiration}` | Date on when the ban will expire. |
//// note | Notes
- `${litebans muteExpiration}` and `${litebans banExpiration}` accept an optional Date and Time pattern to format the time into.
Default is `dd, MMM yyyy HH:mm:ss`.
////
//// details | Example
type: example
```yaml title="banned.yml"
priority: 1
condition: '${litebans isBanned}'
motd:
- '<red>You were <bold>BANNED</bold>!'
- '<red>Expires: <grey>${litebans banExpiration}'
```
////
///
+14
View File
@@ -18,6 +18,7 @@ The following subcommands are available (Subcommands are case-insensitive):
- [`help`](#help)
- [`reload`](#reload)
- [`clearCache`](#clearcache)
- [`migrate <plugin>`](#migrate)
### help
@@ -41,4 +42,17 @@ Reloads the plugin's `config.yml` and all available YAML files in the `profiles`
**Permission:** `advancedserverlist.command.clearcache`
Clears the currently cached favicons and players.
///
### migrate &lt;plugin&gt; { #migrate }
/// info |
**Permission:** `advancedserverlist.command.migrate`
**Arguments:
- `<plugin>` - The plugin to migrate from.
Migrates files from one plugin over to AdvancedServerList.
Check the [Migration Page](../migration/index.md) for a list of supported plugins.
///
+1 -1
View File
@@ -10,7 +10,7 @@ icon: octicons/list-unordered-24
This page lists some examples you may want to use for your proxy or server.
Feel free to suggest additional examples on my [Discord Server](https://discord.gg/6dazXp6) in the `#advancedserverlist` channel.
Feel free to suggest additional examples in the `advancedserverlist` category on the [M.O.S.S. Discord Server](https://discord.gg/MyPTjpsgGH){ target="_blank" rel="nofollow" }.
## Table of Contents
+48 -26
View File
@@ -5,7 +5,7 @@ icon: octicons/milestone-24
# Getting Started
This page will explain how to set up AdvancedServerList and make it work for your server.
It tries to be as easy to understand as possible. But if you still have problems, consider joining the [Discord Server](https://discord.gg/6dazXp6){ target="_blank" rel="nofollow" } for help.
The guide is designed to be as easy to understand as possible. If you still have problems or questions, join the [M.O.S.S Discord Server](https://discord.gg/MyPTjpsgGH){ target="_blank" rel="nofollow" } for more help.
## 1. Download the plugin { #download-the-plugin }
@@ -352,86 +352,108 @@ Note that the config can get migrated to newer versions, adding missing options
#
unknownPlayer:
#
# The name to use. Defaults to Anonymous.
# The name to use.
#
# Default: Anonymous
#
name: "Anonymous"
#
# The UUID to use. Defaults to 606e2ff0-ed77-4842-9d6c-e1d3321c7838 (UUID of MHF_Question).
# The UUID to use.
#
# Default: 606e2ff0-ed77-4842-9d6c-e1d3321c7838 (UUID of MHF_Question).
#
uuid: "606e2ff0-ed77-4842-9d6c-e1d3321c7838"
#
# Should the Caching of players be disabled?
#
# When set to true will AdvancedServerList not load any players from the cache.data file (if present) nor save any to it.
# Placeholders that rely on the player being cached (such as ${player name}) will not work while this option is enabled.
# When set to true will no player joining the server be cached and saved to the playercache.json file.
# This will also cause placeholders using a cached player such as ${player name} to no longer work.
#
# Defaults to false when not present.
# Default: false
#
disableCache: false
#
# Should AdvancedServerList check for new versions?
#
# When set to true will AdvancedServerList check for a new version on modrinth.com every 12 hours and inform you in the
# console about whether it found any new update or not.
# When set to true will AdvancedServerList look for a new update on startup and repeat that check
# every 12 hours after that.
# It uses Modrinth to check for updates.
#
# Defaults to false when not present.
# Default: true
#
checkUpdates: true
#
# Should debug mode be enabled?
#
# When set to true will AdvancedServerList print additional messages to the console prefixed with "[DEBUG]".
# It is recommended to only enable this when having problems or when being told to by the plugin dev, as it could
# otherwise cause significant spam in your console.
# Additional messages prefixed with [DEBUG] will be printed in the console when this option is set
# to true.
# Enabling this option is only recommended for when you have problems, or have been told to enable
# it by the plugin developer, as it can otherwise spam your console.
#
# Defaults to false when not present.
# Default: false
#
debug: false
#
# Sets the time in minutes for favicons to be cached.
# The number cannot be less than 1.
# Sets how long Favicons should be cached. Value is in minutes with the lowest possible value being 1.
#
# Defaults to 1 if not set.
# This option only affects dynamic favicons created from a placeholder or URL. Local favicons will
# not be affected.
#
# Default: 1
#
faviconCacheTime: 1
#
# List of options that should be disabled while the Maintenance Mode of the plugin Maintenance is active.
# Any option not listed here will NOT be disabled, meaning AdvancedServerList will continue to handle it.
# Options to disable while the Maintenance Plugin is present and Maintenance Mode is active.
#
# Each option defaults to true when not present, disabling said option while Maintenance is active.
# Should an option be removed from this section will AdvancedServerList continue to set it, as if
# the Maintenance plugin isn't active.
#
disableDuringMaintenance:
#
# When true (Default), disables handling of MOTD while Maintenance is enabled.
# Whether MOTD changing should be disabled while Maintenance mode is active.
#
# Default: true
#
motd: true
#
# When true (Default), disables handling of Favicon while Maintenance is enabled.
# Whether favicon changing should be disabled while Maintenance mode is active.
#
# Default: true
#
favicon: true
#
# When true (Default), disables hiding of player count while Maintenance is enabled.
# Whether player hiding should be disabled while Maintenance mode is active.
#
# Default: true
#
hidePlayers: true
#
# When true (Default), disables handling of player count text while Maintenance is enabled.
# Whether player count text changing should be disabled while Maintenance mode is active.
#
# Default: true
#
playerCountText: true
#
# When true (Default), disables handling of player count hover while Maintenance is enabled.
# Whether player count hover changing should be disabled while Maintenance mode is active.
#
# Default: true
#
playerCountHover: true
#
# When true (Default), disables use of extra players feature while Maintenance is enabled.
# Whether the extra players feature should be disabled while Maintenance mode is active.
#
# Default: true
#
extraPlayers: true
#
# When true (Default), disables use of max players feature while Maintenance is enabled.
# Whether the max players feature should be disabled while Maintenance mode is active.
#
# Default: true
#
maxPlayers: true
+17 -3
View File
@@ -4,11 +4,25 @@ icon: octicons/file-directory-symlink-24
# Migration
This page lists all migration guides for specific AdvancedServerList versions.
## Other Plugins
Note that these pages only cover server list profile files. The config.yml is automatically being migrated (Feature since v3.1.0).
The below pages show guides on how to migrate from another plugin to AdvancedServerList.
These pages may include important information about the migration process and what you may have to do before, during or after the process.
## Pages
<div class="grid cards" markdown>
- [**ServerListPlus**](serverlistplus.md)
----
Migrate from the Plugin [ServerListPlus](https://github.com/Minecrell/ServerListPlus).
</div>
## AdvancedServerList
The below pages show guides on how to migrate from one version to another of AdvancedServerList.
These guides are only for the Server List Profile files, as the config.yml gets automatically migrated (Feature since v3.1.0).
<div class="grid cards" markdown>
+282
View File
@@ -0,0 +1,282 @@
---
icon: octicons/arrow-right-24
---
# ServerListPlus
Version `v4.8.0-b1` added support for migrating your existing `ServerListPlus.yml` configuration to AdvancedServerList.
## Important notes
Migration requires that ServerListPlus is present and running on the server.
This is due to AdvancedServerList using the internal API of ServerListPlus to retrieve the Configuration used.
## Conversions
Specific values within the ServerListPlus configuration will be converted into equivalents supported by AdvancedServerList.
### Placeholders
The following placeholders get converted:
| Placeholder | Conversion |
|-------------------------|-----------------------------------------------------------------------------------|
| `%player%` | `${player name}` |
| `%uuid%` and `%_uuid_%` | `${player uuid}` |
| `%online%` | `${server playersOnline}` |
| `%max%` | `${server playersMax}` |
### Colors/Formatting
The following color and formatting codes get converted[^1]:
| Color/Formatting code | Conversion |
|--------------------------------------------|-------------------------------------------------------------------------------|
| `&<color/format>` | Corresponding color/formatting code in MiniMessage (i.e. `&1 -> <dark_blue>`) |
| `&#<hexcode>` | `<#<hexcode>>` |
| `%gradient#<start>#<end>%<text>%gradient%` | `<gradient:#<start>:#<end>><text></gradient>` |
### Favicon options
The following Favicon options get converted into an equivalent one:
| Option | Conversion |
|---------|---------------------------------------------------------------------------------|
| `Heads` | `https://mc-heads.net/avatar/<entry>/64/nohelm` |
| `Helms` | Returned as-is with [placeholders replaced](#placeholders). |
| `Files` | Only `.png` files will be included with [placeholders replaced](#placeholders). |
## How to Migrate
Execute the command [`/asl migrate serverlistplus`](../commands/index.md#migrate) to start the migration process. Make sure that ServerListPlus is present and enabled.
## Example
Below can you find a full example of a ServerListPlus.yml file and the corresponding migrated files from AdvancedServerList:
/// tab | :octicons-file-code-24: ServerListPlus.yml
```yaml
--- !Status
Default:
Description:
- |-
&aA Minecraft Server.
&7Now with [&a&lPvP&7], [&a&lMinigames&7], and much more!
- |-
&aA Minecraft Server.
&eNow running the latest &lMinecraft &eversion!
- |-
&a&#45bf55A Minecraft &#0288d1Server.
&e%gradient#ffbe00#f4511e%Now with RGB colors. Nice!%gradient%
Players:
Hover:
- |-
&aWelcome to &lA Minecraft Server&a!
&aCurrently &e&l%online%/%max% &aplayers are playing on our server!
Personalized:
Description:
- |-
&aA Minecraft Server. &7| &eHello, &l%player%!
&7Now with [&a&lPvP&7], [&a&lMinigames&7], and much more!
- |-
&aA Minecraft Server. &7| &eHello, &l%player%!
&eNow running the latest &lMinecraft &eversion!
- |-
&a&#45bf55A Minecraft &#0288d1Server.
&e%gradient#ffbe00#f4511e%Now with RGB colors. Hello %player%!%gradient%
Players:
Hover:
- |-
&aWelcome back, &l%player%&a!
&aCurrently &e&l%online%/%max% &aplayers are playing on our server!
Favicon:
Files:
- favicon1.png
- favicon2.png
Banned:
Description:
- |-
&cYou are &4&lBANNED!
&cGo away!
Players:
Hidden: true
--- !Plugin
PlayerTracking:
Enabled: true
Storage: !JSONStorage
Enabled: true
SaveDelay: 5m
StripRGBIfOutdated: true
Unknown:
PlayerName: player
PlayerCount: ???
Date: ???
BanReason: some reason
BanOperator: somebody
BanExpirationDate: never
Favicon:
Timeout: 10s
RecursiveFolderSearch: true
ResizeStrategy: SCALE
--- !Bukkit
ProtocolLib: DISABLE
```
///
/// tab | :octicons-file-code-24: slp_default.yml
```yaml
priority: 0
profiles:
- motd:
- <green>A Minecraft Server.
- <grey>Now with [<green><bold>PvP<grey>], [<green><bold>Minigames<grey>], and much
more!
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
- motd:
- <green>A Minecraft Server.
- <yellow>Now running the latest <bold>Minecraft <yellow>version!
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
- motd:
- <green><#45bf55>A Minecraft <#0288d1>Server.
- <yellow><gradient:#ffbe00:#f4511e>Now with RGB colors. Nice!</gradient>
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
motd: []
playerCount:
hover:
- <green>Welcome to <bold>A Minecraft Server<green>!
- <green>Currently <yellow><bold>${server playersOnline}/${server playersMax} <green>players
are playing on our server!
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
```
///
/// tab | :octicons-file-code-24: slp_personalized.yml
```yaml
priority: 1
condition: ${player name} != "Someone"
profiles:
- motd:
- <green>A Minecraft Server. <grey>| <yellow>Hello, <bold>${player name}!
- <grey>Now with [<green><bold>PvP<grey>], [<green><bold>Minigames<grey>], and much
more!
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: favicon1.png
- motd:
- <green>A Minecraft Server. <grey>| <yellow>Hello, <bold>${player name}!
- <yellow>Now running the latest <bold>Minecraft <yellow>version!
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: favicon2.png
- motd:
- <green><#45bf55>A Minecraft <#0288d1>Server.
- <yellow><gradient:#ffbe00:#f4511e>Now with RGB colors. Hello ${player name}!</gradient>
playerCount:
hover: []
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
motd: []
playerCount:
hover:
- <green>Welcome back, <bold>${player name}<green>!
- <green>Currently <yellow><bold>${server playersOnline}/${server playersMax} <green>players
are playing on our server!
text: ''
hidePlayers: false
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
```
///
/// tab | :octicons-file-code-24: slp_banned.yml
```yaml
priority: 1
condition: ${player isBanned}
motd:
- <red>You are <dark_red><bold>BANNED!
- <red>Go away!
playerCount:
hover: []
text: ''
hidePlayers: true
extraPlayers:
enabled: false
amount: 0
maxPlayers:
enabled: false
amount: 0
favicon: ''
```
///
[^1]:
Converting of color and formatting codes is done lazely and without context.
This means that a text such as `&aHello &l%player%&a!` gets converted into `<aqua>Hello <bold>${player name}<aqua>!` when it actually should be `<aqua>Hello <bold>${player name}</bold>!`
+4 -2
View File
@@ -187,8 +187,10 @@ playerCount:
The `playerCount -> hover` option allows you to define lines of text to show when a player hovers over the player count with their cursor.
Note that this option only accepts basic colors such as `<blue>` or `<grey>` and that HEX colors are not supported.
/// info | Notes
Only basic color and formatting codes such as `<aqua>` and `<bold>` are accepted. Hex colors will be downsampled to the closest supported color.
///
/// details | Example
type: example
+8 -5
View File
@@ -118,11 +118,14 @@ nav:
- Examples: examples/index.md
- Migration:
- migration/index.md
- v3.8.0 to v3.9.0: migration/v3_8_0-to-v3_9_0.md
- v3.7.0 to v3.8.0: migration/v3_7_0-to-v3_8_0.md
- '< v3.7.0 to v3.7.0': migration/pre-v3_7_0-to-v3_7_0.md
- v1.9.0 to v1.10.0: migration/v1_9_0-to-v1_10_0.md
- v1.5.3 to v1.6.0: migration/v1_5_3-to-v1_6_0.md
- Other Plugins:
- ServerListPlus: migration/serverlistplus.md
- AdvancedServerList:
- v3.8.0 to v3.9.0: migration/v3_8_0-to-v3_9_0.md
- v3.7.0 to v3.8.0: migration/v3_7_0-to-v3_8_0.md
- '< v3.7.0 to v3.7.0': migration/pre-v3_7_0-to-v3_7_0.md
- v1.9.0 to v1.10.0: migration/v1_9_0-to-v1_10_0.md
- v1.5.3 to v1.6.0: migration/v1_5_3-to-v1_6_0.md
- API:
- api/index.md
- Changelog: api/changelog.md
+3 -2
View File
@@ -92,7 +92,7 @@
<dependency>
<groupId>com.viaversion</groupId>
<artifactId>viaversion-api</artifactId>
<version>4.9.3</version>
<version>4.10.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
@@ -117,7 +117,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
@@ -131,6 +131,7 @@
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
@@ -164,6 +164,11 @@ public class PaperCore extends JavaPlugin implements PluginCore<CachedServerIcon
return "paper";
}
@Override
public boolean isPluginEnabled(String plugin){
return Bukkit.getPluginManager().isPluginEnabled(plugin);
}
@Override
public CachedServerIcon createFavicon(BufferedImage image) throws Exception{
return Bukkit.loadServerIcon(image);
@@ -26,6 +26,7 @@
package ch.andre601.advancedserverlist.paper.listeners;
import ch.andre601.advancedserverlist.paper.PaperCore;
import ch.andre601.advancedserverlist.paper.commands.PaperCmdSender;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -51,5 +52,14 @@ public class JoinEvent implements Listener{
Player player = event.getPlayer();
plugin.getCore().getPlayerHandler().addPlayer(address.getHostString(), player.getName(), player.getUniqueId());
if(player.hasPermission("advancedserverlist.admin") || player.hasPermission("advancedserverlist.updatecheck")){
if(plugin.getCore().getUpdateChecker() == null)
return;
PaperCmdSender sender = new PaperCmdSender(player);
plugin.getCore().getUpdateChecker().performCachedUpdateCheck(sender);
}
}
}
@@ -35,6 +35,7 @@ import ch.andre601.advancedserverlist.core.objects.CachedPlayer;
import ch.andre601.advancedserverlist.core.parsing.ComponentParser;
import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer;
import ch.andre601.advancedserverlist.paper.PaperCore;
import ch.andre601.advancedserverlist.paper.objects.FakePlayerProfile;
import ch.andre601.advancedserverlist.paper.objects.impl.PaperPlayerImpl;
import ch.andre601.advancedserverlist.paper.objects.impl.PaperServerImpl;
import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
@@ -47,7 +48,6 @@ import org.bukkit.util.CachedServerIcon;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class PaperEventWrapper implements GenericEventWrapper<CachedServerIcon, PaperPlayerImpl>{
@@ -104,7 +104,7 @@ public class PaperEventWrapper implements GenericEventWrapper<CachedServerIcon,
})
.toString();
players.add(Bukkit.createProfile(UUID.randomUUID(), parsed));
players.add(FakePlayerProfile.create(parsed));
}
event.getPlayerSample().addAll(players);
@@ -0,0 +1,208 @@
/*
* MIT License
*
* Copyright (c) 2022-2024 Andre_601
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package ch.andre601.advancedserverlist.paper.objects;
import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
import org.bukkit.profile.PlayerTextures;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.net.URL;
import java.util.*;
import java.util.concurrent.CompletableFuture;
public record FakePlayerProfile(String name, UUID uuid) implements PlayerProfile{
public static FakePlayerProfile create(String name){
return new FakePlayerProfile(name, UUID.randomUUID());
}
@Override
public @Nullable UUID getUniqueId(){
return uuid();
}
@Override
public @Nullable String getName(){
return name();
}
@SuppressWarnings("removal")
@Override
public @NotNull String setName(@Nullable String name){
return name;
}
@Override
public @Nullable UUID getId(){
return null;
}
@SuppressWarnings("removal")
@Override
public @Nullable UUID setId(@Nullable UUID uuid){
return null;
}
@Override
public @NotNull PlayerTextures getTextures(){
return new FakePlayeerTextures();
}
@Override
public void setTextures(@Nullable PlayerTextures textures){
}
@Override
public @NotNull Set<ProfileProperty> getProperties(){
return Collections.emptySet();
}
@Override
public boolean hasProperty(@Nullable String property){
return false;
}
@Override
public void setProperty(@NotNull ProfileProperty property){
}
@Override
public void setProperties(@NotNull Collection<ProfileProperty> properties){
}
@Override
public boolean removeProperty(@Nullable String property){
return false;
}
@Override
public void clearProperties(){
}
@Override
public boolean isComplete(){
return false;
}
@Override
public boolean completeFromCache(){
return false;
}
@Override
public boolean completeFromCache(boolean onlineMode){
return false;
}
@Override
public boolean completeFromCache(boolean lookupUUID, boolean onlineMode){
return false;
}
@Override
public boolean complete(boolean textures){
return false;
}
@Override
public boolean complete(boolean textures, boolean onlineMode){
return false;
}
@Override
public @NotNull CompletableFuture<PlayerProfile> update(){
return null;
}
@Override
public org.bukkit.profile.@NotNull PlayerProfile clone(){
return null;
}
@Override
public @NotNull Map<String, Object> serialize(){
return Collections.emptyMap();
}
private static record FakePlayeerTextures() implements PlayerTextures{
@Override
public boolean isEmpty(){
return false;
}
@Override
public void clear(){
}
@Override
public @Nullable URL getSkin(){
return null;
}
@Override
public void setSkin(@Nullable URL skinUrl){
}
@Override
public void setSkin(@Nullable URL skinUrl, @Nullable SkinModel skinModel){
}
@Override
public @NotNull SkinModel getSkinModel(){
return SkinModel.CLASSIC;
}
@Override
public @Nullable URL getCape(){
return null;
}
@Override
public void setCape(@Nullable URL capeUrl){
}
@Override
public long getTimestamp(){
return 0;
}
@Override
public boolean isSigned(){
return false;
}
}
}
@@ -20,6 +20,9 @@ dependencies:
Maintenance:
load: BEFORE
required: false
ServerListPlus:
load: BEFORE
required: false
# The below stuff is NOT used by Paper plugin.
commands:
@@ -42,6 +45,7 @@ permissions:
default: op
children:
- 'advancedserverlist.command.*'
- 'advancedserverlist.updatecheck'
advancedserverlist.command.*:
description: 'Grants access to all commands'
default: op
@@ -53,4 +57,7 @@ permissions:
default: op
advancedserverlist.command.reload:
description: 'Grants access to /asl reload'
default: op
advancedserverlist.updatecheck:
description: 'Notifies you of new updates when joining the server'
default: op
+7 -1
View File
@@ -37,10 +37,16 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<plugin.version>4.6.2</plugin.version>
<plugin.version>4.9.0</plugin.version>
<plugin.description>Create multiple Server lists based on conditions.</plugin.description>
<api.version>3.3.0</api.version>
<dependency.adventure-api>4.17.0</dependency.adventure-api>
<dependency.adventure-text-minimessage>4.17.0</dependency.adventure-text-minimessage>
<dependency.adventure-text-serializer-legacy>4.17.0</dependency.adventure-text-serializer-legacy>
<dependency.adventure-platform-bungeecord>4.3.2</dependency.adventure-platform-bungeecord>
<dependency.configurate-yaml>4.1.2</dependency.configurate-yaml>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
+1
View File
@@ -0,0 +1 @@
preview.andre601.ch
+2 -1
View File
@@ -9,7 +9,8 @@
{
"description": "Use Jitpack registry for AdvancedBan",
"matchPackageNames": [
"com.github.DevLeoko:AdvancedBan"
"com.github.DevLeoko:AdvancedBan",
"com.github.LeonMangler:PremiumVanishAPI"
],
"registryUrls": [
"https://jitpack.io"
+2 -2
View File
@@ -1,3 +1,3 @@
mkdocs-material==9.5.17
mkdocs-glightbox==0.3.7
mkdocs-material==9.5.22
mkdocs-glightbox==0.4.0
git+https://github.com/Andre601/mkdocs-pagenav-generator
+3 -2
View File
@@ -84,7 +84,7 @@
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>configurate-yaml</artifactId>
<version>4.1.2</version>
<version>${dependency.configurate-yaml}</version>
<scope>provided</scope>
</dependency>
@@ -114,7 +114,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
@@ -128,6 +128,7 @@
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
@@ -54,6 +54,7 @@ import java.awt.image.BufferedImage;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class VelocityCore implements PluginCore<Favicon>{
@@ -158,6 +159,14 @@ public class VelocityCore implements PluginCore<Favicon>{
return "velocity";
}
@Override
public boolean isPluginEnabled(String plugin){
if(getProxy() == null)
return false;
return getProxy().getPluginManager().isLoaded(plugin.toLowerCase(Locale.ROOT));
}
@Override
public Favicon createFavicon(BufferedImage image){
return Favicon.create(image);
@@ -26,6 +26,7 @@
package ch.andre601.advancedserverlist.velocity.listeners;
import ch.andre601.advancedserverlist.velocity.VelocityCore;
import ch.andre601.advancedserverlist.velocity.commands.VelocityCmdSender;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.connection.PostLoginEvent;
import com.velocitypowered.api.proxy.Player;
@@ -47,5 +48,14 @@ public class JoinEvent{
Player player = event.getPlayer();
plugin.getCore().getPlayerHandler().addPlayer(address.getHostString(), player.getUsername(), player.getUniqueId());
if(player.hasPermission("advancedserverlist.admin") || player.hasPermission("advancedserverlist.updatecheck")){
if(plugin.getCore().getUpdateChecker() == null)
return;
VelocityCmdSender sender = new VelocityCmdSender(player);
plugin.getCore().getUpdateChecker().performCachedUpdateCheck(sender);
}
}
}
@@ -14,6 +14,10 @@
{
"id": "maintenance",
"optional": true
},
{
"id": "serverlistplus",
"optional": true
}
],
"main": "ch.andre601.advancedserverlist.velocity.VelocityCore"
+3 -3
View File
@@ -52,7 +52,7 @@
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.4</version>
<version>1.5.6</version>
<scope>compile</scope>
</dependency>
<dependency>
@@ -101,7 +101,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<version>3.4.1</version>
<configuration>
<archive>
<manifest>
@@ -115,7 +115,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
@@ -121,7 +121,10 @@ public class VersionUploader{
WebhookEmbedBuilder builder = new WebhookEmbedBuilder()
.setTitle(new WebhookEmbed.EmbedTitle("New Release", null))
.setDescription("A new release of AdvancedServerList is available on Modrinth and Hangar for you to download!")
.setDescription(String.format(
"Version `%s` of AdvancedServerList is now available for download on Modrinth and Hangar!",
release.tagName()
))
.setColor(0x1BD96A);
StringJoiner modrinthText = new StringJoiner("\n");
@@ -102,15 +102,18 @@ public class HangarVersionUploader{
final List<Dependency> paperDependencies = List.of(
Dependency.fromNamespace("ViaVersion", false),
Dependency.fromNamespace("Maintenance", false),
Dependency.fromNamespace("PlaceholderAPI", false)
Dependency.fromNamespace("PlaceholderAPI", false),
Dependency.fromUrl("ServerListPlus", "https://github.com/Minecrell/ServerListPlus", false)
);
final List<Dependency> bungeeDependencies = List.of(
Dependency.fromNamespace("PapiProxyBridge", false),
Dependency.fromNamespace("Maintenance", false)
Dependency.fromNamespace("Maintenance", false),
Dependency.fromUrl("ServerListPlus", "https://github.com/Minecrell/ServerListPlus", false)
);
final List<Dependency> velocityDependencies = List.of(
Dependency.fromNamespace("PapiProxyBridge", false),
Dependency.fromNamespace("Maintenance", false)
Dependency.fromNamespace("Maintenance", false),
Dependency.fromUrl("ServerListPlus", "https://github.com/Minecrell/ServerListPlus", false)
);
final List<MultipartObject> fileInfo = List.of(
@@ -171,8 +174,13 @@ public class HangarVersionUploader{
LOGGER.info("Uploading release...");
return client.execute(post, response -> {
if(response.getCode() != 200){
String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
throw new RuntimeException(String.format(
"Received non-successful response while uploading release. Code: %d, Message: %s", response.getCode(), response.getReasonPhrase()
"Received non-successful response while uploading release.\nCode: %d\nMessage: %s\nBody: %s",
response.getCode(),
response.getReasonPhrase(),
body
));
}
LOGGER.info("Successfully uploaded new release on Hangar!");
@@ -36,7 +36,7 @@ public record Dependency(String name, String externalUrl, boolean required){
return new Dependency(name, null, required);
}
public static Dependency fromUrl(String url, boolean required){
return new Dependency(null, url, required);
public static Dependency fromUrl(String name, String url, boolean required){
return new Dependency(name, url, required);
}
}
@@ -55,7 +55,7 @@ public class ModrinthVersionUploader{
PlatformInfo.VELOCITY
);
private final List<String> versions = List.of(
"1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4"
"1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6"
);
private final ModrinthAPI api;