aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/gtPlusPlus/api')
-rw-r--r--src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java14
-rw-r--r--src/Java/gtPlusPlus/api/analytics/SegmentAnalytics.java152
2 files changed, 160 insertions, 6 deletions
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;
+ }
+
+}