public ForumItem(ForumItemType type, string id, string link, string updated) { Type = type; Id = id; Link = link; Updated = updated; }
async Task <ForumItem> CheckItemIsUpdated(ForumItemType type, HtmlNode htmlItem) { var link = GetHtmlValue(htmlItem, Configuration.GetSection($"{type}s:Link")); var updated = GetHtmlValue(htmlItem, Configuration.GetSection($"{type}s:Updated")); var idUrlPattern = IdUrlPattern[type]; var idIdPattern = IdIdPattern[type]; var idString = (idUrlPattern != null ? idUrlPattern.Match(link) : idIdPattern.Match(htmlItem.Attributes["id"].Value))?.Groups?[1]?.Value; if (idString == null) { throw new InvalidDataException($"Cannot find ID for {type}"); } if (!int.TryParse(idString, out var id)) { throw new InvalidDataException($"Cannot parse ID for {type}"); } var uniqueId = $"{Configuration.Key}/{id}"; var lastUpdated = await Storage.ExecuteScalarAsync($"SELECT Updated FROM {type}s WHERE {type}Id = @Param0", uniqueId) as string; if (updated == lastUpdated) { return(null); } switch (type) { case ForumItemType.Forum: case ForumItemType.Topic: return(new ForumItem(type, uniqueId, link, updated)); case ForumItemType.Post: return(new ForumPostItem( GetHtmlValue(htmlItem.OwnerDocument.DocumentNode, Configuration.GetSection("Posts:ForumName")), GetHtmlValue(htmlItem.OwnerDocument.DocumentNode, Configuration.GetSection("Posts:TopicName")), uniqueId, GetHtmlValue(htmlItem, Configuration.GetSection("Posts:Link")), GetHtmlValue <int>(htmlItem, Configuration.GetSection("Posts:Index")), GetHtmlValue(htmlItem, Configuration.GetSection("Posts:ReplyLink")), GetHtmlValue <DateTimeOffset>(htmlItem, Configuration.GetSection("Posts:Date")), GetHtmlValue(htmlItem, Configuration.GetSection("Posts:Author")), GetHtmlValue <HtmlNode>(htmlItem, Configuration.GetSection("Posts:Body")) )); default: throw new InvalidDataException($"Unknown type {type} in CheckItemIsUpdated"); } }