/// <summary> Освобождение ресурсов </summary> public void Dispose() { if (!String.IsNullOrWhiteSpace(CurrentModelChatMessage.StringContent) || _currentListQuotedMessage.Count > 0) { CurrentModelChatMessage.Sender = DataSourceContact.ModelContactIam; CurrentModelChatMessage.SendTime = DateTime.Now; CurrentModelChatMessage.ModelEnumChatMessageTypeObj = ModelEnumChatMessageType.GetModelEnum(7); CurrentModelChatMessage.IdChat = CurrentModelChat.Id; if (_currentListQuotedMessage.Count > 0) { CurrentModelChatMessage.ListQuotedModelChatMessage = new ObservableCollection <ModelChatMessage>(_currentListQuotedMessage); } if (DataSourceChat.SaveDraftModelChatMessage(CurrentModelChatMessage)) { CurrentModelChat.DraftMessage = CurrentModelChatMessage; } } else { if (CurrentModelChat.DraftMessage != null) { DataSourceChat.SaveDraftModelChatMessage(CurrentModelChatMessage); CurrentModelChat.DraftMessage = null; } } CallbackRouter.Instance.ListModelChatMessageChanged -= OnListModelChatMessageChanged; CallbackRouter.Instance.ListModelContactStatusChanged -= OnListModelContactStatusChanged; CallbackRouter.Instance.ListModelContactSubscriptionChanged -= OnListModelContactSubscriptionChanged; CallbackRouter.Instance.ModelUserSettingsChanged -= OnModelUserSettingsChanged; }
/// <summary> Метод добавления собеседников в чат </summary> public void InviteAndRevokeChatMembers(List <ModelContact> membersToInvite, List <ModelContact> membersToRevoke) { if (DataSourceChat.InviteAndRevokeChatMembers(CurrentModelChat, membersToInvite, membersToRevoke)) { MarkReadModelMessage(); } }
/// <summary> Обработчик изменения чатов внутри логики C++ </summary> private void LogicListModelChatChangedHandler(string[] entityIds) { var listChangedModelChat = new List <ModelChat>(); var listDeletedModelChat = new List <ModelChat>(); var listModelChat = DataSourceChat.GetListModelChatById(entityIds); foreach (var i in entityIds) { var modelChat = listModelChat.FirstOrDefault(obj => obj.Id == i); if (modelChat != null) { listChangedModelChat.Add(modelChat); } else { listDeletedModelChat.Add(new ModelChat { Id = i }); } } OnListModelChatChanged(listChangedModelChat, listDeletedModelChat); }
/// <summary> Метод удаления чата </summary> private void DeleteChat() { if (DataSourceChat.DeleteModelChat(CurrentModelChat)) { CurrentListModelChat.Remove(CurrentModelChat); } }
/// <summary> Метод переименования чата </summary> private void RenameChatModel() { /*CurrentModelChatMessage.Sender = ModelContact.ModelContactIam; * CurrentModelChatMessage.SendTime = DateTime.Now; * CurrentModelChatMessage.ModelEnumChatMessageTypeObj = ModelEnumChatMessageType.GetModelEnumChatMessageType(1); // сообщение о переименовании * CurrentModelChatMessage.IdChat = CurrentModelChat.Id;*/ if (DataSourceChat.RenameModelChat(CurrentModelChat)) { MarkReadModelMessage(); // СВ сказал что при любой активности в чате все сообщения считаем прочитанными } }
/// <summary> Отправить контакты </summary> public void SendContactListToChat(List <ModelContact> listModelContact) { if (listModelContact == null) { return; } if (DataSourceChat.SendListModelContactToChat(listModelContact, CurrentModelChat)) { MarkReadModelMessage(); } }
/// <summary> Метод удаления собеседника из чата </summary> private void RemoveFromChatContactModel(ModelContact mc) { if (DataSourceChat.InviteAndRevokeChatMembers(CurrentModelChat, new List <ModelContact>(), new List <ModelContact> { mc })) { /* * if (CurrentModelChat.ListModelContactNotMe.Count == 1) * { * CurrentModelChat.Title = LocalizationApp.GetInstance().GetValueByKey(@"ModelChatMessage_Untitled"); * }*/ MarkReadModelMessage(); } }
/// <summary> Редактировать сообщение </summary> public bool EditMessage(ModelChatMessage modelChatMessage, string text) { var result = true; modelChatMessage.StringContent = text; modelChatMessage.Changed = true; if (modelChatMessage.Sender.Iam) { result = DataSourceChat.EditMessage(modelChatMessage, text); } return(result); }
/// <summary> Конструктор </summary> public ViewModelChat() { var listModelChat = DataSourceChat.GetListModelChat(); CurrentListModelChat = new ObservableCollection <ModelChat>(SortCurrentListModelChat(listModelChat)); CallbackRouter.Instance.ListModelChatChanged += OnListModelChatChanged; CallbackRouter.Instance.ListModelContactStatusChanged += OnListModelContactStatusChanged; CallbackRouter.Instance.ListModelChatMessageChanged += OnListModelChatMessageChanged; CommandMarkReadAll = new Command(obj => MarkReadAll()); CommandDeleteChat = new Command(obj => DeleteChat()); CurrentViewModelChat = this; }
/// <summary> Конструктор </summary> public ViewModelChatRedirect() { CommandSelectContactList = new Command(obj => SelectContactList()); CommandSelectChatList = new Command(obj => SelectChattList()); UseContactList = true; _listModelContact = DataSourceContact.GetListModelContact().Where(obj => obj.IsDodicall && !obj.Blocked).ToList(); CurrentListModelContact = new ObservableCollection <ModelContact>(_listModelContact); _listModelChat = DataSourceChat.GetListModelChat().Where(obj => !obj.IsP2P).ToList(); CurrentListModelChat = new ObservableCollection <ModelChat>(SortCurrentListModelChat(_listModelChat)); }
/// <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 DeleteModelChatMessage(ModelChatMessage modelChatMessage) { if (modelChatMessage.Sender.Iam) { if (DataSourceChat.DeleteModelChatMessage(modelChatMessage)) { modelChatMessage.ModelEnumChatMessageTypeObj = ModelEnumChatMessageType.GetModelEnum(5); } } else { modelChatMessage.ModelEnumChatMessageTypeObj = ModelEnumChatMessageType.GetModelEnum(5); } if (modelChatMessage.ListQuotedModelChatMessage != null) { modelChatMessage.ListQuotedModelChatMessage.Clear(); } }
///// <summary> Обработчик изменения модели внутри логики C++ </summary> //public void DoCallback(object sender, DoCallbackArgs e) //{ //if (e.ModelName == "Chats") //{ // Action action = () => ChangedListModelChat(e.EntityIds); // CurrentDispatcher.BeginInvoke(action); //} //if (e.ModelName == "ChatMessages") //{ // Action action = () => ChangedListModelChatMessages(e.EntityIds); // CurrentDispatcher.BeginInvoke(action); //} //if (e.ModelName == "ContactsPresence") //{ // CurrentDispatcher.BeginInvoke(new Action(ChangedStatusListModelContact)); //} //} ///// <summary> Обработчик изменения списка чатов внутри логики C++ </summary> //private void ChangedListModelChatMessages(string[] entityIds) //{ // // вот этот код перенести в колбеки в обработку колбека "ChatMessages" // var listChatIds = _dataSourceChat.GetListModelChatByIdMessage(entityIds); // ChangedListModelChat(listChatIds, new List<ModelChat>()); //} /// <summary> Обработчик изменения списка чатов внутри логики C++ </summary> private void ChangedListModelChat(List <ModelChat> listChangedModelChat, List <ModelChat> listDeletedModelChat) { var listModelChatCurrent = CurrentListModelChat.ToList(); // удаление foreach (var i in listDeletedModelChat) { listModelChatCurrent.Remove(listModelChatCurrent.FirstOrDefault(obj => obj.Id == i.Id)); } Action action = () => { // добавление и обновление foreach (var i in listChangedModelChat) { var modelChat = listModelChatCurrent.FirstOrDefault(obj => obj.Id == i.Id); if (modelChat != null) { // изменение (пошел через переприсвоение свойств, а не через удалить и добавить заново, что бы не слетало выделение) modelChat.ListModelContact = ListModelContactSort(i.ListModelContact); modelChat.Active = i.Active; modelChat.LastMessage = i.LastMessage; modelChat.LastModifiedDate = i.LastModifiedDate; modelChat.NewMessagesCount = i.NewMessagesCount; modelChat.Title = i.Title;// LocalizationApp.GetInstance().GetValueByKey(@"ModelChatMessage_Untitled"); modelChat.TotalMessagesCount = i.TotalMessagesCount; } else { listModelChatCurrent.Add(i); } } CurrentListModelChat = new ObservableCollection <ModelChat>(SortCurrentListModelChat(listModelChatCurrent)); DataSourceChat.RefreshModelContactChatStatus(CurrentListModelChat.ToList()); }; CurrentDispatcher.BeginInvoke(action); }
/// <summary> Редактировать сообщение с ответом </summary> public bool EditMessage(ModelChatMessage modelChatMessage, string text, bool shouldDeleteQuote) { var result = true; if (shouldDeleteQuote) { modelChatMessage.ListQuotedModelChatMessage.Clear(); } modelChatMessage.StringContent = text; modelChatMessage.Changed = true; if (modelChatMessage.Sender.Iam) { result = DataSourceChat.EditMessage(modelChatMessage, text, shouldDeleteQuote); } return(result); }
/// <summary> Получить чат из текушего списка чатов </summary> public ModelChat GetChatFromList(ModelContact modelContact) { var result = new ModelChat(); var modelChat = DataSourceChat.GetModelChatByModelContact(modelContact); var modelChatFromList = CurrentListModelChat.FirstOrDefault(obj => obj.Id == modelChat.Id); if (modelChatFromList != null) { result = modelChatFromList; } else { CurrentListModelChat.Add(modelChat); result = modelChat; } return(result); }
/// <summary> Метод прочтения всех сообщений </summary> private void MarkReadAll() { var listModelChat = CurrentListModelChat.Where(obj => obj.ExistNewMessages).ToArray(); if (!listModelChat.Any()) { return; } foreach (var i in listModelChat) { if (i.LastMessage != null) { DataSourceChat.MarkReadModelChatMessage(i.LastMessage); // кастыль, т.к. из бизнес логики не приходяк колбеки об изменении чатов !!! i.NewMessagesCount = 0; i.LastMessage.Readed = true; } } }
/// <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> public ViewModelChatDetail(List <ModelContact> listModelContact) { var modelChat = DataSourceChat.GetModelChatByListModelContact(listModelContact); InitializatiOnoverallConstructors(modelChat); }
/// <summary> Обработчик изменения сообщений в чатах </summary> private void OnListModelChatMessageChanged(object sender, List <ModelChatMessage> modelChatMessages) { var listModelChat = DataSourceChat.GetListModelChatByIdMessage(modelChatMessages.Select(obj => obj.Id).ToArray()); ChangedListModelChat(listModelChat, new List <ModelChat>()); }
/// <summary> Обработчик изменения статусов контактов </summary> private void OnListModelContactStatusChanged(object sender, List <PackageModelContactStatus> packageModelContactStatuses) { Action action = () => DataSourceChat.RefreshModelContactChatStatus(CurrentListModelChat.ToList()); CurrentDispatcher.BeginInvoke(action); }
/// <summary> Обработчик изменения сообщений чатов внутри логики C++ </summary> private void LogicListModelChatMessageChangedHandler(string[] entityIds) { var listModelChatMessage = DataSourceChat.GetModelChatMessageById(entityIds); OnListModelChatMessageChanged(listModelChatMessage); }
/// <summary> Инициализация конструкторов </summary> private void InitializatiOnoverallConstructors(ModelChat modelChat) { if (modelChat != null) { var modelChatFromList = ViewModelChat.CurrentViewModelChat.CurrentListModelChat.FirstOrDefault(obj => obj.Id == modelChat.Id); if (modelChatFromList == null) { ViewModelChat.CurrentViewModelChat.CurrentListModelChat.Add(modelChat); CurrentModelChat = modelChat; } else { CurrentModelChat = modelChatFromList; } } _listModelChatMessage = DataSourceChat.GetPagedModelChatMessageByIdChat(CurrentModelChat); foreach (var i in ListModelChatMessage) { var modelContact = ListModelConctactChatMembers.FirstOrDefault(obj => obj?.DodicallId == i?.Sender?.DodicallId); if (modelContact == null) { ListModelConctactChatMembers.Add(i.Sender); } } foreach (var i in _listModelChatMessage) { // Сделать отдельный список с собеседниками+теми кто когда-то был в чате // Брать ссылку на объект из этого списка, тогда все будет работать //var modelContactFromModelChat = CurrentModelChat.ListModelContact.FirstOrDefault(obj => obj.Id == i?.Sender?.Id); var modelContactFromChatMessageSenders = ListModelConctactChatMembers.FirstOrDefault(obj => obj?.DodicallId == i?.Sender?.DodicallId); if (modelContactFromChatMessageSenders != null) { i.Sender = modelContactFromChatMessageSenders; } //if (modelContactFromModelChat != null) i.Sender = modelContactFromModelChat; } SortCurrentListModelChatMessage(); if (!CurrentModelChat.IsP2P) { CurrentModelChat.ListModelContact = ListModelContactSort(CurrentModelChat.ListModelContact); //_dataSourceContact.RefreshModelContactStatus(_listModelChatMessage.Select(obj => obj?.Sender).ToList()); DataSourceContact.RefreshModelContactStatus(GetAllSendersAndUserFromChat()); //_dataSourceContact.RefreshModelContactStatus(CurrentModelChat.ListModelContact); } CommandSendModelMessage = new Command(obj => SendModelMessage()); CommandRenameChatModel = new Command(obj => RenameChatModel()); CommandRemoveFromChat = new Command(obj => RemoveFromChatContactModel((ModelContact)obj)); //CommandInviteAndRevokeChatMembers = new Command(obj => InviteAndRevokeChatMembers()); if (CurrentModelChat.HaveDraft) { CurrentModelChatMessage = CurrentModelChat.DraftMessage; } CallbackRouter.Instance.ListModelChatMessageChanged += OnListModelChatMessageChanged; CallbackRouter.Instance.ListModelContactStatusChanged += OnListModelContactStatusChanged; CallbackRouter.Instance.ListModelContactSubscriptionChanged += OnListModelContactSubscriptionChanged; CallbackRouter.Instance.ModelUserSettingsChanged += OnModelUserSettingsChanged; }
/// <summary> Разрешение редактировать сообщение </summary> public bool CanEditMessage(ModelChatMessage modelChatMessage) { return(DataSourceChat.CanEditMessage(modelChatMessage)); }