private void CheckForUpdateThread() { string html; try { html = General.DownloadPageToString(General.ProgramURL); } catch { return; } Settings.LastUpdateCheck = DateTime.Now.Date; var htmlParser = new HTMLParser(html); HTMLTagRange labelLatestDivTagRange = htmlParser.CreateTagRange(Enumerable.FirstOrDefault(Enumerable.Where( htmlParser.FindStartTags("div"), t => HTMLParser.ClassAttributeValueHas(t, "label-latest")))); if (labelLatestDivTagRange == null) return; HTMLTagRange versionSpanTagRange = htmlParser.CreateTagRange(Enumerable.FirstOrDefault(Enumerable.Where( htmlParser.FindStartTags(labelLatestDivTagRange, "span"), t => HTMLParser.ClassAttributeValueHas(t, "css-truncate-target")))); if (versionSpanTagRange == null) return; string latestStr = htmlParser.GetInnerHTML(versionSpanTagRange).Replace("v", ""); int latest = ParseVersionNumber(latestStr); if (latest == -1) return; int current = ParseVersionNumber(General.Version); if (!String.IsNullOrEmpty(Settings.LatestUpdateVersion)) { current = Math.Max(current, ParseVersionNumber(Settings.LatestUpdateVersion)); } if (latest > current) { lock (_startupPromptSync) { if (IsDisposed) return; Settings.LatestUpdateVersion = latestStr; Invoke(() => { if (MessageBox.Show(this, "A newer version of Chan Thread Watch is available. Would you like to open the Chan Thread Watch website?", "Newer Version Found", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { Process.Start(General.ProgramURL); } }); } } }
public override void ResurrectDeadPosts(HTMLParser previousParser, List<ReplaceInfo> replaceList) { if (previousParser == null) return; List<ReplaceInfo> tempReplaceList = new List<ReplaceInfo>(); Dictionary<string, HTMLTagRange> newPostContainers = new Dictionary<string, HTMLTagRange>(); Dictionary<string, HTMLTagRange> resurrectedPostContainers = new Dictionary<string, HTMLTagRange>(); foreach (HTMLTagRange postContainerTagRange in Enumerable.Where(Enumerable.Select(Enumerable.Where(_htmlParser.FindStartTags("div"), t => HTMLParser.ClassAttributeValueHas(t, "postContainer")), t => _htmlParser.CreateTagRange(t)), r => r != null)) { newPostContainers.Add(postContainerTagRange.StartTag.GetAttributeValue("id"), postContainerTagRange); } HTMLTagRange lastExistingPostContainerTagRange = null; foreach (HTMLTagRange previousPostContainerTagRange in Enumerable.Where(Enumerable.Select(Enumerable.Where(previousParser.FindStartTags("div"), t => HTMLParser.ClassAttributeValueHas(t, "postContainer")), t => previousParser.CreateTagRange(t)), r => r != null)) { HTMLTagRange tempTagRange; if (!newPostContainers.TryGetValue(previousPostContainerTagRange.StartTag.GetAttributeValue("id"), out tempTagRange)) { int offset = lastExistingPostContainerTagRange != null ? lastExistingPostContainerTagRange.EndOffset : Enumerable.FirstOrDefault(Enumerable.Where(_htmlParser.FindStartTags("div"), t => HTMLParser.ClassAttributeValueHas(t, "thread"))).EndOffset; HTMLTag inputTag = previousParser.FindTag(false, previousPostContainerTagRange, "input"); string value = previousParser.GetHTML(previousPostContainerTagRange); if (!value.Contains("<strong style=\"color: #FF0000\">[Deleted]</strong>")) { value = value.Insert(inputTag.EndOffset - previousPostContainerTagRange.Offset, "<strong style=\"color: #FF0000\">[Deleted]</strong>"); } tempReplaceList.Add( new ReplaceInfo { Offset = offset, Length = 0, Type = ReplaceType.DeadPost, Tag = previousPostContainerTagRange.StartTag.GetAttributeValue("id"), Value = value }); resurrectedPostContainers.Add(previousPostContainerTagRange.StartTag.GetAttributeValue("id"), previousPostContainerTagRange); } else { lastExistingPostContainerTagRange = tempTagRange; } } StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { General.WriteReplacedString(_htmlParser.PreprocessedHTML, tempReplaceList, sw); } _htmlParser = new HTMLParser(sb.ToString()); tempReplaceList.Clear(); foreach (HTMLTagRange deadLinkTagRange in Enumerable.Where(Enumerable.Select(Enumerable.Where(_htmlParser.FindStartTags("span"), t => HTMLParser.ClassAttributeValueHas(t, "deadlink")), t => _htmlParser.CreateTagRange(t)), r => r != null)) { string deadLinkInnerHTML = HttpUtility.HtmlDecode(_htmlParser.GetInnerHTML(deadLinkTagRange)); if (deadLinkInnerHTML.Contains(">>>")) continue; string deadLinkID = deadLinkInnerHTML.Substring(2); if (resurrectedPostContainers.ContainsKey("pc" + deadLinkID)) { tempReplaceList.Add( new ReplaceInfo { Offset = deadLinkTagRange.Offset, Length = deadLinkTagRange.Length, Type = ReplaceType.DeadLink, Tag = "pc" + deadLinkID, Value = "<a class=\"quotelink\" href=\"#p" + deadLinkID + "\">>>" + deadLinkID + "</a>" }); } } sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { General.WriteReplacedString(_htmlParser.PreprocessedHTML, tempReplaceList, sw); } _htmlParser = new HTMLParser(sb.ToString()); if (replaceList == null) return; foreach (HTMLTagRange postContainerTagRange in Enumerable.Where(Enumerable.Select(Enumerable.Where(_htmlParser.FindStartTags("div"), t => HTMLParser.ClassAttributeValueHas(t, "postContainer")), t => _htmlParser.CreateTagRange(t)), r => r != null)) { if (!resurrectedPostContainers.ContainsKey(postContainerTagRange.StartTag.GetAttributeValue("id"))) continue; HTMLTagRange fileTextDivTagRange = _htmlParser.CreateTagRange(Enumerable.FirstOrDefault(Enumerable.Where( _htmlParser.FindStartTags(postContainerTagRange, "div"), t => HTMLParser.ClassAttributeValueHas(t, "fileText")))); if (fileTextDivTagRange == null) continue; HTMLTagRange fileThumbLinkTagRange = _htmlParser.CreateTagRange(Enumerable.FirstOrDefault(Enumerable.Where( _htmlParser.FindStartTags(postContainerTagRange, "a"), t => HTMLParser.ClassAttributeValueHas(t, "fileThumb")))); if (fileThumbLinkTagRange == null) continue; HTMLTag fileTextLinkStartTag = _htmlParser.FindStartTag(fileTextDivTagRange, "a"); if (fileTextLinkStartTag == null) continue; HTMLTag fileThumbImageTag = _htmlParser.FindStartTag(fileThumbLinkTagRange, "img"); if (fileThumbImageTag == null) continue; HTMLAttribute attribute = fileTextLinkStartTag.GetAttribute("href"); if (attribute != null) { replaceList.Add( new ReplaceInfo { Offset = attribute.Offset, Length = attribute.Length, Type = ReplaceType.ImageLinkHref, Tag = String.Empty, Value = "href=\"" + HttpUtility.HtmlAttributeEncode(attribute.Value) + "\"" }); } attribute = fileThumbLinkTagRange.StartTag.GetAttribute("href"); if (attribute != null) { replaceList.Add( new ReplaceInfo { Offset = attribute.Offset, Length = attribute.Length, Type = ReplaceType.ImageLinkHref, Tag = String.Empty, Value = "href=\"" + HttpUtility.HtmlAttributeEncode(attribute.Value) + "\"" }); } attribute = fileThumbImageTag.GetAttribute("src"); if (attribute != null) { replaceList.Add( new ReplaceInfo { Offset = attribute.Offset, Length = attribute.Length, Type = ReplaceType.ImageSrc, Tag = String.Empty, Value = "src=\"" + HttpUtility.HtmlAttributeEncode(attribute.Value) + "\"" }); } } }