protected override void OnCreate(Bundle bundle) { platformSpecificHandler = new PlatformSpecificHandler(); platformSpecificHandler.StorageInterface = new AndroidStorage(); platformSpecificHandler.ViewHandler = new AndroidViewHandler(); platformSpecificHandler.ToastManager = new AndroidToastManager(); platformSpecificHandler.FileReader = new AndroidFileReader(); handler = new AnimalAdjectiveHandler(platformSpecificHandler); favourites = new FavouritesManager(platformSpecificHandler); this.sharedGeneralGUIHandler = new SharedGeneralGUIHandler(platformSpecificHandler); this.sharedFavouriteGUIHandler = new SharedFavouritesGUIHandler(platformSpecificHandler, sharedGeneralGUIHandler); this.sharedHomeGUIHandler = new SharedHomeGUIHandler(platformSpecificHandler, sharedGeneralGUIHandler); base.OnCreate(bundle); this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs; this.AddTab("", Resource.Drawable.ic_action_play, new HomeFragment(handler, favourites, sharedGeneralGUIHandler, sharedHomeGUIHandler)); this.AddTab("", Resource.Drawable.ic_action_favorite2, new FavouritesFragment(handler, favourites, sharedGeneralGUIHandler, sharedFavouriteGUIHandler)); this.AddTab("", Resource.Drawable.ic_action_settings, new SettingsFragment()); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); }
protected override void OnPause() { _videoAd.Pause(this); MemoryWatcher.Watcher.Pause(); #pragma warning disable 4014 if (Settings.IsCachingEnabled) { if (AnimeUpdateQuery.UpdatedSomething) { DataCache.SaveDataForUser(Credentials.UserName, ResourceLocator.AnimeLibraryDataStorage.AllLoadedAnimeItemAbstractions.Select( abstraction => abstraction.EntryData), AnimeListWorkModes.Anime); AnimeUpdateQuery.UpdatedSomething = false; } if (MangaUpdateQuery.UpdatedSomething) { DataCache.SaveDataForUser(Credentials.UserName, ResourceLocator.AnimeLibraryDataStorage.AllLoadedMangaItemAbstractions.Select( abstraction => abstraction.EntryData), AnimeListWorkModes.Manga); MangaUpdateQuery.UpdatedSomething = false; } } DataCache.SaveVolatileData(); DataCache.SaveHumMalIdDictionary(); ViewModelLocator.ForumsMain.SavePinnedTopics(); FavouritesManager.SaveData(); AnimeImageQuery.SaveData(); ResourceLocator.HandyDataStorage.SaveData(); #pragma warning restore 4014 base.OnPause(); }
public static void SetFavouritesManager(this BlockEditorControlBase becb, FavouritesManager favouritesManager) { Reflector.SetInstanceFieldByName(becb, "m_FavouritesManager", favouritesManager, ReflectionWays.SystemReflection);; }
public FavouritesFragment(AnimalAdjectiveHandler aaHandler, FavouritesManager favs, SharedGeneralGUIHandler sharedGUIHandler, SharedFavouritesGUIHandler favouritesGUIHandler) { this.handler = aaHandler; this.favourites = favs; this._sharedGUIHandler = sharedGUIHandler; this._favouritesGUIHandler = favouritesGUIHandler; }
public void CheckIfFavourite(object favouriteButton, FavouritesManager favouritesManager, CombinedAnimalAdjective animalAdjective) { if (favouritesManager.IsFavourite(animalAdjective)) { platformHandler.ViewHandler.SetFavouriteSelectedImage(true, favouriteButton); } else { platformHandler.ViewHandler.SetFavouriteSelectedImage(false, favouriteButton); } }
/// <summary> /// Invoked when application execution is being suspended. Application state is saved /// without knowing whether the application will be terminated or resumed with the contents /// of memory still intact. /// </summary> /// <param name="sender">The source of the suspend request.</param> /// <param name="e">Details about the suspend request.</param> private async void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); if (Settings.IsCachingEnabled) { if (AnimeUpdateQuery.UpdatedSomething) { await DataCache.SaveDataForUser(Credentials.UserName, ResourceLocator.AnimeLibraryDataStorage.AllLoadedAnimeItemAbstractions.Select( abstraction => abstraction.EntryData), AnimeListWorkModes.Anime); } if (MangaUpdateQuery.UpdatedSomething) { await DataCache.SaveDataForUser(Credentials.UserName, ResourceLocator.AnimeLibraryDataStorage.AllLoadedMangaItemAbstractions.Select( abstraction => abstraction.EntryData), AnimeListWorkModes.Manga); } } try { foreach ( var file in await ApplicationData.Current.TemporaryFolder.GetFilesAsync(CommonFileQuery.DefaultQuery)) { if (file.Name.Contains("_cropTemp")) { await file.DeleteAsync(StorageDeleteOption.PermanentDelete); } } } catch (Exception) { //well... } await DataCache.SaveVolatileData(); await DataCache.SaveHumMalIdDictionary(); await ViewModelLocator.ForumsMain.SavePinnedTopics(); await FavouritesManager.SaveData(); await AnimeImageQuery.SaveData(); await ResourceLocator.HandyDataStorage.SaveData(); deferral.Complete(); }
public AppStartupLoginHandler(ILoginHandler loginHandler, BlockedApiLoginHandler blockedApiLoginHandler, ServersUpdateTimer serversUpdateTimer, ServiceWatcher serviceWatcher, INotificationProvider notificationProvider, AutoConnectManager autoConnectManager, OpenVpnConfigsUpdateTimer openVpnConfigsUpdateTimer, VpnConnectionWatcher wcfServiceWatcher, SettingsServiceClientManager settingsServiceClientManager, FavouritesManager favouriteServersUpdater, CyberSecHostsStorage cyberSecHostsStorage) { this._serversUpdateTimer = serversUpdateTimer; this._serviceWatcher = serviceWatcher; this._notificationProvider = notificationProvider; this._autoConnectManager = autoConnectManager; this._openVpnConfigsUpdateTimer = openVpnConfigsUpdateTimer; this._wcfServiceWatcher = wcfServiceWatcher; this._settingsServiceClientManager = settingsServiceClientManager; this._favouriteServersUpdater = favouriteServersUpdater; this._loginHandler = loginHandler; this._blockedApiLoginHandler = blockedApiLoginHandler; this._cyberSecHostsStorage = cyberSecHostsStorage; }
public void HandleFavouriteButtonClick(object favouriteButton, FavouritesManager favouritesManager, CombinedAnimalAdjective animalAdjective) { if (favouritesManager.IsFavourite(animalAdjective)) { platformHandler.ViewHandler.SetFavouriteSelectedImage(false, favouriteButton); favouritesManager.RemoveFromFavourites(animalAdjective); this.platformHandler.ToastManager.ShowToast(animalAdjective.FullWord + " added to favourites."); } else { platformHandler.ViewHandler.SetFavouriteSelectedImage(true, favouriteButton); favouritesManager.AddToFavourites(animalAdjective); this.platformHandler.ToastManager.ShowToast(animalAdjective.FullWord + " removed from favourites."); } }
public static void InitApp() { Credentials.Init(); HtmlClassMgr.Init(); FavouritesManager.LoadData(); AnimeImageQuery.Init(); ViewModelLocator.ForumsMain.LoadPinnedTopics(); if (Settings.NotificationCheckInRuntime && Credentials.Authenticated) { ResourceLocator.SchdeuledJobsManger.StartJob(ScheduledJob.FetchNotifications, 5, () => { ResourceLocator.NotificationsTaskManager.CallTask(BgTasks.Notifications); }); } ResourceLocator.HandyDataStorage.Init(); }
public static async Task InitApp() { ResourceLocator.ConnectionInfoProvider.Init(); Credentials.Init(); FavouritesManager.LoadData(); AnimeImageQuery.Init(); ViewModelLocator.ForumsMain.LoadPinnedTopics(); await ResourceLocator.AiringInfoProvider.Init(false); if (Settings.NotificationCheckInRuntime && Credentials.Authenticated) { ResourceLocator.SchdeuledJobsManger.StartJob(ScheduledJob.FetchNotifications, 5, () => { ResourceLocator.NotificationsTaskManager.CallTask(BgTasks.Notifications); }); } ResourceLocator.HandyDataStorage.Init(); AwaitableCompletion.SetResult(true); }
public ServerSidePanelViewModel(VpnConnector vpnConnector, BestUserServerProvider bestServerProvider, ApiServerProvider apiServerProvider, VpnConnectionSpeedTracker speedTracker, ISettings userSettings, FavouritesManager favouritesManager, UserContext userContext, EventFacade eventFacade) { this._vpnConnector = vpnConnector; this._bestServerProvider = bestServerProvider; this._apiServerProvider = apiServerProvider; this._settings = userSettings; this._favouritesManager = favouritesManager; this._userContext = userContext; this._eventFacade = eventFacade; this._bestServerProvider.ServersChanged += new EventHandler(this.OnServersChanged); this._vpnConnector.GeoServerConnectionStatusChanged += new ConnectionEventHandler <GeographicalServer>(this.OnServerConnectionStatusChanged); this._userContext.add_UserChanged(delegate(object s, UserEventArgs e) { this.UpdateCurrentServerViewModel(); }); this._favouritesManager.FavouriteServersChanged += new EventHandler <FavouriteServersChangedEventArgs>(this.ChangeCurrentServerFavouriteStatus); speedTracker.SpeedChanged = (EventHandler <VpnConnectionSpeedChangeEventArgs>)Delegate.Combine(speedTracker.SpeedChanged, new EventHandler <VpnConnectionSpeedChangeEventArgs>(this.UpdateSpeeds)); this._settings.Observe <UserSettings, DistanceUnits>((UserSettings s) => s.DistanceUnits, delegate(DistanceUnits d) { this.UpdateCurrentServerViewModel(); }); }
private bool ShowNextWord(String text, object textView, object favsButton, AnimalAdjectiveHandler handler, FavouritesManager favsManager) { if (!String.IsNullOrEmpty(text)) { this.platformHandler.ViewHandler.ChangeTextOfView(textView, text); this._sharedGUIHandler.CheckIfFavourite(favsButton, favsManager, handler.CurrentAnimalAdjective); return(true); } else { return(false); } }
public bool ShowCurrentFavourite(FavouritesManager favsManager, object textView, object favsButton) { return(this.SetNewFavourite(favsManager.GetCurrentFavourite().FullWord, textView, favsButton, favsManager)); }
private bool SetNewFavourite(String text, object textView, object favsButton, FavouritesManager favsManager) { if (!String.IsNullOrEmpty(text)) { this.platformHandler.ViewHandler.ChangeTextOfView(textView, text); this._generalGUIHandler.CheckIfFavourite(favsButton, favsManager, favsManager.GetCurrentFavourite()); return(true); } else { return(false); } }
public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false) { try { ProfileData possibleData = null; if (!force) { possibleData = await DataCache.RetrieveProfileData(_userName); } if (possibleData != null) { possibleData.Cached = true; return(possibleData); } var raw = !updateFavsOnly ? await(await (await ResourceLocator.MalHttpContextProvider.GetHttpContextAsync()) .GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync() : await GetRequestResponse(); var doc = new HtmlDocument(); doc.LoadHtml(raw); var current = new ProfileData { User = { Name = _userName } }; #region Recents try { var i = 1; foreach ( var recentNode in doc.DocumentNode.Descendants("div") .Where( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "statistics-updates di-b w100 mb8")) { if (i <= 3) { current.RecentAnime.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8) .Split('/')[2])); } else { current.RecentManga.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8) .Split('/')[2])); } i++; } } catch (Exception) { //no recents } #endregion #region FavChar try { foreach ( var favCharNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list characters") .Descendants("li")) { var curr = new AnimeCharacter(); var imgNode = favCharNode.Descendants("a").First(); var styleString = imgNode.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); var infoNode = favCharNode.Descendants("div").Skip(1).First(); var nameNode = infoNode.Descendants("a").First(); curr.Name = nameNode.InnerText.Trim(); curr.Id = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2]; var originNode = infoNode.Descendants("a").Skip(1).First(); curr.Notes = originNode.InnerText.Trim(); curr.ShowId = originNode.Attributes["href"].Value.Split('/')[2]; curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime"; current.FavouriteCharacters.Add(curr); } } catch (Exception) { //no favs } #endregion #region FavManga try { foreach ( var favMangaNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list manga") .Descendants("li")) { current.FavouriteManga.Add( int.Parse( favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavAnime try { foreach ( var favAnimeNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list anime") .Descendants("li")) { current.FavouriteAnime.Add( int.Parse( favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavPpl try { foreach ( var favPersonNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list people") .Descendants("li")) { var curr = new AnimeStaffPerson(); var aElems = favPersonNode.Descendants("a"); var styleString = aElems.First().Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = aElems.Skip(1).First().InnerText.Trim(); curr.Id = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2]; current.FavouritePeople.Add(curr); } } catch (Exception) { //no favs } #endregion #region Stats if (!updateFavsOnly) { try { var animeStats = doc.FirstOfDescendantsWithClass("div", "stats anime"); var generalStats = animeStats.Descendants("div").First().Descendants("div"); current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); var i = 0; #region AnimeStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.AnimeWatching = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 1: current.AnimeCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 2: current.AnimeOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 3: current.AnimeDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 4: current.AnimePlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r") .Descendants("li")) { switch (i) { case 0: current.AnimeTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 1: current.AnimeRewatched = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 2: current.AnimeEpisodes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; } i++; } //we are done with anime #endregion i = 0; animeStats = doc.FirstOfDescendantsWithClass("div", "stats manga"); generalStats = animeStats.Descendants("div").First().Descendants("div"); current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); #region MangaStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.MangaReading = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 1: current.MangaCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 2: current.MangaOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 3: current.MangaDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 4: current.MangaPlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r") .Descendants("li")) { switch (i) { case 0: current.MangaTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 1: current.MangaReread = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 2: current.MangaChapters = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 3: current.MangaVolumes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; } i++; } //we are done with manga #endregion } catch (Exception e) { //hatml } } #endregion #region LeftSideBar if (!updateFavsOnly) { try { var sideInfo = doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li") .ToList(); try { foreach (var htmlNode in sideInfo) { var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText); if (left == "Supporter") { continue; } current.Details.Add(new Tuple <string, string>(left, WebUtility.HtmlDecode(htmlNode.LastChild.InnerText))); } } catch (Exception) { } current.User.ImgUrl = doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First() .Attributes["src"].Value; } catch (Exception) { //??? } } #endregion #region Friends if (!updateFavsOnly) { try { var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a"); foreach (var friend in friends) { var curr = new MalUser(); var styleString = friend.Attributes["data-bg"].Value; curr.ImgUrl = styleString.Replace("/r/76x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = friend.InnerText; current.Friends.Add(curr); } } catch (Exception) { // } } #endregion #region Comments if (!updateFavsOnly) { try { var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24"); foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix")) { var curr = new MalComment(); var imgNode = comment.Descendants("img").First(); if (imgNode.Attributes.Contains("srcset")) { curr.User.ImgUrl = imgNode.Attributes["srcset"].Value.Split(',').Last() .Replace("2x", "").Trim(); } else if (imgNode.Attributes.Contains("data-src")) { curr.User.ImgUrl = imgNode.Attributes["data-src"].Value; } var textBlock = comment.Descendants("div").First(); var header = textBlock.Descendants("div").First(); curr.User.Name = header.ChildNodes[1].InnerText; curr.Date = header.ChildNodes[3].InnerText; curr.Content = WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim()); var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8"); var convNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation"); if (convNode != null) { curr.ComToCom = WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last()); } var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete"); if (deleteNode != null) { curr.CanDelete = true; curr.Id = deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries).Last(); } foreach (var img in comment.Descendants("img").Skip(1)) { if (img.Attributes.Contains("src")) { curr.Images.Add(img.Attributes["src"].Value); } } current.Comments.Add(curr); } } catch (Exception e) { //no comments } } #endregion try { current.ProfileMemId = doc.DocumentNode.Descendants("input") .First(node => node.Attributes.Contains("name") && node.Attributes["name"].Value == "profileMemId") .Attributes["value"].Value; } catch (Exception) { //restricted } try { current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "profile-about-user js-truncate-inner").OuterHtml; } catch (Exception) { // } if (_userName.Equals(Credentials.UserName, StringComparison.CurrentCultureIgnoreCase)) //umm why do we need someone's favs? { FavouritesManager.ForceNewSet(FavouriteType.Anime, current.FavouriteAnime.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Manga, current.FavouriteManga.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Character, current.FavouriteCharacters.Select(i => i.Id).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Person, current.FavouritePeople.Select(i => i.Id).ToList()); } current.IsFriend = doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-remove js-user-function") != null; current.CanAddFriend = doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-request js-user-function") != null; if (!updateFavsOnly) { DataCache.SaveProfileData(_userName, current); } return(current); } catch (Exception e) { ResourceLocator.TelemetryProvider.LogEvent($"Profile Query Crash: {_userName}, {e}"); ResourceLocator.MessageDialogProvider.ShowMessageDialog( "Hmm, you have encountered bug that'm hunting. I've just sent report to myself. If everything goes well it should be gone in next release :). Sorry for inconvenience!", "Ooopsies!"); } return(new ProfileData()); }
public bool PreviousFavourite(FavouritesManager favsManager, object textView, object favsButton) { return(this.SetNewFavourite(favsManager.GetPreviousFavourite(), textView, favsButton, favsManager)); }
public bool PreviousWord(AnimalAdjectiveHandler handler, object textView, object favsButton, FavouritesManager favsManager) { return(this.ShowNextWord(handler.GetPreviousWord(), textView, favsButton, handler, favsManager)); }
public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false) { ProfileData possibleData = null; if (!force) { possibleData = await DataCache.RetrieveProfileData(_userName); } if (possibleData != null) { return(possibleData); } var raw = !updateFavsOnly ? await(await (await MalHttpContextProvider.GetHttpContextAsync()).GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync() : await GetRequestResponse(); var doc = new HtmlDocument(); doc.LoadHtml(raw); var current = new ProfileData { User = { Name = _userName } }; #region Recents try { var i = 1; foreach ( var recentNode in doc.DocumentNode.Descendants("div") .Where( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:recentUpdateNode:class"])) { if (i <= 3) { current.RecentAnime.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2])); } else { current.RecentManga.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2])); } i++; } } catch (Exception) { //no recents } #endregion #region FavChar try { foreach ( var favCharNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favCharacterNode:class"]) .Descendants("li")) { var curr = new AnimeCharacter(); var imgNode = favCharNode.Descendants("a").First(); var styleString = imgNode.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); var infoNode = favCharNode.Descendants("div").Skip(1).First(); var nameNode = infoNode.Descendants("a").First(); curr.Name = nameNode.InnerText.Trim(); curr.Id = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2]; var originNode = infoNode.Descendants("a").Skip(1).First(); curr.Notes = originNode.InnerText.Trim(); curr.ShowId = originNode.Attributes["href"].Value.Split('/')[2]; curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime"; current.FavouriteCharacters.Add(curr); } } catch (Exception) { //no favs } #endregion #region FavManga try { foreach ( var favMangaNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favMangaNode:class"]) .Descendants("li")) { current.FavouriteManga.Add( int.Parse( favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavAnime try { foreach ( var favAnimeNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favAnimeNode:class"]) .Descendants("li")) { current.FavouriteAnime.Add( int.Parse( favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavPpl try { foreach ( var favPersonNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favPeopleNode:class"]) .Descendants("li")) { var curr = new AnimeStaffPerson(); var aElems = favPersonNode.Descendants("a"); var styleString = aElems.First().Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = aElems.Skip(1).First().InnerText.Trim(); curr.Id = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2]; current.FavouritePeople.Add(curr); } } catch (Exception) { //no favs } #endregion #region Stats if (!updateFavsOnly) { try { var animeStats = doc.FirstOfDescendantsWithClass("div", "stats anime"); var generalStats = animeStats.Descendants("div").First().Descendants("div"); current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim()); current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim()); var i = 0; #region AnimeStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.AnimeWatching = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 1: current.AnimeCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 2: current.AnimeOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 3: current.AnimeDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 4: current.AnimePlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li")) { switch (i) { case 0: current.AnimeTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 1: current.AnimeRewatched = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 2: current.AnimeEpisodes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; } i++; } //we are done with anime #endregion i = 0; animeStats = doc.FirstOfDescendantsWithClass("div", "stats manga"); generalStats = animeStats.Descendants("div").First().Descendants("div"); current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim()); current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim()); #region MangaStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.MangaReading = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 1: current.MangaCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 2: current.MangaOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 3: current.MangaDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 4: current.MangaPlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li")) { switch (i) { case 0: current.MangaTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 1: current.MangaReread = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 2: current.MangaChapters = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 3: current.MangaVolumes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; } i++; } //we are done with manga #endregion } catch (Exception) { //hatml } } #endregion #region LeftSideBar if (!updateFavsOnly) { try { var sideInfo = doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li").ToList(); try { foreach (var htmlNode in sideInfo) { var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText); if (left == "Supporter") { continue; } current.Details.Add(new Tuple <string, string>(left, WebUtility.HtmlDecode(htmlNode.LastChild.InnerText))); } //current.LastOnline = sideInfo[0].LastChild.InnerText; //current.Gender = sideInfo[1].LastChild.InnerText; //current.Birthday = sideInfo[2].LastChild.InnerText; //current.Location = sideInfo[3].LastChild.InnerText; //current.Joined = sideInfo[4].LastChild.InnerText; } catch (Exception) { //current.LastOnline = sideInfo[0].LastChild.InnerText; //current.Joined = sideInfo[1].LastChild.InnerText; } current.User.ImgUrl = doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First().Attributes["src" ] .Value; } catch (Exception) { //??? } } #endregion #region Friends if (!updateFavsOnly) { try { var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a"); foreach (var friend in friends) { var curr = new MalUser(); var styleString = friend.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/76x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = friend.InnerText; current.Friends.Add(curr); } } catch (Exception) { // } } #endregion #region Comments if (!updateFavsOnly) { try { var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24"); foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix")) { var curr = new MalComment(); curr.User.ImgUrl = comment.Descendants("img").First().Attributes["src"].Value; var textBlock = comment.Descendants("div").First(); var header = textBlock.Descendants("div").First(); curr.User.Name = header.ChildNodes[1].InnerText; curr.Date = header.ChildNodes[3].InnerText; curr.Content = WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim()); var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8"); var convNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation"); if (convNode != null) { curr.ComToCom = WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last()); } var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete"); if (deleteNode != null) { curr.CanDelete = true; curr.Id = deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries).Last(); } foreach (var img in comment.Descendants("img").Skip(1)) { if (img.Attributes.Contains("src")) { curr.Images.Add(img.Attributes["src"].Value); } } current.Comments.Add(curr); } } catch (Exception e) { //no comments } } #endregion try { current.ProfileMemId = doc.DocumentNode.Descendants("input") .First(node => node.Attributes.Contains("name") && node.Attributes["name"].Value == "profileMemId") .Attributes["value"].Value; } catch (Exception) { //restricted } try { current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "word-break").OuterHtml; } catch (Exception) { // } if (_userName == Credentials.UserName) //umm why do we need someone's favs? { FavouritesManager.ForceNewSet(FavouriteType.Anime, current.FavouriteAnime.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Manga, current.FavouriteManga.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Character, current.FavouriteCharacters.Select(i => i.Id).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Person, current.FavouritePeople.Select(i => i.Id).ToList()); } if (!updateFavsOnly) { DataCache.SaveProfileData(_userName, current); } return(current); }
public void SetUp() { mockEndUserSettingDAO = new Mock <EndUserSettingDAO>(); endUserFavouritesManager = new FavouritesManager(mockEndUserSettingDAO.Object); }
public FavouriteViewModel() { _cache = FavouritesManager.Instance; }