Example #1
0
  /** Generic method that posts a plugin to the metrics website */
  private void postPlugin(boolean isPing) throws IOException {
    // Construct the post data
    String data =
        encode("guid")
            + '='
            + encode(guid)
            + encodeDataPair("version", Mafiacraft.getCore().getVersionDetailed())
            + encodeDataPair("server", Mafiacraft.getImpl().getServerVersion())
            + encodeDataPair("players", Integer.toString(Mafiacraft.getOnlinePlayers().size()))
            + encodeDataPair("revision", String.valueOf(REVISION));

    // If we're pinging, append it
    if (isPing) {
      data += encodeDataPair("ping", "true");
    }

    // Acquire a lock on the graphs, which lets us make the assumption we also lock everything
    // inside of the graph (e.g plotters)
    synchronized (graphs) {
      Iterator<Graph> iter = graphs.iterator();

      while (iter.hasNext()) {
        Graph graph = iter.next();

        // Because we have a lock on the graphs set already, it is reasonable to assume
        // that our lock transcends down to the individual plotters in the graphs also.
        // Because our methods are private, no one but us can reasonably access this list
        // without reflection so this is a safe assumption without adding more code.
        for (Plotter plotter : graph.getPlotters()) {
          // The key name to send to the metrics server
          // The format is C-GRAPHNAME-PLOTTERNAME where separator - is defined at the top
          // Legacy (R4) submitters use the format Custom%s, or CustomPLOTTERNAME
          String key =
              String.format(
                  "C%s%s%s%s",
                  CUSTOM_DATA_SEPARATOR,
                  graph.getName(),
                  CUSTOM_DATA_SEPARATOR,
                  plotter.getColumnName());

          // The value to send, which for the foreseeable future is just the string
          // value of plotter.getValue()
          String value = Integer.toString(plotter.getValue());

          // Add it to the http post data :)
          data += encodeDataPair(key, value);
        }
      }
    }

    // Create the url
    URL url = new URL(BASE_URL + String.format(REPORT_URL, "Mafiacraft"));

    // Connect to the website
    URLConnection connection;

    // Mineshafter creates a socks proxy, so we can safely bypass it
    // It does not reroute POST requests so we need to go around it
    if (isMineshafterPresent()) {
      connection = url.openConnection(Proxy.NO_PROXY);
    } else {
      connection = url.openConnection();
    }

    connection.setDoOutput(true);

    // Write the data
    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write(data);
    writer.flush();

    // Now read the response
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String response = reader.readLine();

    // close resources
    writer.close();
    reader.close();

    if (response.startsWith("ERR")) {
      throw new IOException(response); // Throw the exception
    } else {
      // Is this the first update this hour?
      if (response.contains("OK This is your first update this hour")) {
        synchronized (graphs) {
          Iterator<Graph> iter = graphs.iterator();

          while (iter.hasNext()) {
            Graph graph = iter.next();

            for (Plotter plotter : graph.getPlotters()) {
              plotter.reset();
            }
          }
        }
      }
    }
    // if (response.startsWith("OK")) - We should get "OK" followed by an optional description if
    // everything goes right
  }
Example #2
0
  /** Generic method that posts a plugin to the metrics website */
  private void postPlugin(final boolean isPing) throws IOException {
    // Server software specific section
    PluginDescriptionFile description = plugin.getDescription();
    String pluginName = description.getName();
    boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled
    String pluginVersion = description.getVersion();
    String serverVersion = Bukkit.getVersion();
    int playersOnline = Bukkit.getServer().getOnlinePlayers().length;

    // END server software specific section -- all code below does not use any code outside of this
    // class / Java

    // Construct the post data
    StringBuilder json = new StringBuilder(1024);
    json.append('{');

    // The plugin's description file containg all of the plugin data such as name, version, author,
    // etc
    appendJSONPair(json, "guid", guid);
    appendJSONPair(json, "plugin_version", pluginVersion);
    appendJSONPair(json, "server_version", serverVersion);
    appendJSONPair(json, "players_online", Integer.toString(playersOnline));

    // New data as of R6
    String osname = System.getProperty("os.name");
    String osarch = System.getProperty("os.arch");
    String osversion = System.getProperty("os.version");
    String java_version = System.getProperty("java.version");
    int coreCount = Runtime.getRuntime().availableProcessors();

    // normalize os arch .. amd64 -> x86_64
    if (osarch.equals("amd64")) {
      osarch = "x86_64";
    }

    appendJSONPair(json, "osname", osname);
    appendJSONPair(json, "osarch", osarch);
    appendJSONPair(json, "osversion", osversion);
    appendJSONPair(json, "cores", Integer.toString(coreCount));
    appendJSONPair(json, "auth_mode", onlineMode ? "1" : "0");
    appendJSONPair(json, "java_version", java_version);

    // If we're pinging, append it
    if (isPing) {
      appendJSONPair(json, "ping", "1");
    }

    if (graphs.size() > 0) {
      synchronized (graphs) {
        json.append(',');
        json.append('"');
        json.append("graphs");
        json.append('"');
        json.append(':');
        json.append('{');

        boolean firstGraph = true;

        final Iterator<Graph> iter = graphs.iterator();

        while (iter.hasNext()) {
          Graph graph = iter.next();

          StringBuilder graphJson = new StringBuilder();
          graphJson.append('{');

          for (Plotter plotter : graph.getPlotters()) {
            appendJSONPair(
                graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue()));
          }

          graphJson.append('}');

          if (!firstGraph) {
            json.append(',');
          }

          json.append(escapeJSON(graph.getName()));
          json.append(':');
          json.append(graphJson);

          firstGraph = false;
        }

        json.append('}');
      }
    }

    // close json
    json.append('}');

    // Create the url
    URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName)));

    // Connect to the website
    URLConnection connection;

    // Mineshafter creates a socks proxy, so we can safely bypass it
    // It does not reroute POST requests so we need to go around it
    if (isMineshafterPresent()) {
      connection = url.openConnection(Proxy.NO_PROXY);
    } else {
      connection = url.openConnection();
    }

    byte[] uncompressed = json.toString().getBytes();
    byte[] compressed = gzip(json.toString());

    // Headers
    connection.addRequestProperty("User-Agent", "MCStats/" + REVISION);
    connection.addRequestProperty("Content-Type", "application/json");
    connection.addRequestProperty("Content-Encoding", "gzip");
    connection.addRequestProperty("Content-Length", Integer.toString(compressed.length));
    connection.addRequestProperty("Accept", "application/json");
    connection.addRequestProperty("Connection", "close");

    connection.setDoOutput(true);

    if (debug) {
      System.out.println(
          "[Metrics] Prepared request for "
              + pluginName
              + " uncompressed="
              + uncompressed.length
              + " compressed="
              + compressed.length);
    }

    // Write the data
    OutputStream os = connection.getOutputStream();
    os.write(compressed);
    os.flush();

    // Now read the response
    final BufferedReader reader =
        new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String response = reader.readLine();

    // close resources
    os.close();
    reader.close();

    if (response == null || response.startsWith("ERR") || response.startsWith("7")) {
      if (response == null) {
        response = "null";
      } else if (response.startsWith("7")) {
        response = response.substring(response.startsWith("7,") ? 2 : 1);
      }

      throw new IOException(response);
    } else {
      // Is this the first update this hour?
      if (response.equals("1") || response.contains("This is your first update this hour")) {
        synchronized (graphs) {
          final Iterator<Graph> iter = graphs.iterator();

          while (iter.hasNext()) {
            final Graph graph = iter.next();

            for (Plotter plotter : graph.getPlotters()) {
              plotter.reset();
            }
          }
        }
      }
    }
  }
Example #3
0
  /** Generic method that posts a plugin to the metrics website */
  private void postPlugin(final boolean isPing) throws IOException {
    // Server software specific section
    PluginDescriptionFile description = plugin.getDescription();
    String pluginName = description.getName();
    boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if
    // online mode
    // is enabled
    String pluginVersion = description.getVersion();
    String serverVersion = Bukkit.getVersion();
    int playersOnline = Bukkit.getServer().getOnlinePlayers().size();

    // END server software specific section -- all code below does not use
    // any code outside of this class / Java

    // Construct the post data
    final StringBuilder data = new StringBuilder();

    // The plugin's description file containg all of the plugin data such as
    // name, version, author, etc
    data.append(encode("guid")).append('=').append(encode(guid));
    encodeDataPair(data, "version", pluginVersion);
    encodeDataPair(data, "server", serverVersion);
    encodeDataPair(data, "players", Integer.toString(playersOnline));
    encodeDataPair(data, "revision", String.valueOf(REVISION));

    // New data as of R6
    String osname = System.getProperty("os.name");
    String osarch = System.getProperty("os.arch");
    String osversion = System.getProperty("os.version");
    String java_version = System.getProperty("java.version");
    int coreCount = Runtime.getRuntime().availableProcessors();

    // normalize os arch .. amd64 -> x86_64
    if (osarch.equals("amd64")) {
      osarch = "x86_64";
    }

    encodeDataPair(data, "osname", osname);
    encodeDataPair(data, "osarch", osarch);
    encodeDataPair(data, "osversion", osversion);
    encodeDataPair(data, "cores", Integer.toString(coreCount));
    encodeDataPair(data, "online-mode", Boolean.toString(onlineMode));
    encodeDataPair(data, "java_version", java_version);

    // If we're pinging, append it
    if (isPing) {
      encodeDataPair(data, "ping", "true");
    }

    // Acquire a lock on the graphs, which lets us make the assumption we
    // also lock everything
    // inside of the graph (e.g plotters)
    synchronized (graphs) {
      final Iterator<Graph> iter = graphs.iterator();

      while (iter.hasNext()) {
        final Graph graph = iter.next();

        for (Plotter plotter : graph.getPlotters()) {
          // The key name to send to the metrics server
          // The format is C-GRAPHNAME-PLOTTERNAME where separator -
          // is defined at the top
          // Legacy (R4) submitters use the format Custom%s, or
          // CustomPLOTTERNAME
          final String key =
              String.format(
                  "C%s%s%s%s",
                  CUSTOM_DATA_SEPARATOR,
                  graph.getName(),
                  CUSTOM_DATA_SEPARATOR,
                  plotter.getColumnName());

          // The value to send, which for the foreseeable future is
          // just the string
          // value of plotter.getValue()
          final String value = Integer.toString(plotter.getValue());

          // Add it to the http post data :)
          encodeDataPair(data, key, value);
        }
      }
    }

    // Create the url
    URL url = new URL(BASE_URL + String.format(REPORT_URL, encode(pluginName)));

    // Connect to the website
    URLConnection connection;

    // Mineshafter creates a socks proxy, so we can safely bypass it
    // It does not reroute POST requests so we need to go around it
    if (isMineshafterPresent()) {
      connection = url.openConnection(Proxy.NO_PROXY);
    } else {
      connection = url.openConnection();
    }

    connection.setDoOutput(true);

    // Write the data
    final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write(data.toString());
    writer.flush();

    // Now read the response
    final BufferedReader reader =
        new BufferedReader(new InputStreamReader(connection.getInputStream()));
    final String response = reader.readLine();

    // close resources
    writer.close();
    reader.close();

    if (response == null || response.startsWith("ERR")) {
      throw new IOException(response); // Throw the exception
    } else {
      // Is this the first update this hour?
      if (response.contains("OK This is your first update this hour")) {
        synchronized (graphs) {
          final Iterator<Graph> iter = graphs.iterator();

          while (iter.hasNext()) {
            final Graph graph = iter.next();

            for (Plotter plotter : graph.getPlotters()) {
              plotter.reset();
            }
          }
        }
      }
    }
  }
Example #4
0
  /** Generic method that posts a plugin to the metrics website */
  private void postPlugin(final boolean isPing) throws IOException {
    // The plugin's description file containg all of the plugin data such as name, version, author,
    // etc
    final PluginDescriptionFile description = plugin.getDescription();

    // Construct the post data
    final StringBuilder data = new StringBuilder();
    data.append(encode("guid")).append('=').append(encode(guid));
    encodeDataPair(data, "version", description.getVersion());
    encodeDataPair(data, "server", Bukkit.getVersion());
    encodeDataPair(data, "players", Integer.toString(Bukkit.getServer().getOnlinePlayers().length));
    encodeDataPair(data, "revision", String.valueOf(REVISION));

    // If we're pinging, append it
    if (isPing) {
      encodeDataPair(data, "ping", "true");
    }

    // Acquire a lock on the graphs, which lets us make the assumption we also lock everything
    // inside of the graph (e.g plotters)
    synchronized (graphs) {
      final Iterator<Graph> iter = graphs.iterator();

      while (iter.hasNext()) {
        final Graph graph = iter.next();

        for (Plotter plotter : graph.getPlotters()) {
          // The key name to send to the metrics server
          // The format is C-GRAPHNAME-PLOTTERNAME where separator - is defined at the top
          // Legacy (R4) submitters use the format Custom%s, or CustomPLOTTERNAME
          final String key =
              String.format(
                  "C%s%s%s%s",
                  CUSTOM_DATA_SEPARATOR,
                  graph.getName(),
                  CUSTOM_DATA_SEPARATOR,
                  plotter.getColumnName());

          // The value to send, which for the foreseeable future is just the string
          // value of plotter.getValue()
          final String value = Integer.toString(plotter.getValue());

          // Add it to the http post data :)
          encodeDataPair(data, key, value);
        }
      }
    }

    // Create the url
    URL url =
        new URL(BASE_URL + String.format(REPORT_URL, encode(plugin.getDescription().getName())));

    // Connect to the website
    URLConnection connection;

    // Mineshafter creates a socks proxy, so we can safely bypass it
    // It does not reroute POST requests so we need to go around it
    if (isMineshafterPresent()) {
      connection = url.openConnection(Proxy.NO_PROXY);
    } else {
      connection = url.openConnection();
    }

    connection.setDoOutput(true);

    // Write the data
    final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write(data.toString());
    writer.flush();

    // Now read the response
    final BufferedReader reader =
        new BufferedReader(new InputStreamReader(connection.getInputStream()));
    final String response = reader.readLine();

    // close resources
    writer.close();
    reader.close();

    if (response == null || response.startsWith("ERR")) {
      throw new IOException(response); // Throw the exception
    } else {
      // Is this the first update this hour?
      if (response.contains("OK This is your first update this hour")) {
        synchronized (graphs) {
          final Iterator<Graph> iter = graphs.iterator();

          while (iter.hasNext()) {
            final Graph graph = iter.next();

            for (Plotter plotter : graph.getPlotters()) {
              plotter.reset();
            }
          }
        }
      }
    }
  }