From c265c7ce5c55f2154ad75c113b59077d5b7baaad Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 4 Jul 2014 14:23:11 -0700 Subject: [PATCH] Fixed sync db Logger.java Added temp test code in player tracker...ignore. fixed bug in dynamic server sorter. --- .../src/mineplex/core/logger/Logger.java | 23 +- .../core/playerTracker/PlayerTracker.java | 129 ++++- .../Mineplex.Hub/src/mineplex/hub/Hub.java | 2 +- .../servermonitor/DynamicServerSorter.java | 4 +- .../LOC.Website.Web.Publish.xml | 448 +++++++++--------- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 6 files changed, 372 insertions(+), 234 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/logger/Logger.java b/Plugins/Mineplex.Core/src/mineplex/core/logger/Logger.java index 26f34e986..48eaf324f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/logger/Logger.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/logger/Logger.java @@ -3,16 +3,19 @@ package mineplex.core.logger; import java.util.ArrayList; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; public class Logger { public static Logger Instance; + private static JavaPlugin _plugin; private LoggerRepository _repository; public static void initialize(JavaPlugin plugin) { + _plugin = plugin; Instance = new Logger(plugin); } @@ -47,14 +50,20 @@ public class Logger } } - public void log(String message) + public void log(final String message) { - _repository.saveLog(message); + Bukkit.getServer().getScheduler().runTaskAsynchronously(_plugin, new Runnable() + { + public void run() + { + _repository.saveLog(message); + } + }); } public void log(Throwable exception) { - List messages = new ArrayList(); + final List messages = new ArrayList(); messages.add("[Exception Start]" + exception.getMessage()); @@ -65,6 +74,12 @@ public class Logger messages.add("[Exception End]"); - _repository.saveLog(messages.toArray(new String[0])); + Bukkit.getServer().getScheduler().runTaskAsynchronously(_plugin, new Runnable() + { + public void run() + { + _repository.saveLog(messages.toArray(new String[0])); + } + }); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java b/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java index 28fcd7976..3540c4bf7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/playerTracker/PlayerTracker.java @@ -1,6 +1,20 @@ package mineplex.core.playerTracker; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.binary.Hex; import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.libs.com.google.gson.Gson; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; @@ -8,18 +22,88 @@ import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; import mineplex.core.account.event.ClientUnloadEvent; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.PoolingClientConnectionManager; + public class PlayerTracker extends MiniPlugin { private PlayerTrackerRepository _repository = null; - + public PlayerTracker(JavaPlugin plugin, String serverName, boolean us) { super("Player Tracker", plugin); _repository = new PlayerTrackerRepository(); _repository.initialize(serverName, us); + + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); + + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry); + connectionManager.setMaxTotal(200); + connectionManager.setDefaultMaxPerRoute(20); + + HttpClient httpClient = new DefaultHttpClient(connectionManager); + InputStream in = null; + + try + { + + HttpGet request = new HttpGet("http://api.dnsmadeeasy.com/V2.0/dns/managed/962728/records/"); + + String timeStamp = getServerTime(); + SecretKeySpec keySpec = new SecretKeySpec("8c9af8cc-d306-4df3-8de8-944deafa8239".getBytes(), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] hashBytes = mac.doFinal((timeStamp + "").getBytes()); + Hex.encodeHexString(hashBytes); + + request.addHeader("x-dnsme-apiKey", "610e21ee-4250-4b55-b637-a1fcc3847850"); + request.addHeader("x-dnsme-requestDate", timeStamp + ""); + request.addHeader("x-dnsme-hmac", Hex.encodeHexString(hashBytes)); + request.addHeader("Content-Type", "application/json"); + + HttpResponse response = httpClient.execute(request); + + if (response != null) + { + in = response.getEntity().getContent(); + System.out.println(convertStreamToString(in)); + } + } + catch (Exception ex) + { + System.out.println("JsonWebCall.Execute() Error:\n" + ex.getMessage()); + + for (StackTraceElement trace : ex.getStackTrace()) + { + System.out.println(trace); + } + } + finally + { + httpClient.getConnectionManager().shutdown(); + + if (in != null) + { + try + { + in.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + } } - + @EventHandler public void trackPlayer(final PlayerJoinEvent event) { @@ -31,7 +115,7 @@ public class PlayerTracker extends MiniPlugin } }); } - + @EventHandler public void untrackPlayer(final ClientUnloadEvent event) { @@ -43,4 +127,43 @@ public class PlayerTracker extends MiniPlugin } }); } + + String getServerTime() + { + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + return dateFormat.format(calendar.getTime()); + } + + protected String convertStreamToString(InputStream is) + { + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line = null; + try + { + while ((line = reader.readLine()) != null) + { + sb.append(line + "\n"); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + finally + { + try + { + is.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + return sb.toString(); + } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 98ad8f6ec..0f462926e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -83,7 +83,7 @@ public class Hub extends JavaPlugin implements IRelation PreferencesManager preferenceManager = new PreferencesManager(this, clientManager, donationManager); preferenceManager.GiveItem = true; new MessageManager(this, clientManager, preferenceManager); - Creature creature = new Creature(this); + Creature creature = new Creature(this); NpcManager npcManager = new NpcManager(this, creature); PetManager petManager = new PetManager(this, clientManager, donationManager, creature, webServerAddress); new AntiStack(this); diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerSorter.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerSorter.java index d2fc1a589..fbf37f8f3 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerSorter.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerSorter.java @@ -22,9 +22,9 @@ public class DynamicServerSorter implements Comparator if (first.AvailableCPU > second.AvailableCPU) return -1; - if (second.AvailableCPU < first.AvailableCPU) + if (second.AvailableCPU > first.AvailableCPU) return 1; - return 1; + return 0; } } \ No newline at end of file diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index 62e1e74fb..bc5c764cc 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,7 +1,6 @@  - @@ -17,42 +16,39 @@ - + - - + - - + - + - + + - - @@ -61,7 +57,9 @@ - + + + @@ -72,23 +70,24 @@ - - + - + + + - + + - @@ -96,7 +95,7 @@ - + @@ -104,45 +103,40 @@ - + + + - - - - - - - - + + - - + @@ -153,73 +147,81 @@ - + - + + + + + + - - + + - + - + - + + + + - - + - + - - + + - + - + - + + @@ -227,50 +229,47 @@ - + - - + - - + + - - - + + - + - - + + - - + + - + - + - @@ -283,36 +282,41 @@ - + + + + + - + + - + + - - + @@ -322,7 +326,6 @@ - @@ -333,20 +336,20 @@ + - + + - - @@ -354,8 +357,6 @@ - - @@ -363,48 +364,50 @@ - - - + + + + - - + + + + - - + + + - - @@ -413,127 +416,124 @@ - - - - + - - + - + - - + - + + - + - - + + - - + - + - - + + - + - + - - + + + - + - + + - + - + - - + + - + - - + + - - + + - + - + - + @@ -546,38 +546,39 @@ - + + - + + + - + - - + - - + @@ -587,7 +588,6 @@ - @@ -598,72 +598,73 @@ + - + + - + - - - + - + - - + + + - - + + - + - + - + @@ -678,27 +679,24 @@ - - - - + - - + - - - + + + + @@ -708,95 +706,97 @@ - + + - + + - - + - + - - - + + + - + - + - + - + + - + - + + - + - - + - - + + - + - - + + - - + + - + - + - + @@ -809,38 +809,39 @@ - + + - + + + - + - - + - - + @@ -850,7 +851,6 @@ - @@ -861,28 +861,28 @@ + - + + - + - - @@ -891,42 +891,43 @@ - + - - + + + - - + + - + - + - + @@ -941,27 +942,24 @@ - - - - + - - + - + + @@ -971,85 +969,87 @@ - + + - + + - - + - + - - - + + + - + - + - + - + + - + - + + - + - - + - - + + - + - - + + - - + + - + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 4ac012ac5eb8cbe2fe9320ab6826136620b71a6a..047b052394fc5ac25c67c05b1d8bf61f7e28ca0c 100644 GIT binary patch delta 12762 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 qSSD;(Z~h