mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-11-24 19:25:16 +01:00
346 lines
12 KiB
Diff
346 lines
12 KiB
Diff
From 85d4b2dd2289a9c7abfe027d9cc31d0338c3ad4f Mon Sep 17 00:00:00 2001
|
|
From: Techcable <Techcable@techcable.net>
|
|
Date: Thu, 19 May 2016 10:55:20 -0700
|
|
Subject: [PATCH] Configurable Waterfall Metrics
|
|
|
|
|
|
diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
index b30541b..293ec4e 100644
|
|
--- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
@@ -84,4 +84,8 @@ public interface ProxyConfig
|
|
// Waterfall Options
|
|
//
|
|
|
|
+ /**
|
|
+ * If metrics is enabled
|
|
+ */
|
|
+ boolean isMetrics();
|
|
}
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/Metrics.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/Metrics.java
|
|
new file mode 100644
|
|
index 0000000..ae5a2a9
|
|
--- /dev/null
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/Metrics.java
|
|
@@ -0,0 +1,131 @@
|
|
+package io.github.waterfallmc.waterfall;
|
|
+
|
|
+import java.io.BufferedReader;
|
|
+import java.io.IOException;
|
|
+import java.io.InputStreamReader;
|
|
+import java.io.OutputStreamWriter;
|
|
+import java.io.UnsupportedEncodingException;
|
|
+import java.net.URL;
|
|
+import java.net.URLConnection;
|
|
+import java.net.URLEncoder;
|
|
+import java.util.TimerTask;
|
|
+
|
|
+import net.md_5.bungee.BungeeCord;
|
|
+import net.md_5.bungee.api.ProxyServer;
|
|
+
|
|
+public class Metrics extends TimerTask
|
|
+{
|
|
+
|
|
+ /**
|
|
+ * The current revision number
|
|
+ */
|
|
+ private final static int REVISION = 5;
|
|
+ /**
|
|
+ * The base url of the metrics domain
|
|
+ */
|
|
+ private static final String BASE_URL = "http://mcstats.org";
|
|
+ /**
|
|
+ * The url used to report a server's status
|
|
+ */
|
|
+ private static final String REPORT_URL = "/report/%s";
|
|
+ /**
|
|
+ * Interval of time to ping (in minutes)
|
|
+ */
|
|
+ public final static int PING_INTERVAL = 10;
|
|
+ boolean firstPost = true;
|
|
+
|
|
+ @Override
|
|
+ public void run()
|
|
+ {
|
|
+ try
|
|
+ {
|
|
+ // We use the inverse of firstPost because if it is the first time we are posting,
|
|
+ // it is not a interval ping, so it evaluates to FALSE
|
|
+ // Each time thereafter it will evaluate to TRUE, i.e PING!
|
|
+ postPlugin( !firstPost );
|
|
+
|
|
+ // After the first post we set firstPost to false
|
|
+ // Each post thereafter will be a ping
|
|
+ firstPost = false;
|
|
+ } catch ( IOException ex )
|
|
+ {
|
|
+ // ProxyServer.getInstance().getLogger().info( "[Metrics] " + ex.getMessage() );
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Generic method that posts a plugin to the metrics website
|
|
+ */
|
|
+ private void postPlugin(boolean isPing) throws IOException
|
|
+ {
|
|
+ // Construct the post data
|
|
+ final StringBuilder data = new StringBuilder();
|
|
+ data.append( encode( "guid" ) ).append( '=' ).append( encode( BungeeCord.getInstance().config.getUuid() ) );
|
|
+ encodeDataPair( data, "version", ProxyServer.getInstance().getVersion() );
|
|
+ encodeDataPair( data, "server", "0" );
|
|
+ encodeDataPair( data, "players", Integer.toString( ProxyServer.getInstance().getOnlineCount() ) );
|
|
+ encodeDataPair( data, "revision", String.valueOf( REVISION ) );
|
|
+
|
|
+ // If we're pinging, append it
|
|
+ if ( isPing )
|
|
+ {
|
|
+ encodeDataPair( data, "ping", "true" );
|
|
+ }
|
|
+
|
|
+ // Create the url
|
|
+ URL url = new URL( BASE_URL + String.format( REPORT_URL, encode( "Waterfall" ) ) );
|
|
+
|
|
+ // Connect to the website
|
|
+ URLConnection connection;
|
|
+
|
|
+ connection = url.openConnection();
|
|
+
|
|
+ connection.setDoOutput( true );
|
|
+ final BufferedReader reader;
|
|
+ final String response;
|
|
+ try ( OutputStreamWriter writer = new OutputStreamWriter( connection.getOutputStream() ) )
|
|
+ {
|
|
+ writer.write( data.toString() );
|
|
+ writer.flush();
|
|
+ reader = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
|
|
+ response = reader.readLine();
|
|
+ }
|
|
+ reader.close();
|
|
+
|
|
+ if ( response == null || response.startsWith( "ERR" ) )
|
|
+ {
|
|
+ throw new IOException( response ); //Throw the exception
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * <p>
|
|
+ * Encode a key/value data pair to be used in a HTTP post request. This
|
|
+ * INCLUDES a & so the first key/value pair MUST be included manually,
|
|
+ * e.g:</p>
|
|
+ * <code>
|
|
+ * StringBuffer data = new StringBuffer();
|
|
+ * data.append(encode("guid")).append('=').append(encode(guid));
|
|
+ * encodeDataPair(data, "version", description.getVersion());
|
|
+ * </code>
|
|
+ *
|
|
+ * @param buffer the StringBuilder to append the data pair onto
|
|
+ * @param key the key value
|
|
+ * @param value the value
|
|
+ */
|
|
+ private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException
|
|
+ {
|
|
+ buffer.append( '&' ).append( encode( key ) ).append( '=' ).append( encode( value ) );
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Encode text as UTF-8
|
|
+ *
|
|
+ * @param text the text to encode
|
|
+ * @return the encoded text, as UTF-8
|
|
+ */
|
|
+ private static String encode(final String text) throws UnsupportedEncodingException
|
|
+ {
|
|
+ return URLEncoder.encode( text, "UTF-8" );
|
|
+ }
|
|
+}
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
index 03160da..1fa3ecd 100644
|
|
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
@@ -10,10 +10,23 @@ import net.md_5.bungee.conf.YamlConfig;
|
|
|
|
public class WaterfallConfiguration extends Configuration {
|
|
|
|
+ /**
|
|
+ * If metrics is enabled
|
|
+ * <p>
|
|
+ * Default is true (enabled)
|
|
+ */
|
|
+ private boolean metrics = true;
|
|
+
|
|
@Override
|
|
public void load() {
|
|
super.load();
|
|
YamlConfig config = new YamlConfig(new File("waterfall.yml"));
|
|
config.load(false); // Load, but no permissions
|
|
+ metrics = config.getBoolean("metrics", metrics);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isMetrics() {
|
|
+ return metrics;
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
index 3dceb6e..3578aa4 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
@@ -23,6 +23,7 @@ import net.md_5.bungee.scheduler.BungeeScheduler;
|
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
import com.google.gson.Gson;
|
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
+import io.github.waterfallmc.waterfall.Metrics;
|
|
import io.github.waterfallmc.waterfall.conf.WaterfallConfiguration;
|
|
import io.netty.bootstrap.ServerBootstrap;
|
|
import io.netty.channel.Channel;
|
|
@@ -284,7 +285,9 @@ public class BungeeCord extends ProxyServer
|
|
}
|
|
}
|
|
}, 0, TimeUnit.MINUTES.toMillis( 5 ) );
|
|
- metricsThread.scheduleAtFixedRate( new Metrics(), 0, TimeUnit.MINUTES.toMillis( Metrics.PING_INTERVAL ) );
|
|
+ if (config.isMetrics()) {
|
|
+ metricsThread.scheduleAtFixedRate( new Metrics(), 0, TimeUnit.MINUTES.toMillis( Metrics.PING_INTERVAL ) );
|
|
+ }
|
|
}
|
|
|
|
public void startListeners()
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/Metrics.java b/proxy/src/main/java/net/md_5/bungee/Metrics.java
|
|
deleted file mode 100644
|
|
index 9523987..0000000
|
|
--- a/proxy/src/main/java/net/md_5/bungee/Metrics.java
|
|
+++ /dev/null
|
|
@@ -1,129 +0,0 @@
|
|
-package net.md_5.bungee;
|
|
-
|
|
-import java.io.BufferedReader;
|
|
-import java.io.IOException;
|
|
-import java.io.InputStreamReader;
|
|
-import java.io.OutputStreamWriter;
|
|
-import java.io.UnsupportedEncodingException;
|
|
-import java.net.URL;
|
|
-import java.net.URLConnection;
|
|
-import java.net.URLEncoder;
|
|
-import java.util.TimerTask;
|
|
-import net.md_5.bungee.api.ProxyServer;
|
|
-
|
|
-public class Metrics extends TimerTask
|
|
-{
|
|
-
|
|
- /**
|
|
- * The current revision number
|
|
- */
|
|
- private final static int REVISION = 5;
|
|
- /**
|
|
- * The base url of the metrics domain
|
|
- */
|
|
- private static final String BASE_URL = "http://mcstats.org";
|
|
- /**
|
|
- * The url used to report a server's status
|
|
- */
|
|
- private static final String REPORT_URL = "/report/%s";
|
|
- /**
|
|
- * Interval of time to ping (in minutes)
|
|
- */
|
|
- final static int PING_INTERVAL = 10;
|
|
- boolean firstPost = true;
|
|
-
|
|
- @Override
|
|
- public void run()
|
|
- {
|
|
- try
|
|
- {
|
|
- // We use the inverse of firstPost because if it is the first time we are posting,
|
|
- // it is not a interval ping, so it evaluates to FALSE
|
|
- // Each time thereafter it will evaluate to TRUE, i.e PING!
|
|
- postPlugin( !firstPost );
|
|
-
|
|
- // After the first post we set firstPost to false
|
|
- // Each post thereafter will be a ping
|
|
- firstPost = false;
|
|
- } catch ( IOException ex )
|
|
- {
|
|
- // ProxyServer.getInstance().getLogger().info( "[Metrics] " + ex.getMessage() );
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * Generic method that posts a plugin to the metrics website
|
|
- */
|
|
- private void postPlugin(boolean isPing) throws IOException
|
|
- {
|
|
- // Construct the post data
|
|
- final StringBuilder data = new StringBuilder();
|
|
- data.append( encode( "guid" ) ).append( '=' ).append( encode( BungeeCord.getInstance().config.getUuid() ) );
|
|
- encodeDataPair( data, "version", ProxyServer.getInstance().getVersion() );
|
|
- encodeDataPair( data, "server", "0" );
|
|
- encodeDataPair( data, "players", Integer.toString( ProxyServer.getInstance().getOnlineCount() ) );
|
|
- encodeDataPair( data, "revision", String.valueOf( REVISION ) );
|
|
-
|
|
- // If we're pinging, append it
|
|
- if ( isPing )
|
|
- {
|
|
- encodeDataPair( data, "ping", "true" );
|
|
- }
|
|
-
|
|
- // Create the url
|
|
- URL url = new URL( BASE_URL + String.format( REPORT_URL, encode( "BungeeCord" ) ) );
|
|
-
|
|
- // Connect to the website
|
|
- URLConnection connection;
|
|
-
|
|
- connection = url.openConnection();
|
|
-
|
|
- connection.setDoOutput( true );
|
|
- final BufferedReader reader;
|
|
- final String response;
|
|
- try ( OutputStreamWriter writer = new OutputStreamWriter( connection.getOutputStream() ) )
|
|
- {
|
|
- writer.write( data.toString() );
|
|
- writer.flush();
|
|
- reader = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
|
|
- response = reader.readLine();
|
|
- }
|
|
- reader.close();
|
|
-
|
|
- if ( response == null || response.startsWith( "ERR" ) )
|
|
- {
|
|
- throw new IOException( response ); //Throw the exception
|
|
- }
|
|
- }
|
|
-
|
|
- /**
|
|
- * <p>
|
|
- * Encode a key/value data pair to be used in a HTTP post request. This
|
|
- * INCLUDES a & so the first key/value pair MUST be included manually,
|
|
- * e.g:</p>
|
|
- * <code>
|
|
- * StringBuffer data = new StringBuffer();
|
|
- * data.append(encode("guid")).append('=').append(encode(guid));
|
|
- * encodeDataPair(data, "version", description.getVersion());
|
|
- * </code>
|
|
- *
|
|
- * @param buffer the StringBuilder to append the data pair onto
|
|
- * @param key the key value
|
|
- * @param value the value
|
|
- */
|
|
- private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException
|
|
- {
|
|
- buffer.append( '&' ).append( encode( key ) ).append( '=' ).append( encode( value ) );
|
|
- }
|
|
-
|
|
- /**
|
|
- * Encode text as UTF-8
|
|
- *
|
|
- * @param text the text to encode
|
|
- * @return the encoded text, as UTF-8
|
|
- */
|
|
- private static String encode(final String text) throws UnsupportedEncodingException
|
|
- {
|
|
- return URLEncoder.encode( text, "UTF-8" );
|
|
- }
|
|
-}
|
|
--
|
|
2.8.2
|
|
|