using Google.Apis.Auth.OAuth2; using Google.Apis.Oauth2.v2; using Google.Apis.Services; using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3.Data; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Xml; using Windows.ApplicationModel.Background; using Windows.Storage; using Windows.UI.Notifications; namespace FoxTube.Background { public sealed class BackgroundProcessor : IBackgroundTask { private DateTime lastCheck; private readonly ApplicationDataContainer settings = ApplicationData.Current.RoamingSettings; dynamic prefs; BackgroundTaskDeferral def; public async void Run(IBackgroundTaskInstance taskInstance) { try { def = taskInstance.GetDeferral(); if (settings.Values["lastCheck"] == null) { settings.Values["lastCheck"] = DateTime.Now.ToString(); def.Complete(); return; } else lastCheck = DateTime.Parse(settings.Values["lastCheck"] as string); prefs = JsonConvert.DeserializeObject(settings.Values["settings"] as string); if ((bool)prefs.devNotifications) CheckAnnouncements(); if ((bool)prefs.videoNotifications && (bool)prefs.hasAccount) await CheckAccount(); } finally { settings.Values["lastCheck"] = DateTime.Now.ToString(); def.Complete(); } } async Task CheckAccount() { try { UserCredential Credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = "349735264870-2ekqlm0a4mkg3mmrfcv90s3qp3o15dq0.apps.googleusercontent.com", ClientSecret = "BkVZOAaCU2Zclf0Zlicg6y2_" }, new[] { Oauth2Service.Scope.UserinfoProfile, Oauth2Service.Scope.UserinfoEmail, YouTubeService.Scope.YoutubeForceSsl, YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.YoutubeReadonly, YouTubeService.Scope.Youtubepartner }, "user", CancellationToken.None); if (Credential == null) return; YouTubeService service = new YouTubeService(new BaseClientService.Initializer { HttpClientInitializer = Credential, ApplicationName = "FoxTube" }); List subscriptions = new List(); List results = new List(); SubscriptionsResource.ListRequest subRequest = service.Subscriptions.List("snippet"); subRequest.Mine = true; subRequest.MaxResults = 50; subRequest.Order = SubscriptionsResource.ListRequest.OrderEnum.Relevance; SubscriptionListResponse subResponse; string nextToken = null; do { subRequest.PageToken = nextToken; subResponse = await subRequest.ExecuteAsync(); foreach (Subscription s in subResponse.Items) subscriptions.Add(s); nextToken = subResponse.NextPageToken; } while (!string.IsNullOrWhiteSpace(nextToken)); foreach (Subscription item in subscriptions) { SearchResource.ListRequest request = service.Search.List("snippet"); request.PublishedAfter = lastCheck; request.ChannelId = item.Snippet.ResourceId.ChannelId; request.Type = "video"; request.MaxResults = 5; SearchListResponse response = await request.ExecuteAsync(); foreach (SearchResult i in response.Items) { results.Add(i); if (i.Snippet.LiveBroadcastContent == "live") ToastNotificationManager.CreateToastNotifier().Show( Notification.GetStreamToast(i.Id.VideoId, i.Snippet.ChannelId, i.Snippet.Title.ConvertEscapeSymbols(), i.Snippet.ChannelTitle, i.Snippet.Thumbnails.Medium.Url, i.Snippet.PublishedAt.Value, item.Snippet.Thumbnails.Default__.Url)); else if (i.Snippet.LiveBroadcastContent == "upcoming") ToastNotificationManager.CreateToastNotifier().Show( Notification.GetUpcomingToast(i.Id.VideoId, i.Snippet.ChannelId, i.Snippet.Title.ConvertEscapeSymbols(), i.Snippet.ChannelTitle, i.Snippet.Thumbnails.Medium.Url, i.Snippet.PublishedAt.Value, item.Snippet.Thumbnails.Default__.Url)); else ToastNotificationManager.CreateToastNotifier().Show( Notification.GetVideoToast(i.Id.VideoId, i.Snippet.ChannelId, i.Snippet.Title.ConvertEscapeSymbols(), i.Snippet.ChannelTitle, i.Snippet.Thumbnails.Medium.Url, i.Snippet.PublishedAt.Value, item.Snippet.Thumbnails.Default__.Url)); } } results.OrderBy(i => i.Snippet.PublishedAt); TileUpdater updater = TileUpdateManager.CreateTileUpdaterForApplication(); updater.EnableNotificationQueue(true); updater.Clear(); for (int i = 0; i < 5 && i < results.Count; i++) updater.Update(Tiles.GetTileLayout(System.Security.SecurityElement.Escape(results[i].Snippet.Title.ConvertEscapeSymbols()), System.Security.SecurityElement.Escape(results[i].Snippet.ChannelTitle), results[i].Snippet.Thumbnails.Medium.Url.Replace("&", "%26"), subscriptions.Find(x => x.Snippet.ResourceId.ChannelId == results[i].Snippet.ChannelId).Snippet.Thumbnails.Medium.Url)); } catch { } } async void CheckAnnouncements() { try { XmlDocument doc = new XmlDocument(); doc.LoadXml(await new HttpClient().GetStringAsync("http://foxgame-studio.000webhostapp.com/foxtube-messages.xml")); XmlElement item = doc["posts"].FirstChild as XmlElement; DateTime date = DateTime.Parse(item.GetAttribute("time")); if (date > lastCheck && date < DateTime.Now) ToastNotificationManager.CreateToastNotifier().Show( Notification.GetInternalToast(item["id"].InnerText, item["header"][(string)prefs.language].InnerText, item["content"][(string)prefs.language].InnerText, item["thumbnail"].InnerText, item["avatar"].InnerText)); } catch { } } } public static class Ext { public static string ConvertEscapeSymbols(this string str) { return str.Replace(""", "\"").Replace("'", "'").Replace("<", "<").Replace(">", ">").Replace("&", "&").Replace(""", "\"").Replace("'", "'").Replace("<", "<").Replace(">", ">").Replace("&", "&"); } } }