/// <summary> /// Добавление сообшений полученыых с сервера в базу /// </summary> /// <param name="provider"></param> /// <param name="db"></param> /// <param name="messages">Добавляемые сообщения</param> /// <param name="selfid"></param> /// <param name="progressHandler">обработчик прогресса обработки сообщений</param> /// <param name="updatedTopicIds">Какие топики были обновлены.</param> /// <param name="updatedMessageIds">Какие сообщения были добавлены.</param> private static void AddMessages( [NotNull] IServiceProvider provider, IDataContext db, JanusMessageInfo[] messages, int selfid, Action <int, int> progressHandler, out int[] updatedTopicIds, out int[] updatedMessageIds) { if (db == null) { throw new ArgumentNullException("db"); } if (messages == null) { throw new ArgumentNullException("messages"); } var msgIds = new List <int>(); var topicIds = new List <int>(); var processed = 0; foreach (var msg in messages) { if (ForumsSubscriptionHelper.IsTrashForum(msg.forumId)) { try { var mid = msg.messageId; db.TopicInfos(ti => ti.MessageID == mid).Delete(); db.Messages(m => m.ID == mid).Delete(); } catch (Exception) { provider.LogError(Resources.ErrorOnMessageDelete + msg.messageId); } } else { var updatedTid = db.Message(msg.messageId, m => (int?)m.TopicID); if (msg.message.IsNullOrEmpty()) { msg.message = "<none>"; } var lastModerated = msg.lastModerated == DateTime.MinValue ? null : (DateTime?)msg.lastModerated; try { if (!updatedTid.HasValue) { var markRead = false; if (msg.parentId != 0) { markRead = db.Message(msg.parentId, m => m.ReadReplies); } var isRead = msg.userId == selfid ? provider.GetRequiredService <IRsdnSyncConfigService>().GetConfig().MarkOwnMessages : markRead; db .Messages() .Value(_ => _.ID, msg.messageId) .Value(_ => _.ForumID, msg.forumId) .Value(_ => _.TopicID, msg.topicId) .Value(_ => _.ParentID, msg.parentId) .Value(_ => _.Date, msg.messageDate) .Value(_ => _.UserNick, msg.userNick) .Value(_ => _.Subject, msg.subject) .Value(_ => _.Message, msg.message) .Value(_ => _.UserClass, ToJanusUserClass(msg.userRole)) .Value(_ => _.IsRead, isRead) .Value(_ => _.UserID, msg.userId) .Value(_ => _.ArticleId, msg.articleId) .Value(_ => _.ReadReplies, markRead) .Value(_ => _.Name, msg.messageName) .Value(_ => _.LastModerated, lastModerated) .Value(_ => _.Closed, msg.closed) .Insert(); msgIds.Add(msg.messageId); } else { var locMsg = msg; db .Messages(m => m.ID == locMsg.messageId) .Set(_ => _.ForumID, msg.forumId) .Set(_ => _.TopicID, msg.topicId) .Set(_ => _.ParentID, msg.parentId) .Set(_ => _.Date, msg.messageDate) .Set(_ => _.UserID, msg.userId) .Set(_ => _.UserNick, msg.userNick) .Set(_ => _.Subject, msg.subject) .Set(_ => _.Message, msg.message) .Set(_ => _.UserClass, ToJanusUserClass(msg.userRole)) .Set(_ => _.ArticleId, msg.articleId) .Set(_ => _.LastModerated, lastModerated) .Set(_ => _.Name, msg.messageName) .Set(_ => _.Closed, msg.closed) .Update(); topicIds.Add(updatedTid.Value == 0 ? msg.messageId : updatedTid.Value); } } catch (Exception e) { // Какая ....! provider.LogError( string.Format( "{0}{1} : {2}", Resources.ErrorOnMessageProcessing, msg.messageId, e.Message)); } } processed++; if (progressHandler != null) { progressHandler(messages.Length, processed); } } db .SubscribedForums() .Set(_ => _.LastSync, 1) .Update(); updatedTopicIds = topicIds.ToArray(); updatedMessageIds = msgIds.ToArray(); }
private static void AddBrokenTopicRequests( IServiceProvider provider, IEnumerable <JanusMessageInfo> messages) { var freshMids = new Dictionary <int, JanusMessageInfo>(); var parentIds = new Dictionary <int, int>(); // Собираем все messageId и parentId foreach (var msg in messages) { freshMids[msg.messageId] = msg; if (msg.parentId != 0 && !ForumsSubscriptionHelper.IsTrashForum(msg.forumId)) // Skip roots & trash { parentIds[msg.parentId] = msg.messageId; } } // Удаляем тех родителей, которые уже присутствуют в том же пакете foreach (var parentId in parentIds.Keys.ToArray()) { if (freshMids.ContainsKey(parentId)) { parentIds.Remove(parentId); } } using (var dbMgr = provider.CreateDBContext()) { var ids = dbMgr .Messages() .Where(msg => parentIds.Keys.ToArray().Contains(msg.ID)) .Select(msg => msg.ID); // Удаляем тех родителей, которые присутствуют в БД foreach (var mid in ids) { parentIds.Remove(mid); } } // Оборванных веток нет - выходим if (parentIds.Count <= 0) { return; } provider.LogInfo( string.Format( parentIds.Count.GetDeclension( Resources.BrokenTopicMessage1, Resources.BrokenTopicMessage2, Resources.BrokenTopicMessage5), parentIds.Count, parentIds.Values.JoinToStringSeries(30).FirstOrDefault())); // Добавляем оставшиеся в запросы топиков // TODO: вменяемые строковые константы foreach (var mid in parentIds.Values) { provider .GetOutboxManager() .DownloadTopics .Add( Resources.BrokenTopicRequestSource, mid, Resources.BrokenTopicRequestHint.FormatStr(freshMids[mid].subject)); } }