Initial commit
This commit is contained in:
		
				commit
				
					
						760e926bec
					
				
			
		
					 8 changed files with 265 additions and 0 deletions
				
			
		
							
								
								
									
										38
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					target/
 | 
				
			||||||
 | 
					!.mvn/wrapper/maven-wrapper.jar
 | 
				
			||||||
 | 
					!**/src/main/**/target/
 | 
				
			||||||
 | 
					!**/src/test/**/target/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### IntelliJ IDEA ###
 | 
				
			||||||
 | 
					.idea/modules.xml
 | 
				
			||||||
 | 
					.idea/jarRepositories.xml
 | 
				
			||||||
 | 
					.idea/compiler.xml
 | 
				
			||||||
 | 
					.idea/libraries/
 | 
				
			||||||
 | 
					*.iws
 | 
				
			||||||
 | 
					*.iml
 | 
				
			||||||
 | 
					*.ipr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Eclipse ###
 | 
				
			||||||
 | 
					.apt_generated
 | 
				
			||||||
 | 
					.classpath
 | 
				
			||||||
 | 
					.factorypath
 | 
				
			||||||
 | 
					.project
 | 
				
			||||||
 | 
					.settings
 | 
				
			||||||
 | 
					.springBeans
 | 
				
			||||||
 | 
					.sts4-cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### NetBeans ###
 | 
				
			||||||
 | 
					/nbproject/private/
 | 
				
			||||||
 | 
					/nbbuild/
 | 
				
			||||||
 | 
					/dist/
 | 
				
			||||||
 | 
					/nbdist/
 | 
				
			||||||
 | 
					/.nb-gradle/
 | 
				
			||||||
 | 
					build/
 | 
				
			||||||
 | 
					!**/src/main/**/build/
 | 
				
			||||||
 | 
					!**/src/test/**/build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### VS Code ###
 | 
				
			||||||
 | 
					.vscode/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Mac OS ###
 | 
				
			||||||
 | 
					.DS_Store
 | 
				
			||||||
							
								
								
									
										3
									
								
								.idea/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.idea/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					# Default ignored files
 | 
				
			||||||
 | 
					/shelf/
 | 
				
			||||||
 | 
					/workspace.xml
 | 
				
			||||||
							
								
								
									
										7
									
								
								.idea/encodings.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.idea/encodings.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="Encoding">
 | 
				
			||||||
 | 
					    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
 | 
				
			||||||
 | 
					    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										14
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="ExternalStorageConfigurationManager" enabled="true" />
 | 
				
			||||||
 | 
					  <component name="MavenProjectsManager">
 | 
				
			||||||
 | 
					    <option name="originalFiles">
 | 
				
			||||||
 | 
					      <list>
 | 
				
			||||||
 | 
					        <option value="$PROJECT_DIR$/pom.xml" />
 | 
				
			||||||
 | 
					      </list>
 | 
				
			||||||
 | 
					    </option>
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21" project-jdk-type="JavaSDK">
 | 
				
			||||||
 | 
					    <output url="file://$PROJECT_DIR$/out" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										6
									
								
								.idea/vcs.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/vcs.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="VcsDirectoryMappings">
 | 
				
			||||||
 | 
					    <mapping directory="$PROJECT_DIR$" vcs="Git" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										31
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					### Instructions
 | 
				
			||||||
 | 
					In `pom.xml`:
 | 
				
			||||||
 | 
					```xml
 | 
				
			||||||
 | 
					<dependency>
 | 
				
			||||||
 | 
					    <groupId>eu.m724</groupId>
 | 
				
			||||||
 | 
					    <artifactId>mstats-spigot</artifactId>
 | 
				
			||||||
 | 
					</dependency>
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In `plugin.yml`:
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					libraries:
 | 
				
			||||||
 | 
					  - eu.m724:mstats-spigot
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In main class:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import eu.m724.mstats.MStats;
 | 
				
			||||||
 | 
					import org.bukkit.plugin.java.JavaPlugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MyPlugin extends JavaPlugin {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onEnable() {
 | 
				
			||||||
 | 
					        // it's recommended that this is the last line of onEnable
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        int mStatsId = 1; // replace this of course with your plugin ID
 | 
				
			||||||
 | 
					        MStats.init(this, mStatsId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										41
									
								
								pom.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								pom.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
				
			||||||
 | 
					         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
				
			||||||
 | 
					         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
				
			||||||
 | 
					    <modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <groupId>eu.m724</groupId>
 | 
				
			||||||
 | 
					    <artifactId>mstats-spigot</artifactId>
 | 
				
			||||||
 | 
					    <version>0.1.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <properties>
 | 
				
			||||||
 | 
					        <maven.compiler.source>21</maven.compiler.source>
 | 
				
			||||||
 | 
					        <maven.compiler.target>21</maven.compiler.target>
 | 
				
			||||||
 | 
					        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
				
			||||||
 | 
					        <project.spigot.version>1.21.1-R0.1-SNAPSHOT</project.spigot.version>
 | 
				
			||||||
 | 
					    </properties>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <repositories>
 | 
				
			||||||
 | 
					        <repository>
 | 
				
			||||||
 | 
					            <id>spigot-repo</id>
 | 
				
			||||||
 | 
					            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
 | 
				
			||||||
 | 
					        </repository>
 | 
				
			||||||
 | 
					        <repository>
 | 
				
			||||||
 | 
					            <id>m724-repo</id>
 | 
				
			||||||
 | 
					            <url>https://git.m724.eu/api/packages/Minecon724/maven</url>
 | 
				
			||||||
 | 
					        </repository>
 | 
				
			||||||
 | 
					    </repositories>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <dependencies>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>org.spigotmc</groupId>
 | 
				
			||||||
 | 
					            <artifactId>spigot-api</artifactId>
 | 
				
			||||||
 | 
					            <version>${project.spigot.version}</version>
 | 
				
			||||||
 | 
					            <scope>provided</scope>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
 | 
					    </dependencies>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <scm>
 | 
				
			||||||
 | 
					        <developerConnection>scm:git:git@git.m724.eu:Minecon724/mstats-spigot.git</developerConnection>
 | 
				
			||||||
 | 
					    </scm>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										125
									
								
								src/main/java/eu/m724/mstats/MStats.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/main/java/eu/m724/mstats/MStats.java
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,125 @@
 | 
				
			||||||
 | 
					package eu.m724.mstats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gson.*;
 | 
				
			||||||
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
 | 
					import org.bukkit.scheduler.BukkitRunnable;
 | 
				
			||||||
 | 
					import org.bukkit.scheduler.BukkitTask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.net.URI;
 | 
				
			||||||
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
 | 
					import java.net.http.HttpClient;
 | 
				
			||||||
 | 
					import java.net.http.HttpRequest;
 | 
				
			||||||
 | 
					import java.net.http.HttpResponse;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.logging.Logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MStats extends BukkitRunnable {
 | 
				
			||||||
 | 
					    private static final int VERSION = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private BukkitTask task;
 | 
				
			||||||
 | 
					    private final Map<Plugin, Integer> registeredPlugins = new HashMap<>();
 | 
				
			||||||
 | 
					    private final Plugin plugin;
 | 
				
			||||||
 | 
					    private final Logger logger = Logger.getLogger("mStats");
 | 
				
			||||||
 | 
					    private String token = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static MStats INSTANCE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MStats(Plugin plugin) {
 | 
				
			||||||
 | 
					        this.plugin = plugin;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void init(Plugin plugin, int id) {
 | 
				
			||||||
 | 
					        if (INSTANCE != null && INSTANCE.plugin.isEnabled()) {
 | 
				
			||||||
 | 
					            INSTANCE.registeredPlugins.put(plugin, id);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var mStats = new MStats(plugin);
 | 
				
			||||||
 | 
					        mStats.registeredPlugins.put(plugin, id);
 | 
				
			||||||
 | 
					        mStats.init();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void init() {
 | 
				
			||||||
 | 
					        if (INSTANCE != null) {
 | 
				
			||||||
 | 
					            logger.info("Plugin crashed. Restarting mStats.");
 | 
				
			||||||
 | 
					            task.cancel();
 | 
				
			||||||
 | 
					            // some plugins may have registered before the one that crashed
 | 
				
			||||||
 | 
					            this.registeredPlugins.putAll(INSTANCE.registeredPlugins);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        INSTANCE = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // a scheduler starts running the first tick after everything was loaded
 | 
				
			||||||
 | 
					        task = new BukkitRunnable() {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void run() {
 | 
				
			||||||
 | 
					                firstRun();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }.runTaskLater(plugin, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        logger.info("mStats running as " + plugin.getName());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void firstRun() {
 | 
				
			||||||
 | 
					        for (Plugin plugin : this.registeredPlugins.keySet()) {
 | 
				
			||||||
 | 
					            if (!plugin.isEnabled()) {
 | 
				
			||||||
 | 
					                // remove broken plugins
 | 
				
			||||||
 | 
					                this.registeredPlugins.remove(plugin);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        task.cancel();
 | 
				
			||||||
 | 
					        task = this.runTaskTimerAsynchronously(plugin, 0, 72000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO don't send this every time
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void run() {
 | 
				
			||||||
 | 
					        var json = new JsonObject();
 | 
				
			||||||
 | 
					        var pla = new JsonArray();
 | 
				
			||||||
 | 
					        registeredPlugins.forEach((key, value) -> {
 | 
				
			||||||
 | 
					            var o1 = new JsonObject();
 | 
				
			||||||
 | 
					            o1.addProperty("id", value);
 | 
				
			||||||
 | 
					            o1.addProperty("version", key.getDescription().getVersion());
 | 
				
			||||||
 | 
					            pla.add(o1);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        json.add("plugins", pla);
 | 
				
			||||||
 | 
					        json.addProperty("serverVersion", plugin.getServer().getVersion());
 | 
				
			||||||
 | 
					        json.addProperty("statsVersion", VERSION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HttpRequest request;
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            request = HttpRequest
 | 
				
			||||||
 | 
					                    .newBuilder(new URI("http://localhost:8080/api/server/heartbeat"))
 | 
				
			||||||
 | 
					                    .POST(HttpRequest.BodyPublishers.ofString(new Gson().toJson(json)))
 | 
				
			||||||
 | 
					                    .header("X-Server-Token", token)
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
 | 
					        } catch (URISyntaxException e) { throw new RuntimeException(e); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try (HttpClient httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NEVER).build()) {
 | 
				
			||||||
 | 
					            httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAccept(resp -> {
 | 
				
			||||||
 | 
					                JsonObject response = JsonParser.parseString(resp.body()).getAsJsonObject();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (response.has("message")) {
 | 
				
			||||||
 | 
					                    logger.info("Message from metrics server: " + response.get("message").getAsString());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (resp.statusCode() != 200) {
 | 
				
			||||||
 | 
					                    logger.severe("Unable to contact metrics. It's not known why. " + resp.statusCode());
 | 
				
			||||||
 | 
					                    logger.severe(resp.body());
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (response.has("token")) {
 | 
				
			||||||
 | 
					                    this.token = response.get("token").getAsString();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (response.has("version")) {
 | 
				
			||||||
 | 
					                    // TODO
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue