diff --git a/FoxTube.Core/Models/User.cs b/FoxTube.Core/Models/User.cs index 49f55b5..2e8d436 100644 --- a/FoxTube.Core/Models/User.cs +++ b/FoxTube.Core/Models/User.cs @@ -1,11 +1,16 @@ -using Google.Apis.Auth.OAuth2; +using FoxTube.Utils; +using Google.Apis.Auth.OAuth2; using Google.Apis.Oauth2.v2; using Google.Apis.Oauth2.v2.Data; using Google.Apis.Services; using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3.Data; +using Newtonsoft.Json; +using System; +using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; +using Windows.Storage; using YouTube; using YoutubeExplode; @@ -21,11 +26,69 @@ namespace FoxTube.Models public ExtendedYouTubeService Service { get; private set; } public YoutubeClient Client { get; private set; } + private User() { } + + public async Task UpdateSubscriptionState(string channelId) + { + if (Subscriptions.Exists(x => x.Snippet.ResourceId.ChannelId == channelId)) + { + Subscription s = Subscriptions.Find(x => x.Snippet.ResourceId.ChannelId == channelId); + + try { await Service.Subscriptions.Delete(s.Id).ExecuteAsync(); } + catch (Exception e) + { + Metrics.SendReport(new Exception("Failed to unsubscribe", e)); + return true; + } + + UserManagement.SubscriptionsChangedInvoker(this, s); + Subscriptions.Remove(s); + + SaveSubscriptions(); + return false; + } + else + { + var request = Service.Subscriptions.Insert(new Subscription() + { + Snippet = new SubscriptionSnippet() + { + ResourceId = new ResourceId() + { + ChannelId = channelId, + Kind = "youtube#channel" + } + } + }, "snippet"); + + Subscription s = await request.ExecuteAsync(); + if (s == null) + return false; + Subscriptions.Add(s); + + UserManagement.SubscriptionsChangedInvoker(this, s); + + SaveSubscriptions(); + return true; + } + } + + private void SaveSubscriptions() + { + Dictionary subs = Subscriptions.Select(i => + new KeyValuePair(i.Snippet.ResourceId.ChannelId, i.Snippet.Thumbnails.Default__?.Url)) + as Dictionary; + + ApplicationData.Current.RoamingSettings.Values[$"Subscriptions.{UserInfo.Id}"] = JsonConvert.SerializeObject(subs); + } + public static async Task GetUser(UserCredential credential) { - User user = new User(); + User user = new User + { + Credential = credential + }; - user.Credential = credential; BaseClientService.Initializer initializer = new BaseClientService.Initializer { ApplicationName = "FoxTube", @@ -52,6 +115,7 @@ namespace FoxTube.Models user.Subscriptions.AddRange(subResponse.Items); } while (!string.IsNullOrWhiteSpace(subRequest.PageToken)); + var request = user.Service.Channels.List("snippet,contentDetails,brandingSettings"); request.Mine = true; diff --git a/FoxTube.Core/UserManagement.cs b/FoxTube.Core/UserManagement.cs index 7ce647e..8b2acf3 100644 --- a/FoxTube.Core/UserManagement.cs +++ b/FoxTube.Core/UserManagement.cs @@ -27,13 +27,13 @@ namespace FoxTube #region Private members private static readonly ApplicationDataContainer storage = ApplicationData.Current.LocalSettings; - private static ExtendedYouTubeService _defaultService = new ExtendedYouTubeService(new Google.Apis.Services.BaseClientService.Initializer + private static readonly ExtendedYouTubeService _defaultService = new ExtendedYouTubeService(new Google.Apis.Services.BaseClientService.Initializer { ApplicationName = "FoxTube", ApiKey = "AIzaSyBgHrCnrlzlVmk0cJKL8RqP9Y8x6XSuk_0", //ApiKey = "AIzaSyD7tpbuvmYDv9h4udo9L_g3r0sLPFAnN00" }); - private static YoutubeClient _defaultYteClient = new YoutubeClient(); + private static readonly YoutubeClient _defaultYteClient = new YoutubeClient(); private static string[] Scopes { get; } = new string[] { @@ -131,6 +131,7 @@ namespace FoxTube await CurrentUser.Credential.RevokeTokenAsync(CancellationToken.None); + storage.Values.Remove($"Subscriptions.{CurrentUser.UserInfo.Id}"); CurrentUser = null; Users[Users.ToList().FindIndex(i => i.Id == userId)] = null; @@ -201,5 +202,8 @@ namespace FoxTube else vaultCredential.Password = refreshToken; } + + internal static void SubscriptionsChangedInvoker(User sender, Subscription subscription) => + SubscriptionsChanged?.Invoke(sender, subscription); } } \ No newline at end of file