diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b67afb27..a53a65eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,47 +13,58 @@ jobs: - uses: actions/setup-java@v3 with: - java-version: 8 + java-version: 17 distribution: temurin - cache: gradle - name: Build uses: gradle/gradle-build-action@v2 with: arguments: build + cache-read-only: ${{ github.ref_name != 'master' && github.ref_name != 'development' }} - name: Publish to Maven Repository - if: ${{ job.status == 'success' && github.repository == 'GeyserMC/Floodgate' }} + if: ${{ github.repository == 'GeyserMC/Floodgate' }} uses: gradle/gradle-build-action@v2 env: ORG_GRADLE_PROJECT_geysermcUsername: ${{ vars.DEPLOY_USER }} ORG_GRADLE_PROJECT_geysermcPassword: ${{ secrets.DEPLOY_PASS }} with: arguments: publish + cache-read-only: ${{ github.ref_name != 'master' && github.ref_name != 'development' }} - name: Publish to Downloads API - if: ${{ github.ref_name == 'master' && job.status == 'success' && github.repository == 'GeyserMC/Floodgate' }} + if: ${{ github.ref_name == 'master' && github.repository == 'GeyserMC/Floodgate' }} shell: bash + env: + DOWNLOADS_USERNAME: ${{ vars.DOWNLOADS_USERNAME }} + DOWNLOADS_PRIVATE_KEY: ${{ secrets.DOWNLOADS_PRIVATE_KEY }} + DOWNLOADS_SERVER_IP: ${{ secrets.DOWNLOADS_SERVER_IP }} run: | # Save the private key to a file echo "$DOWNLOADS_PRIVATE_KEY" > id_ecdsa chmod 600 id_ecdsa + + # Set the project + project=floodgate # Get the version from gradle.properties version=$(cat gradle.properties | grep -o "version=[0-9\\.]*" | cut -d"=" -f2) + + # Create the build folder + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP mkdir -p "~/uploads/$project/$GITHUB_RUN_NUMBER/" # Copy over artifacts - scp -B -o StrictHostKeyChecking=no -i id_ecdsa **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/files/ + rsync -P -e "ssh -o StrictHostKeyChecking=no -i id_ecdsa" **/build/libs/floodgate-*.jar $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/uploads/$project/$GITHUB_RUN_NUMBER/ # Remove un-needed artifacts - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ~/files/floodgate-parent-*.jar ~/files/floodgate-api.jar ~/files/floodgate-core.jar + ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP rm ./uploads/$project/$GITHUB_RUN_NUMBER/floodgate-api.jar ./uploads/$project/$GITHUB_RUN_NUMBER/floodgate-core.jar - # Run the build script - ssh -o StrictHostKeyChecking=no -i id_ecdsa $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP ./handleBuild.sh floodgate $version $GITHUB_RUN_ID $GITHUB_SHA + # Push the metadata + echo "{\"project\": \"$project\", \"version\": \"$version\", \"id\": $GITHUB_RUN_NUMBER, \"commit\": \"$GITHUB_SHA\"}" > metadata.json + rsync -P -e "ssh -o StrictHostKeyChecking=no -i id_ecdsa" metadata.json $DOWNLOADS_USERNAME@$DOWNLOADS_SERVER_IP:~/uploads/$project/$GITHUB_RUN_NUMBER/ - name: Notify Discord - if: ${{ github.repository == 'GeyserMC/Floodgate' }} + if: ${{ (success() || failure()) && github.repository == 'GeyserMC/Floodgate' }} uses: Tim203/actions-git-discord-webhook@main with: webhook_url: ${{ secrets.DISCORD_WEBHOOK }} - status: ${{ job.status }} diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 4edc17e3..016ad98d 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -10,11 +10,11 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 17 uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: '8' + java-version: '17' cache: 'gradle' - name: Build with Maven diff --git a/Jenkinsfile b/Jenkinsfile index 58099d91..f9dbc474 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,7 +2,7 @@ pipeline { agent any tools { gradle 'Gradle 7' - jdk 'Java 8' + jdk 'Java 17' } options { buildDiscarder(logRotator(artifactNumToKeepStr: '5')) diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index ed15ef06..43cf80cd 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -33,7 +33,7 @@ object Versions { const val nettyVersion = "4.1.49.Final" const val snakeyamlVersion = "2.0" const val cloudVersion = "1.5.0" - const val bstatsVersion = "3.0.1" + const val bstatsVersion = "3.0.2" const val javaWebsocketVersion = "1.5.2" @@ -41,6 +41,5 @@ object Versions { // Platform versions const val velocityVersion = "3.1.1" - const val bungeeCommit = "ff5727c" - const val spigotVersion = "1.13-R0.1-SNAPSHOT" + const val spigotVersion = "1.19.4-R0.1-SNAPSHOT" } \ No newline at end of file diff --git a/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts b/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts index 696d05ac..85e35202 100644 --- a/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/floodgate.publish-conventions.gradle.kts @@ -10,6 +10,6 @@ indra { } } - publishSnapshotsTo("geysermc", "https://repo.opencollab.dev/artifactory/maven-snapshots") - publishReleasesTo("geysermc", "https://repo.opencollab.dev/artifactory/maven-releases") + publishSnapshotsTo("geysermc", "https://repo.opencollab.dev/maven-snapshots") + publishReleasesTo("geysermc", "https://repo.opencollab.dev/maven-releases") } \ No newline at end of file diff --git a/bungee/build.gradle.kts b/bungee/build.gradle.kts index b5183540..f0e93a8a 100644 --- a/bungee/build.gradle.kts +++ b/bungee/build.gradle.kts @@ -1,3 +1,4 @@ +var bungeeCommit = "dfd847f" var gsonVersion = "2.8.0" var guavaVersion = "21.0" @@ -13,7 +14,7 @@ relocate("cloud.commandframework") relocate("io.leangen.geantyref") // these dependencies are already present on the platform -provided("com.github.SpigotMC.BungeeCord", "bungeecord-proxy", Versions.bungeeCommit) +provided("com.github.SpigotMC.BungeeCord", "bungeecord-proxy", bungeeCommit) provided("com.google.code.gson", "gson", gsonVersion) provided("com.google.guava", "guava", guavaVersion) provided("org.yaml", "snakeyaml", Versions.snakeyamlVersion) diff --git a/bungee/src/main/java/org/geysermc/floodgate/bungee/inject/BungeeInjector.java b/bungee/src/main/java/org/geysermc/floodgate/bungee/inject/BungeeInjector.java index 9515299a..3f3de2fd 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/bungee/inject/BungeeInjector.java +++ b/bungee/src/main/java/org/geysermc/floodgate/bungee/inject/BungeeInjector.java @@ -36,6 +36,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.netty.PipelineUtils; import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Varint21LengthFieldExtraBufPrepender; import net.md_5.bungee.protocol.Varint21LengthFieldPrepender; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.bungee.util.BungeeReflectionUtils; @@ -54,6 +55,16 @@ public final class BungeeInjector extends CommonPlatformInjector { public void inject() { // Can everyone just switch to Velocity please :) + // Newer Bungee versions have a separate prepender for backend and client connections + Field serverFramePrepender = + ReflectionUtils.getField(PipelineUtils.class, "serverFramePrepender"); + if (serverFramePrepender != null) { + BungeeCustomServerPrepender customServerPrepender = new BungeeCustomServerPrepender( + this, ReflectionUtils.castedStaticValue(serverFramePrepender) + ); + BungeeReflectionUtils.setFieldValue(null, serverFramePrepender, customServerPrepender); + } + Field framePrepender = ReflectionUtils.getField(PipelineUtils.class, "framePrepender"); // Required in order to inject into both Geyser <-> proxy AND proxy <-> server @@ -121,6 +132,22 @@ public final class BungeeInjector extends CommonPlatformInjector { } } + @RequiredArgsConstructor + private static final class BungeeCustomServerPrepender + extends Varint21LengthFieldExtraBufPrepender { + private final BungeeInjector injector; + private final Varint21LengthFieldExtraBufPrepender original; + + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + original.handlerAdded(ctx); + // The Minecraft encoder being in the pipeline isn't present until later + + // Proxy <-> Server + ctx.pipeline().addLast(BUNGEE_INIT, new BungeeProxyToServerInjectInitializer(injector)); + } + } + @RequiredArgsConstructor private static final class BungeeClientToProxyInjectInitializer extends ChannelInboundHandlerAdapter { diff --git a/core/src/main/java/org/geysermc/floodgate/core/pluginmessage/channel/FormChannel.java b/core/src/main/java/org/geysermc/floodgate/core/pluginmessage/channel/FormChannel.java index cebbd19f..86ca3a83 100644 --- a/core/src/main/java/org/geysermc/floodgate/core/pluginmessage/channel/FormChannel.java +++ b/core/src/main/java/org/geysermc/floodgate/core/pluginmessage/channel/FormChannel.java @@ -27,6 +27,7 @@ package org.geysermc.floodgate.core.pluginmessage.channel; import com.google.common.base.Charsets; import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; +import it.unimi.dsi.fastutil.shorts.Short2ObjectMaps; import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import jakarta.inject.Inject; import java.util.UUID; @@ -41,7 +42,8 @@ import org.geysermc.floodgate.core.pluginmessage.PluginMessageChannel; public class FormChannel implements PluginMessageChannel { private final FormDefinitions formDefinitions = FormDefinitions.instance(); - private final Short2ObjectMap