From 5c789d7ac0a98e7ccc5ae6bccedef59621bb9c7f Mon Sep 17 00:00:00 2001 From: Techcable 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 + } + } + + /** + *

+ * 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:

+ * + * StringBuffer data = new StringBuffer(); + * data.append(encode("guid")).append('=').append(encode(guid)); + * encodeDataPair(data, "version", description.getVersion()); + * + * + * @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 + *

+ * 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 - } - } - - /** - *

- * 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:

- * - * StringBuffer data = new StringBuffer(); - * data.append(encode("guid")).append('=').append(encode(guid)); - * encodeDataPair(data, "version", description.getVersion()); - * - * - * @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.3