Compare commits

...
38 Commits
Author SHA1 Message Date
Andre601 348d1fcacf v5.8.0
- Use 1.7.0-b1 of ExpressionParser
- Wrap condition evaluation in try-catch to prevent stacktrace spams for invalid protocols (bots?) pinging.
2026-05-03 21:39:48 +02:00
Andre601 4451d2382b Remove FakePlayerProfile and make hover only work on newer Paper versions 2026-05-01 21:53:52 +02:00
Andre601 3d410631ef Merge pull request 'Update dependency io.papermc.paper:paper-api to v26' (#582) from renovate/io.papermc.paper-paper-api-26.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/582
2026-05-01 14:07:15 +02:00
Andre601 e0ba710aed paper/pom.xml aktualisiert 2026-05-01 14:07:06 +02:00
Andre601's Bot 966d817f29 Update dependency io.papermc.paper:paper-api to v26 2026-05-01 12:05:19 +00:00
Andre601 838416b1c5 Merge pull request 'Update dependency org.junit.jupiter:junit-jupiter-engine to v5.14.4' (#581) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/581
2026-04-29 14:17:44 +02:00
Andre601's Bot 23ee4a08ad Update dependency org.junit.jupiter:junit-jupiter-engine to v5.14.4 2026-04-29 12:04:12 +00:00
Andre601 baba7c7076 Use git-pages action for docs deployment 2026-04-25 14:14:23 +02:00
Andre601 7e7228dd77 Merge pull request 'Update dependency com.google.code.gson:gson to v2.14.0' (#580) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/580
2026-04-25 14:09:40 +02:00
Andre601's Bot 103bf4f1db Update dependency com.google.code.gson:gson to v2.14.0 2026-04-25 12:04:19 +00:00
Andre601 0c7c8e56db Update default config in getting-started.md 2026-04-25 01:25:17 +02:00
Andre601 cb3161a118 Merge pull request 'Update dependency net.kyori:adventure-text-serializer-legacy to v5' (#579) from renovate/major-dependency.adventure-text-serializer-legacy into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/579
2026-04-22 14:11:44 +02:00
Andre601 326fe7098a Merge pull request 'Update all non-major dependencies' (#578) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/578
2026-04-22 14:11:25 +02:00
Andre601's Bot d79c54f7c9 Update dependency net.kyori:adventure-text-serializer-legacy to v5 2026-04-22 12:04:30 +00:00
Andre601's Bot 1468febf72 Update all non-major dependencies 2026-04-22 12:04:25 +00:00
Andre601 afbcad6c3e Merge pull request 'Update dependency net.kyori:adventure-text-minimessage to v5' (#577) from renovate/major-dependency.adventure-text-minimessage into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/577
2026-04-19 14:06:31 +02:00
Andre601 79aefaa6a5 Merge pull request 'Update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.1' (#576) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/576
2026-04-19 14:06:06 +02:00
Andre601's Bot d6ac483a0e Update dependency net.kyori:adventure-text-minimessage to v5 2026-04-19 12:05:15 +00:00
Andre601's Bot 35df0d84ca Update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.1 2026-04-19 12:04:58 +00:00
Andre601 45229bd6d2 Merge pull request 'Update dependency eu.kennytv.maintenance:maintenance-api to v5' (#575) from renovate/eu.kennytv.maintenance-maintenance-api-5.x into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/575
2026-04-18 14:14:07 +02:00
Andre601 7bfa88383d Merge pull request 'Update dependency net.kyori:adventure-api to v5.0.1' (#574) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/574
2026-04-18 14:12:28 +02:00
Andre601's Bot efaae58562 Update dependency eu.kennytv.maintenance:maintenance-api to v5 2026-04-18 12:07:08 +00:00
Andre601's Bot 7dfdbb621d Update dependency net.kyori:adventure-api to v5.0.1 2026-04-18 12:06:54 +00:00
Andre601 d2cd554fb1 Merge pull request 'Update dependency net.kyori:adventure-api to v5' (#573) from renovate/major-dependency.adventure-api into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/573
2026-04-16 15:50:12 +02:00
Andre601 69168efb01 Merge pull request 'Update dependency com.google.guava:guava to v33.6.0-jre' (#572) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/572
2026-04-16 15:49:56 +02:00
Andre601's Bot 55f94a8c27 Update dependency net.kyori:adventure-api to v5 2026-04-16 12:04:32 +00:00
Andre601's Bot e813bdaba4 Update dependency com.google.guava:guava to v33.6.0-jre 2026-04-16 12:04:13 +00:00
Andre601 b3f56aa398 Merge pull request 'Update all non-major dependencies to v2.0.0-beta.15' (#571) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/571
2026-04-12 14:43:39 +02:00
Andre601's Bot 87f0573162 Update all non-major dependencies to v2.0.0-beta.15 2026-04-12 12:04:33 +00:00
Andre601 e49fe391d0 Merge pull request 'Update dependency com.viaversion:viaversion-api to v5.8.1' (#570) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/570
2026-03-31 14:06:26 +02:00
Andre601's Bot d077efdc12 Update dependency com.viaversion:viaversion-api to v5.8.1 2026-03-31 12:04:41 +00:00
Andre601 90fdaf628c Merge pull request 'Update dependency mkdocs-redirects to v1.2.3' (#569) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/569
2026-03-29 14:17:30 +02:00
Andre601's Bot 9651011b19 Update dependency mkdocs-redirects to v1.2.3 2026-03-29 12:02:58 +00:00
Andre601 9bacc04a68 Compile with Java 25 2026-03-28 13:52:41 +01:00
Andre601 515081e395 Merge pull request 'Update all non-major dependencies' (#568) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/568
2026-03-28 13:07:37 +01:00
Andre601's Bot 95fec87c12 Update all non-major dependencies 2026-03-28 12:07:06 +00:00
Andre601 778a415b4f Merge pull request 'Update dependency properdocs to v1.6.7' (#567) from renovate/all-minor-patch into master
Reviewed-on: https://codeberg.org/Andre601/AdvancedServerList/pulls/567
2026-03-21 14:23:28 +01:00
Andre601's Bot db66945d99 Update dependency properdocs to v1.6.7 2026-03-21 12:02:41 +00:00
23 changed files with 128 additions and 533 deletions

No files matched your search

+7 -13
View File
@@ -17,12 +17,10 @@ jobs:
deployWiki:
runs-on: codeberg-tiny
steps:
- name: "Checkout Source Repository"
- name: "Checkout Repository"
uses: https://code.forgejo.org/actions/checkout@v6
with:
token: "${{ secrets.BOT_TOKEN }}"
- name: "Checkout Target Repository"
run: "git clone -b pages https://codeberg.org/Andre601/asl-docs site"
- name: "Setup Python 3.x"
uses: https://code.forgejo.org/actions/setup-python@v6
with:
@@ -31,13 +29,9 @@ jobs:
run: "pip install -r requirements.txt"
- name: "Build Website"
run: "properdocs build"
- name: "Commit and Push"
run: |
git config --global user.email "andre_601-bot@noreply.codeberg.org"
git config --global user.name "ASL Wiki Builder"
mv domains site/.domains
cd site
git remote set-url origin https://${{ secrets.BOT_TOKEN }}@codeberg.org/Andre601/asl-docs
git add --all
git commit -m "Update Wiki ($( env TZ=Europe/Zurich date +"%d.%m.%Y %Z" ))"
git push
- name: "Deploy Website"
uses: https://code.forgejo.org/actions/git-pages@v2
with:
site: https://asl.andre601.ch
token: ${{ secrets.FORGEJO_TOKEN }}
source: site/
-64
View File
@@ -1,64 +0,0 @@
when:
- event: pull_request
path:
include: [".woodpecker/pr_preview.yml", "docs/**", "mkdocs.yml", "requirements.txt"]
variables:
setup_git: &setup_git
- apk add git
- git config --global user.email "andre_601-bot@noreply.codeberg.org"
- git config --global user.name "PR Docs Preview Builder"
steps:
- name: "Clone Preview Repository"
image: alpine:3.20.3
commands:
- chmod -R a+w .
- <<: *setup_git
- git clone https://codeberg.org/Andre601/preview.git site
- chmod -R a+w site
- cd site
- 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
- name: "Commit and Push"
image: alpine:3.20.3
secrets:
- bot_token
commands:
- <<: *setup_git
- mv preview-domains site/.domains
- cd site
- git remote add upstream https://$BOT_TOKEN@codeberg.org/Andre601/preview.git
- git add --all
- 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"]
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://preview.andre601.ch/@${CI_REPO_NAME,,}~${CI_COMMIT_PULL_REQUEST} |
- name: "Comment on Failure"
image: mcs94/gitea-comment
when:
- status: ["failure"]
settings:
gitea_address: https://codeberg.org
gitea_token:
from_secret: BOT_TOKEN
comment: |-
Pull request Preview **failed**!
Please check the CI logs for details: ${CI_PIPELINE_URL}
+1 -1
View File
@@ -4,7 +4,7 @@ when:
steps:
- name: "Build Jar and Upload"
image: maven:3.9.14-eclipse-temurin-21
image: maven:3.9.15-eclipse-temurin-25
environment:
CODEBERG_API_TOKEN:
from_secret: cb_token
-36
View File
@@ -1,36 +0,0 @@
when:
- event: push
branch: ${CI_REPO_DEFAULT_BRANCH}
path:
include: [".woodpecker/publish_docs.yml", "docs/**", "mkdocs.yml", "requirements.txt"]
variables:
setup_git: &setup_git
- apk add git
- git config --global user.email "andre_601-bot@noreply.codeberg.org"
- git config --global user.name "ASL Docs Builder"
steps:
- name: "Clone target Repository"
image: alpine:3.20.3
commands:
- chmod -R a+w .
- <<: *setup_git
- git clone -b pages https://codeberg.org/Andre601/asl-docs.git site
- chmod -R a+w site
- name: "Build Docs"
image: woodpeckerci/plugin-mkdocs:latest
settings:
pip_install_file: requirements.txt
- name: "Commit and Push"
image: alpine:3.20.3
secrets:
- bot_token
commands:
- <<: *setup_git
- mv domains site/.domains
- cd site
- git remote set-url origin https://$BOT_TOKEN@codeberg.org/Andre601/asl-docs.git
- git add --all
- git commit -m "Update AdvancedServerList Docs ($( env TZ=Europe/Zurich date +"%d.%m.%Y %Z" )) [SKIP CI]"
- git push
+1 -1
View File
@@ -79,7 +79,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21-R0.1-SNAPSHOT</version>
<version>26.1.2.build.53-stable</version>
<scope>provided</scope>
</dependency>
<dependency>
+1 -1
View File
@@ -75,7 +75,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21-R0.1-SNAPSHOT</version>
<version>26.1.2.build.53-stable</version>
<scope>provided</scope>
</dependency>
<dependency>
+6 -6
View File
@@ -79,7 +79,7 @@
<dependency>
<groupId>ch.andre601</groupId>
<artifactId>expressionparser</artifactId>
<version>1.6.1</version>
<version>1.7.0-b1</version>
<scope>compile</scope>
</dependency>
@@ -121,7 +121,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.2</version>
<version>2.14.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -133,7 +133,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.5.0-jre</version>
<version>33.6.0-jre</version>
<scope>provided</scope>
</dependency>
@@ -174,7 +174,7 @@
<dependency>
<groupId>eu.kennytv.maintenance</groupId>
<artifactId>maintenance-api</artifactId>
<version>4.2.1</version>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -186,7 +186,7 @@
<dependency>
<groupId>io.github.miniplaceholders</groupId>
<artifactId>miniplaceholders-api</artifactId>
<version>3.1.0</version>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
@@ -194,7 +194,7 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.14.3</version>
<version>5.14.4</version>
<scope>test</scope>
</dependency>
</dependencies>
@@ -25,13 +25,13 @@
package ch.andre601.advancedserverlist.core.check;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NonNull;
import java.util.concurrent.ThreadFactory;
public class UpdateCheckThread implements ThreadFactory{
@Override
public Thread newThread(@NotNull Runnable r){
public Thread newThread(@NonNull Runnable r){
Thread t = new Thread(r, "AdvancedServerList-UpdateThread");
t.setDaemon(true);
return t;
@@ -48,7 +48,16 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
ParseWarnCollector collector = new ParseWarnCollector(condition);
PluginLogger logger = core.plugin().pluginLogger();
boolean result = core.parser().evaluate(condition, player, server, collector);
boolean result;
try{
result = core.parser().compileToBoolean(condition, collector, player, server);
}catch(Exception ex){
logger.warn("Encountered an Exception while parsing condition '%s'. Cause: %s", condition, ex.getMessage());
if(core.fileHandler().getBool(false, "debug"))
logger.warn("Stacktrace:", ex);
return false;
}
if(collector.hasWarnings()){
logger.warn("Encountered <white>%d</white> Error(s) while parsing condition for file '<white>%s</white>':", collector.getWarnings().size(), file);
@@ -70,7 +79,7 @@ public record ServerListProfile(int priority, String condition, ProfileEntry def
}
if(profiles.size() == 1)
return profiles.get(0); // No need to run a random for 1 profile.
return profiles.getFirst(); // No need to run a random for 1 profile.
synchronized(random){
return profiles.get(random.nextInt(profiles.size()));
@@ -25,16 +25,15 @@
package ch.andre601.advancedserverlist.core.profiles.conditions;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.advancedserverlist.core.profiles.conditions.placeholders.reader.PlaceholderTokenReader;
import ch.andre601.advancedserverlist.core.profiles.conditions.placeholders.reader.PlaceholderValueReader;
import ch.andre601.advancedserverlist.core.profiles.conditions.placeholders.tokens.CustomExpressionTokenizer;
import ch.andre601.expressionparser.ExpressionParserEngine;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.expressions.ExpressionTokenizer;
import ch.andre601.expressionparser.operator.Operator;
import ch.andre601.expressionparser.parsers.ExpressionTemplateParser;
import ch.andre601.expressionparser.parsers.ValueReader;
import ch.andre601.expressionparser.templates.ConstantExpressionTemplate;
import ch.andre601.expressionparser.templates.ExpressionTemplate;
import ch.andre601.expressionparser.tokens.Token;
import ch.andre601.expressionparser.tokens.readers.TokenReader;
@@ -45,11 +44,11 @@ import java.util.List;
public class ProfileConditionParser implements ExpressionParserEngine{
private final CustomExpressionTokenizer tokenizer;
private final ExpressionTokenizer tokenizer;
private final ExpressionTemplateParser parser;
private ProfileConditionParser(List<TokenReader> tokenReaders, ImmutableMap<Token, Operator> operators, ImmutableList<ValueReader> valueReaders){
this.tokenizer = new CustomExpressionTokenizer(tokenReaders);
this.tokenizer = new ExpressionTokenizer(tokenReaders);
this.parser = new ExpressionTemplateParser(operators, valueReaders);
}
@@ -60,17 +59,13 @@ public class ProfileConditionParser implements ExpressionParserEngine{
.build();
}
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
public ExpressionTemplate compile(String s, ParseWarnCollector parseWarnCollector){
return null;
public ExpressionTemplate compile(String text, ParseWarnCollector collector, Object... args){
ExpressionTemplate result = parser.parse(tokenizer.parse(text, collector, args), collector);
if(result == null)
return ConstantExpressionTemplate.of(false);
return result;
}
private static class ProfileConditionParserBuilder extends ExpressionParserEngine.Builder<ProfileConditionParser>{
@@ -1,48 +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.core.profiles.conditions.placeholders.reader;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.tokens.Token;
import ch.andre601.expressionparser.tokens.readers.TokenReader;
import java.text.ParsePosition;
public abstract class CustomTokenReader extends TokenReader{
public CustomTokenReader(int priority){
super(priority);
}
@Override
public Token read(String text, ParsePosition position, ParseWarnCollector collector){
return null;
}
public abstract Token read(String text, ParsePosition position, GenericPlayer player, GenericServer server, ParseWarnCollector collector);
}
@@ -31,19 +31,38 @@ import ch.andre601.advancedserverlist.core.profiles.conditions.placeholders.toke
import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.tokens.Token;
import ch.andre601.expressionparser.tokens.readers.TokenReader;
import java.text.ParsePosition;
public class PlaceholderTokenReader extends CustomTokenReader{
public class PlaceholderTokenReader extends TokenReader{
public PlaceholderTokenReader(int priority){
super(priority);
}
@Override
public Token read(String text, ParsePosition position, GenericPlayer player, GenericServer server, ParseWarnCollector collector){
public Token read(String text, ParsePosition position, ParseWarnCollector collector, Object... args){
GenericPlayer player = null;
GenericServer server = null;
for(Object arg : args){
if(arg instanceof GenericPlayer pl){
player = pl;
}else
if(arg instanceof GenericServer srv){
server = srv;
}
}
if(player == null || server == null){
collector.appendWarning(position.getIndex(), "Received null GenericPlayer or GenericServer instance.");
return null;
}
if(position.getIndex() + 1 < text.length() && text.charAt(position.getIndex()) == '$' && text.charAt(position.getIndex() + 1) == '{'){
position.setIndex(position.getIndex() + 2);
return new PlaceholderToken(StringReplacer.parsePlaceholder(text, position, player, server, collector));
}
return null;
@@ -37,8 +37,8 @@ import java.util.List;
public class PlaceholderValueReader extends ValueReader{
@Override
public ExpressionTemplate read(ExpressionTemplateParser parser, List<Token> tokens, ParseWarnCollector collector){
if(tokens.get(0) instanceof PlaceholderToken){
PlaceholderToken token = (PlaceholderToken)tokens.remove(0);
if(tokens.getFirst() instanceof PlaceholderToken){
PlaceholderToken token = (PlaceholderToken)tokens.removeFirst();
return token.getValue();
}
return null;
@@ -1,92 +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.core.profiles.conditions.placeholders.tokens;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.advancedserverlist.core.profiles.conditions.placeholders.reader.CustomTokenReader;
import ch.andre601.expressionparser.ParseWarnCollector;
import ch.andre601.expressionparser.tokens.Token;
import ch.andre601.expressionparser.tokens.readers.TokenReader;
import com.google.common.collect.Ordering;
import java.text.ParsePosition;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
public class CustomExpressionTokenizer{
private static final Ordering<TokenReader> TOKEN_READER_ORDERING = Ordering.from(Comparator.comparingInt(TokenReader::getPriority)).reverse();
private final List<TokenReader> tokenReaders;
public CustomExpressionTokenizer(Iterable<TokenReader> tokenReaders){
this.tokenReaders = TOKEN_READER_ORDERING.immutableSortedCopy(tokenReaders);
}
public List<Token> parse(String text, GenericPlayer player, GenericServer server, ParseWarnCollector collector){
ParsePosition position = new ParsePosition(0);
List<Token> tokens = new LinkedList<>();
next_token:
while(true){
while(position.getIndex() < text.length() && Character.isWhitespace(text.charAt(position.getIndex())))
position.setIndex(position.getIndex() + 1);
if(position.getIndex() >= text.length())
break;
for(TokenReader tokenReader : tokenReaders){
Token token;
if(tokenReader instanceof CustomTokenReader customTokenReader){
if(null != (token = customTokenReader.read(text, position, player, server, collector))){
tokens.add(token);
continue next_token;
}
}else{
if(null != (token = tokenReader.read(text, position, collector))){
tokens.add(token);
continue next_token;
}
}
}
if(position.getIndex() >= text.length()){
collector.appendWarningFormatted(
"Current index position (%d) is larger or equal to Text length (%d) for condition '%s'",
position.getIndex(), text.length(), text
);
}else{
collector.appendWarningFormatted(position.getIndex(), "Illegal Token '%c'.", text.charAt(position.getIndex()));
}
break;
}
return tokens;
}
}
@@ -25,11 +25,16 @@
package ch.andre601.advancedserverlist.core;
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.advancedserverlist.core.profiles.conditions.ProfileConditionParser;
import ch.andre601.expressionparser.ParseWarnCollector;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import java.util.Map;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -39,13 +44,16 @@ public class ExpressionParserTests{
private final DummyPluginLogger logger = new DummyPluginLogger();
private final Map<String, Boolean> testValuesMap = getTestMap();
private final TestPlayer player = new TestPlayer();
private final TestServer server = new TestServer();
@Test
public void testBasicExpressionResults(){
for(Map.Entry<String, Boolean> values : testValuesMap.entrySet()){
logger.info("TEST[expression=\"%s\", expected=%b]", values.getKey(), values.getValue());
ParseWarnCollector collector = new ParseWarnCollector(values.getKey());
boolean result = parser.evaluate(values.getKey(), null, null, collector);
boolean result = parser.compileToBoolean(values.getKey(), collector, player, server);
logger.info("Result (Output, Expected?): %b, %b", result, (result == values.getValue()));
assertEquals(result, values.getValue());
@@ -66,4 +74,38 @@ public class ExpressionParserTests{
"false or 100 < 10", false
);
}
private static class TestPlayer implements GenericPlayer{
@Override
public @NonNull String getName(){
return "Lorem";
}
@Override
public int getProtocol(){
return 1;
}
@Override
public @NonNull UUID getUUID(){
return UUID.randomUUID();
}
}
private static class TestServer implements GenericServer{
@Override
public int getPlayersOnline(){
return 10;
}
@Override
public int getPlayersMax(){
return 20;
}
@Override
public @Nullable String getHost(){
return "play.example.com";
}
}
}
+2 -2
View File
@@ -473,7 +473,7 @@ faviconCacheTime: 1
#
# Setting any not listed option or leaving this blank/removing it sets the option to resize.
#
faviconStrategy: 'resize'
faviconResizeStrategy: 'resize'
#
# Options to disable while the Maintenance Plugin is present and Maintenance Mode is active.
@@ -543,7 +543,7 @@ disableDuringMaintenance:
# This is used internally to determine if the config needs to be migrated.
# Changing or even removing this option could result in your config being broken.
#
configVersion: 9
configVersion: 10
```
///
+2 -2
View File
@@ -78,7 +78,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.7-R0.1-SNAPSHOT</version>
<version>[26.1.2.build,)</version>
<scope>provided</scope>
</dependency>
@@ -100,7 +100,7 @@
<dependency>
<groupId>com.viaversion</groupId>
<artifactId>viaversion-api</artifactId>
<version>5.7.2</version>
<version>5.9.0</version>
<scope>provided</scope>
</dependency>
@@ -35,11 +35,9 @@ 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;
import com.destroystokyo.paper.profile.PlayerProfile;
import me.clip.placeholderapi.PlaceholderAPI;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
@@ -101,8 +99,7 @@ public class PaperEventWrapper implements GenericEventWrapper<CachedServerIcon,
Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent$ListedPlayerInfo");
setListedPlayers(lines, player, server);
}catch(ClassNotFoundException ex){
// Version before latest 1.20.6 builds(?)
setPlayerSample(lines, player, server);
plugin.pluginLogger().warn("playerCount -> hover is not supported on this Paper Version!");
}
}
@@ -112,7 +109,7 @@ public class PaperEventWrapper implements GenericEventWrapper<CachedServerIcon,
Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent$ListedPlayerInfo");
clearListedPlayers();
}catch(ClassNotFoundException ex){
clearPlayerSample();
plugin.pluginLogger().warn("playerCount -> hidePlayers is not supported on this Paper Version!");
}
}
@@ -206,19 +203,6 @@ public class PaperEventWrapper implements GenericEventWrapper<CachedServerIcon,
event.getListedPlayers().addAll(playerList);
}
@SuppressWarnings({"Deprecation", "removal"})
private void clearPlayerSample(){
event.getPlayerSample().clear();
}
@SuppressWarnings({"Deprecation", "removal"})
private void setPlayerSample(List<String> lines, PaperPlayerImpl player, GenericServer server){
clearPlayerSample();
List<PlayerProfile> playerProfiles = getPlayerList(lines, player, server, FakePlayerProfile::create);
event.getPlayerSample().addAll(playerProfiles);
}
private <T> List<T> getPlayerList(List<String> lines, PaperPlayerImpl player, GenericServer server, Function<String, T> function){
List<T> playerList = new ArrayList<>(lines.size());
for(String line : lines){
@@ -1,208 +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.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 FakePlayerTextures();
}
@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 record FakePlayerTextures() 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;
}
}
}
@@ -41,7 +41,7 @@ import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NonNull;
import java.util.Collections;
import java.util.List;
@@ -58,17 +58,17 @@ public class PAPIPlaceholders extends PlaceholderExpansion{
}
@Override
public @NotNull String getIdentifier(){
public @NonNull String getIdentifier(){
return "asl";
}
@Override
public @NotNull String getAuthor(){
public @NonNull String getAuthor(){
return "Andre601";
}
@Override
public @NotNull String getVersion(){
public @NonNull String getVersion(){
return plugin.core().version();
}
@@ -78,7 +78,7 @@ public class PAPIPlaceholders extends PlaceholderExpansion{
}
@Override
public String onPlaceholderRequest(Player pl, @NotNull String identifier){
public String onPlaceholderRequest(Player pl, @NonNull String identifier){
String host = pl.getVirtualHost() == null ? null : pl.getVirtualHost().getHostString();
CachedPlayer cached = plugin.core().playerHandler().getCachedPlayer(pl.getUniqueId());
+8 -8
View File
@@ -41,24 +41,24 @@
<project.build.build_id/>
<plugin.version>5.7.3</plugin.version>
<plugin.version>5.8.0</plugin.version>
<plugin.description>Create multiple Server lists based on conditions.</plugin.description>
<api.version>4.1.1</api.version>
<!-- Adventure versions -->
<dependency.adventure-api>4.26.1</dependency.adventure-api>
<dependency.adventure-text-minimessage>4.26.1</dependency.adventure-text-minimessage>
<dependency.adventure-text-serializer-legacy>4.26.1</dependency.adventure-text-serializer-legacy>
<dependency.adventure-api>5.0.1</dependency.adventure-api>
<dependency.adventure-text-minimessage>5.0.1</dependency.adventure-text-minimessage>
<dependency.adventure-text-serializer-legacy>5.0.1</dependency.adventure-text-serializer-legacy>
<dependency.adventure-platform-bungeecord>4.4.1</dependency.adventure-platform-bungeecord>
<!-- Configurate version -->
<dependency.configurate-yaml>4.2.0</dependency.configurate-yaml>
<!-- Cloud versions -->
<dependency.cloud-annotations>2.0.0</dependency.cloud-annotations>
<dependency.cloud-bungee>2.0.0-beta.14</dependency.cloud-bungee>
<dependency.cloud-paper>2.0.0-beta.14</dependency.cloud-paper>
<dependency.cloud-velocity>2.0.0-beta.14</dependency.cloud-velocity>
<dependency.cloud-minecraft-extras>2.0.0-beta.14</dependency.cloud-minecraft-extras>
<dependency.cloud-bungee>2.0.0-beta.15</dependency.cloud-bungee>
<dependency.cloud-paper>2.0.0-beta.15</dependency.cloud-paper>
<dependency.cloud-velocity>2.0.0-beta.15</dependency.cloud-velocity>
<dependency.cloud-minecraft-extras>2.0.0-beta.15</dependency.cloud-minecraft-extras>
</properties>
<profiles>
+2 -2
View File
@@ -1,7 +1,7 @@
properdocs==1.6.6
properdocs==1.6.7
mkdocs-material==9.7.6
mkdocs-glightbox==0.5.2
mkdocs-redirects==1.2.2
mkdocs-redirects==1.2.3
git+https://github.com/Andre601/mkdocs-pagenav-generator
mkdocs-macros-plugin==1.5.0
pygments-minimessage==1.0.0
+2 -2
View File
@@ -46,7 +46,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.2</version>
<version>2.14.0</version>
<scope>compile</scope>
</dependency>
<dependency>
@@ -58,7 +58,7 @@
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.6</version>
<version>5.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>