private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //event handle when picking an item { string SelectedItem = (string)comboBox1.SelectedItem; try { //access books string BookJSON = File.ReadAllText(@"C:\Users\RMBonMAC\Documents\GitHub\BookStore\BookStore\BookStore\bin\Debug\Books.json"); JObject json = JObject.Parse(BookJSON); JObject BookTarget = (JObject)json[SelectedItem]; string book_target = BookTarget.ToString(); Book foundBook = new Book(); Newtonsoft.Json.JsonConvert.PopulateObject(book_target, foundBook); AuthorText.Text = foundBook.author;; IsbnText.Text = foundBook.ISBN; PriceText.Text = foundBook.price.ToString(); } catch { AuthorText.Clear(); IsbnText.Clear(); PriceText.Clear(); } QuantityText.Focus(); }
public string GetUserBooksFolder(Author author, AuthorText authorText) { string urlWithoutHTTP = author.URL.Replace(@"http://", ""); if (urlWithoutHTTP.EndsWith("/indexdate.shtml")) { urlWithoutHTTP = urlWithoutHTTP.Replace("/indexdate.shtml", ""); } if (urlWithoutHTTP.EndsWith("/indextitle.shtml")) { urlWithoutHTTP = urlWithoutHTTP.Replace("/indextitle.shtml", ""); } string endPath = urlWithoutHTTP.Substring(urlWithoutHTTP.IndexOf("/") + 1).Replace("/", @"\"); if (!string.IsNullOrWhiteSpace(RootBooksFolder)) { endPath = Path.Combine(RootBooksFolder, endPath); } string sectionName = authorText.SectionName; foreach (char c in Path.GetInvalidFileNameChars()) { sectionName = sectionName.Replace(c, '_'); } return(endPath); }
public string GetFileName(AuthorText authorText) { var parts = authorText.Link.Split("/".ToCharArray()); var path = parts[parts.Length - 1]; return(TextCleaner.MakeFileAcceptableName(path)); }
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //event handle when picking an item { try { MySqlConnection connection = new MySqlConnection("Datasource=localhost;port=3306;username=root;password="******"\"{comboBox1.SelectedItem.ToString()}\""; string query = "SELECT * FROM bookstore.books WHERE title = " + selectedItem; connection.Open(); MySqlCommand command = new MySqlCommand(query, connection); MySqlDataReader reader = command.ExecuteReader(); if (reader.Read()) { AuthorText.Text = reader["author"].ToString(); PriceText.Text = reader["price"].ToString(); IsbnText.Text = reader["ISBN"].ToString(); } connection.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); //clear form AuthorText.Clear(); IsbnText.Clear(); PriceText.Clear(); } QuantityText.Focus(); }
/// <summary> /// This creates the book and if a certain book is picked, the corresponding text boxes will update with the /// correct information in each box. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { string SelectedItem = (string)comboBox1.SelectedItem; try { string jsonBook = File.ReadAllText(@"Z:\Desktop\Fourth Year (F18-S19)\CompE561\Lab1\Lab1\bin\Debug\BookList.json"); JObject JSON = JObject.Parse(jsonBook); JObject targetBook = (JObject)JSON[SelectedItem]; string s_targetBook = targetBook.ToString(); Book found = new Book(); Newtonsoft.Json.JsonConvert.PopulateObject(s_targetBook, found); AuthorText.Text = found.author;; IsbnText.Text = found.ISBN; PriceText.Text = found.price.ToString(); } catch { AuthorText.Clear(); IsbnText.Clear(); PriceText.Clear(); } QuantityText.Focus(); }
/// <summary> /// Конструктор (при нахождении файла в кеше устанавливается свойство Text /// </summary> /// <param name="author">Автор</param> /// <param name="text">Текст</param> public DownloadTextItem(Author author, AuthorText text) { _author = author; AuthorText = text; string fileName = GetCachedFileName(); if (File.Exists(fileName)) { Text = File.ReadAllText(fileName, Encoding.GetEncoding(1251)); } BytesReceived = 0; }
public void Start() { if (_isDownloading) { return; } _isDownloading = true; _client = null; _stop = false; Logger.Add(string.Format("Запущена закачка книги '{0}'.", AuthorText.Name)); WEB.DownloadPageSilent(AuthorText.GetFullLink(_author), Progress, Complete); }
/// <summary> /// опубликовать информация об обновлении книги /// </summary> /// <param name="authorUrl">урл автора</param> /// <param name="book">книга</param> /// <param name="authorName">имя автора</param> public void PublishMessageUpdatedBook(AuthorText book, string authorUrl, string authorName) { var paramJson = new fastJSON.JSONParameters { UsingGlobalTypes = false, EnableAnonymousTypes = true, UseExtensions = false }; var paramBJson = new fastBinaryJSON.BJSONParameters { UsingGlobalTypes = false, EnableAnonymousTypes = true, UseExtensions = false }; try { if (_settings.UseMessageBroker) { var transportBookInfo = new TransportBookInfo() { AuthorLink = authorUrl, AuthorName = authorName, Description = book.Description, Genres = book.Genres, Link = book.Link, Name = book.Name, SectionName = book.SectionName, Size = book.Size, UpdateDate = DateTime.Now.ToUniversalTime().Ticks }; var jsonTransportBookInfo = fastBinaryJSON.BJSON.Instance.ToBJSON(transportBookInfo, paramBJson);// fastJSON.JSON.Instance.ToJSON(transportBookInfo); var command = new SubscriptionMessageCommand() { JsonObjectBytes = jsonTransportBookInfo }; PublishMessageUpdatedBook(fastJSON.JSON.Instance.ToJSON(command, paramJson)); } } catch (Exception ex) { //_logger.Add("Остановлен сервис подписки на push-уведомления об обновлениях."); } }
/// <summary> /// Пытается добавить текст автора в очередь закачки. /// Если уже есть в кеше, то не добавляет, а возвращает из кеша. /// </summary> /// <param name="author">Автор</param> /// <param name="text">Текст</param> /// <returns>Элемент очереди, либо из кеша</returns> public static DownloadTextItem Add(Author author, AuthorText text) { foreach (DownloadTextItem downloadTextItem in DownloadTextItems) { if (downloadTextItem.GetHashCode() == (new DownloadTextItem(author, text)).GetHashCode()) { return(downloadTextItem); } } DownloadTextItem item = new DownloadTextItem(author, text) { Logger = _logger }; if (item.Text == null) { DownloadTextItems.Add(item); } ChangeVisibility(); return(item); }
private void OpenReader(AuthorText authorText, int? readerType) { if (readerType == null) readerType = MainWindow.GetSettings().DefaultReader; string url = authorText.GetFullLink(_author); switch (readerType) { case 0: // веб-страничка WEB.OpenURL(url.Trim()); break; case 1: // внутренняя читалка case 3: // другая читалка DownloadTextItem item = DownloadTextHelper.Add(_author, authorText); item.ReaderType = readerType; item.DownloadTextComplete += ItemDownloadTextComplete; if (item.Text == null) { item.Start(); } else ItemDownloadTextComplete(item, null); break; case 2: // Aj-reader string aj = "http://zhurnal.lib.ru/img/m/mertwyj_o_a/aj.shtml?" + url.Replace("http://zhurnal.lib.ru/", ""); WEB.OpenURL(aj.Trim()); break; default: break; } }
private void OpenReader(AuthorText authorText) { OpenReader(authorText, null); }
public string GetUserBooksFolder(Author author, AuthorText authorText) { var path = Path.Combine(RootBooksFolder, authorText.SectionName); return(path); }
public string GetCachedFileName() { return(AuthorText.GetCachedFileName(_author)); }
public bool UpdateAuthorInfo(string page, Author author, SynchronizationContext context, bool skipBookDescriptionChecking = false) { try { lock (_lockObj) { bool retValue = false; if (string.IsNullOrWhiteSpace(author.AlternateURL) && author.URL.Contains("http://www.fanfiction.net/atom/u/")) { author.AlternateURL = author.URL.Replace("http://www.fanfiction.net/atom/u/", "http://www.fanfiction.net/u/"); } if (string.IsNullOrWhiteSpace(author.AlternateURL) && author.URL.Contains("https://www.fanfiction.net/atom/u/")) { author.AlternateURL = author.URL.Replace("https://www.fanfiction.net/atom/u/", "https://www.fanfiction.net/u/"); } var authorTemp = new Author { UpdateDate = author.UpdateDate }; using (XmlReader reader = XmlReader.Create(new StringReader(page))) { SyndicationFeed feed = SyndicationFeed.Load(reader); int cnt = 0; foreach (var item in feed.Items) { var text = new AuthorText { Description = CleanSummary(TextCleaner.Html2Text(item.Summary.Text)), Genres = item.Authors.Count > 0 ? item.Authors[0].Name : "", Link = item.Links.Count > 0 ? //item.Links[0].GetAbsoluteUri()==null ? "" : item.Links[0].GetAbsoluteUri().AbsolutePath item.Links[0].Uri.ToString() : "", Name = item.Title.Text, Order = cnt, SectionName = item.Authors.Count > 0 ? item.Authors[0].Name : "", Size = -1, UpdateDate = item.LastUpdatedTime.LocalDateTime }; authorTemp.Texts.Add(text); cnt++; } if (author.Texts.Count > 0) // если раньше загружали автора, то проводим сравнение { foreach (AuthorText txt in authorTemp.Texts) { bool bFound = false; int OldSize = 0; // стрый размер текста foreach (AuthorText t in author.Texts) { if (txt.Link == t.Link) { txt.Cached = t.Cached; if (t.IsNew) { // если книгу не читали до этой проверки, не меняем старое значение, чтобы видеть кумулятивное изменение размера OldSize = t.SizeOld;// запоминаем позапрошлый размер, чтобы запомнить изменения в новом тексте кумулятивно } else { OldSize = t.Size; // запоминаем старый размер, чтобы запомнить его в новом тексте } bFound = txt.Name == t.Name && txt.Description == t.Description; // && txt.UpdateDate == t.UpdateDate if (bFound) { // переносим значение isNew в новый массив, чтобы не потерять непрочитанные новые тексты txt.IsNew = t.IsNew; txt.UpdateDate = t.UpdateDate; txt.SizeOld = t.SizeOld; // переносим, чтобы при отсутствии изменений не скидывалась информация об изменениях break; } } } if (!bFound) { retValue = true; authorTemp.IsNew = true; txt.IsNew = true; txt.UpdateDate = DateTime.Now; txt.SizeOld = OldSize; // да, автор обновился authorTemp.UpdateDate = DateTime.Now; //#region Отсылка информации об обновлении в шину брокера сообщений //MessageBroker.HiLevelManager.Manager.GetInstance().PublishMessageUpdatedBook(txt, author.URL, author.Name); //#endregion // отсылка инормации об обновлении на сервер статистики SIinformer.ApiStuff.ApiManager.GetInstance().PublishMessageUpdatedBook(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), txt, author.URL, author.Name); } } // доп проверка по количеству произведений if (authorTemp.Texts.Count != author.Texts.Count) { retValue = true; authorTemp.UpdateDate = feed.LastUpdatedTime.LocalDateTime; } } // отсылка информации о книгах (не обновленные. обновленные идут отдельным вызовом) на сервер статистики SIinformer.ApiStuff.ApiManager.GetInstance().SetBooksInfo(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), authorTemp.Texts.Where(b => !b.IsNew).ToList(), author.URL, author.Name); context.Post(Author.SyncRun, new Author.RunContent { Renewed = author, New = authorTemp }); reader.Close(); } return(retValue); }//lock } catch (Exception ex) { MainWindow.MainForm.GetLogger().Add("Ошибка парсинка странички " + author.URL + " " + ex.Message); } return(false); }
public void PublishMessageUpdatedBook(Logger logger, Setting settings, AuthorText book, string authorUrl, string authorName) { if (!settings.UseMessageBroker) { return; } CheckProxy(settings); var paramBJson = new fastBinaryJSON.BJSONParameters { UsingGlobalTypes = false, EnableAnonymousTypes = true, UseExtensions = false }; try { var transportBookInfo = new TransportBookInfo() { AuthorLink = authorUrl, AuthorName = authorName, Description = book.Description, Genres = book.Genres, Link = book.Link, Name = book.Name, SectionName = book.SectionName, Size = book.Size, UpdateDate = DateTime.Now.ToUniversalTime().Ticks }; var jsonTransportBookInfo = fastBinaryJSON.BJSON.Instance.ToBJSON(transportBookInfo, paramBJson); var rpc = new JsonRpcClient(_proxy) { Url = _apiUrl }; rpc.Invoke <BooleanOperationResult>( new RpcCommand() { Method = "SetUpdateInfo", ParametersArray = new object[] { "clientId", SubscriptionManager.CurrentClientId, "jsonObjectBytes", jsonTransportBookInfo, "appId", "slkdjfhsjdfks928347832940hfjdsf982738r9" } }, (data) => GetUiControl().InvokeIfRequired(() => { if (data == null) { logger.Add("Не удалось отослать информацию об обновлении серверу статистики SIInformer", true); } else if (data.Result) { // ну, отослали успешно, чо делать-то? Да ничего. :-) } else { logger.Add("Не удалось отослать информацию об обновлении серверу статистики SIInformer: " + data.Error, true); } }, DispatcherPriority.Normal), (error) => GetUiControl().InvokeIfRequired(() => logger.Add("Не удалось отослать информацию об обновлении серверу статистики SIInformer: " + error.Message, true), DispatcherPriority.Normal)); } catch (Exception ex) { logger.Add("Ошибка работы модуля общения с сервером статистики SIInformer: " + ex.Message, true); } }
public string GetFileExtention(AuthorText authorText) { return(Path.GetExtension(authorText.Link)); }
public override int GetHashCode() { return(_author.GetHashCode() ^ AuthorText.GetHashCode()); }
public string GetFileName(AuthorText authorText) { return(authorText.Link); }
private void Complete(object sender, DownloadDataCompletedEventArgs e) { WebClient client = (WebClient)sender; client.DownloadDataCompleted -= Complete; client.DownloadProgressChanged -= Progress; DownloadTextHelper.Remove(this); if ((e != null) && e.Cancelled) { Logger.Add(string.Format("Загрузка книги '{0}' прервана.", AuthorText.Name)); } else if ((e != null) && (e.Error != null)) { Logger.Add(e.Error.StackTrace, false, true); Logger.Add(e.Error.Message, false, true); Logger.Add(string.Format("Ошибка при загрузке книги '{0}'.", AuthorText.Name), true, true); } if ((e != null) && (e.Error == null) && (!e.Cancelled)) { Text = (e.Result != null) ? WEB.ConvertPage(e.Result) : null; if (Text != null) { Text = PostProcess(Text); if (!Directory.Exists(Path.GetDirectoryName(GetCachedFileName()))) { Directory.CreateDirectory(Path.GetDirectoryName(GetCachedFileName())); } // надо проверить разницу с предыдущим текстом // для этого ищем предыдущий файл и сравниваем с ним, результат пишем в отдельный файл #region Вычисление изменений в тексте файла string CachedFileName = Path.GetFileNameWithoutExtension(GetCachedFileName()); // делаем так, потому что имя файла может поменяться. Мы ориентируемся на последний вариант в предположении, // что автор обновляет проду, а не перезаливает с новым именем // убираем штамп времени string[] name_parts = CachedFileName.Split(".".ToCharArray()); if (name_parts.Length > 1) { string CachedFileNameWithoutTimeMask = ""; for (int i = 0; i < name_parts.Length - 1; i++) { CachedFileNameWithoutTimeMask = CachedFileNameWithoutTimeMask + ((CachedFileNameWithoutTimeMask == "") ? name_parts[i] : "." + name_parts[i]); } CachedFileNameWithoutTimeMask = CachedFileNameWithoutTimeMask + "."; // берем последний закачанный файл var files = from f in Directory.GetFiles(Path.GetDirectoryName(GetCachedFileName())) where Path.GetFileName(f).ToLower().StartsWith(CachedFileNameWithoutTimeMask.ToLower()) && Path.GetFileName(f).ToLower().EndsWith(".shtml") orderby f select f; string last_file = ""; if (files.Count() > 0) { last_file = files.Last(); } // если такой есть, то проведем сравнение #region код вычисления различий // если текст больше 150 кило - небудем находить различия, ибо медленно if (Text.Length < 150 * 1024) { if (!string.IsNullOrEmpty(last_file)) { // засунем вычисления в отдельный поток, так как это медленная операция System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker(); bw.DoWork += (o, e1) => { Logger.Add(string.Format("Нахождение различий в обновлении книги '{0}'.", AuthorText.Name)); Helpers.HtmlDiff diff = new Helpers.HtmlDiff(File.ReadAllText(last_file, Encoding.GetEncoding(1251)), Text); string diff_file = ""; try { diff_file = diff.Build(); } catch { } if (!string.IsNullOrEmpty(diff_file)) { diff_file = diff_file.Replace("<head>", "<head><STYLE type=\"text/css\">table {border:1px solid #d9d9d9;} td {border:1px solid #d9d9d9; padding:3px;} ins {background-color: #00542E;text-decoration:inherit;} del {color: #999; background-color:#FEC8C8;} ins.mod { background-color: #FFE1AC; }</STYLE>"); File.WriteAllText( Path.Combine(Path.GetDirectoryName(GetCachedFileName()), CachedFileName + "_diff.shtml"), diff_file, Encoding.GetEncoding(1251)); AuthorText.UpdateHasDiff(_author); } Logger.Add(string.Format("Файл различий в обновлении книги '{0}' сформирован.", AuthorText.Name)); }; bw.RunWorkerAsync(); } } else { Logger.Add(string.Format("Нахождение различий в обновлении книги '{0}' не будет произведено, оазмер превышает 150кб.", AuthorText.Name)); } #endregion } #endregion File.WriteAllText(GetCachedFileName(), Text, Encoding.GetEncoding(1251)); Logger.Add(string.Format("Книга '{0}' закачана.", AuthorText.Name)); } } if (DownloadTextComplete != null) { DownloadTextComplete(this, e); } }
public bool UpdateAuthorInfo(string page, Author author, SynchronizationContext context, bool skipBookDescriptionChecking = false) { lock (_lockObj) { bool retValue = false; var authorTemp = new Author { UpdateDate = author.UpdateDate }; // проанализируем данные на страничке. если раньше их не загружали, то в любом случае не показываем, что есть обновления, просто заполняем данные 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) { var item = new AuthorText { Description = NormalizeHTML(m.Groups["Description"].Value).Trim(), Genres = NormalizeHTML(m.Groups["Genres"].Value), Link = m.Groups["LinkToText"].Value, Name = NormalizeHTML(m.Groups["NameOfText"].Value), Order = cnt, SectionName = NormalizeHTML(m.Groups["Section"].Value).Replace("@", ""), Size = int.Parse(m.Groups["SizeOfText"].Value) }; authorTemp.Texts.Add(item); cnt++; } } if (author.Texts.Count > 0) // если раньше загружали автора, то проводим сравнение { foreach (AuthorText txt in authorTemp.Texts) { bool bFound = false; int OldSize = 0; // стрый размер текста foreach (AuthorText t in author.Texts) { if (txt.Link == t.Link) { txt.Cached = t.Cached; if (t.IsNew) { // если книгу не читали до этой проверки, не меняем старое значение, чтобы видеть кумулятивное изменение размера OldSize = t.SizeOld;// запоминаем позапрошлый размер, чтобы запомнить изменения в новом тексте кумулятивно } else { OldSize = t.Size; // запоминаем старый размер, чтобы запомнить его в новом тексте } bFound = skipBookDescriptionChecking ? txt.Name == t.Name && txt.Size == t.Size : txt.Name == t.Name && txt.Size == t.Size & txt.Description == t.Description; if (bFound) { // переносим значение isNew в новый массив, чтобы не потерять непрочитанные новые тексты txt.IsNew = t.IsNew; txt.UpdateDate = t.UpdateDate; txt.SizeOld = t.SizeOld; // переносим, чтобы при отсутствии изменений не скидывалась информация об изменениях break; } } } if (!bFound) { retValue = true; authorTemp.IsNew = true; txt.IsNew = true; txt.UpdateDate = DateTime.Now; txt.SizeOld = OldSize; // да, автор обновился authorTemp.UpdateDate = DateTime.Now; //#region Отсылка информации об обновлении в шину брокера сообщений //MessageBroker.HiLevelManager.Manager.GetInstance().PublishMessageUpdatedBook(txt, author.URL, author.Name); //#endregion // отсылка инормации об обновлении на сервер статистики SIinformer.ApiStuff.ApiManager.GetInstance().PublishMessageUpdatedBook(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), txt, author.URL, author.Name); } } // доп проверка по количеству произведений if (authorTemp.Texts.Count != author.Texts.Count) { retValue = true; authorTemp.UpdateDate = DateTime.Now; } } // отсылка информации о книгах (не обновленные. обновленные идут отдельным вызовом) на сервер статистики SIinformer.ApiStuff.ApiManager.GetInstance().SetBooksInfo(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), authorTemp.Texts.Where(b => !b.IsNew).ToList(), author.URL, author.Name); context.Post(Author.SyncRun, new Author.RunContent { Renewed = author, New = authorTemp }); return(retValue); } // lock }
public string GetFileExtention(AuthorText authorText) { return(".html"); }