diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 0cd182e..1bdafdc 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -17,18 +17,16 @@ jobs: with: java-version: 1.8 - name: Build with Gradle - run: ./gradlew build + run: ./gradlew shadowJar - uses: webfactory/ssh-agent@v0.1.1 with: ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }} - name: Push jar run: | mv ./build/libs/*.jar ./mineweb_bridge-$VERSION.jar - git config --global user.email "paypal@mineweb.org" - git config --global user.name "MineWeb Bot" git add mineweb_bridge-$VERSION.jar git commit -m "build: Add mineweb_bridge-$VERSION.jar" git push $REPO master env: REPO: git@github.com:${{github.repository}}.git - VERSION: "3.0.0" + VERSION: "3.0.1" diff --git a/build.gradle b/build.gradle index 3b167f0..4d087a2 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'eclipse' apply plugin: 'maven' group = 'fr.vmarchaud' -version = '3.0.0' +version = '3.0.1' description = "mineweb_bridge" @@ -24,6 +24,7 @@ repositories { mavenLocal() maven { url "https://hub.spigotmc.org/nexus/content/groups/public/" } maven { url "http://repo.dmulloy2.net/content/groups/public/" } + maven { url 'https://repo.spongepowered.org/maven' } mavenCentral() jcenter() flatDir { @@ -32,17 +33,18 @@ repositories { } dependencies { - compile "com.google.guava:guava:17.0" + compileOnly "com.google.guava:guava:17.0" //compile files('/Users/valentin/Sites/mineweb_bridge/guava-17.0.jar') //compile group: 'com.google.guava', name: 'guava', version: '17.0' - compile "com.google.code.gson:gson:2.5" - compile ("com.comphenix.protocol:ProtocolLib:4.4.0") { + compileOnly "com.google.code.gson:gson:2.5" + compileOnly ("com.comphenix.protocol:ProtocolLib:4.4.0") { exclude group: "com.comphenix.executors" // For exclude group: "cglib" } compile 'com.annimon:stream:1.1.1' compile 'javax.xml.bind:jaxb-api:2.3.0' + compileOnly 'org.spongepowered:spongeapi:7.1.0' compileOnly "org.spigotmc:spigot-api:1.14.4-R0.1-SNAPSHOT" compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' diff --git a/mineweb_bridge-3.0.1.jar b/mineweb_bridge-3.0.1.jar new file mode 100644 index 0000000..0fcb3bb Binary files /dev/null and b/mineweb_bridge-3.0.1.jar differ diff --git a/src/main/java/fr/vmarchaud/mineweb/bukkit/BukkitCore.java b/src/main/java/fr/vmarchaud/mineweb/bukkit/BukkitCore.java index 9d3c313..ce73dbd 100644 --- a/src/main/java/fr/vmarchaud/mineweb/bukkit/BukkitCore.java +++ b/src/main/java/fr/vmarchaud/mineweb/bukkit/BukkitCore.java @@ -23,51 +23,37 @@ *******************************************************************************/ package fr.vmarchaud.mineweb.bukkit; -import java.io.File; -import java.io.IOException; -import java.text.DateFormat; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.logging.FileHandler; -import java.util.logging.Level; -import java.util.logging.Logger; - -import fr.vmarchaud.mineweb.common.injector.NettyServer; -import fr.vmarchaud.mineweb.common.injector.WebThread; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; -import org.bukkit.command.CommandSender; -import org.bukkit.command.Command; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; - -import fr.vmarchaud.mineweb.bukkit.methods.BukkitGetBannedPlayers; -import fr.vmarchaud.mineweb.bukkit.methods.BukkitGetMOTD; -import fr.vmarchaud.mineweb.bukkit.methods.BukkitGetMaxPlayers; -import fr.vmarchaud.mineweb.bukkit.methods.BukkitGetVersion; -import fr.vmarchaud.mineweb.bukkit.methods.BukkitGetWhitelistedPlayers; +import fr.vmarchaud.mineweb.bukkit.methods.*; +import fr.vmarchaud.mineweb.common.CommandScheduler; import fr.vmarchaud.mineweb.common.ICore; import fr.vmarchaud.mineweb.common.IMethod; import fr.vmarchaud.mineweb.common.RequestHandler; -import fr.vmarchaud.mineweb.common.CommandScheduler; import fr.vmarchaud.mineweb.common.configuration.PluginConfiguration; import fr.vmarchaud.mineweb.common.configuration.ScheduledStorage; import fr.vmarchaud.mineweb.common.injector.NettyInjector; +import fr.vmarchaud.mineweb.common.injector.WebThread; import fr.vmarchaud.mineweb.common.injector.router.RouteMatcher; -import fr.vmarchaud.mineweb.common.methods.CommonGetPlayerCount; -import fr.vmarchaud.mineweb.common.methods.CommonGetPlayerList; -import fr.vmarchaud.mineweb.common.methods.CommonGetSystemStats; -import fr.vmarchaud.mineweb.common.methods.CommonGetTimestamp; -import fr.vmarchaud.mineweb.common.methods.CommonIsConnected; -import fr.vmarchaud.mineweb.common.methods.CommonPluginType; -import fr.vmarchaud.mineweb.common.methods.CommonRunCommand; -import fr.vmarchaud.mineweb.common.methods.CommonScheduledCommand; +import fr.vmarchaud.mineweb.common.methods.*; import fr.vmarchaud.mineweb.utils.CustomLogFormatter; import fr.vmarchaud.mineweb.utils.http.HttpResponseBuilder; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; public class BukkitCore extends JavaPlugin implements ICore { @@ -109,10 +95,17 @@ public void onEnable() { logger.info("Loading ..."); methods = new HashMap(); players = new HashSet(); - if (config.getPort() == null) + + if (config.getPort() == null) { + if (!Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { + throw new RuntimeException("The bridge requires ProtocolLib to run on server's port"); + } + injector = new BukkitNettyInjector(this); - else + } else { nettyServerThread = new WebThread(this); + } + httpRouter = new RouteMatcher(); logger.info("Registering route ..."); registerRoutes(); diff --git a/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeCore.java b/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeCore.java index b9b025c..7db1ce8 100644 --- a/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeCore.java +++ b/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeCore.java @@ -23,43 +23,36 @@ *******************************************************************************/ package fr.vmarchaud.mineweb.bungee; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.logging.FileHandler; -import java.util.logging.Level; -import java.util.logging.Logger; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; - import fr.vmarchaud.mineweb.bungee.methods.BungeeGetMOTD; import fr.vmarchaud.mineweb.bungee.methods.BungeeGetMaxPlayers; import fr.vmarchaud.mineweb.bungee.methods.BungeeGetVersion; +import fr.vmarchaud.mineweb.common.CommandScheduler; import fr.vmarchaud.mineweb.common.ICore; import fr.vmarchaud.mineweb.common.IMethod; import fr.vmarchaud.mineweb.common.RequestHandler; -import fr.vmarchaud.mineweb.common.CommandScheduler; import fr.vmarchaud.mineweb.common.configuration.PluginConfiguration; import fr.vmarchaud.mineweb.common.configuration.ScheduledStorage; import fr.vmarchaud.mineweb.common.injector.NettyInjector; +import fr.vmarchaud.mineweb.common.injector.WebThread; import fr.vmarchaud.mineweb.common.injector.router.RouteMatcher; -import fr.vmarchaud.mineweb.common.methods.CommonGetPlayerCount; -import fr.vmarchaud.mineweb.common.methods.CommonGetPlayerList; -import fr.vmarchaud.mineweb.common.methods.CommonGetSystemStats; -import fr.vmarchaud.mineweb.common.methods.CommonGetTimestamp; -import fr.vmarchaud.mineweb.common.methods.CommonIsConnected; -import fr.vmarchaud.mineweb.common.methods.CommonPluginType; -import fr.vmarchaud.mineweb.common.methods.CommonRunCommand; -import fr.vmarchaud.mineweb.common.methods.CommonScheduledCommand; +import fr.vmarchaud.mineweb.common.methods.*; import fr.vmarchaud.mineweb.utils.CustomLogFormatter; import fr.vmarchaud.mineweb.utils.http.HttpResponseBuilder; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.scheduler.ScheduledTask; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + public class BungeeCore extends Plugin implements ICore { public static ICore instance; @@ -69,6 +62,7 @@ public static ICore get() { private RouteMatcher httpRouter; private NettyInjector injector; + private WebThread nettyServerThread; private HashMap methods; private RequestHandler requestHandler; private PluginConfiguration config; @@ -104,8 +98,14 @@ public void onEnable() { getProxy().getPluginManager().registerListener(this, new BungeeListeners(instance)); // inject when we are ready - logger.info("Injecting http server ..."); - injector.inject(); + if(config.port == null) { + logger.info("Injecting http server ..."); + injector.inject(); + } else { + logger.info("Starting http server thread ..."); + nettyServerThread = new WebThread(this); + nettyServerThread.start(); + } logger.info("Registering methods ..."); requestHandler = new RequestHandler(instance); registerMethods(); @@ -226,4 +226,8 @@ public void runCommand(String command) { public CommandScheduler getCommandScheduler() { return commandScheduler; } + + public NettyInjector getInjector() { + return injector; + } } diff --git a/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeNettyInjector.java b/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeNettyInjector.java index cc5a21a..0d28143 100644 --- a/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeNettyInjector.java +++ b/src/main/java/fr/vmarchaud/mineweb/bungee/BungeeNettyInjector.java @@ -23,9 +23,6 @@ *******************************************************************************/ package fr.vmarchaud.mineweb.bungee; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; - import fr.vmarchaud.mineweb.common.ICore; import fr.vmarchaud.mineweb.common.injector.JSONAPIChannelDecoder; import fr.vmarchaud.mineweb.common.injector.NettyInjector; @@ -37,11 +34,10 @@ import net.md_5.bungee.connection.InitialHandler; import net.md_5.bungee.netty.HandlerBoss; import net.md_5.bungee.netty.PipelineUtils; -import net.md_5.bungee.protocol.KickStringWriter; -import net.md_5.bungee.protocol.LegacyDecoder; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.MinecraftEncoder; -import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.*; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; public class BungeeNettyInjector extends NettyInjector { @@ -60,6 +56,7 @@ public synchronized void inject() { Class server = PipelineUtils.class; Field field = server.getDeclaredField("SERVER_CHILD"); Field modifiersField = Field.class.getDeclaredField("modifiers"); + field.setAccessible(true); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); diff --git a/src/main/java/fr/vmarchaud/mineweb/common/configuration/PluginConfiguration.java b/src/main/java/fr/vmarchaud/mineweb/common/configuration/PluginConfiguration.java index abe67ed..ffa1b35 100644 --- a/src/main/java/fr/vmarchaud/mineweb/common/configuration/PluginConfiguration.java +++ b/src/main/java/fr/vmarchaud/mineweb/common/configuration/PluginConfiguration.java @@ -1,13 +1,13 @@ package fr.vmarchaud.mineweb.common.configuration; +import fr.vmarchaud.mineweb.common.ICore; +import lombok.Data; + import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import fr.vmarchaud.mineweb.common.ICore; -import lombok.Data; - @Data public class PluginConfiguration { @@ -24,11 +24,8 @@ public PluginConfiguration(File path) { /** * Load the configuration from the file - * @param File object representing the path of the file - * @param ICore interface for logging and use gson instance - * - * @throws IllegalAccessException - * @throws InstantiationException + * @param path object representing the path of the file + * @param api interface for logging and use gson instance */ public static PluginConfiguration load(File path, ICore api) { if (path.exists()) { @@ -45,21 +42,30 @@ public static PluginConfiguration load(File path, ICore api) { if (reader != null) { try { reader.close(); - } catch (IOException e) {} + } catch (IOException e) { + e.printStackTrace(); + } } } } else { api.logger().warning("Cant find a config file, creating it"); - return new PluginConfiguration(path); + PluginConfiguration config = new PluginConfiguration(path); + config.save(api); + return config; } } /** * Save the configuration to the file - * @param ICore interface for logging and use gson instance + * @param api interface for logging and use gson instance */ public void save(ICore api) { try { + // Create the folder + new File(path.getParent()).mkdirs(); + // Create the file + path.createNewFile(); + // Write it String config = api.gson().toJson(this); FileWriter writer = new FileWriter(path); writer.write(config); diff --git a/src/main/java/fr/vmarchaud/mineweb/common/injector/WebThread.java b/src/main/java/fr/vmarchaud/mineweb/common/injector/WebThread.java index 1ae54b1..38db953 100644 --- a/src/main/java/fr/vmarchaud/mineweb/common/injector/WebThread.java +++ b/src/main/java/fr/vmarchaud/mineweb/common/injector/WebThread.java @@ -2,7 +2,6 @@ import fr.vmarchaud.mineweb.common.ICore; import lombok.Getter; -import org.bukkit.Bukkit; public class WebThread extends Thread { @@ -20,7 +19,6 @@ public void run() { try { webServer.start(); } catch (Exception e) { - Bukkit.getConsoleSender().sendMessage("HTTP server start failed! (" + e.getMessage() + ")"); api.logger().info("HTTP server start failed! (" + e.getMessage() + ")"); this.interrupt(); } diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index 879864e..407232d 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -1,4 +1,4 @@ name: MinewebBridge main: fr.vmarchaud.mineweb.bungee.BungeeCore -version: 1.0 -author: ThisIsMac +version: 3.0.1 +author: ThisIsMac, Shyrogan diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 99f47d6..6758daa 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,12 @@ name: MinewebBridge main: fr.vmarchaud.mineweb.bukkit.BukkitCore -version: 2.0.0 -author: ThisIsMac +version: 3.0.1 +authors: + - ThisIsMac + - Shyrogan +softdepend: + - ProtocolLib +load: STARTUP commands: mineweb: description: Commands to manage MineWebBridge