Example #1
0
		public static void AddNewMessages(
			ISyncContext context,
			JanusMessageInfo[] messages,
			JanusRatingInfo[] rates,
			JanusModerateInfo[] moderatorials,
			int selfID)
		{
			AddNewMessages(
				context,
				messages,
				rates,
				moderatorials,
				null,
				selfID);
		}
Example #2
0
		public static void AddNewMessages(
			ISyncContext context,
			JanusMessageInfo[] messages,
			JanusRatingInfo[] rates,
			JanusModerateInfo[] moderatorials,
			Action<IDataContext> afterProcessInTxHandler,
			int selfID)
		{
			if (messages == null)
				throw new ArgumentNullException(nameof(messages));
			if (rates == null)
				throw new ArgumentNullException(nameof(rates));
			if (messages.Length == 0 && rates.Length == 0)
				// Nothing to do
				return;

			context.LogInfo(Resources.ProcessMessages);

			var msgIds = Array<int>.Empty;
			// Затычка. Блокируем интерфейс на время обработки сообщений.
			using (context.GetRequiredService<IUIShell>().FreezeUI(context))
			using (context.GetRequiredService<IJanusDatabaseManager>().GetLock().GetWriterLock())
			{
				var dbMgr = context.GetRequiredService<IJanusDatabaseManager>();
				using (var db = dbMgr.CreateDBContext())
				using (var tx = db.BeginTransaction())
				{
					var tids = new HashSet<int>();
					var pgSvc = context.GetService<ISyncProgressVisualizer>();

					var topicIds = Array<int>.Empty;
					if (messages.Length > 0)
						AddMessages(
							context,
							db,
							messages,
							selfID,
							pgSvc != null
								? (total, current) =>
									{
										pgSvc.ReportProgress(total, current);
										pgSvc.SetProgressText(
											current
												.GetDeclension(
													Resources.NewMsgProcessingProgressText1,
													Resources.NewMsgProcessingProgressText2,
													Resources.NewMsgProcessingProgressText5)
												.FormatWith(current));
									}
								: (Action<int, int>) null,
							out topicIds,
							out msgIds);
					foreach (var msg in messages)
						tids.Add(msg.topicId != 0 ? msg.topicId : msg.messageId);
					foreach (var id in topicIds)
						tids.Add(id);

					AddNewRates(
						db,
						rates,
						pgSvc != null
							? (total, current) =>
								{
									pgSvc.ReportProgress(total, current);
									pgSvc.SetProgressText(
										current
											.GetDeclension(
												Resources.NewRatesProcessingProgress1,
												Resources.NewRatesProcessingProgress2,
												Resources.NewRatesProcessingProgress5)
											.FormatWith(current));
								}
							: (Action<int, int>) null);
					foreach (var rate in rates)
						tids.Add(rate.topicId != 0 ? rate.topicId : rate.messageId);

					AddModeratorials(db, moderatorials);

					// Вариант с получением топиков с сервера
					foreach (var tid in moderatorials.Select(
						mod => mod.topicId == 0 ? mod.messageId : mod.topicId))
						tids.Add(tid);

					context.GetRequiredService<IRsdnForumService>().UpdateForumAggregates(context, db, tids);

					afterProcessInTxHandler?.Invoke(db);

					tx.Commit();
					GC.KeepAlive(db);
				}
			}

			AddBrokenTopicRequests(context, messages);

			var searchSvc = context.GetRequiredService<ISearchService>();
			var addedCount =
				searchSvc.AddMessagesToIndex(
					messages.Select(
						svcMsg =>
							new MessageSearchInfo(
								svcMsg.messageId,
								svcMsg.messageDate,
								svcMsg.subject,
								svcMsg.message,
								svcMsg.forumId,
								svcMsg.userId,
								svcMsg.userNick)));
			context.StatisticsContainer.AddValue(JanusATInfo.IndexedMessagesStats, addedCount);

			context.LogInfo(
				Resources
					.DownloadTopicsStat
					.FormatWith(
						msgIds.Length,
						msgIds.Length.GetDeclension(
							Resources.Messages1,
							Resources.Messages2,
							Resources.Messages5)));

			context.StatisticsContainer.AddValue(JanusATInfo.MessagesStats, messages.Length);
			context.StatisticsContainer.AddValue(JanusATInfo.RatesStats, rates.Length);
			context.StatisticsContainer.AddValue(JanusATInfo.ModeratorialsStats, moderatorials.Length);
		}