aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Java/gtPlusPlus/GTplusplus.java5
-rw-r--r--src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java14
-rw-r--r--src/Java/gtPlusPlus/api/analytics/SegmentAnalytics.java152
-rw-r--r--src/Java/gtPlusPlus/core/handler/events/BlockEventHandler.java8
-rw-r--r--src/Java/gtPlusPlus/core/handler/events/LoginEventHandler.java27
-rw-r--r--src/Java/gtPlusPlus/core/lib/CORE.java6
-rw-r--r--src/Java/gtPlusPlus/core/util/Utils.java4
7 files changed, 186 insertions, 30 deletions
diff --git a/src/Java/gtPlusPlus/GTplusplus.java b/src/Java/gtPlusPlus/GTplusplus.java
index 1af638722f..cf42eaa38e 100644
--- a/src/Java/gtPlusPlus/GTplusplus.java
+++ b/src/Java/gtPlusPlus/GTplusplus.java
@@ -74,9 +74,6 @@ public class GTplusplus implements ActionListener {
if(!Utils.isServer()){
enableCustomCapes = true;
- if (Minecraft.getMinecraft().thePlayer != null){
- CORE.mLocalProfile = Minecraft.getMinecraft().thePlayer.getGameProfile();
- }
}
//Give this a go mate.
@@ -175,6 +172,6 @@ public class GTplusplus implements ActionListener {
private static final void initAnalytics(){
- CORE.mAnalytics = new SegmentAnalytics();
+
}
} \ No newline at end of file
diff --git a/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java b/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java
index ec2537cbfd..ff7d050a9e 100644
--- a/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java
+++ b/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java
@@ -6,6 +6,8 @@ import com.segment.analytics.Log;
import com.segment.analytics.Plugin;
import com.segment.analytics.messages.Message;
+import gtPlusPlus.core.util.Utils;
+
/**
* A {@link Plugin} implementation that redirects client logs to standard output and logs callback
* events.
@@ -14,23 +16,23 @@ public class AnalyticsLoggingPlugin implements Plugin {
@Override public void configure(Analytics.Builder builder) {
builder.log(new Log() {
@Override public void print(Level level, String format, Object... args) {
- System.out.println(level + ":\t" + String.format(format, args));
+ Utils.LOG_WARNING(level + ":\t" + String.format(format, args));
}
@Override public void print(Level level, Throwable error, String format, Object... args) {
- System.out.println(level + ":\t" + String.format(format, args));
- System.out.println(error);
+ Utils.LOG_WARNING(level + ":\t" + String.format(format, args));
+ //Utils.LOG_WARNING(error);
}
});
builder.callback(new Callback() {
@Override public void success(Message message) {
- System.out.println("Uploaded " + message);
+ Utils.LOG_WARNING("Uploaded " + message);
}
@Override public void failure(Message message, Throwable throwable) {
- System.out.println("Could not upload " + message);
- System.out.println(throwable);
+ Utils.LOG_WARNING("Could not upload " + message);
+ //Utils.LOG_WARNING(throwable);
}
});
}
diff --git a/src/Java/gtPlusPlus/api/analytics/SegmentAnalytics.java b/src/Java/gtPlusPlus/api/analytics/SegmentAnalytics.java
new file mode 100644
index 0000000000..9000bfd95a
--- /dev/null
+++ b/src/Java/gtPlusPlus/api/analytics/SegmentAnalytics.java
@@ -0,0 +1,152 @@
+package gtPlusPlus.api.analytics;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.mojang.authlib.GameProfile;
+import com.segment.analytics.Analytics;
+import com.segment.analytics.messages.IdentifyMessage;
+import com.segment.analytics.messages.TrackMessage;
+
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.LoadedMods;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.player.PlayerUtils;
+import gtPlusPlus.core.util.uuid.UUIDGenerator;
+import gtPlusPlus.core.util.uuid.UUIDUtils;
+import ic2.core.IC2;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class SegmentAnalytics {
+
+ //Globally Enabled
+ public static boolean isEnabled = true;
+
+ //Analytics Map with IDs
+ public static final Map<Integer, SegmentAnalytics> sAnalyticsMasterList = new ConcurrentHashMap<Integer, SegmentAnalytics>();
+ //ID count
+ private static int sAnalyticsMapID = 0;
+
+ //Analytics Player Mapping
+ public static final Map<UUID, Integer> sAnalyticsToPlayermap = new ConcurrentHashMap<UUID, Integer>();
+
+ //Set some Vars
+ final BlockingFlush mBlockingFlush;
+ final Analytics mAnalytics;
+ final UUIDGenerator mUuidGenerator;
+
+ final GameProfile mLocalProfile;
+ final String aLocalName;
+ final UUID aUUID;
+ final String aUserName;
+ final String anonymousId;
+
+ //Build a new instance of this class
+ public SegmentAnalytics(EntityPlayer mPlayer){
+ LOG("Generating a new instance of Segment Analytics Handler 2.1.0 for "+mPlayer.getDisplayName());
+
+ int currentID = sAnalyticsMapID;
+ sAnalyticsMapID++;
+
+ sAnalyticsMasterList.put(currentID, this);
+ sAnalyticsToPlayermap.put(mPlayer.getUniqueID(), currentID);
+
+ this.mLocalProfile = mPlayer.getGameProfile();
+ this.aLocalName = mLocalProfile.getName();
+ this.aUUID = PlayerUtils.getPlayersUUIDByName(aLocalName);
+ this.aUserName = aUUID.toString();
+ this.anonymousId = getStringForm(generateIdForSession());
+
+ //Create a new UUID generator.
+ this.mUuidGenerator = new UUIDGenerator();
+
+ //Use Segment Analytics instead of plain Google Analytics.
+ this.mBlockingFlush = BlockingFlush.create();
+ this.mAnalytics = Analytics.builder("API_KEY_GOES_HERE") //
+ .plugin(mBlockingFlush.plugin())
+ .plugin(new AnalyticsLoggingPlugin())
+ .build();
+
+ //Let us submit a doorknock to Segment to let them know who this is.
+ submitInitData(mPlayer);
+ }
+
+ //Sets vars and stops Analytics running if the player profile is invalid.
+ private boolean canProcess(){
+ //Invalid Player Profile
+ if (mLocalProfile == null || !isEnabled){
+ return false;
+ }
+ if (aLocalName == null || aUUID == null || aUserName == null || anonymousId == null){
+ //LOG("One player var remained null, returning false.");
+ return false;
+ }
+ if (aLocalName != null && aUUID != null && aUserName != null && anonymousId != null){
+ //LOG("All player vars are ok, returning true.");
+ return true;
+ }
+ LOG("Something went wrong, returning false.");
+ return false;
+ }
+
+
+ public void submitInitData(EntityPlayer mPlayer){
+ if (!canProcess()){
+ return;
+ }
+ Map<String, Object> properties = new LinkedHashMap<>();
+ properties.put("username", aLocalName);
+ properties.put("gt_version", Utils.getGregtechVersionAsString());
+ if (LoadedMods.IndustrialCraft2){
+ properties.put("ic2_version", IC2.VERSION);
+ }
+ properties.put("country_code", CORE.USER_COUNTRY);
+ properties.put("gtnh", CORE.GTNH);
+
+ LOG("Created new Data packet, queued for submission.");
+ mAnalytics.enqueue(IdentifyMessage.builder()
+ .userId(aUserName) //Save Username as UUID, for future sessions to attach to.
+ .anonymousId(anonymousId) //Save Random Session UUID
+ .traits(properties));
+
+ mAnalytics.flush();
+ }
+
+ public void submitTrackingData(String aActionPerformed){
+ if (!canProcess()){
+ return;
+ }
+ LOG("Queued submission of data for event "+aActionPerformed+".");
+ mAnalytics.enqueue(TrackMessage.builder(aActionPerformed) //
+ //.properties(properties) //Save Stats
+ .anonymousId(anonymousId) //Save Random Session UUID
+ .userId(aUserName)); // Save Username as UUID, for future sessions to attach to.
+ }
+
+ public UUID generateIdForSession(){
+ return UUIDUtils.getUUIDFromBytes(generateUUID());
+ }
+
+ private final byte[] generateUUID(){
+ return mUuidGenerator.next(4);
+ }
+
+ public final String getStringForm(UUID mID){
+ return mID.toString();
+ }
+
+ // Non-Dev Comments
+ public static void LOG(final String s) {
+ Utils.getLogger().info("[Analytics] "+s);
+ }
+
+ public static SegmentAnalytics getAnalyticsForPlayer(EntityPlayer mPlayer){
+ if (SegmentAnalytics.sAnalyticsToPlayermap.containsKey(mPlayer)){
+ return SegmentAnalytics.sAnalyticsMasterList.get(SegmentAnalytics.sAnalyticsToPlayermap.get(mPlayer.getUniqueID()));
+ }
+ return null;
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/core/handler/events/BlockEventHandler.java b/src/Java/gtPlusPlus/core/handler/events/BlockEventHandler.java
index 16599b3b8b..b4872bde93 100644
--- a/src/Java/gtPlusPlus/core/handler/events/BlockEventHandler.java
+++ b/src/Java/gtPlusPlus/core/handler/events/BlockEventHandler.java
@@ -7,7 +7,9 @@ import java.util.ArrayList;
import java.util.Random;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.analytics.SegmentAnalytics;
import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.lib.LoadedMods;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.core.util.math.MathUtils;
@@ -40,7 +42,7 @@ public class BlockEventHandler {
event.world.setBlock(fireX, fireY, fireZ, Blocks.fire); // Replace it with Fire
event.useBlock = Event.Result.DENY; // Prevent the Fire from being extinguished (also prevents Block#onBlockClicked from being called)
}
- }*/
+ }*/
}
@SubscribeEvent
@@ -158,6 +160,10 @@ public class BlockEventHandler {
}
}
}
+
+ //Try submit some data for this event.
+ SegmentAnalytics.getAnalyticsForPlayer(event.harvester).submitTrackingData("Action_Block_Broken");
+
}
catch (Throwable r){
Utils.LOG_INFO("Block Event Handler Failed. Please Report this to Alkalus.");
diff --git a/src/Java/gtPlusPlus/core/handler/events/LoginEventHandler.java b/src/Java/gtPlusPlus/core/handler/events/LoginEventHandler.java
index b3897e48c1..9664c7d340 100644
--- a/src/Java/gtPlusPlus/core/handler/events/LoginEventHandler.java
+++ b/src/Java/gtPlusPlus/core/handler/events/LoginEventHandler.java
@@ -1,11 +1,10 @@
package gtPlusPlus.core.handler.events;
-import static gtPlusPlus.core.lib.CORE.mLocalProfile;
-
import java.util.*;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
+import gtPlusPlus.api.analytics.SegmentAnalytics;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.proxy.ClientProxy;
import gtPlusPlus.core.util.Utils;
@@ -29,11 +28,17 @@ public class LoginEventHandler {
//Set this for easier use elsewhere.
if (event.player.getEntityWorld().isRemote){
- ClientProxy.playerName = this.localPlayersName;
- if (mLocalProfile == null){
- mLocalProfile = this.localPlayerRef.getGameProfile();
- }
- }
+ ClientProxy.playerName = this.localPlayersName;
+ }
+
+ try {
+ new SegmentAnalytics(event.player);
+ }
+ catch (Throwable t){
+ SegmentAnalytics.LOG("Failed to create Analytics submission during log in process.");
+ SegmentAnalytics.LOG("Disabling.");
+ SegmentAnalytics.isEnabled = false;
+ }
try {
@@ -44,14 +49,6 @@ public class LoginEventHandler {
if (!this.localPlayerRef.worldObj.isRemote){
PlayerCache.appendParamChanges(this.localPlayersName, this.localPlayersUUID.toString());
- //Submit Analytics
- try {
- CORE.mAnalytics.submitInitData();
- }
- catch (Throwable t){
- Utils.LOG_INFO("Failed to submit analytics data.");
- }
-
if (CORE.ConfigSwitches.enableUpdateChecker){
if (!Utils.isModUpToDate()){
Utils.LOG_INFO("[GT++] You're not using the latest recommended version of GT++, consider updating.");
diff --git a/src/Java/gtPlusPlus/core/lib/CORE.java b/src/Java/gtPlusPlus/core/lib/CORE.java
index 318976ff03..6efb7faaac 100644
--- a/src/Java/gtPlusPlus/core/lib/CORE.java
+++ b/src/Java/gtPlusPlus/core/lib/CORE.java
@@ -34,7 +34,7 @@ public class CORE {
//Analytics handler
- public static SegmentAnalytics mAnalytics;
+ //public static SegmentAnalytics mAnalytics;
public static Map PlayerCache;
@@ -69,8 +69,6 @@ public class CORE {
public static final int GREGTECH_API_VERSION = GregTech_API.VERSION;
public static IGregtech_RecipeAdder RA;
- //Local Client Player, null if Server Side
- public static GameProfile mLocalProfile;
//GT++ Fake Player Profile
public static GameProfile gameProfile = new GameProfile(UUID.nameUUIDFromBytes("gtplusplus.core".getBytes()), "[GT++]");
;
@@ -98,7 +96,7 @@ public class CORE {
public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>> sTesseractGeneratorOwnershipMap = new HashMap<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>>();
public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>> sTesseractTerminalOwnershipMap = new HashMap<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>>();
- //BookMapt
+ //BookMap
public static final Map<String, ItemStack> sBookList = new ConcurrentHashMap<String, ItemStack>();
diff --git a/src/Java/gtPlusPlus/core/util/Utils.java b/src/Java/gtPlusPlus/core/util/Utils.java
index e9e7506cee..f8ae3e4cba 100644
--- a/src/Java/gtPlusPlus/core/util/Utils.java
+++ b/src/Java/gtPlusPlus/core/util/Utils.java
@@ -183,6 +183,10 @@ public class Utils {
final Logger gtPlusPlusLogger = LogManager.getLogger("GT++");
return gtPlusPlusLogger;
}
+
+ public static final Logger getLogger(){
+ return modLogger;
+ }
// Non-Dev Comments
public static void LOG_INFO(final String s) {