diff options
author | Jordan Byrne <draknyte1@hotmail.com> | 2017-12-11 14:49:38 +1000 |
---|---|---|
committer | Jordan Byrne <draknyte1@hotmail.com> | 2017-12-11 14:49:38 +1000 |
commit | ccb601dd7e675a9829dfac7080a917b1083d9a6d (patch) | |
tree | bef7b610ad52bdbbe9616eb5652677d0aa7a00fe /src/Java | |
parent | 759f46b32881301624bcc28441b4ef8880c6ff92 (diff) | |
download | GT5-Unofficial-ccb601dd7e675a9829dfac7080a917b1083d9a6d.tar.gz GT5-Unofficial-ccb601dd7e675a9829dfac7080a917b1083d9a6d.tar.bz2 GT5-Unofficial-ccb601dd7e675a9829dfac7080a917b1083d9a6d.zip |
$ Redid Analytics Handling to be done on a per-player basis and not handle client side per-player.
Diffstat (limited to 'src/Java')
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) { |