Skip to content

Commit d54e72a

Browse files
author
Tamas Henning
committed
Proper proxied clients
1 parent 3b9cfd6 commit d54e72a

File tree

8 files changed

+286
-31
lines changed

8 files changed

+286
-31
lines changed

src/java/com/tamashenning/forgeanalytics/AnalyticsClient.java

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.tamashenning.forgeanalytics;
22

33
import java.security.MessageDigest;
4+
45
import java.security.NoSuchAlgorithmException;
56
import java.util.ArrayList;
67
import java.util.HashMap;
@@ -25,10 +26,13 @@
2526

2627
import net.minecraft.client.Minecraft;
2728
import net.minecraft.server.MinecraftServer;
29+
import net.minecraft.server.dedicated.DedicatedServer;
2830
import net.minecraftforge.common.ForgeVersion;
2931
import net.minecraftforge.common.MinecraftForge;
3032
import net.minecraftforge.common.config.Configuration;
33+
import net.minecraftforge.fml.common.FMLCommonHandler;
3134

35+
@Deprecated
3236
public class AnalyticsClient {
3337

3438
public boolean UploadModel(AnalyticsModel model, boolean isClient) throws Exception {
@@ -74,7 +78,8 @@ public boolean UploadModel(AnalyticsModel model, boolean isClient) throws Except
7478
dataForge.add(entry.getKey(), new JsonPrimitive(entry.getValue()));
7579
}
7680
}
77-
// System.out.println(json);
81+
82+
System.out.println(json);
7883
this.UploadForge(dataForge.toString());
7984
return this.UploadModel(json, isClient);
8085
}
@@ -188,15 +193,20 @@ public boolean FireEvent(boolean isClient) {
188193
} else {
189194
// Respect snooper settings...
190195
try {
191-
if (!MinecraftServer.getServer().isSnooperEnabled()) {
192-
return false;
196+
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
197+
if (server.getClass().equals(DedicatedServer.class)) {
198+
DedicatedServer ds = (DedicatedServer) server;
199+
if (!ds.isSnooperEnabled()) {
200+
return false;
201+
}
193202
}
203+
194204
MinecraftForge.EVENT_BUS.post(new AnalyticsEvent(net.minecraftforge.fml.relauncher.Side.SERVER));
195205
} catch (Exception e) {
196206
// First time server init???
197207
return false;
198208
}
199-
209+
200210
}
201211
return true;
202212
}

src/java/com/tamashenning/forgeanalytics/ForgeAnalyticsMod.java

+5-8
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ForgeAnalyticsMod {
2020

2121
public static final String MODID = "forgeanalytics";
2222
public static final String MODNAME = "Forge Analytics";
23-
public static final String VERSION = "0.0.0.13";
23+
public static final String VERSION = "0.0.0.16";
2424
public static final String GUIFACTORY = "com.tamashenning.forgeanalytics.gui.GuiFactory";
2525

2626
@Instance(ForgeAnalyticsMod.MODID)
@@ -29,6 +29,9 @@ public class ForgeAnalyticsMod {
2929
@SidedProxy(clientSide = "com.tamashenning.forgeanalytics.proxies.ClientProxy", serverSide = "com.tamashenning.forgeanalytics.proxies.ServerProxy")
3030
public static CommonProxy proxy;
3131

32+
@SidedProxy(clientSide = "com.tamashenning.forgeanalytics.client.AnalyticsClientSide", serverSide = "com.tamashenning.forgeanalytics.client.AnalyticsCommon")
33+
public static AnalyticsCommon proxiedClient;
34+
3235
public static Logger logger;
3336

3437
@EventHandler
@@ -54,13 +57,7 @@ public void serverLoad(FMLServerStartingEvent e) {
5457

5558
@EventHandler
5659
public void serverStarted(FMLServerStartedEvent e) {
57-
AnalyticsClient ac = new AnalyticsClient();
58-
try {
59-
ac.UploadModel(ac.CreateServerStartupPing(), false);
60-
} catch (Exception e1) {
61-
// TODO Auto-generated catch block
62-
e1.printStackTrace();
63-
}
60+
6461
}
6562

6663
@EventHandler
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.tamashenning.forgeanalytics.client;
2+
3+
import java.util.HashMap;
4+
5+
import com.tamashenning.forgeanalytics.events.AnalyticsEvent;
6+
import com.tamashenning.forgeanalytics.models.AnalyticsModel;
7+
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraftforge.common.MinecraftForge;
10+
import net.minecraftforge.fml.relauncher.Side;
11+
import net.minecraftforge.fml.relauncher.SideOnly;
12+
13+
@SideOnly(Side.CLIENT)
14+
public class AnalyticsClientSide extends AnalyticsCommon {
15+
16+
@Override
17+
public AnalyticsModel CreateKeepAlivePing(){
18+
AnalyticsModel am = new AnalyticsModel();
19+
am.Table = ForgeAnalyticsConstants.pingClientTable;
20+
am.Properties = new HashMap<String, String>();
21+
am.PartitionKey = ForgeAnalyticsConstants.pingClientKeepAlive;
22+
am.ClientDateTimeEpoch = System.currentTimeMillis() / 1000L;
23+
am.Properties.putAll(this.getCommonValues());
24+
25+
return am;
26+
27+
}
28+
29+
@Override
30+
public boolean FireEvent() {
31+
if (!Minecraft.getMinecraft().isSnooperEnabled()) {
32+
return false;
33+
}
34+
MinecraftForge.EVENT_BUS.post(new AnalyticsEvent(net.minecraftforge.fml.relauncher.Side.CLIENT));
35+
36+
return true;
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
package com.tamashenning.forgeanalytics.client;
2+
3+
import java.security.MessageDigest;
4+
import java.security.NoSuchAlgorithmException;
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
import org.apache.http.HttpResponse;
11+
import org.apache.http.NameValuePair;
12+
import org.apache.http.client.HttpClient;
13+
import org.apache.http.client.entity.UrlEncodedFormEntity;
14+
import org.apache.http.client.methods.HttpPost;
15+
import org.apache.http.entity.StringEntity;
16+
import org.apache.http.impl.client.HttpClientBuilder;
17+
import org.apache.http.message.BasicNameValuePair;
18+
19+
import com.google.gson.JsonObject;
20+
import com.google.gson.JsonPrimitive;
21+
import com.tamashenning.forgeanalytics.events.AnalyticsEvent;
22+
import com.tamashenning.forgeanalytics.models.AnalyticsModel;
23+
24+
import net.minecraft.client.Minecraft;
25+
import net.minecraft.server.MinecraftServer;
26+
import net.minecraft.server.dedicated.DedicatedServer;
27+
import net.minecraftforge.common.ForgeVersion;
28+
import net.minecraftforge.common.MinecraftForge;
29+
import net.minecraftforge.common.config.Configuration;
30+
import net.minecraftforge.fml.common.FMLCommonHandler;
31+
32+
public class AnalyticsCommon {
33+
34+
public boolean UploadModel(AnalyticsModel model, boolean isClient) throws Exception {
35+
36+
if (!FireEvent()) {
37+
return false;
38+
}
39+
40+
model.Properties.putAll(ForgeAnalyticsConstants.CustomProperties);
41+
42+
// Code to send to Tamas backend...
43+
44+
JsonObject data = new JsonObject();
45+
data.add("PartitionKey", new JsonPrimitive(model.PartitionKey));
46+
data.add("ClientDateTimeEpoch", new JsonPrimitive(model.ClientDateTimeEpoch));
47+
data.add("Table", new JsonPrimitive(model.Table));
48+
49+
JsonObject propertiesMap = new JsonObject();
50+
51+
for (Map.Entry<String, String> entry : model.Properties.entrySet()) {
52+
// if the user opted out of the property, respect it...
53+
if (!ForgeAnalyticsConstants.dataConfig
54+
.get(Configuration.CATEGORY_GENERAL, entry.getKey() + "_OptOut", false).getBoolean()) {
55+
56+
propertiesMap.add(entry.getKey(), new JsonPrimitive(entry.getValue()));
57+
}
58+
}
59+
60+
data.add("Properties", propertiesMap);
61+
62+
String json = data.toString();
63+
64+
// Code to send to Lex' backend
65+
66+
JsonObject dataForge = new JsonObject();
67+
dataForge.add("cmd", new JsonPrimitive(model.PartitionKey));
68+
69+
for (Map.Entry<String, String> entry : model.Properties.entrySet()) {
70+
// if the user opted out of the property, respect it...
71+
if (!ForgeAnalyticsConstants.dataConfig
72+
.get(Configuration.CATEGORY_GENERAL, entry.getKey() + "_OptOut", false).getBoolean()) {
73+
74+
dataForge.add(entry.getKey(), new JsonPrimitive(entry.getValue()));
75+
}
76+
}
77+
78+
// System.out.println(json);
79+
this.UploadForge(dataForge.toString());
80+
return this.UploadModel(json, isClient);
81+
}
82+
83+
public AnalyticsModel CreateKeepAlivePing() {
84+
AnalyticsModel am = new AnalyticsModel();
85+
am.Table = ForgeAnalyticsConstants.pingServerTable;
86+
am.Properties = new HashMap<String, String>();
87+
am.PartitionKey = ForgeAnalyticsConstants.pingServerKeepAlive;
88+
am.ClientDateTimeEpoch = System.currentTimeMillis() / 1000L;
89+
am.Properties.putAll(this.getCommonValues());
90+
return am;
91+
}
92+
93+
public AnalyticsModel CreateServerStartupPing() {
94+
AnalyticsModel am = new AnalyticsModel();
95+
am.Table = ForgeAnalyticsConstants.pingServerTable;
96+
am.Properties = new HashMap<String, String>();
97+
am.PartitionKey = ForgeAnalyticsConstants.pingServerStartCommand;
98+
am.ClientDateTimeEpoch = System.currentTimeMillis() / 1000L;
99+
am.Properties.putAll(this.getCommonValues());
100+
101+
return am;
102+
}
103+
104+
public AnalyticsModel CreateServerStoppedPing() {
105+
AnalyticsModel am = new AnalyticsModel();
106+
am.Table = ForgeAnalyticsConstants.pingServerTable;
107+
am.Properties = new HashMap<String, String>();
108+
am.PartitionKey = ForgeAnalyticsConstants.pingServerStopCommand;
109+
am.ClientDateTimeEpoch = System.currentTimeMillis() / 1000L;
110+
am.Properties.putAll(this.getCommonValues());
111+
112+
return am;
113+
}
114+
115+
public boolean FireEvent() {
116+
try {
117+
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
118+
if (server.getClass().equals(DedicatedServer.class)) {
119+
DedicatedServer ds = (DedicatedServer) server;
120+
if (!ds.isSnooperEnabled()) {
121+
return false;
122+
}
123+
}
124+
125+
MinecraftForge.EVENT_BUS.post(new AnalyticsEvent(net.minecraftforge.fml.relauncher.Side.SERVER));
126+
} catch (Exception e) {
127+
// First time server init???
128+
return false;
129+
}
130+
return true;
131+
}
132+
133+
protected Map<String, String> getCommonValues() {
134+
Map<String, String> commonValues = new HashMap<String, String>();
135+
136+
String activeModListCount = Integer
137+
.toString(net.minecraftforge.fml.common.Loader.instance().getActiveModList().size());
138+
139+
String modListCount = Integer.toString(net.minecraftforge.fml.common.Loader.instance().getModList().size());
140+
// String modList = "";
141+
142+
commonValues.put("JavaVersion", System.getProperty("java.version"));
143+
commonValues.put("JavaMaxRAM", Long.toString(Runtime.getRuntime().maxMemory()));
144+
commonValues.put("JavaAllocatedRAM", Long.toString(Runtime.getRuntime().totalMemory()));
145+
// TODO: Remove once fully switched over.
146+
commonValues.put("SessionID", ForgeAnalyticsSingleton.getInstance().SessionID);
147+
commonValues.put("AdID", ForgeAnalyticsConstants.AdID);
148+
commonValues.put("session_id", ForgeAnalyticsSingleton.getInstance().SessionUUID.toString());
149+
commonValues.put("instance_id", ForgeAnalyticsConstants.InstanceUUID.toString());
150+
commonValues.put("MinecraftVersion", net.minecraftforge.fml.common.Loader.instance().getMCVersionString());
151+
commonValues.put("ForgeVersion", ForgeVersion.getVersion());
152+
commonValues.put("MCPVersion", net.minecraftforge.fml.common.Loader.instance().getMCPVersionString());
153+
commonValues.put("ActiveModCount", activeModListCount);
154+
commonValues.put("ModCount", modListCount);
155+
commonValues.put("ModPack", ForgeAnalyticsConstants.modPack);
156+
157+
return commonValues;
158+
}
159+
160+
protected boolean UploadModel(String json, boolean isClient) throws Exception {
161+
162+
HttpClient httpClient = HttpClientBuilder.create().build();
163+
164+
try {
165+
HttpPost request = new HttpPost(ForgeAnalyticsConstants.serverUrl);
166+
167+
StringEntity params = new StringEntity(json);
168+
request.addHeader("content-type", "application/json");
169+
request.setEntity(params);
170+
HttpResponse response = httpClient.execute(request);
171+
172+
} catch (Exception ex) {
173+
ex.printStackTrace();
174+
}
175+
176+
return true;
177+
}
178+
179+
protected void UploadForge(String json) throws Exception {
180+
181+
HttpClient httpClient = HttpClientBuilder.create().build();
182+
183+
try {
184+
HttpPost request = new HttpPost(ForgeAnalyticsConstants.forgeServerUrl);
185+
186+
List<NameValuePair> nvp = new ArrayList<NameValuePair>();
187+
nvp.add(new BasicNameValuePair("stat", json));
188+
189+
request.setEntity(new UrlEncodedFormEntity(nvp));
190+
HttpResponse response = httpClient.execute(request);
191+
192+
} catch (Exception ex) {
193+
// handle exception here
194+
ex.printStackTrace();
195+
}
196+
}
197+
198+
public String Anonymize(String data) throws NoSuchAlgorithmException {
199+
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
200+
byte[] dataBytes = data.getBytes();
201+
for (int i = 0; i < ForgeAnalyticsConstants.HASHCOUNT; i++) {
202+
dataBytes = sha256.digest(dataBytes);
203+
}
204+
205+
return this.bytesToHex(dataBytes);
206+
}
207+
208+
final protected char[] hexArray = "0123456789abcdef".toCharArray();
209+
210+
protected String bytesToHex(byte[] bytes) {
211+
char[] hexChars = new char[bytes.length * 2];
212+
for (int j = 0; j < bytes.length; j++) {
213+
int v = bytes[j] & 0xFF;
214+
hexChars[j * 2] = hexArray[v >>> 4];
215+
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
216+
}
217+
return new String(hexChars);
218+
}
219+
220+
}

src/java/com/tamashenning/forgeanalytics/client/ForgeAnalyticsSingleton.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
import java.util.TimerTask;
88
import java.util.UUID;
99

10-
import com.tamashenning.forgeanalytics.AnalyticsClient;
10+
import com.tamashenning.forgeanalytics.ForgeAnalyticsMod;
1111

1212
public class ForgeAnalyticsSingleton {
1313
private static ForgeAnalyticsSingleton instance = null;
14-
private AnalyticsClient ac = new AnalyticsClient();
1514
private Timer timer = new Timer();
1615

1716
public String SessionID = "";
@@ -34,7 +33,7 @@ public String CreateID() {
3433
String id = "";
3534
SecureRandom random = new SecureRandom();
3635
try {
37-
id = ac.Anonymize(new BigInteger(130, random).toString(32));
36+
id = ForgeAnalyticsMod.proxiedClient.Anonymize(new BigInteger(130, random).toString(32));
3837
} catch (NoSuchAlgorithmException e) {
3938
e.printStackTrace();
4039
}
@@ -47,12 +46,7 @@ public void StartKeepAliveTimer(final boolean isClient) {
4746
public void run() {
4847

4948
try {
50-
if (!isClient) {
51-
ac.UploadModel(ac.CreateServerKeepAlivePing(), isClient);
52-
} else {
53-
ac.UploadModel(ac.CreateClientKeepAlivePing(), isClient);
54-
}
55-
49+
ForgeAnalyticsMod.proxiedClient.UploadModel(ForgeAnalyticsMod.proxiedClient.CreateKeepAlivePing(), isClient);
5650
} catch (Exception e) {
5751
//
5852
e.printStackTrace();

0 commit comments

Comments
 (0)