diff --git a/InstaSharper.Examples/App.config b/InstaSharper.Examples/App.config index f882b53a..7785bb06 100644 --- a/InstaSharper.Examples/App.config +++ b/InstaSharper.Examples/App.config @@ -4,4 +4,4 @@ - + \ No newline at end of file diff --git a/InstaSharper.Examples/InstaSharper.Examples.csproj b/InstaSharper.Examples/InstaSharper.Examples.csproj index 787fcfce..07fedfd4 100644 --- a/InstaSharper.Examples/InstaSharper.Examples.csproj +++ b/InstaSharper.Examples/InstaSharper.Examples.csproj @@ -34,11 +34,12 @@ 4 - - ..\InstaSharper\bin\Debug\net452\InstaSharper.dll + + False + ..\InstaSharper\bin\release\net452\InstaSharper.dll - packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll + packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll @@ -54,9 +55,11 @@ + + + - diff --git a/InstaSharper.Examples/Program.cs b/InstaSharper.Examples/Program.cs index 6a91cb1b..064e915c 100644 --- a/InstaSharper.Examples/Program.cs +++ b/InstaSharper.Examples/Program.cs @@ -1,8 +1,10 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using InstaSharper.API; using InstaSharper.API.Builder; using InstaSharper.Classes; +using InstaSharper.Classes.Android.DeviceInfo; using InstaSharper.Examples.Samples; using InstaSharper.Logger; @@ -18,6 +20,9 @@ public class Program private static void Main(string[] args) { var result = Task.Run(MainAsync).GetAwaiter().GetResult(); + if (result) + return; + Console.ReadKey(); } public static async Task MainAsync() @@ -33,12 +38,14 @@ public static async Task MainAsync() }; // create new InstaApi instance using Builder - _instaApi = new InstaApiBuilder() + var device = AndroidDeviceGenerator.GetByName(AndroidDevices.SAMSUNG_NOTE3); + var requestMessage = ApiRequestMessage.FromDevice(device); + _instaApi = InstaApiBuilder.CreateBuilder() .SetUser(userSession) - .UseLogger(new DebugLogger()) // use logger for requests and debug messages - .SetRequestDelay(TimeSpan.FromSeconds(1)) // set delay between requests + .SetApiRequestMessage(requestMessage) + .UseLogger(new DebugLogger(LogLevel.Info)) // use logger for requests and debug messages + .SetRequestDelay(TimeSpan.FromSeconds(2)) .Build(); - // login Console.WriteLine($"Logging in as {userSession.UserName}"); var logInResult = await _instaApi.LoginAsync(); @@ -51,27 +58,23 @@ public static async Task MainAsync() Console.WriteLine("Press 1 to start basic demo samples"); Console.WriteLine("Press 2 to start upload photo demo sample"); Console.WriteLine("Press 3 to start comment media demo sample"); + Console.WriteLine("Press 4 to start stories demo sample"); + Console.WriteLine("Press 5 to start demo with saving state of API instance"); + var samplesMap = new Dictionary + { + [ConsoleKey.D1] = new Basics(_instaApi), + [ConsoleKey.D2] = new UploadPhoto(_instaApi), + [ConsoleKey.D3] = new CommentMedia(_instaApi), + [ConsoleKey.D4] = new Stories(_instaApi), + [ConsoleKey.D5] = new SaveLoadState(_instaApi) + }; var key = Console.ReadKey(); Console.WriteLine(Environment.NewLine); - switch (key.Key) - { - case ConsoleKey.D1: - var basics = new Basics(_instaApi); - await basics.DoShow(); - break; - case ConsoleKey.D2: - var upload = new UploadPhoto(_instaApi); - await upload.DoShow(); - break; - case ConsoleKey.D3: - var comment = new CommentMedia(_instaApi); - await comment.DoShow(); - break; - default: - break; - } + if (samplesMap.ContainsKey(key.Key)) + await samplesMap[key.Key].DoShow(); Console.WriteLine("Done. Press esc key to exit..."); + key = Console.ReadKey(); return key.Key == ConsoleKey.Escape; } @@ -88,4 +91,4 @@ public static async Task MainAsync() return false; } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/Properties/AssemblyInfo.cs b/InstaSharper.Examples/Properties/AssemblyInfo.cs index 6035e817..b094a7c8 100644 --- a/InstaSharper.Examples/Properties/AssemblyInfo.cs +++ b/InstaSharper.Examples/Properties/AssemblyInfo.cs @@ -36,4 +36,4 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/Basics.cs b/InstaSharper.Examples/Samples/Basics.cs index 8f21a516..bcb21e24 100644 --- a/InstaSharper.Examples/Samples/Basics.cs +++ b/InstaSharper.Examples/Samples/Basics.cs @@ -6,7 +6,7 @@ namespace InstaSharper.Examples.Samples { - internal class Basics + internal class Basics : IDemoSample { /// /// Config values @@ -72,4 +72,4 @@ public async Task DoShow() } } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/CommentMedia.cs b/InstaSharper.Examples/Samples/CommentMedia.cs index 35f65101..bd290780 100644 --- a/InstaSharper.Examples/Samples/CommentMedia.cs +++ b/InstaSharper.Examples/Samples/CommentMedia.cs @@ -4,7 +4,7 @@ namespace InstaSharper.Examples.Samples { - internal class CommentMedia + internal class CommentMedia : IDemoSample { private readonly IInstaApi _instaApi; @@ -21,4 +21,4 @@ public async Task DoShow() : $"Unable to create comment: {commentResult.Info.Message}"); } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/IDemoSample.cs b/InstaSharper.Examples/Samples/IDemoSample.cs new file mode 100644 index 00000000..19fea3c5 --- /dev/null +++ b/InstaSharper.Examples/Samples/IDemoSample.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace InstaSharper.Examples.Samples +{ + internal interface IDemoSample + { + Task DoShow(); + } +} \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/SaveLoadState.cs b/InstaSharper.Examples/Samples/SaveLoadState.cs new file mode 100644 index 00000000..990da146 --- /dev/null +++ b/InstaSharper.Examples/Samples/SaveLoadState.cs @@ -0,0 +1,41 @@ +using System; +using System.Threading.Tasks; +using InstaSharper.API; +using InstaSharper.API.Builder; + +namespace InstaSharper.Examples.Samples +{ + internal class SaveLoadState : IDemoSample + { + private readonly IInstaApi _instaApi; + + public SaveLoadState(IInstaApi instaApi) + { + _instaApi = instaApi; + } + + public async Task DoShow() + { + var result = await _instaApi.GetCurrentUserAsync(); + if (!result.Succeeded) + { + Console.WriteLine($"Unable to get current user using current API instance: {result.Info}"); + return; + } + Console.WriteLine($"Got current user: {result.Value.UserName} using existing API instance"); + var stream = _instaApi.GetStateDataAsStream(); + var anotherInstance = InstaApiBuilder.CreateBuilder() + .SetRequestDelay(TimeSpan.FromSeconds(2)) + .Build(); + anotherInstance.LoadStateDataFromStream(stream); + var anotherResult = await anotherInstance.GetCurrentUserAsync(); + if (!anotherResult.Succeeded) + { + Console.WriteLine($"Unable to get current user using current API instance: {result.Info}"); + return; + } + Console.WriteLine( + $"Got current user: {anotherResult.Value.UserName} using new API instance without re-login"); + } + } +} \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/Stories.cs b/InstaSharper.Examples/Samples/Stories.cs new file mode 100644 index 00000000..92e851c1 --- /dev/null +++ b/InstaSharper.Examples/Samples/Stories.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using InstaSharper.API; + +namespace InstaSharper.Examples.Samples +{ + internal class Stories : IDemoSample + { + private readonly IInstaApi _instaApi; + + public Stories(IInstaApi instaApi) + { + _instaApi = instaApi; + } + + public async Task DoShow() + { + var result = await _instaApi.GetStoryFeedAsync(); + if (!result.Succeeded) + { + Console.WriteLine($"Unable to get story feed: {result.Info}"); + return; + } + var storyFeed = result.Value; + Console.WriteLine($"Got {storyFeed.Items.Count} story reels."); + foreach (var feedItem in storyFeed.Items) + { + Console.WriteLine($"User: {feedItem.User.FullName}"); + foreach (var item in feedItem.Items) + Console.WriteLine( + $"Story item: {item.Caption?.Text ?? item.Code}, images:{item.ImageList?.Count ?? 0}, videos: {item.VideoList?.Count ?? 0}"); + } + } + } +} \ No newline at end of file diff --git a/InstaSharper.Examples/Samples/UploadPhoto.cs b/InstaSharper.Examples/Samples/UploadPhoto.cs index bffa6b18..300d643b 100644 --- a/InstaSharper.Examples/Samples/UploadPhoto.cs +++ b/InstaSharper.Examples/Samples/UploadPhoto.cs @@ -6,7 +6,7 @@ namespace InstaSharper.Examples.Samples { - internal class UploadPhoto + internal class UploadPhoto : IDemoSample { private readonly IInstaApi _instaApi; @@ -17,7 +17,7 @@ public UploadPhoto(IInstaApi instaApi) public async Task DoShow() { - var mediaImage = new MediaImage + var mediaImage = new InstaImage { Height = 1080, Width = 1080, @@ -29,4 +29,4 @@ public async Task DoShow() : $"Unable to upload photo: {result.Info.Message}"); } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/Utils/ConsoleUtils.cs b/InstaSharper.Examples/Utils/ConsoleUtils.cs index eff75917..1b9956bc 100644 --- a/InstaSharper.Examples/Utils/ConsoleUtils.cs +++ b/InstaSharper.Examples/Utils/ConsoleUtils.cs @@ -11,4 +11,4 @@ public static void PrintMedia(string header, InstaMedia media, int maxDescriptio $"{header} [{media.User.UserName}]: {media.Caption?.Text.Truncate(maxDescriptionLength)}, {media.Code}, likes: {media.LikesCount}, multipost: {media.IsMultiPost}"); } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/Utils/DebugLogger.cs b/InstaSharper.Examples/Utils/DebugLogger.cs deleted file mode 100644 index 173bb364..00000000 --- a/InstaSharper.Examples/Utils/DebugLogger.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading.Tasks; -using InstaSharper.Logger; -using Newtonsoft.Json; - -namespace InstaSharper.Logger -{ - internal class DebugLogger : ILogger - { - public void OnRequest(object request) - { - WriteSeprator(); - if (request is HttpRequestMessage req) - { - Console.WriteLine($"[+] Request: {req.Method} {req.RequestUri}"); - WriteHeaders(req.Headers); - WriteProperties(req.Properties); - } - else if (request is Uri uri) - Console.WriteLine($"[+] Request: {HttpMethod.Get} {uri}"); - else - Console.WriteLine($"Request[{request.GetType()}]"); - //WriteObject(request); - WriteSeprator(); - } - - public void OnResponse(object response) - { - if (response is HttpResponseMessage rsp) - { - Console.WriteLine($"[+] Response: {rsp.RequestMessage.Method} {rsp.RequestMessage.RequestUri}"); - WriteContent(rsp.Content,Formatting.None, 0); - } - //WriteObject(response); - } - - public void OnError(Exception ex) - { - Console.WriteLine("[+] Error:"); - Console.WriteLine(ex.ToString()); - } - - public void OnInfo(string info) - { - Console.WriteLine($"[+] Info:\n{info}"); - } - - private void WriteHeaders(HttpHeaders headers) - { - if (headers == null) return; - if (!headers.Any()) return; - Console.WriteLine("[+] Headers:"); - foreach (var item in headers) - Console.WriteLine($"{item.Key}:{JsonConvert.SerializeObject(item.Value)}"); - } - - private void WriteProperties(IDictionary properties) - { - if (properties == null) return; - if (properties.Count == 0) return; - - Console.WriteLine($"[+] Properties:\n{JsonConvert.SerializeObject(properties, Formatting.Indented)}"); - } - - private async void WriteContent(HttpContent content,Formatting formatting, int maxLen = 0) - { - Console.WriteLine("[+] Content:"); - var raw = await content.ReadAsStringAsync(); - if (formatting == Formatting.Indented) raw = FormatJson(raw); - raw = raw.Contains("") ? "got html content!" : raw; - if (raw.Length > maxLen & maxLen != 0) - raw = raw.Substring(0, maxLen); - Console.WriteLine(raw); - } - - private void WriteSeprator() - { - StringBuilder sep = new StringBuilder(); - for (var i = 0; i < 100; i++) sep.Append("-"); - Console.WriteLine(sep); - } - - private void WriteObject(object obj) - { - Console.WriteLine(JsonConvert.SerializeObject(obj)); - } - - private string FormatJson(string json) - { - dynamic parsedJson = JsonConvert.DeserializeObject(json); - return JsonConvert.SerializeObject(parsedJson, Formatting.Indented); - } - - } -} \ No newline at end of file diff --git a/InstaSharper.Examples/Utils/StringExtensions.cs b/InstaSharper.Examples/Utils/StringExtensions.cs index 7382f191..02d5049c 100644 --- a/InstaSharper.Examples/Utils/StringExtensions.cs +++ b/InstaSharper.Examples/Utils/StringExtensions.cs @@ -7,4 +7,4 @@ public static string Truncate(this string value, int maxChars) return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "..."; } } -} +} \ No newline at end of file diff --git a/InstaSharper.Examples/packages.config b/InstaSharper.Examples/packages.config index 80c23c20..6ca16e36 100644 --- a/InstaSharper.Examples/packages.config +++ b/InstaSharper.Examples/packages.config @@ -1,6 +1,5 @@  - - - + + \ No newline at end of file diff --git a/InstaSharper.Tests/Endpoints/FeedTest.cs b/InstaSharper.Tests/Endpoints/FeedTest.cs index 08347dc1..7371f2be 100644 --- a/InstaSharper.Tests/Endpoints/FeedTest.cs +++ b/InstaSharper.Tests/Endpoints/FeedTest.cs @@ -47,6 +47,21 @@ public async void GetUserTagFeedTest(string username) Assert.False(anyMediaDuplicate); } + [Theory] + [InlineData(260955581)] + [InlineData(267685466)] + [InlineData(466579064)] + public async void GetUserReelFeedTest(long userPk) + { + Assert.True(_authInfo.ApiInstance.IsUserAuthenticated); + + var result = await _authInfo.ApiInstance.GetUserStoryFeedAsync(userPk); + var feed = result.Value; + //assert + Assert.True(result.Succeeded); + Assert.NotNull(feed); + } + [Fact] public async void ExploreTest() { @@ -118,20 +133,5 @@ public async void GetUserLikeFeedTest() Assert.NotNull(feed); Assert.False(anyDuplicate); } - - [Theory] - [InlineData(260955581)] - [InlineData(267685466)] - [InlineData(466579064)] - public async void GetUserReelFeedTest(long userPk) - { - Assert.True(_authInfo.ApiInstance.IsUserAuthenticated); - - var result = await _authInfo.ApiInstance.GetUserStoryFeedAsync(userPk); - var feed = result.Value; - //assert - Assert.True(result.Succeeded); - Assert.NotNull(feed); - } } } \ No newline at end of file diff --git a/InstaSharper.Tests/Infrastructure/ApiInstanceBuilderTest.cs b/InstaSharper.Tests/Infrastructure/ApiInstanceBuilderTest.cs index 2a1dce26..c4a1e1e0 100644 --- a/InstaSharper.Tests/Infrastructure/ApiInstanceBuilderTest.cs +++ b/InstaSharper.Tests/Infrastructure/ApiInstanceBuilderTest.cs @@ -11,7 +11,7 @@ public class ApiInstanceBuilderTest public void CreateApiInstanceWithBuilder() { var result = InstaApiBuilder.CreateBuilder() - .UseLogger(new DebugLogger()) + .UseLogger(new DebugLogger(LogLevel.All)) .Build(); Assert.NotNull(result); } diff --git a/InstaSharper.Tests/Infrastructure/StateDataTest.cs b/InstaSharper.Tests/Infrastructure/StateDataTest.cs index cfd89b86..2230f004 100644 --- a/InstaSharper.Tests/Infrastructure/StateDataTest.cs +++ b/InstaSharper.Tests/Infrastructure/StateDataTest.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using InstaSharper.Classes; +using InstaSharper.Classes; using InstaSharper.Tests.Classes; using InstaSharper.Tests.Utils; using Xunit; @@ -26,10 +23,10 @@ public async void GetSetStateDataTest() var getUserResult = await _authInfo.ApiInstance.GetCurrentUserAsync(); var user = getUserResult.Value; - var data = _authInfo.ApiInstance.GetStateData(); + var data = _authInfo.ApiInstance.GetStateDataAsStream(); var newApiInstance = TestHelpers.GetDefaultInstaApiInstance(new UserSessionData()); - newApiInstance.SetStateData(data); - var newGetUserResult = await _authInfo.ApiInstance.GetCurrentUserAsync(); + newApiInstance.LoadStateDataFromStream(data); + var newGetUserResult = await newApiInstance.GetCurrentUserAsync(); var newUser = getUserResult.Value; Assert.True(getUserResult.Succeeded && newGetUserResult.Succeeded); @@ -37,7 +34,6 @@ public async void GetSetStateDataTest() Assert.NotNull(newUser); Assert.Equal(user.UserName, _authInfo.GetUsername()); Assert.Equal(newUser.UserName, _authInfo.GetUsername()); - } } -} +} \ No newline at end of file diff --git a/InstaSharper.Tests/Utils/TestHelpers.cs b/InstaSharper.Tests/Utils/TestHelpers.cs index 46ce7cdf..4586ac7b 100644 --- a/InstaSharper.Tests/Utils/TestHelpers.cs +++ b/InstaSharper.Tests/Utils/TestHelpers.cs @@ -19,7 +19,7 @@ public static IInstaApi GetDefaultInstaApiInstance(string username) var requestMessage = ApiRequestMessage.FromDevice(device); var apiInstance = InstaApiBuilder.CreateBuilder() .SetUserName(username) - .UseLogger(new DebugLogger()) + .UseLogger(new DebugLogger(LogLevel.All)) .SetApiRequestMessage(requestMessage) .Build(); return apiInstance; diff --git a/InstaSharper/API/IInstaApi.cs b/InstaSharper/API/IInstaApi.cs index 146ca7fd..5f37976a 100644 --- a/InstaSharper/API/IInstaApi.cs +++ b/InstaSharper/API/IInstaApi.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.IO; +using System.Threading.Tasks; using InstaSharper.Classes; using InstaSharper.Classes.Models; @@ -15,6 +16,17 @@ public interface IInstaApi #endregion + /// + /// Get current state info as Memory stream + /// + /// State data + Stream GetStateDataAsStream(); + + /// + /// Set state data from provided stream + /// + void LoadStateDataFromStream(Stream data); + #region Async Members /// @@ -348,16 +360,6 @@ public interface IInstaApi /// Task> GetUserStoryFeedAsync(long userId); - /// - /// Get current state info - /// - /// State data - StateData GetStateData(); - - /// - /// Set state data from provided - /// - void SetStateData(StateData data); #endregion } } \ No newline at end of file diff --git a/InstaSharper/API/InstaApi.cs b/InstaSharper/API/InstaApi.cs index 0403afbc..ec926b6c 100644 --- a/InstaSharper/API/InstaApi.cs +++ b/InstaSharper/API/InstaApi.cs @@ -22,9 +22,9 @@ namespace InstaSharper.API { internal class InstaApi : IInstaApi { - private AndroidDevice _deviceInfo; private readonly IHttpRequestProcessor _httpRequestProcessor; private readonly IInstaLogger _logger; + private AndroidDevice _deviceInfo; private UserSessionData _user; public InstaApi(UserSessionData user, IInstaLogger logger, AndroidDevice deviceInfo, @@ -160,16 +160,27 @@ public async Task> GetUserStoryFeedAsync(long userId) } } - public StateData GetStateData() + /// + public Stream GetStateDataAsStream() { - return new StateData() {DeviceInfo = _deviceInfo, IsAuthenticated = IsUserAuthenticated, UserSession = _user}; + var state = new StateData + { + DeviceInfo = _deviceInfo, + IsAuthenticated = IsUserAuthenticated, + UserSession = _user, + Cookies = _httpRequestProcessor.HttpHandler.CookieContainer + }; + return SerializationHelper.SerializeToStream(state); } - public void SetStateData(StateData data) + /// + public void LoadStateDataFromStream(Stream stream) { + var data = SerializationHelper.DeserializeFromStream(stream); _deviceInfo = data.DeviceInfo; _user = data.UserSession; IsUserAuthenticated = data.IsAuthenticated; + _httpRequestProcessor.HttpHandler.CookieContainer = data.Cookies; } public async Task> GetExploreFeedAsync(int maxPages = 0) diff --git a/InstaSharper/Classes/Android/DeviceInfo/AndroidDevice.cs b/InstaSharper/Classes/Android/DeviceInfo/AndroidDevice.cs index 6a1adbb0..2e3c1ee9 100644 --- a/InstaSharper/Classes/Android/DeviceInfo/AndroidDevice.cs +++ b/InstaSharper/Classes/Android/DeviceInfo/AndroidDevice.cs @@ -5,7 +5,6 @@ namespace InstaSharper.Classes.Android.DeviceInfo [Serializable] public class AndroidDevice { - public AndroidDevice() { } public Guid PhoneGuid { get; set; } public Guid DeviceGuid { get; set; } public Guid GoogleAdId { get; set; } = Guid.NewGuid(); diff --git a/InstaSharper/Classes/Models/InstaUserShort.cs b/InstaSharper/Classes/Models/InstaUserShort.cs index 138db7d3..6a51de42 100644 --- a/InstaSharper/Classes/Models/InstaUserShort.cs +++ b/InstaSharper/Classes/Models/InstaUserShort.cs @@ -1,5 +1,8 @@ +using System; + namespace InstaSharper.Classes.Models { + [Serializable] public class InstaUserShort { public bool IsVerified { get; set; } diff --git a/InstaSharper/Classes/StateData.cs b/InstaSharper/Classes/StateData.cs index d4fcd805..5c6402c9 100644 --- a/InstaSharper/Classes/StateData.cs +++ b/InstaSharper/Classes/StateData.cs @@ -1,17 +1,15 @@ using System; -using System.Collections.Generic; -using System.Text; +using System.Net; using InstaSharper.Classes.Android.DeviceInfo; -using InstaSharper.Logger; namespace InstaSharper.Classes { [Serializable] - public class StateData + internal class StateData { - public StateData() { } public AndroidDevice DeviceInfo { get; set; } public UserSessionData UserSession { get; set; } public bool IsAuthenticated { get; set; } + public CookieContainer Cookies { get; set; } } -} +} \ No newline at end of file diff --git a/InstaSharper/Classes/UserSessionData.cs b/InstaSharper/Classes/UserSessionData.cs index 77d477a9..5b11f2b8 100644 --- a/InstaSharper/Classes/UserSessionData.cs +++ b/InstaSharper/Classes/UserSessionData.cs @@ -6,7 +6,6 @@ namespace InstaSharper.Classes [Serializable] public class UserSessionData { - public UserSessionData() { } public string UserName { get; set; } public string Password { get; set; } diff --git a/InstaSharper/Helpers/SerializationHelper.cs b/InstaSharper/Helpers/SerializationHelper.cs new file mode 100644 index 00000000..8907798d --- /dev/null +++ b/InstaSharper/Helpers/SerializationHelper.cs @@ -0,0 +1,24 @@ +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace InstaSharper.Helpers +{ + internal class SerializationHelper + { + public static MemoryStream SerializeToStream(object o) + { + var stream = new MemoryStream(); + var formatter = new BinaryFormatter(); + formatter.Serialize(stream, o); + return stream; + } + + public static T DeserializeFromStream(Stream stream) + { + var formatter = new BinaryFormatter(); + stream.Seek(0, SeekOrigin.Begin); + var fromStream = formatter.Deserialize(stream); + return (T) fromStream; + } + } +} \ No newline at end of file diff --git a/InstaSharper/Logger/DebugLogger.cs b/InstaSharper/Logger/DebugLogger.cs index 589e8560..9a47f56e 100644 --- a/InstaSharper/Logger/DebugLogger.cs +++ b/InstaSharper/Logger/DebugLogger.cs @@ -10,34 +10,45 @@ namespace InstaSharper.Logger { public class DebugLogger : IInstaLogger { + private readonly LogLevel _logLevel; + + public DebugLogger(LogLevel loglevel) + { + _logLevel = loglevel; + } + public void LogRequest(HttpRequestMessage request) { + if (_logLevel < LogLevel.Request) return; WriteSeprator(); Write($"Request: {request.Method} {request.RequestUri}"); WriteHeaders(request.Headers); WriteProperties(request.Properties); - WriteSeprator(); } public void LogRequest(Uri uri) { + if (_logLevel < LogLevel.Request) return; Write($"Request: {uri}"); } public void LogResponse(HttpResponseMessage response) { + if (_logLevel < LogLevel.Response) return; Write($"Response: {response.RequestMessage.Method} {response.RequestMessage.RequestUri}"); WriteContent(response.Content, Formatting.None, 0); } public void LogException(Exception ex) { + if (_logLevel < LogLevel.Exceptions) return; Console.WriteLine($"Exception: {ex}"); Console.WriteLine($"Stacktrace: {ex.StackTrace}"); } public void LogInfo(string info) { + if (_logLevel < LogLevel.Info) return; Write($"Info:{Environment.NewLine}{info}"); } @@ -47,7 +58,7 @@ private void WriteHeaders(HttpHeaders headers) if (!headers.Any()) return; Write("Headers:"); foreach (var item in headers) - Console.WriteLine($"{item.Key}:{JsonConvert.SerializeObject(item.Value)}"); + Write($"{item.Key}:{JsonConvert.SerializeObject(item.Value)}"); } private void WriteProperties(IDictionary properties) diff --git a/InstaSharper/Logger/LogLevel.cs b/InstaSharper/Logger/LogLevel.cs new file mode 100644 index 00000000..c1ba3284 --- /dev/null +++ b/InstaSharper/Logger/LogLevel.cs @@ -0,0 +1,11 @@ +namespace InstaSharper.Logger +{ + public enum LogLevel + { + Exceptions = 0, + Info = 1, + Request = 2, + Response = 3, + All = 4 + } +} \ No newline at end of file