/// <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-уведомления об обновлениях."); } }
private static bool ProcessArrivedBook(TransportBookInfo book, bool isMyInfo) { if (book == null || string.IsNullOrWhiteSpace(book.AuthorLink)) { return(true); } if (Authors == null) { return(true); } var author = Authors.FindAuthor(book.AuthorLink); if (author == null) { return(true); } var alreadyStared = author.IsNew; if (author.IsIgnored || author.IsDeleted) { return(true); } var authorText = author.Texts.FirstOrDefault(t => t.Link == book.Link); // Link у нас - относительный путь, поэтому не преобразовываем bool isNew = false; bool isUpdated = false; var convertedTime = new DateTime(book.UpdateDate, DateTimeKind.Utc).ToLocalTime(); if (isMyInfo) { if (authorText == null) { return(true); } // просто маркируем свои штампы серверным, не меняя локальные даты проверок authorText.ServerStamp = book.UpdateDate; author.ServerStamp = book.UpdateDate; } else { if (authorText == null) { authorText = new AuthorText(); isNew = true; } if (authorText.ServerStamp > book.UpdateDate) { return(true); } if (!isNew) { book.Size = book.Size < 0 ? 0 : book.Size; // кооректируем, иногда бывает -1 isUpdated = ((authorText.Name != book.Name || authorText.Size != book.Size || (_setting.SkipBookDescription ? false : authorText.Description != book.Description))); } if (!isNew && !isUpdated) { authorText.ServerStamp = book.UpdateDate;// скорректируем локальное значение. поставим серверное return(true); } _messageBrokerTrayInfoCollectorTimer.Stop(); authorText.Description = book.Description; authorText.Genres = book.Genres; authorText.Link = book.Link; authorText.Name = book.Name; authorText.SectionName = book.SectionName; if (!authorText.IsNew) { authorText.SizeOld = authorText.Size; } authorText.Size = book.Size; authorText.UpdateDate = convertedTime; authorText.ServerStamp = book.UpdateDate; // ставим штамп сервера authorText.IsNew = true; if (isNew) { author.Texts.Add(authorText); } author.LastCheckDate = authorText.UpdateDate; try { if (author.NextCheckDate < author.LastCheckDate) { var elasticScheduler = new ElasticScheduler(_logger, _setting); elasticScheduler.MakePlan(author); elasticScheduler.SaveStatistics(); } author.UpdateDate = authorText.UpdateDate; author.ServerStamp = book.UpdateDate; // ставим штамп сервера author.IsNew = true; _logger.Add(string.Format("StatServer> Уведомление: обновился {0} ({1})", author.Name, authorText.Name), true, false); if (!_messageBrokerTrayInfo.Contains(author.Name) && !alreadyStared) { _messageBrokerTrayInfo = string.IsNullOrWhiteSpace(_messageBrokerTrayInfo) ? author.Name : _messageBrokerTrayInfo + "; " + author.Name; } _messageBrokerTrayInfoCollectorTimer.Start(); } catch (Exception ex) { _logger.Add(string.Format("Ошибка формирования плана проверок автора {0} - {1}", author.Name, ex)); } } 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); } }