protected async Task SetRecepientName(MessageTable messageTable)
        {
            try
            {
                if (messageTable.SenderId == App.QbProvider.UserId)
                {
                    messageTable.RecepientFullName = "Me";
                }
                else {
                    var opponentUser = opponentUsers.FirstOrDefault(u => u.Id == messageTable.SenderId);
                    if (opponentUser == null)
                    {
                        var userRespose = await App.QbProvider.GetUserAsync(messageTable.SenderId);
                        if (userRespose != null)
                        {
                            this.opponentUsers.Add(userRespose);
                            messageTable.RecepientFullName = userRespose.FullName;
                        }
                    }
                    else {
                        messageTable.RecepientFullName = opponentUser.FullName;
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
        public async Task LoadMessages()
        {
            List<Message> messages;
            try
            {
                messages = await App.QbProvider.GetMessagesAsync(dialogId);
            }
            catch (Exception ex)
            {
                await App.Current.MainPage.DisplayAlert("Error", ex.ToString(), "Ok");
                return;
            }

            if (messages != null)
            {
                messages = messages.OrderBy(message => message.DateSent).ToList();
                foreach (var message in messages)
                {
                    var chatMessage = new MessageTable();
                    chatMessage.DateSent = message.DateSent;
                    chatMessage.SenderId = message.SenderId;
                    chatMessage.MessageId = message.Id;
                    if (message.RecipientId.HasValue)
                        chatMessage.RecepientId = message.RecipientId.Value;
                    chatMessage.DialogId = message.ChatDialogId;
                    chatMessage.IsRead = message.Read == 1;

                    await this.SetRecepientName(chatMessage);
                    
                    chatMessage.Text = System.Net.WebUtility.UrlDecode(message.MessageText);

                    Device.BeginInvokeOnMainThread(() =>
                        Messages.Add(chatMessage)
                    );
                }

                Device.BeginInvokeOnMainThread(() =>
                    {
                        var privateChatPage = ((App.Current.MainPage as NavigationPage).CurrentPage as PrivateChatPage);
                        if (privateChatPage != null)
                            privateChatPage.ScrollList();
                    }
                );
            }
        }
        private void SendMessageCommandExecute(object obj)
        {
            var message = this.MessageText != null ? this.MessageText.Trim() : string.Empty;
            if (!string.IsNullOrEmpty(message))
            {
                var m = new MessageTable();
                m.SenderId = (int)App.QbProvider.UserId;
                m.Text = message;
                m.DialogId = dialogId;
                m.RecepientFullName = "Me";

                try
                {
                    var encodedMessage = System.Net.WebUtility.UrlEncode(message);
                    privateChatManager.SendMessage(encodedMessage);
                }
                catch (Exception ex)
                {
                    return;
                    //await App.Current.MainPage.DisplayAlert ("Error", ex.ToString (), "Ok");
                }

				long unixTimestamp = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks;
				unixTimestamp /= TimeSpan.TicksPerSecond;
				m.DateSent = unixTimestamp;
				m.ID = Database.Instance().SaveMessage(m);

				var dialog = Database.Instance().GetDialog(this.dialogId);
				dialog.LastMessage = m.Text;
				dialog.LastMessageSent = DateTime.UtcNow;
				Database.Instance().SaveDialog(dialog, true);

                this.Messages.Add(m);
                MessageText = "";

                Device.BeginInvokeOnMainThread(() =>
                {
                    var page = (App.Current.MainPage as NavigationPage).CurrentPage as PrivateChatPage;
                    if (page != null)
                        page.ScrollList();
                });
            }
        }
        private async void OnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
            if (messageEventArgs.MessageType == MessageType.Chat ||
                messageEventArgs.MessageType == MessageType.Groupchat)
            {
                string decodedMessage = System.Net.WebUtility.UrlDecode(messageEventArgs.Message.MessageText);

                var messageTable = new MessageTable();
                messageTable.SenderId = messageEventArgs.Message.SenderId;
                messageTable.DialogId = messageEventArgs.Message.ChatDialogId;
                messageTable.DateSent = messageEventArgs.Message.DateSent;

                if (messageEventArgs.Message.NotificationType != 0)
                {
                    if (messageEventArgs.Message.NotificationType == NotificationTypes.GroupUpdate)
                    {
                        if (messageEventArgs.Message.AddedOccupantsIds.Any())
                        {
                            var userIds = new List<int>(messageEventArgs.Message.AddedOccupantsIds);
                            userIds.Add(messageEventArgs.Message.SenderId);
                            var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                            var addedUsers = users.Where(u => u.Id != messageEventArgs.Message.SenderId);
                            var senderUser = users.First(u => u.Id == messageEventArgs.Message.SenderId);
                            messageTable.Text = senderUser.FullName + " added users: " +
                                                string.Join(",", addedUsers.Select(u => u.FullName));
                        }
                        else if (messageEventArgs.Message.DeletedOccupantsIds.Any())
                        {
                            var userIds = new List<int>(messageEventArgs.Message.DeletedOccupantsIds);
                            var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                            messageTable.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
                        }

                        //var dialogInfo = await App.QbProvider.GetDialogAsync(messageEventArgs.Message.ChatDialogId);
                        //if (dialogInfo == null)
                        //{
                        //    return;
                        //}
                        //var dialog = new DialogTable(dialogInfo);
                        //Database.Instance().SaveDialog(dialog);
                    }
                }
                else
                {
                    messageTable.Text = decodedMessage;
                }

                await SetRecepientName(messageTable);

                this.Messages.Add(messageTable);

                Device.BeginInvokeOnMainThread(() =>
                {
                    var page = (App.Current.MainPage as NavigationPage).CurrentPage as PrivateChatPage;
                    if (page != null)
                        page.ScrollList();
                });
            }
        }
        public async Task LoadMessages()
        {
            List<Message> messages;
            try
            {
                messages = await App.QbProvider.GetMessagesAsync(dialogId);
            }
            catch (Exception ex)
            {
                new MessageDialog(ex.ToString(), "Error").ShowAsync();
                return;
            }

            if (messages != null)
            {
                messages = messages.OrderBy(message => message.DateSent).ToList();
                foreach (var message in messages)
                {
                    var chatMessage = new MessageTable();
                    chatMessage.DateSent = message.DateSent;
                    chatMessage.SenderId = message.SenderId;
                    chatMessage.MessageId = message.Id;
                    if (message.RecipientId.HasValue)
                        chatMessage.RecepientId = message.RecipientId.Value;
                    chatMessage.DialogId = message.ChatDialogId;
                    chatMessage.IsRead = message.Read == 1;

                    await this.SetRecepientName(chatMessage);

                    chatMessage.Text = System.Net.WebUtility.UrlDecode(message.MessageText);

                    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                      () =>
                      {
                          Messages.Add(chatMessage);
                      });
                }

                var page = App.NavigationFrame.Content as PrivateChatPage;
                if (page != null)
                    page.ScrollList();
            }
        }
        private void SendMessageCommandExecute()
        {
            var message = this.MessageText != null ? this.MessageText.Trim() : string.Empty;
            if (!string.IsNullOrEmpty(message))
            {
                var m = new MessageTable();
                m.SenderId = (int)App.QbProvider.UserId;
                m.Text = message;
                m.DialogId = dialogId;
                m.RecepientFullName = "Me";


                try
                {
                    var encodedMessage = System.Net.WebUtility.UrlEncode(message);
                    privateChatManager.SendMessage(encodedMessage);
                }
                catch (Exception ex)
                {
                    this.IsBusy = false;
                    new MessageDialog("Internet connection is lost. Please check it and restart the Application", "Error").ShowAsync();
                    return;
                }

                long unixTimestamp = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks;
                unixTimestamp /= TimeSpan.TicksPerSecond;
                m.DateSent = unixTimestamp;
                m.ID = Database.Instance().SaveMessage(m);

                var dialog = Database.Instance().GetDialog(this.dialogId);
                dialog.LastMessage = m.Text;
                dialog.LastMessageSent = DateTime.UtcNow;
                Database.Instance().SaveDialog(dialog, true);

                this.Messages.Add(m);
                MessageText = "";

                var page = App.NavigationFrame.Content as PrivateChatPage;
                if (page != null)
                    page.ScrollList();
            }
        }
        public async Task LoadMessages()
        {
            List<Message> messages;
            List<MessageTable> chatMessages = new List<MessageTable>();
            try
            {
                messages = await App.QbProvider.GetMessagesAsync(dialogId);
            }
            catch (Exception ex)
            {
                new MessageDialog(ex.ToString(), "Error").ShowAsync();
                return;
            }

            using (await lockAddingObject.LockAsync())
            {
                if (messages != null)
                {
                    messages = messages.OrderBy(message => message.DateSent).ToList();
                    foreach (var message in messages)
                    {
                        var chatMessage = new MessageTable();
                        chatMessage.DateSent = message.DateSent;
                        chatMessage.SenderId = message.SenderId;
                        chatMessage.MessageId = message.Id;
                        if (message.RecipientId.HasValue)
                            chatMessage.RecepientId = message.RecipientId.Value;
                        chatMessage.DialogId = message.ChatDialogId;
                        chatMessage.IsRead = message.Read == 1;

                        await this.SetRecepientName(chatMessage);

                        if (message.NotificationType == NotificationTypes.GroupCreate ||
                            message.NotificationType == NotificationTypes.GroupUpdate)
                        {
                            if (message.AddedOccupantsIds.Any())
                            {
                                var userIds = new List<int>(message.AddedOccupantsIds);
                                userIds.Add(message.SenderId);

                                var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));

                                var addedUsers = users.Where(u => u.Id != message.SenderId);
                                var senderUser = users.First(u => u.Id == message.SenderId);
                                chatMessage.Text = senderUser.FullName + " added users: " +
                                                   string.Join(",", addedUsers.Select(u => u.FullName));
                            }
                            else if (message.DeletedOccupantsIds.Any())
                            {
                                var userIds = new List<int>(message.DeletedOccupantsIds);
                                var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                                chatMessage.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
                            }
                        }
                        else
                        {
                            chatMessage.Text = System.Net.WebUtility.UrlDecode(message.MessageText);
                        }

                        chatMessages.Add(chatMessage);
                    }
                }

                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                           () =>
                           {
                               this.Messages.Clear();
                               foreach (var item in chatMessages)
                               {
                                   this.Messages.Add(item);
                               }

                               var page = App.NavigationFrame.Content as GroupChatPage;
                               if (page != null)
                                   page.ScrollList();
                           });
            }
        }
        private async void OnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
            if (messageEventArgs.MessageType == MessageType.Chat ||
                messageEventArgs.MessageType == MessageType.Groupchat)
            {
                using (await lockAddingObject.LockAsync())
                {
                    string decodedMessage = System.Net.WebUtility.UrlDecode(messageEventArgs.Message.MessageText);

                    var messageTable = new MessageTable();
                    messageTable.SenderId = messageEventArgs.Message.SenderId;
                    messageTable.DialogId = messageEventArgs.Message.ChatDialogId;
                    messageTable.DateSent = messageEventArgs.Message.DateSent;
					messageTable.MessageId = messageEventArgs.Message.Id;

                    if (messageEventArgs.Message.NotificationType != 0)
                    {
                        if (messageEventArgs.Message.NotificationType == NotificationTypes.GroupUpdate)
                        {
                            if (messageEventArgs.Message.AddedOccupantsIds.Any())
                            {
                                var userIds = new List<int>(messageEventArgs.Message.AddedOccupantsIds);
                                userIds.Add(messageEventArgs.Message.SenderId);
                                var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                                var addedUsers = users.Where(u => u.Id != messageEventArgs.Message.SenderId);
                                var senderUser = users.First(u => u.Id == messageEventArgs.Message.SenderId);
                                messageTable.Text = senderUser.FullName + " added users: " +
                                                    string.Join(",", addedUsers.Select(u => u.FullName));
                            }
                            else if (messageEventArgs.Message.DeletedOccupantsIds.Any())
                            {
                                var userIds = new List<int>(messageEventArgs.Message.DeletedOccupantsIds);
                                var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                                messageTable.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
                            }
                        }
                    }
                    else
                    {
                        messageTable.Text = decodedMessage;
                    }

                    await SetRecepientName(messageTable);

                    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                    () =>
                    {
                        var message = this.Messages.FirstOrDefault(m => m.MessageId == messageTable.MessageId);
                        if (message == null)
                            this.Messages.Add(messageTable);

                        var page = App.NavigationFrame.Content as GroupChatPage;
                        if (page != null)
                            page.ScrollList();
                    });
                }
            }
        }
Esempio n. 9
0
		public int SaveMessage(MessageTable item, bool isNotify = false)
        {
            int retVal = 0;
            lock (locker)
            {
				var checkIfPresence = this.database.Table<MessageTable>().FirstOrDefault(x => x.MessageId == item.MessageId);
                if (checkIfPresence != null)
                {
                    retVal = item.ID = checkIfPresence.ID;
                    this.database.Update(item);
                }
                else
                {
                    this.database.Insert(item);
                    retVal = item.ID;
                }
            }

			if (isNotify)
				messageObserver.Invoke ();

            return retVal;
        }
        private async Task LoadMessages()
        {
            List<Message> messages = null;
			List<MessageTable> chatMessages = new List<MessageTable>();
            try
            {
                messages = await App.QbProvider.GetMessagesAsync(this.dialogId);
				var userIds = messages.Select(u => u.SenderId).Distinct().ToList();
				userIds.Add(App.UserId);
				this.opponentUsers = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
            }
            catch (Exception ex)
            {
                await App.Current.MainPage.DisplayAlert("Error", ex.ToString(), "Ok");
            }

			using (await lockObject.LockAsync())
			{
				if (messages != null)
				{
					messages = messages.OrderBy(message => message.DateSent).ToList();
					foreach (var message in messages)
					{
						var chatMessage = new MessageTable();
						chatMessage.DateSent = message.DateSent;
						chatMessage.SenderId = message.SenderId;
						chatMessage.MessageId = message.Id;
						if (message.RecipientId.HasValue)
							chatMessage.RecepientId = message.RecipientId.Value;
						chatMessage.DialogId = message.ChatDialogId;
						chatMessage.IsRead = message.Read == 1;

						await this.SetRecepientName(chatMessage);

						if (message.NotificationType == NotificationTypes.GroupCreate ||
							message.NotificationType == NotificationTypes.GroupUpdate)
						{
							if (message.AddedOccupantsIds.Any())
							{
								await LoadMessageText(message, chatMessage);
							}
							else if (message.DeletedOccupantsIds.Any())
							{
								var userIds = new List<int>(message.DeletedOccupantsIds);
								var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
								chatMessage.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
							}
						}
						else
						{
							chatMessage.Text = System.Net.WebUtility.UrlDecode(message.MessageText);
						}

						chatMessages.Add(chatMessage);
					}

					var databaseMessages = Database.Instance().GetMessages(this.dialogId);
					Device.BeginInvokeOnMainThread(() =>
					{
						var messagesJoined = chatMessages.GroupJoin(databaseMessages,        //  inner sequence
														 e => e.MessageId,          //  outerKeySelector
														 o => o.MessageId,          //  innerKeySelector
														  (e, o) => e);

						this.Messages.Clear();
						foreach (var item in messagesJoined)
						{
							this.Messages.Add(item);
						}

						var page = (App.Current.MainPage as NavigationPage).CurrentPage as GroupChatPage;
						if (page != null)
						{
							page.ScrollList();
						}
					}
				);
				}
			}
        }
		private async void OnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
			if (messageEventArgs.MessageType == MessageType.Chat ||
				messageEventArgs.MessageType == MessageType.Groupchat)
			{
				using (await lockObject.LockAsync())
				{
					string decodedMessage = System.Net.WebUtility.UrlDecode(messageEventArgs.Message.MessageText);

					var messageTable = new MessageTable();
					messageTable.SenderId = messageEventArgs.Message.SenderId;
					messageTable.DialogId = messageEventArgs.Message.ChatDialogId;
					messageTable.DateSent = messageEventArgs.Message.DateSent;
					messageTable.MessageId = messageEventArgs.Message.Id;

					if (messageEventArgs.Message.NotificationType != 0)
					{
						if (messageEventArgs.Message.NotificationType == NotificationTypes.GroupUpdate)
						{
							if (messageEventArgs.Message.AddedOccupantsIds.Any())
							{
								await LoadMessageText(messageEventArgs.Message, messageTable);
							}
							else if (messageEventArgs.Message.DeletedOccupantsIds.Any())
							{
								var userIds = new List<int>(messageEventArgs.Message.DeletedOccupantsIds);
								var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
								messageTable.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
							}
						}
					}
					else
					{
						messageTable.Text = decodedMessage;
					}

					await SetRecepientName(messageTable);

					var message = this.Messages.FirstOrDefault(m => m.MessageId == messageTable.MessageId);
					if (message == null)
						this.Messages.Add(messageTable);

					Device.BeginInvokeOnMainThread(() =>
					{
						var groupPage = ((App.Current.MainPage as NavigationPage).CurrentPage as GroupChatPage);
						if (groupPage != null)
							groupPage.ScrollList();
					}
				   );
				}
			}
        }
		private async Task LoadMessageText(Message message, MessageTable chatMessage)
		{
			var userIds = new List<int>(message.AddedOccupantsIds);

			// Check if we loaded this users 
			var isNeedLoad = false;
			foreach (var userInAddedCollectionId in message.AddedOccupantsIds)
			{
				var user = opponentUsers.FirstOrDefault(u => u.Id == userInAddedCollectionId);
				if (user == null)
				{
					isNeedLoad = true;
					break;
				}
			}

			userIds.Add(message.SenderId);

			if (isNeedLoad)
			{
				var users = await App.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
				foreach (var user in users)
				{
					var userInCollection = opponentUsers.FirstOrDefault(u => u.Id == user.Id);
					if (userInCollection == null)
						opponentUsers.Add(user);
				}
			}

			var addedUsers = opponentUsers.Where(u => userIds.Contains(u.Id) && u.Id != message.SenderId);
			var senderUser = opponentUsers.First(u => userIds.Contains(u.Id) && u.Id == message.SenderId);
			chatMessage.Text = senderUser.FullName + " added users: " +
			string.Join(",", addedUsers.Select(u => u.FullName));
			
		}