///// <summary> Обработчик изменения модели внутри логики C++ </summary> //public void DoCallback(object sender, DoCallbackArgs e) //{ //if (e.ModelName == "ChatMessages") //{ // var listIdExisMessage = e.EntityIds.Where(obj => ListModelChatMessage.Any(message => message.Id == obj)).ToArray(); // if (listIdExisMessage.Length > 0) // { // Action action = () => RefreshExistingModelChatMessage(listIdExisMessage); // CurrentDispatcher.BeginInvoke(action); // } // var listIdNewMessage = e.EntityIds.Where(obj => !ListModelChatMessage.Any(message => message.Id == obj)).ToArray(); // if (listIdNewMessage.Length > 0) // { // Action action = () => AddNewModelChatMessage(listIdNewMessage); // CurrentDispatcher.BeginInvoke(action); // } // OnPropertyChanged("ListModelChatMessage"); //} //if (e.ModelName == "ContactsPresence") //{ // Action action = () => DataSourceContact.RefreshModelContactStatus(GetAllSendersAndUserFromChat()); // CurrentDispatcher.BeginInvoke(action); //} //if (e.ModelName == "ContactSubscriptions") //{ // ChangedListModelContactSubscription(e.EntityIds); // //OnPropertyChanged("ListModelConctactChatMembers"); //} //if (e.ModelName == "UserSettingsChanged") //{ // OnPropertyChanged("FontSize"); //} //RefreshListModelContactStatus(); //} //после удаления и редактирования сообщения на другом устройстве колбеки долбят постоянно //при удалении воткнут кастыль, при редактировании нельзя воткнуть т.к. сообщение может быть еще раз отредактированно /// <summary> Обновление существующих сообщений </summary> private void RefreshExistingModelChatMessage(List <ModelChatMessage> listModelChatMessages) { var listEditModelChatMessage = new List <ModelChatMessage>(); var listDeleteModelChatMessage = new List <ModelChatMessage>(); var listServeredModelChatMessage = new List <ModelChatMessage>(); foreach (var modelChatMessage in listModelChatMessages) { //ListModelChatMessage //var isRefreshMessage = true; if (modelChatMessage.ModelEnumChatMessageTypeObj.Code == 0 && modelChatMessage.Changed) { listEditModelChatMessage.Add(modelChatMessage); //isRefreshMessage = false; } if (modelChatMessage.ModelEnumChatMessageTypeObj.Code == 5) { if (_listModelChatMessage.First(obj => obj.Id == modelChatMessage.Id).ModelEnumChatMessageTypeObj.Code != 5) { listDeleteModelChatMessage.Add(modelChatMessage); //isRefreshMessage = false; } } var oldMessage = ListModelChatMessage.FirstOrDefault(obj => obj.Id == modelChatMessage.Id); if (oldMessage.Servered != modelChatMessage.Servered) { listServeredModelChatMessage.Add(modelChatMessage); } } if (listEditModelChatMessage.Count > 0) { OnEventViewModel("EditMessage", listEditModelChatMessage); } if (listDeleteModelChatMessage.Count > 0) { OnEventViewModel("DeleteMessage", listDeleteModelChatMessage); } if (listServeredModelChatMessage.Count > 0) { OnEventViewModel("ServeredMessage", listServeredModelChatMessage); } }
/// <summary> Получить еще старых сообщений </summary> public bool GetMoreOldMessage() { var lastMessage = ListModelChatMessage.First(); var listOldMessage = DataSourceChat.GetPagedOldModelChatMessage(lastMessage); if (listOldMessage.Count == 0) { return(false); } CurrentListOldMessage = listOldMessage; ListModelChatMessage.InsertRange(0, CurrentListOldMessage); return(true); }
/// <summary> Метод отправки сообщения </summary> private void SendModelMessage() { CurrentModelChatMessage.Sender = DataSourceContact.ModelContactIam; CurrentModelChatMessage.SendTime = DateTime.Now; CurrentModelChatMessage.ModelEnumChatMessageTypeObj = ModelEnumChatMessageType.GetModelEnum(0); // простое тесктовое сообщение CurrentModelChatMessage.IdChat = CurrentModelChat.Id; if (CurrentModelChat.IsP2P) { CurrentModelChatMessage.ModelEnumChatMessageSecurityLevelObj = ModelEnumChatMessageSecurityLevel.GetModelEnum(1); //сообщения зашифрованые } else { CurrentModelChatMessage.ModelEnumChatMessageSecurityLevelObj = ModelEnumChatMessageSecurityLevel.GetModelEnum(0); //сообщения не зашифрованые } if (_currentListQuotedMessage.Count != 0) { if (_currentListQuotedMessage.Count == 1 && JustAnswerCurrentMessage && String.IsNullOrWhiteSpace(_currentListQuotedMessage.First().StringContent)) { JustAnswerCurrentMessage = false; } DataSourceChat.QuoteAndSendMessages(CurrentModelChatMessage, _currentListQuotedMessage, JustAnswerCurrentMessage); _currentListQuotedMessage.Clear(); CurrentModelChatMessage = new ModelChatMessage(); } else { if (DataSourceChat.SendModelChatMessage(CurrentModelChatMessage)) { OnEventViewModel("SendModelMessage", CurrentModelChatMessage); ListModelChatMessage.Add(CurrentModelChatMessage); CurrentModelChatMessage = new ModelChatMessage(); } } if (CurrentModelChat.DraftMessage != null) { CurrentModelChat.DraftMessage = null; } }
/// <summary> Метод прочтения сообщений </summary> public void MarkReadModelMessage() { if (ListModelChatMessage.Count == 0) { return; } if (DataSourceChat.MarkReadModelChatMessage(ListModelChatMessage.Last())) { foreach (var i in ListModelChatMessage) { i.Readed = true; } if (CurrentModelChat.LastMessage != null) { CurrentModelChat.LastMessage.Readed = true; } //кастыль, т.к.пока СВ сказал что мы всегда помечаем все сообщения как прочитанные CurrentModelChat.NewMessagesCount = 0; } }
/// <summary> Добавление новых сообщений </summary> private void AddNewModelChatMessage(List <ModelChatMessage> listModelChatMessages) { //var listNewModelChatMessage = DataSourceChat.GetModelChatMessageById(entityIds).Where(obj => obj.IdChat == CurrentModelChat.Id).ToList(); //нужно вернуть TSAPOV //foreach (var i in listNewModelChatMessage) //{ // var modelContact = CurrentModelChat.ListModelContact.FirstOrDefault(obj => obj.Id == i.Sender.Id); // if (modelContact != null) i.Sender = modelContact; //} //var listNewModelChatMessage = DataSourceChat.GetModelChatMessageById(entityIds).Where(obj => obj.IdChat == CurrentModelChat.Id).ToList(); foreach (var i in listModelChatMessages) { var modelContact = CurrentModelChat.ListModelContact.FirstOrDefault(obj => obj.DodicallId == i?.Sender?.DodicallId); if (modelContact != null) { i.Sender = modelContact; } } if (!CurrentModelChat.IsP2P) { //_dataSourceContact.RefreshModelContactStatus(listNewModelChatMessage.Select(obj => obj?.Sender).ToList()); //_dataSourceContact.RefreshModelContactStatus(CurrentModelChat.ListModelContact); DataSourceContact.RefreshModelContactStatus(GetAllSendersAndUserFromChat()); } ListModelChatMessage.AddRange(listModelChatMessages); OnEventViewModel("NewMessage", listModelChatMessages); //MarkReadModelMessage(); // СВ сказал что при любой активности в чате все сообщения считаем прочитанными }
/// <summary> Сортировка сообщений внутри чата </summary> private void SortCurrentListModelChatMessage() { //ListModelChatMessage.Sort((modelMessage1, modelMessage2) => modelMessage1.SendTime.CompareTo(modelMessage2.SendTime)); ListModelChatMessage.Sort((modelMessage1, modelMessage2) => modelMessage1.Rownum.CompareTo(modelMessage2.Rownum)); }
/// <summary> Обработчик изменения сообщений чата </summary> private void OnListModelChatMessageChanged(object sender, List <ModelChatMessage> listModelChatMessages) { var listSingleModelChatMessages = new List <ModelChatMessage>(); listSingleModelChatMessages = listModelChatMessages.Where(obj => !listSingleModelChatMessages.Any(message => message.Id == obj.Id)).ToList(); var listExistMessage = listSingleModelChatMessages.Where(obj => obj.IdChat == CurrentModelChat.Id && ListModelChatMessage.Any(message => message.Id == obj.Id)).ToList(); if (listExistMessage.Count > 0) { Action action = () => RefreshExistingModelChatMessage(listExistMessage); CurrentDispatcher.BeginInvoke(action); } var listNewMessage = listSingleModelChatMessages.Where(obj => obj.IdChat == CurrentModelChat.Id && !ListModelChatMessage.Any(message => message.Id == obj.Id)).ToList(); if (listNewMessage.Count > 0) { Action action = () => AddNewModelChatMessage(listNewMessage); CurrentDispatcher.BeginInvoke(action); } OnPropertyChanged("ListModelChatMessage"); }