Add application analytics

Brian [2016-08-18 14:03:27]
Add application analytics
Filename
PokemonGo.RocketBot.Window/Forms/MainForm.cs
PokemonGo.RocketBot.Window/Helpers/MachineIdHelper.cs
PokemonGo.RocketBot.Window/Helpers/ResourceHelper.cs
PokemonGo.RocketBot.Window/PokemomObject.cs
PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
PokemonGo.RocketBot.Window/Resources/client_secret.json
PokemonGo.RocketBot.Window/packages.config
diff --git a/PokemonGo.RocketBot.Window/Forms/MainForm.cs b/PokemonGo.RocketBot.Window/Forms/MainForm.cs
index d647a3f..c1949cd 100644
--- a/PokemonGo.RocketBot.Window/Forms/MainForm.cs
+++ b/PokemonGo.RocketBot.Window/Forms/MainForm.cs
@@ -36,6 +36,9 @@ using POGOProtos.Inventory.Item;
 using POGOProtos.Map.Fort;
 using POGOProtos.Map.Pokemon;
 using POGOProtos.Networking.Responses;
+using Segment;
+using Segment.Model;
+using Logger = PokemonGo.RocketBot.Logic.Logging.Logger;

 namespace PokemonGo.RocketBot.Window.Forms
 {
@@ -43,7 +46,6 @@ namespace PokemonGo.RocketBot.Window.Forms
     {
         public static MainForm Instance;
         public static SynchronizationContext SynchronizationContext;
-
         private static readonly ManualResetEvent QuitEvent = new ManualResetEvent(false);
         private static readonly string subPath = "";
         private static Session _session;
@@ -71,6 +73,13 @@ namespace PokemonGo.RocketBot.Window.Forms
         private void MainForm_Load(object sender, EventArgs e)
         {
             Text = @"RocketBot v" + Assembly.GetExecutingAssembly().GetName().Version;
+
+            //User activity tracking, help us get more information to make RocketBot better
+            //Everything is anonymous
+            Analytics.Initialize("UzL1tnZa9Yw2qcJWRIbcwGFmWGuovXez");
+            Analytics.Client.Identify(MachineIdHelper.GetMachineId(), new Traits());
+            Analytics.Client.Track(MachineIdHelper.GetMachineId(), "App start");
+
             InitializeBot();
             InitializePokemonForm();
             InitializeMap();
@@ -194,26 +203,26 @@ namespace PokemonGo.RocketBot.Window.Forms
             Logger.SetLoggerContext(_session);

             _session.Navigation.UpdatePositionEvent +=
-                (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng });
+                (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent {Latitude = lat, Longitude = lng});
             _session.Navigation.UpdatePositionEvent += Navigation_UpdatePositionEvent;

             RouteOptimizeUtil.RouteOptimizeEvent +=
                 optimizedroute =>
-                    _session.EventDispatcher.Send(new OptimizeRouteEvent { OptimizedRoute = optimizedroute });
+                    _session.EventDispatcher.Send(new OptimizeRouteEvent {OptimizedRoute = optimizedroute});
             RouteOptimizeUtil.RouteOptimizeEvent += InitializePokestopsAndRoute;

             FarmPokestopsTask.LootPokestopEvent +=
-                pokestop => _session.EventDispatcher.Send(new LootPokestopEvent { Pokestop = pokestop });
+                pokestop => _session.EventDispatcher.Send(new LootPokestopEvent {Pokestop = pokestop});
             FarmPokestopsTask.LootPokestopEvent += UpdateMap;

             CatchNearbyPokemonsTask.PokemonEncounterEvent +=
                 mappokemons =>
-                    _session.EventDispatcher.Send(new PokemonsEncounterEvent { EncounterPokemons = mappokemons });
+                    _session.EventDispatcher.Send(new PokemonsEncounterEvent {EncounterPokemons = mappokemons});
             CatchNearbyPokemonsTask.PokemonEncounterEvent += UpdateMap;

             CatchIncensePokemonsTask.PokemonEncounterEvent +=
                 mappokemons =>
-                    _session.EventDispatcher.Send(new PokemonsEncounterEvent { EncounterPokemons = mappokemons });
+                    _session.EventDispatcher.Send(new PokemonsEncounterEvent {EncounterPokemons = mappokemons});
             CatchIncensePokemonsTask.PokemonEncounterEvent += UpdateMap;
         }

@@ -242,8 +251,8 @@ namespace PokemonGo.RocketBot.Window.Forms
                 _playerLocations.Clear();
                 var routePoint =
                     (from pokeStop in pokeStops
-                     where pokeStop != null
-                     select new PointLatLng(pokeStop.Latitude, pokeStop.Longitude)).ToList();
+                        where pokeStop != null
+                        select new PointLatLng(pokeStop.Latitude, pokeStop.Longitude)).ToList();

                 var route = new GMapRoute(routePoint, "Walking Path")
                 {
@@ -267,7 +276,7 @@ namespace PokemonGo.RocketBot.Window.Forms
             {
                 var route = new GMapRoute(_playerLocations, "step")
                 {
-                    Stroke = new Pen(Color.FromArgb(175, 175, 175), 2) { DashStyle = DashStyle.Dot }
+                    Stroke = new Pen(Color.FromArgb(175, 175, 175), 2) {DashStyle = DashStyle.Dot}
                 };
                 _playerOverlay.Routes.Clear();
                 _playerOverlay.Routes.Add(route);
@@ -444,20 +453,20 @@ namespace PokemonGo.RocketBot.Window.Forms
         {
             //olvPokemonList.ButtonClick += PokemonListButton_Click;

-            pkmnName.ImageGetter = delegate (object rowObject)
+            pkmnName.ImageGetter = delegate(object rowObject)
             {
                 var pokemon = rowObject as PokemonObject;

                 var key = pokemon.PokemonId.ToString();
                 if (!olvPokemonList.SmallImageList.Images.ContainsKey(key))
                 {
-                    var img = GetPokemonImage((int)pokemon.PokemonId);
+                    var img = GetPokemonImage((int) pokemon.PokemonId);
                     olvPokemonList.SmallImageList.Images.Add(key, img);
                 }
                 return key;
             };

-            olvPokemonList.FormatRow += delegate (object sender, FormatRowEventArgs e)
+            olvPokemonList.FormatRow += delegate(object sender, FormatRowEventArgs e)
             {
                 var pok = e.Model as PokemonObject;
                 if (olvPokemonList.Objects.Cast<PokemonObject>()
@@ -475,7 +484,7 @@ namespace PokemonGo.RocketBot.Window.Forms
                 }
             };

-            cmsPokemonList.Opening += delegate (object sender, CancelEventArgs e)
+            cmsPokemonList.Opening += delegate(object sender, CancelEventArgs e)
             {
                 e.Cancel = false;
                 cmsPokemonList.Items.Clear();
@@ -776,7 +785,7 @@ namespace PokemonGo.RocketBot.Window.Forms
                 {
                     var pokemonObject = new PokemonObject(pokemon);
                     var family =
-                        _families.Where(i => (int)i.FamilyId <= (int)pokemon.PokemonId)
+                        _families.Where(i => (int) i.FamilyId <= (int) pokemon.PokemonId)
                             .First();
                     pokemonObject.Candy = family.Candy_;
                     pokemonObjects.Add(pokemonObject);
@@ -830,7 +839,7 @@ namespace PokemonGo.RocketBot.Window.Forms

         private async void ItemBox_ItemClick(object sender, EventArgs e)
         {
-            var item = (ItemData)sender;
+            var item = (ItemData) sender;

             using (var form = new ItemForm(item))
             {
diff --git a/PokemonGo.RocketBot.Window/Helpers/MachineIdHelper.cs b/PokemonGo.RocketBot.Window/Helpers/MachineIdHelper.cs
new file mode 100644
index 0000000..88bc2a3
--- /dev/null
+++ b/PokemonGo.RocketBot.Window/Helpers/MachineIdHelper.cs
@@ -0,0 +1,36 @@
+using System.Management;
+
+namespace PokemonGo.RocketBot.Window.Helpers
+{
+    public class MachineIdHelper
+    {
+        public static string GetCpuId()
+        {
+            var cpuInfo = string.Empty;
+            var mc = new ManagementClass("win32_processor");
+            var moc = mc.GetInstances();
+
+            foreach (var o in moc)
+            {
+                var mo = (ManagementObject) o;
+                cpuInfo = mo.Properties["processorID"].Value.ToString();
+                break;
+            }
+            return cpuInfo;
+        }
+
+        public static string GetHardDriveId()
+        {
+            var drive = "C";
+            var dsk = new ManagementObject(
+                @"win32_logicaldisk.deviceid=""" + drive + @":""");
+            dsk.Get();
+            return dsk["VolumeSerialNumber"].ToString();
+        }
+
+        public static string GetMachineId()
+        {
+            return GetCpuId() + GetHardDriveId();
+        }
+    }
+}
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/Helpers/ResourceHelper.cs b/PokemonGo.RocketBot.Window/Helpers/ResourceHelper.cs
index e976e5a..9ea7874 100644
--- a/PokemonGo.RocketBot.Window/Helpers/ResourceHelper.cs
+++ b/PokemonGo.RocketBot.Window/Helpers/ResourceHelper.cs
@@ -1,10 +1,5 @@
 using System;
-using System.Collections.Generic;
 using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;

 namespace PokemonGo.RocketBot.Window.Helpers
 {
@@ -12,18 +7,18 @@ namespace PokemonGo.RocketBot.Window.Helpers
     {
         public static Image GetImage(string name)
         {
-            return (Image)Properties.Resources.ResourceManager.GetObject(name);
+            return (Image) Properties.Resources.ResourceManager.GetObject(name);
         }

         public static Image GetImage(string name, int maxHeight, int maxWidth)
         {
-            Image image = GetImage(name);
-            var ratioX = (double)maxWidth / image.Width;
-            var ratioY = (double)maxHeight / image.Height;
+            var image = GetImage(name);
+            var ratioX = (double) maxWidth/image.Width;
+            var ratioY = (double) maxHeight/image.Height;
             var ratio = Math.Min(ratioX, ratioY);

-            var newWidth = (int)(image.Width * ratio);
-            var newHeight = (int)(image.Height * ratio);
+            var newWidth = (int) (image.Width*ratio);
+            var newHeight = (int) (image.Height*ratio);

             var newImage = new Bitmap(newWidth, newHeight);

@@ -33,4 +28,4 @@ namespace PokemonGo.RocketBot.Window.Helpers
             return newImage;
         }
     }
-}
+}
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/PokemomObject.cs b/PokemonGo.RocketBot.Window/PokemomObject.cs
index 75c100d..739e2e0 100644
--- a/PokemonGo.RocketBot.Window/PokemomObject.cs
+++ b/PokemonGo.RocketBot.Window/PokemomObject.cs
@@ -51,7 +51,7 @@ namespace PokemonGo.RocketBot.Window

         public double GetIV
         {
-            get { return Math.Round(PokemonInfo.CalculatePokemonPerfection(PokemonData) / 100, 2); }
+            get { return Math.Round(PokemonInfo.CalculatePokemonPerfection(PokemonData)/100, 2); }
         }

         public double GetLv
@@ -84,7 +84,7 @@ namespace PokemonGo.RocketBot.Window
             {
                 if (CandyToEvolve > 0)
                 {
-                    return Candy / CandyToEvolve;
+                    return Candy/CandyToEvolve;
                 }
                 return 0;
             }
diff --git a/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj b/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
index 8eb59ad..e91f81c 100644
--- a/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
+++ b/PokemonGo.RocketBot.Window/PokemonGo.RocketBot.Window.csproj
@@ -87,6 +87,10 @@
     <StartupObject />
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Analytics.NET, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Analytics.2.0.2\lib\Analytics.NET.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="GMap.NET.Core, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b85b9027b614afef, processorArchitecture=MSIL">
       <HintPath>..\packages\GMap.NET.WindowsForms.1.7.1\lib\net40\GMap.NET.Core.dll</HintPath>
       <Private>True</Private>
@@ -124,6 +128,7 @@
     <Reference Include="System.Core" />
     <Reference Include="System.Drawing" />
     <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Management" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="Microsoft.CSharp" />
   </ItemGroup>
@@ -149,6 +154,7 @@
     <Compile Include="Forms\MainForm.designer.cs">
       <DependentUpon>MainForm.cs</DependentUpon>
     </Compile>
+    <Compile Include="Helpers\MachineIdHelper.cs" />
     <Compile Include="Helpers\ResourceHelper.cs" />
     <Compile Include="Helpers\S2GMapDrawer.cs" />
     <Compile Include="Models\GMapMarkerPokestops.cs" />
diff --git a/PokemonGo.RocketBot.Window/Resources/client_secret.json b/PokemonGo.RocketBot.Window/Resources/client_secret.json
new file mode 100644
index 0000000..30bb0a1
--- /dev/null
+++ b/PokemonGo.RocketBot.Window/Resources/client_secret.json
@@ -0,0 +1 @@
+{"installed":{"client_id":"1085850728336-5c0olh427pnpdrvtuq86ub2d6kkern48.apps.googleusercontent.com","project_id":"jovial-engine-140704","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"mtvRhbM1B9_bxrMAdHSK6Abm","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}}
\ No newline at end of file
diff --git a/PokemonGo.RocketBot.Window/packages.config b/PokemonGo.RocketBot.Window/packages.config
index 7fd6988..a4501d6 100644
--- a/PokemonGo.RocketBot.Window/packages.config
+++ b/PokemonGo.RocketBot.Window/packages.config
@@ -1,10 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>

 <packages>
+  <package id="Analytics" version="2.0.2" targetFramework="net452" />
+  <package id="BouncyCastle" version="1.8.1" targetFramework="net452" />
   <package id="C5" version="2.4.5947.17249" targetFramework="net452" />
   <package id="Costura.Fody" version="1.3.3.0" targetFramework="net45" developmentDependency="true" />
   <package id="Fody" version="1.29.4" targetFramework="net45" developmentDependency="true" />
   <package id="GMap.NET.WindowsForms" version="1.7.1" targetFramework="net452" />
+  <package id="Google.Apis" version="1.15.0" targetFramework="net452" />
+  <package id="Google.Apis.Auth" version="1.15.0" targetFramework="net452" />
+  <package id="Google.Apis.Core" version="1.15.0" targetFramework="net452" />
   <package id="Google.Protobuf" version="3.0.0" targetFramework="net452" />
   <package id="log4net" version="2.0.5" targetFramework="net45" />
   <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net452" />
@@ -45,4 +50,5 @@
   <package id="System.Threading.Timer" version="4.0.1" targetFramework="net452" />
   <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net452" />
   <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net452" />
+  <package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net452" />
 </packages>
\ No newline at end of file
You may download the files in Public Git.