public static void AddAuthor(string url) { SetStatus("Добавление автора..."); if (!url.EndsWith("indexdate.shtml")) url = (url.EndsWith("/")) ? url + "indexdate.shtml" : url + "/indexdate.shtml"; byte[] buffer; WebClient client = new WebClient(); string error = "Страничка не входит в круг наших интересов."; try { buffer = WEB.downloadPageSilent(client, url); string page = WEB.convertPage(buffer); int si = page.IndexOf('.', page.IndexOf("<title>")) + 1; DateTime updateDate = GetUpdateDate(page); if (updateDate != DateTime.MinValue) { string authorName = page.Substring(si, page.IndexOf('.', si) - si); if (FindAuthor(url) != null) { error = authorName + " уже присутствует в списке"; throw new Exception(); } Author author = new Author() { Name = authorName, IsNew = false, UpdateDate = updateDate, URL = url }; authors.Add(author); // запоминаем информацию со странички автора UpdateAuthorInfo(page, author); // сортируем данные по дате Sort(); // сохраняем конфиг SaveConfig(); SetStatus("Добавлен: " + author.Name); } else SetStatus(error); } catch (Exception) { SetStatus(error); } }
private static bool UpdateAuthor(Author author) { byte[] buffer; WebClient client = new WebClient(); bool retValue = false; try { if (!author.URL.EndsWith("indexdate.shtml")) author.URL = (author.URL.EndsWith("/")) ? author.URL + "indexdate.shtml" : author.URL + "/indexdate.shtml"; buffer = WEB.downloadPageSilent(client, author.URL); if (buffer != null) { retValue = UpdateAuthorInfo(WEB.convertPage(buffer), author); } } catch (Exception exception) { } return retValue; }
public static bool UpdateAuthorInfo(string page, Author author) { Match match = Regex.Match(page, @"Обновлялось:</font></a></b>\s*(.*?)\s*$", RegexOptions.Multiline); DateTime date = DateTime.MinValue; bool retValue = false; if (match.Success) { string[] newDateStr = match.Groups[1].Value.Split('/'); date = new DateTime(int.Parse(newDateStr[2]), int.Parse(newDateStr[1]), int.Parse(newDateStr[0])); } if (author != null) { #region проанализируем данные на страничке. если раньше их не загружали, то в любом случае не показываем, что есть обновления, просто заполняем данные MySortableBindingList<AuthorText> texts_temp = new MySortableBindingList<AuthorText>(); MatchCollection matches = Regex.Matches(page, "<DL><DT><li>(?:<font.*?>.*?</font>)?\\s*(<b>(?<Authors>.*?)\\s*</b>\\s*)?<A HREF=(?<LinkToText>.*?)><b>\\s*(?<NameOfText>.*?)\\s*</b></A>.*?<b>(?<SizeOfText>\\d+)k</b>.*?<small>(?:Оценка:<b>(?<DescriptionOfRating>(?<rating>\\d+(?:\\.\\d+)?).*?)</b>.*?)?\\s*\"(?<Section>.*?)\"\\s*(?<Genres>.*?)?\\s*(?:<A HREF=\"(?<LinkToComments>.*?)\">Комментарии:\\s*(?<CommentsDescription>(?<CommentCount>\\d+).*?)</A>\\s*)?</small>.*?(?:<br><DD>(?<Description>.*?))?</DL>"); if (matches.Count > 0) { int cnt = 0; foreach (Match m in matches) { AuthorText item = new AuthorText(); item.Description = NormalizeHTML(m.Groups["Description"].Value).Trim(); item.Genres = NormalizeHTML(m.Groups["Genres"].Value); item.Link = m.Groups["LinkToText"].Value; item.Name = NormalizeHTML(m.Groups["NameOfText"].Value); item.Order = cnt; item.SectionName = NormalizeHTML(m.Groups["Section"].Value).Replace("@",""); item.Size = int.Parse(m.Groups["SizeOfText"].Value); texts_temp.Add(item); cnt++; } } if (author.Texts.Count > 0) // если раньше загружали проводим стравнение { foreach (AuthorText txt in texts_temp) { bool bFound = false; for (int i = 0; i < author.Texts.Count; i++) { if (txt.Description == author.Texts[i].Description && txt.Name == author.Texts[i].Name && txt.Size == author.Texts[i].Size) { bFound = true; txt.IsNew = author.Texts[i].IsNew;// переносим значение isNew в новый массив, чтобы не потерять непрочитанные новые тексты break; } } if (!bFound) { txt.IsNew = author.IsNew = retValue = true;// да, автор обновился if (date <= author.UpdateDate) // поменяем дату на сегодняшнюю, если дата обновления на страничке старее, чем зарегистрированная у нас author.UpdateDate = DateTime.Today; else // иначе ставим дату, указанную автором author.UpdateDate = date; } } // доп проверка по количеству произведений if (texts_temp.Count != author.Texts.Count) { retValue = true; if (date <= author.UpdateDate) // поменяем дату на сегодняшнюю, если дата обновления на страничке старее, чем зарегистрированная у нас author.UpdateDate = DateTime.Today; else// иначе ставим дату, указанную автором author.UpdateDate = date; } // запоминаем новые данные } author.Texts = texts_temp; #endregion } return retValue; }