Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 17 additions & 14 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '1.6-SNAPSHOT'
id 'net.fabricmc.fabric-loom' version "${loom_version}"
id 'maven-publish'
}

Expand All @@ -17,45 +17,46 @@ repositories {
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
// for more information about repositories.
maven { url 'https://maven.nucleoid.xyz' }
mavenCentral()
}

dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.officialMojangMappings()
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
implementation "net.fabricmc:fabric-loader:${project.loader_version}"

// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

modImplementation include("me.lucko:fabric-permissions-api:${project.permissions_api}")
modImplementation include("eu.pb4:predicate-api:${project.predicate_api_version}")
modImplementation include("eu.pb4:placeholder-api:${project.placeholder_api_version}")
implementation "me.lucko:fabric-permissions-api:${project.permissions_api}"
include "me.lucko:fabric-permissions-api:${project.permissions_api}"

implementation "eu.pb4:predicate-api:${project.predicate_api_version}"
include "eu.pb4:predicate-api:${project.predicate_api_version}"

implementation "eu.pb4:placeholder-api:${project.placeholder_api_version}"
include "eu.pb4:placeholder-api:${project.placeholder_api_version}"
}

processResources {
inputs.property "version", project.version
inputs.property "minecraft_version", project.minecraft_version
inputs.property "loader_version", project.loader_version
filteringCharset "UTF-8"

filesMatching("fabric.mod.json") {
expand "version": project.version,
"minecraft_version": project.minecraft_version,
"loader_version": project.loader_version
}
}

def targetJavaVersion = 21
def targetJavaVersion = 25
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
// If Javadoc is generated, this must be specified in that task too.
it.options.encoding = "UTF-8"
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
it.options.release.set(targetJavaVersion)
}
it.options.release.set(targetJavaVersion)
}

java {
Expand All @@ -67,11 +68,13 @@ java {
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()
sourceCompatibility = JavaVersion.VERSION_25
targetCompatibility = JavaVersion.VERSION_25
}

jar {
from("LICENSE") {
rename { "${it}_${project.archivesBaseName}"}
rename { "${it}_${project.base.archivesName.get()}"}
}
}

Expand Down
18 changes: 9 additions & 9 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
org.gradle.jvmargs=-Xmx1G

# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version=1.21
loader_version=0.15.11
# check these on https://fabricmc.net/develop
minecraft_version=26.1.2
loader_version=0.18.4
loom_version=1.16-SNAPSHOT

# Mod Properties
mod_version = 1.0.1
mod_version = 1.1.0
maven_group = io.github.polymeta
archives_base_name = ServerLinksSender

# Dependencies
# check this on https://modmuss50.me/fabric.html
fabric_version=0.100.3+1.21
permissions_api=0.3.1
predicate_api_version=0.5.0+1.21
placeholder_api_version=2.4.0+1.21
fabric_version=0.150.0+26.1.2
permissions_api=0.7.0
predicate_api_version=0.8.1+26.1
placeholder_api_version=3.0.0+26.1
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class ServerLinksSender implements ModInitializer
public static final NodeParser PARSER = NodeParser.builder()
.simplifiedTextFormat()
.quickText()
.globalPlaceholders()
.commonPlaceholders()
.staticPreParsing()
.build();
public static BaseConfig CONFIG;
Expand All @@ -56,7 +56,7 @@ public void onInitialize()
.requires(Permissions.require("serverlinks.main", 4))
.executes((ctx) ->
{
loadConfig();
loadConfig(ctx.getSource().getServer().registryAccess());
ctx.getSource().sendSuccess(() -> Component.literal("Config reloaded"), false);
return 1;
})
Expand All @@ -68,10 +68,10 @@ public void onInitialize()
{
ctx.getSource().sendFailure(Component.literal("Unknown argument passed in! " +
"Use '/reloadserverlinks --force-update' to send all players an updated list after reloading")
.withStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/reloadserverlinks --force-update"))));
.withStyle(Style.EMPTY.withClickEvent(new ClickEvent.SuggestCommand("/reloadserverlinks --force-update"))));
return 1;
}
loadConfig();
loadConfig(ctx.getSource().getServer().registryAccess());
SendPacketsToPlayers(ctx.getSource().getServer().getPlayerList().getPlayers());
ctx.getSource().sendSuccess(() -> Component.literal("Config reloaded and links distributed to all online players"), false);
return 1;
Expand All @@ -83,7 +83,7 @@ public void onInitialize()
ServerLifecycleEvents.SERVER_STARTED.register(s ->
{

if(loadConfig())
if(loadConfig(s.registryAccess()))
{
AtomicInteger i = new AtomicInteger();
s.addTickable(() ->
Expand Down Expand Up @@ -114,11 +114,12 @@ private void SendPacketsToPlayers(List<ServerPlayer> players) {
executor.execute(() -> players.forEach(x -> x.connection.send(new ClientboundServerLinksPacket(CONFIG.buildPacketContents(x)))));
}

public static boolean loadConfig()
public static boolean loadConfig(net.minecraft.core.HolderLookup.Provider registryAccess)
{
try
{
var configDir = FabricLoader.getInstance().getConfigDir().resolve("serverlinkssender");
var gson = BaseConfig.createGson(registryAccess);

BaseConfig config;

Expand All @@ -127,7 +128,7 @@ public static boolean loadConfig()
{
var data = JsonParser.parseString(Files.readString(configFile));

config = BaseConfig.GSON.fromJson(data, BaseConfig.class);
config = gson.fromJson(data, BaseConfig.class);

}
else
Expand All @@ -137,7 +138,7 @@ public static boolean loadConfig()
config = new BaseConfig();
}

Files.writeString(configFile, BaseConfig.GSON.toJson(config));
Files.writeString(configFile, gson.toJson(config));
config.preParseText();
CONFIG = config;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
import com.mojang.datafixers.util.Either;
import eu.pb4.placeholders.api.PlaceholderContext;
import eu.pb4.placeholders.api.node.TextNode;
import eu.pb4.predicate.api.BuiltinPredicates;
import eu.pb4.predicate.api.GsonPredicateSerializer;
import eu.pb4.predicate.api.MinecraftPredicate;
import eu.pb4.predicate.api.PredicateContext;
import eu.pb4.predicate.impl.predicates.compat.PermissionPredicate;
import io.github.polymeta.serverlinkssender.ServerLinksSender;
import net.minecraft.core.HolderLookup;
import net.minecraft.resources.Identifier;
import net.minecraft.server.ServerLinks;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.permissions.PermissionLevel;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -21,10 +24,13 @@

public class BaseConfig
{
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().setLenient()
.registerTypeHierarchyAdapter(MinecraftPredicate.class, GsonPredicateSerializer.INSTANCE)
.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT, java.lang.reflect.Modifier.STATIC)
.create();
public static Gson createGson(HolderLookup.Provider lookup)
{
return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().setLenient()
.registerTypeHierarchyAdapter(MinecraftPredicate.class, GsonPredicateSerializer.create(lookup))
.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT, java.lang.reflect.Modifier.STATIC)
.create();
}

@SerializedName("refresh_interval")
public int linkRefreshTime = -1;
Expand All @@ -50,12 +56,12 @@ public void preParseText()
public List<ServerLinks.UntrustedEntry> buildPacketContents(ServerPlayer player)
{
var links = parsedGlobalLinks.entrySet().stream()
.map(x -> new ServerLinks.UntrustedEntry(Either.right(x.getKey().toText(PlaceholderContext.of(player))), x.getValue()))
.map(x -> new ServerLinks.UntrustedEntry(Either.right(x.getKey().toComponent(PlaceholderContext.of(player))), x.getValue()))
.collect(Collectors.toCollection(ArrayList::new));
links.addAll(additionalLinks.stream()
.filter(x -> x.requirement.test(PredicateContext.of(player)).success())
.flatMap(x -> x.parsedLinks.entrySet().stream())
.map(x -> new ServerLinks.UntrustedEntry(Either.right(x.getKey().toText(PlaceholderContext.of(player))), x.getValue()))
.map(x -> new ServerLinks.UntrustedEntry(Either.right(x.getKey().toComponent(PlaceholderContext.of(player))), x.getValue()))
.collect(Collectors.toCollection(ArrayList::new)));
return links;
}
Expand All @@ -64,6 +70,6 @@ public static class ContextLinkEntry
{
private Map<String, String> links = Map.of("<rb>My cool extra link!", "https://google.com");
public transient Map<TextNode, String> parsedLinks;
public MinecraftPredicate requirement = new PermissionPredicate("example.permission", 2);
public MinecraftPredicate requirement = BuiltinPredicates.fabricPermission(Identifier.parse("example.permission"), PermissionLevel.byId(2));
}
}
6 changes: 4 additions & 2 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
],
"depends": {
"fabricloader": ">=${loader_version}",
"fabric": "*",
"minecraft": ">=${minecraft_version}"
"fabric-api": "*",
"fabric-permissions-api-v0": "*",
"minecraft": "~26.1",
"java": ">=25"
}
}
2 changes: 1 addition & 1 deletion src/main/resources/serverlinkssender.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"required": true,
"minVersion": "0.8",
"package": "io.github.polymeta.serverlinkssender.mixin",
"compatibilityLevel": "JAVA_21",
"compatibilityLevel": "JAVA_25",
"mixins": [
],
"client": [
Expand Down