Esempio n. 1
0
		public static void AddNewMessages(
			ISyncContext context,
			JanusMessageInfo[] messages,
			JanusRatingInfo[] rates,
			JanusModerateInfo[] moderatorials,
			int selfID)
		{
			AddNewMessages(
				context,
				messages,
				rates,
				moderatorials,
				null,
				selfID);
		}
Esempio n. 2
0
 public static int GetThreadId(this JanusMessageInfo msg) =>
 msg.topicId != 0 ? msg.topicId : msg.messageId;
Esempio n. 3
0
		/// <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(
			[JetBrains.Annotations.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(nameof(db));
			if (messages == null)
				throw new ArgumentNullException(nameof(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($"{Resources.ErrorOnMessageProcessing}{msg.messageId} : {e.Message}");
					}
				}

				processed++;
				progressHandler?.Invoke(messages.Length, processed);
			}

			db
				.SubscribedForums()
				.Set(_ => _.LastSync, 1)
				.Update();
			updatedTopicIds = topicIds.ToArray();
			updatedMessageIds = msgIds.ToArray();
		}
Esempio n. 4
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);
		}