Merge pull request #17 from Sen66/master

Detective Squirrel [2016-07-22 05:54:47]
Merge pull request #17 from Sen66/master

Added some stuff
Filename
.vs/Pokemon Go Rocket API/v14/.suo
PokemonGo/RocketAPI/Client.cs
PokemonGo/RocketAPI/Console/App.config
PokemonGo/RocketAPI/Console/PokemonGo.RocketAPI.Console.csproj
PokemonGo/RocketAPI/Console/Program.cs
PokemonGo/RocketAPI/Console/Settings.cs
PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
PokemonGo/RocketAPI/ISettings.cs
README.md
img.jpg
img.png
diff --git a/.vs/Pokemon Go Rocket API/v14/.suo b/.vs/Pokemon Go Rocket API/v14/.suo
index e04100d..08885fe 100644
Binary files a/.vs/Pokemon Go Rocket API/v14/.suo and b/.vs/Pokemon Go Rocket API/v14/.suo differ
diff --git a/PokemonGo/RocketAPI/Client.cs b/PokemonGo/RocketAPI/Client.cs
index a3d3d51..01fc070 100644
--- a/PokemonGo/RocketAPI/Client.cs
+++ b/PokemonGo/RocketAPI/Client.cs
@@ -1,4 +1,4 @@
-#region
+#region

 using System;
 using System.Linq;
@@ -11,6 +11,8 @@ using PokemonGo.RocketAPI.Extensions;
 using PokemonGo.RocketAPI.GeneratedCode;
 using PokemonGo.RocketAPI.Helpers;
 using PokemonGo.RocketAPI.Login;
+using AllEnum;
+using System.Collections.Generic;

 #endregion

@@ -19,7 +21,7 @@ namespace PokemonGo.RocketAPI
     public class Client
     {
         private readonly HttpClient _httpClient;
-        private readonly ISettings _settings;
+        private ISettings _settings;
         private string _accessToken;
         private string _apiUrl;
         private AuthType _authType = AuthType.Google;
@@ -27,6 +29,7 @@ namespace PokemonGo.RocketAPI
         private double _currentLat;
         private double _currentLng;
         private Request.Types.UnknownAuth _unknownAuth;
+        static string accestoken = string.Empty;

         public Client(ISettings settings)
         {
@@ -77,15 +80,20 @@ namespace PokemonGo.RocketAPI

         public async Task DoGoogleLogin()
         {
-            if (_settings.GoogleRefreshToken == string.Empty)
+            if (_settings.GoogleRefreshToken == string.Empty && accestoken == string.Empty)
             {
                 var tokenResponse = await GoogleLogin.GetAccessToken();
                 _accessToken = tokenResponse.id_token;
                 Console.WriteLine($"Put RefreshToken in settings for direct login: {tokenResponse.access_token}");
+                accestoken = tokenResponse.access_token;
             }
             else
             {
-                var tokenResponse = await GoogleLogin.GetAccessToken(_settings.GoogleRefreshToken);
+                GoogleLogin.TokenResponseModel tokenResponse;
+                if (_settings.GoogleRefreshToken != string.Empty)
+                    tokenResponse = await GoogleLogin.GetAccessToken(_settings.GoogleRefreshToken);
+                else
+                    tokenResponse = await GoogleLogin.GetAccessToken(accestoken);
                 _accessToken = tokenResponse.id_token;
                 _authType = AuthType.Google;
             }
@@ -392,5 +400,56 @@ namespace PokemonGo.RocketAPI
                     _httpClient.PostProtoPayload<Request, PlayerUpdateResponse>($"https://{_apiUrl}/rpc", updateRequest);
             return updateResponse;
         }
+
+
+
+
+        public async Task<IEnumerable<Item>> GetItemsToRecycle(ISettings settings, Client client)
+        {
+            var myItems = await GetItems(client);
+
+            return myItems
+                .Where(x => settings.ItemRecycleFilter.Any(f => f.Key == ((ItemId)x.Item_) && x.Count > f.Value))
+                .Select(x => new Item { Item_ = x.Item_, Count = x.Count - settings.ItemRecycleFilter.Single(f => f.Key == (AllEnum.ItemId)x.Item_).Value, Unseen = x.Unseen });
+        }
+
+        public async Task RecycleItems(Client client)
+        {
+            var items = await GetItemsToRecycle(_settings, client);
+
+            foreach (var item in items)
+            {
+                var transfer = await RecycleItem((AllEnum.ItemId)item.Item_, item.Count);
+                ColoredConsoleWrite(ConsoleColor.DarkCyan, $"[{DateTime.Now.ToString("HH:mm:ss")}] Recycled {item.Count}x {(AllEnum.ItemId)item.Item_}");
+                await Task.Delay(500);
+            }
+            await Task.Delay(_settings.RecycleItemsInterval * 1000);
+            RecycleItems(client);
+        }
+
+        public async Task<Response.Types.Unknown6> RecycleItem(AllEnum.ItemId itemId, int amount)
+        {
+            var customRequest = new InventoryItemData.RecycleInventoryItem
+            {
+                ItemId = (AllEnum.ItemId)Enum.Parse(typeof(AllEnum.ItemId), itemId.ToString()),
+                Count = amount
+            };
+
+            var releasePokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30,
+                new Request.Types.Requests()
+                {
+                    Type = (int)RequestType.RECYCLE_INVENTORY_ITEM,
+                    Message = customRequest.ToByteString()
+                });
+            return await _httpClient.PostProtoPayload<Request, Response.Types.Unknown6>($"https://{_apiUrl}/rpc", releasePokemonRequest);
+        }
+
+        public static async Task<IEnumerable<Item>> GetItems(Client client)
+        {
+            var inventory = await client.GetInventory();
+            return inventory.InventoryDelta.InventoryItems
+                .Select(i => i.InventoryItemData?.Item)
+                .Where(p => p != null);
+        }
     }
 }
diff --git a/PokemonGo/RocketAPI/Console/App.config b/PokemonGo/RocketAPI/Console/App.config
index d5900b4..54cda01 100644
--- a/PokemonGo/RocketAPI/Console/App.config
+++ b/PokemonGo/RocketAPI/Console/App.config
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
-    <startup>
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+  </startup>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
@@ -12,14 +12,38 @@
     </assemblyBinding>
   </runtime>
   <appSettings>
-    <add key="AuthType" value="Google"/><!--Google/Ptc-->
-    <add key="PtcUsername" value="username"/>
-    <add key="PtcPassword" value="pw"/>
-    <add key="GoogleRefreshToken" value=""/>
-    <add key="DefaultLatitude" value="52.379189"/><!--Default Amsterdam Central Station-->
-    <add key="DefaultLongitude" value="4.899431"/><!--Default Amsterdam Central Station-->
-    <add key="TransferType" value="none"/><!--none/cp/leaveStrongest/duplicate/all Whitelists/blackslists for each type is in Program.cs-->
-    <add key="TransferCPThreshold" value="0"/><!--transfer pokemon with CP less than this value if cp transfer type is selected. Whitelist in Program.cs-->
-    <add key="EvolveAllGivenPokemons" value="false"/>
+    <add key="AuthType" value="Google" />
+    <!--Google/Ptc-->
+    <add key="PtcUsername" value="username" />
+    <add key="PtcPassword" value="pw" />
+    <add key="GoogleRefreshToken" value="" />
+    <add key="DefaultLatitude" value="48.398358" />
+    <!--Default Amsterdam Central Station-->
+    <add key="DefaultLongitude" value="13.436663" />
+    <!--Default Amsterdam Central Station-->
+    <add key="LevelOutput" value="levelup" />
+    <!--2 Modes: "time": Every XXX seconds and "levelup" every levelup-->
+    <add key="LevelTimeInterval" value="1" />
+    <!--Pick 1 if levelup and time in seconds if "time"-->
+    <add key="RecycleItemsInterval" value="60" />
+    <!--Recycle Time in seconds-->
+    <add key="TransferType" value="none" />
+    <!--none/cp/leaveStrongest/duplicate/all Whitelists/blackslists for each type is in Program.cs-->
+    <add key="TransferCPThreshold" value="0" />
+    <!--transfer pokemon with CP less than this value if cp transfer type is selected. Whitelist in Program.cs-->
+    <add key="EvolveAllGivenPokemons" value="false" />
+    <add key="ClientSettingsProvider.ServiceUri" value="" />
   </appSettings>
+  <system.web>
+    <membership defaultProvider="ClientAuthenticationMembershipProvider">
+      <providers>
+        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
+      </providers>
+    </membership>
+    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
+      <providers>
+        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
+      </providers>
+    </roleManager>
+  </system.web>
 </configuration>
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Console/PokemonGo.RocketAPI.Console.csproj b/PokemonGo/RocketAPI/Console/PokemonGo.RocketAPI.Console.csproj
index fafb5f7..a8a785c 100644
--- a/PokemonGo/RocketAPI/Console/PokemonGo.RocketAPI.Console.csproj
+++ b/PokemonGo/RocketAPI/Console/PokemonGo.RocketAPI.Console.csproj
@@ -11,6 +11,21 @@
     <AssemblyName>PokemonGo.RocketAPI.Console</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -39,6 +54,7 @@
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Web.Extensions" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -61,6 +77,18 @@
       <Name>PokemonGo.RocketAPI</Name>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.5">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
        Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/PokemonGo/RocketAPI/Console/Program.cs b/PokemonGo/RocketAPI/Console/Program.cs
index aeb7e17..60f087b 100644
--- a/PokemonGo/RocketAPI/Console/Program.cs
+++ b/PokemonGo/RocketAPI/Console/Program.cs
@@ -1,4 +1,4 @@
-#region
+#region

 using System;
 using System.Collections.Generic;
@@ -26,10 +26,10 @@ namespace PokemonGo.RocketAPI.Console
     internal class Program
     {
         private static readonly ISettings ClientSettings = new Settings();
-
+        static int Currentlevel = -1;

         public static void CheckVersion()
-        {
+        {
             try
             {
                 var match =
@@ -55,7 +55,7 @@ namespace PokemonGo.RocketAPI.Console

                 ColoredConsoleWrite(ConsoleColor.White, "There is a new Version available: " + gitVersion + " downloading.. ");
                 Thread.Sleep(1000);
-                Process.Start("https://github.com/NecronomiconCoding/Pokemon-Go-Rocket-API");
+                Process.Start("");
             }
             catch (Exception)
             {
@@ -68,7 +68,7 @@ namespace PokemonGo.RocketAPI.Console
             using (var wC = new WebClient())
                 return
                     wC.DownloadString(
-                        "https://raw.githubusercontent.com/NecronomiconCoding/Pokemon-Go-Rocket-API/master/PokemonGo/RocketAPI/Console/Properties/AssemblyInfo.cs");
+                        "");
         }

         public static void ColoredConsoleWrite(ConsoleColor color, string text)
@@ -154,9 +154,10 @@ namespace PokemonGo.RocketAPI.Console
             ColoredConsoleWrite(ConsoleColor.DarkGray, "Latitude: " + ClientSettings.DefaultLatitude);
             ColoredConsoleWrite(ConsoleColor.DarkGray, "Longitude: " + ClientSettings.DefaultLongitude);
             ColoredConsoleWrite(ConsoleColor.Yellow, "----------------------------");
-            ColoredConsoleWrite(ConsoleColor.DarkGray, "Random Profile Data\n");
-            ColoredConsoleWrite(ConsoleColor.DarkGray, profile.ToString());
-
+            ColoredConsoleWrite(ConsoleColor.DarkGray, "Your Account:\n");
+            ColoredConsoleWrite(ConsoleColor.DarkGray, "Name: " + profile.Profile.Username);
+            ColoredConsoleWrite(ConsoleColor.DarkGray, "Team: " + profile.Profile.Team);
+            ColoredConsoleWrite(ConsoleColor.DarkGray, "Stardust: " + profile.Profile.Currency.ToArray()[1].Amount);


             try
@@ -176,7 +177,10 @@ namespace PokemonGo.RocketAPI.Console
                 if (ClientSettings.EvolveAllGivenPokemons)
                     await EvolveAllGivenPokemons(client, pokemons);

+                client.RecycleItems(client);
+
                 await Task.Delay(5000);
+                PrintLevel(client);
                 await ExecuteFarmingPokestopsAndPokemons(client);
                 ColoredConsoleWrite(ConsoleColor.Red, $"[{DateTime.Now.ToString("HH:mm:ss")}] Unexpected stop? Restarting in 20 seconds.");
                 await Task.Delay(20000);
@@ -186,6 +190,7 @@ namespace PokemonGo.RocketAPI.Console
             catch (UriFormatException ufe) { ColoredConsoleWrite(ConsoleColor.White, "System URI Format Exception - Restarting"); Execute(); }
             catch (ArgumentOutOfRangeException aore) { ColoredConsoleWrite(ConsoleColor.White, "ArgumentOutOfRangeException - Restarting"); Execute(); }
             catch (NullReferenceException nre) { ColoredConsoleWrite(ConsoleColor.White, "Null Refference - Restarting"); Execute(); }
+            catch (ArgumentNullException ane) { ColoredConsoleWrite(ConsoleColor.White, "Argument Null Refference - Restarting"); Execute(); }
             //await ExecuteCatchAllNearbyPokemons(client);
         }

@@ -297,7 +302,7 @@ namespace PokemonGo.RocketAPI.Console
             });
             System.Console.ReadLine();
         }
-
+
         private static async Task TransferAllButStrongestUnwantedPokemon(Client client)
         {
             //ColoredConsoleWrite(ConsoleColor.White, $"[{DateTime.Now.ToString("HH:mm:ss")}] Firing up the meat grinder");
@@ -460,5 +465,24 @@ namespace PokemonGo.RocketAPI.Console

             ColoredConsoleWrite(ConsoleColor.Gray, $"[{DateTime.Now.ToString("HH:mm:ss")}] Finished grinding all the meat");
         }
+
+        public static async Task PrintLevel(Client client)
+        {
+            var inventory = await client.GetInventory();
+            var stats = inventory.InventoryDelta.InventoryItems.Select(i => i.InventoryItemData?.PlayerStats).ToArray();
+            foreach (var v in stats)
+                if (v != null)
+                    if (ClientSettings.LevelOutput == "time")
+                        ColoredConsoleWrite(ConsoleColor.Yellow, $"[{DateTime.Now.ToString("HH:mm:ss")}] Current Level: " + v.Level + " (" + v.Experience + "/" + v.NextLevelXp + ")");
+                    else if (ClientSettings.LevelOutput == "levelup")
+                        if (Currentlevel != v.Level)
+                        {
+                            Currentlevel = v.Level;
+                            ColoredConsoleWrite(ConsoleColor.Magenta, $"[{DateTime.Now.ToString("HH:mm:ss")}] Current Level: " + v.Level + ". XP needed for next Level: " + (v.NextLevelXp - v.Experience));
+                        }
+
+            await Task.Delay(ClientSettings.LevelTimeInterval * 1000);
+            PrintLevel(client);
+        }
     }
 }
diff --git a/PokemonGo/RocketAPI/Console/Settings.cs b/PokemonGo/RocketAPI/Console/Settings.cs
index b27fbb9..d9bb280 100644
--- a/PokemonGo/RocketAPI/Console/Settings.cs
+++ b/PokemonGo/RocketAPI/Console/Settings.cs
@@ -1,9 +1,12 @@
-#region
+#region

 using System.Configuration;
 using System.Globalization;
 using System.Runtime.CompilerServices;
 using PokemonGo.RocketAPI.Enums;
+using System.Collections.Generic;
+using AllEnum;
+using System;

 #endregion

@@ -32,6 +35,35 @@ namespace PokemonGo.RocketAPI.Console

         // LEAVE EVERYTHING ALONE

+        public string LevelOutput => GetSetting() != string.Empty ? GetSetting() : "time";
+
+        public int LevelTimeInterval => GetSetting() != string.Empty ? System.Convert.ToInt16(GetSetting()) : 600;
+
+        ICollection<KeyValuePair<ItemId, int>> ISettings.ItemRecycleFilter
+        {
+            get
+            {
+                //Type and amount to keep
+                return new[]
+                {
+                    new KeyValuePair<ItemId, int>(ItemId.ItemPokeBall, 20),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemGreatBall, 50),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemUltraBall, 100),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemMasterBall, 200),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemRevive, 20),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemPotion, 0),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemSuperPotion, 0),
+                    new KeyValuePair<ItemId, int>(ItemId.ItemHyperPotion, 50)
+                };
+            }
+
+            set
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public int RecycleItemsInterval => GetSetting() != string.Empty ? Convert.ToInt16(GetSetting()) : 60;

         public string GoogleRefreshToken
         {
diff --git a/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs b/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
index 091f87e..69892bf 100644
--- a/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
+++ b/PokemonGo/RocketAPI/GeneratedCode/Payloads.cs
@@ -3085,6 +3085,167 @@ namespace PokemonGo.RocketAPI.GeneratedCode
             }
         }

+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class RecycleInventoryItem : pb::IMessage<RecycleInventoryItem>
+        {
+            private static readonly pb::MessageParser<RecycleInventoryItem> _parser = new pb::MessageParser<RecycleInventoryItem>(() => new RecycleInventoryItem());
+            public static pb::MessageParser<RecycleInventoryItem> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor
+            {
+                get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[10]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor
+            {
+                get { return Descriptor; }
+            }
+
+            public RecycleInventoryItem()
+            {
+                OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public RecycleInventoryItem(RecycleInventoryItem other) : this()
+            {
+                itemId_ = other.itemId_;
+                count_ = other.count_;
+            }
+
+            public RecycleInventoryItem Clone()
+            {
+                return new RecycleInventoryItem(this);
+            }
+
+            /// <summary>Field number for the "item_id" field.</summary>
+            public const int ItemIdFieldNumber = 1;
+            private global::AllEnum.ItemId itemId_ = 0;
+            public global::AllEnum.ItemId ItemId
+            {
+                get { return itemId_; }
+                set
+                {
+                    itemId_ = value;
+                }
+            }
+
+            /// <summary>Field number for the "count" field.</summary>
+            public const int CountFieldNumber = 2;
+            private int count_;
+            public int Count
+            {
+                get { return count_; }
+                set
+                {
+                    count_ = value;
+                }
+            }
+
+            public override bool Equals(object other)
+            {
+                return Equals(other as RecycleInventoryItem);
+            }
+
+            public bool Equals(RecycleInventoryItem other)
+            {
+                if (ReferenceEquals(other, null))
+                {
+                    return false;
+                }
+                if (ReferenceEquals(other, this))
+                {
+                    return true;
+                }
+                if (ItemId != other.ItemId) return false;
+                if (Count != other.Count) return false;
+                return true;
+            }
+
+            public override int GetHashCode()
+            {
+                int hash = 1;
+                if (ItemId != 0) hash ^= ItemId.GetHashCode();
+                if (Count != 0) hash ^= Count.GetHashCode();
+                return hash;
+            }
+
+            public override string ToString()
+            {
+                return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output)
+            {
+                if (ItemId != 0)
+                {
+                    output.WriteRawTag(8);
+                    output.WriteEnum((int)ItemId);
+                }
+                if (Count != 0)
+                {
+                    output.WriteRawTag(16);
+                    output.WriteInt32(Count);
+                }
+            }
+
+            public int CalculateSize()
+            {
+                int size = 0;
+                if (ItemId != 0)
+                {
+                    size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ItemId);
+                }
+                if (Count != 0)
+                {
+                    size += 1 + pb::CodedOutputStream.ComputeInt32Size(Count);
+                }
+                return size;
+            }
+
+            public void MergeFrom(RecycleInventoryItem other)
+            {
+                if (other == null)
+                {
+                    return;
+                }
+                if (other.ItemId != 0)
+                {
+                    ItemId = other.ItemId;
+                }
+                if (other.Count != 0)
+                {
+                    Count = other.Count;
+                }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input)
+            {
+                uint tag;
+                while ((tag = input.ReadTag()) != 0)
+                {
+                    switch (tag)
+                    {
+                        default:
+                            input.SkipLastField();
+                            break;
+                        case 8:
+                            {
+                                itemId_ = (global::AllEnum.ItemId)input.ReadEnum();
+                                break;
+                            }
+                        case 16:
+                            {
+                                Count = input.ReadInt32();
+                                break;
+                            }
+                    }
+                }
+            }
+
+        }
+
         public int CalculateSize()
         {
             var size = 0;
diff --git a/PokemonGo/RocketAPI/ISettings.cs b/PokemonGo/RocketAPI/ISettings.cs
index 12af47a..247ecad 100644
--- a/PokemonGo/RocketAPI/ISettings.cs
+++ b/PokemonGo/RocketAPI/ISettings.cs
@@ -1,6 +1,7 @@
-#region
+#region

 using PokemonGo.RocketAPI.Enums;
+using System.Collections.Generic;

 #endregion

@@ -11,11 +12,15 @@ namespace PokemonGo.RocketAPI
         AuthType AuthType { get; }
         double DefaultLatitude { get; }
         double DefaultLongitude { get; }
+        string LevelOutput { get; }
+        int LevelTimeInterval { get; }
         string GoogleRefreshToken { get; set; }
         string PtcPassword { get; }
         string PtcUsername { get; }
         bool EvolveAllGivenPokemons { get; }
         string TransferType { get; }
         int TransferCPThreshold { get; }
+        ICollection<KeyValuePair<AllEnum.ItemId, int>> ItemRecycleFilter { get; set; }
+        int RecycleItemsInterval { get; }
     }
-}
\ No newline at end of file
+}
diff --git a/README.md b/README.md
index 846c951..ca4f400 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Pokemon-Go-Rocket-API
-![alt tag](https://github.com/DetectiveSquirrel/Pokemon-Go-Rocket-API/blob/master/img.png)
+![alt tag](https://github.com/Sen66/Pokemon-Go-Rocket-API/blob/master/img.jpg)

 A Pokemon Go bot in C#

@@ -11,7 +11,8 @@ A Pokemon Go bot in C#
 * Farm all pokemons in neighbourhood
 * Evolve pokemons
 * Transfer pokemons
-* Auto Updates
+* Auto recycle not needed items
+* Output level and needed XP for levelup

 ## Getting Started

diff --git a/img.jpg b/img.jpg
new file mode 100644
index 0000000..b5d421f
Binary files /dev/null and b/img.jpg differ
diff --git a/img.png b/img.png
deleted file mode 100644
index c791baf..0000000
Binary files a/img.png and /dev/null differ
You may download the files in Public Git.