private async void OnChatMessage(LongPollChatMessage message) { if (Messages == null) { return; } if (message.Message?.MessageContent == null) { return; } bool isChat = Dialog?.Message.ChatId != 0; if ((!isChat && (message.Message.MessageContent.UserId == Dialog?.User.Profile.Id)) || (isChat && Dialog?.Message.ChatId == message.Message.MessageContent.ChatId)) { var id = message.Message.MessageContent.Id; if (message.Message.MessageContent.IsOut) { var existedMessage = Messages.FirstOrDefault(m => m.MessageContent.Id == id); if (existedMessage != null) { return; } else if (_lastSentMessages.Count > 0) { return; } } _hasUnreadMessages = true; message.Message.IsNew = true; Messages.Add(message.Message); //if there are attachments in message, request message from server with full data if (!message.Message.MessageContent.Attachments.IsNullOrEmpty() || message.Message.MessageContent.Geo != null || message.Message.MessageContent.ForwardMessages != null) { try { var fullMessage = await ServiceLocator.Vkontakte.Messages.GetById(id); if (fullMessage != null) { var m = Messages.FirstOrDefault(x => x.MessageContent.Id == id); m.MessageContent = fullMessage; Messages[Messages.IndexOf(m)] = m; Debug.WriteLine("Updated"); } } catch (Exception ex) { Logger.Error(ex, "Unable to load full message by id " + id); } } } }
private async void OnChatMessage(LongPollChatMessage message) { if (Dialogs == null) { Dialogs = new IncrementalLoadingCollection <Dialog>(); } bool isChat = message.Message.MessageContent.ChatId != 0; var dialog = Dialogs?.FirstOrDefault(d => !isChat ? d.User?.Profile.Id == message.Message.MessageContent.UserId : d.Message.ChatId == message.Message.MessageContent.ChatId); if (dialog != null) { bool isSelected = _selectedDialog == dialog; dialog.Message = message.Message.MessageContent; if (isChat) { dialog.User = new User(message.Message.Sender); } var dialogIndex = Dialogs.IndexOf(dialog); if (dialogIndex != 0) { Dialogs.RemoveAt(dialogIndex); Dialogs.Insert(0, dialog); //Dialogs.Move(dialogIndex, 0); //if it's not top dialog in the list, move it } else { Dialogs[dialogIndex] = dialog; //notifying UI to update whole model (trigger templateselector) } if (isSelected) { SelectedDialog = dialog; } } else { dialog = new Dialog(message.Message.MessageContent); var user = await ServiceLocator.UserService.GetById(message.Message.MessageContent.UserId); if (user != null) { dialog.User = new User(user); Dialogs.Insert(0, dialog); } } dialog.UnreadCount++; }