Пример #1
0
        /// <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;
        }
Пример #2
0
 /// <summary> Метод добавления собеседников в чат </summary>
 public void InviteAndRevokeChatMembers(List <ModelContact> membersToInvite, List <ModelContact> membersToRevoke)
 {
     if (DataSourceChat.InviteAndRevokeChatMembers(CurrentModelChat, membersToInvite, membersToRevoke))
     {
         MarkReadModelMessage();
     }
 }
Пример #3
0
        /// <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);
        }
Пример #4
0
 /// <summary> Метод удаления чата </summary>
 private void DeleteChat()
 {
     if (DataSourceChat.DeleteModelChat(CurrentModelChat))
     {
         CurrentListModelChat.Remove(CurrentModelChat);
     }
 }
Пример #5
0
 /// <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(); // СВ сказал что при любой активности в чате все сообщения считаем прочитанными
     }
 }
Пример #6
0
        /// <summary> Отправить контакты </summary>
        public void SendContactListToChat(List <ModelContact> listModelContact)
        {
            if (listModelContact == null)
            {
                return;
            }

            if (DataSourceChat.SendListModelContactToChat(listModelContact, CurrentModelChat))
            {
                MarkReadModelMessage();
            }
        }
Пример #7
0
 /// <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();
     }
 }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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;
        }
Пример #10
0
        /// <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));
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
        /// <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;
            }
        }
Пример #13
0
        /// <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();
            }
        }
Пример #14
0
        ///// <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);
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
        /// <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);
        }
Пример #17
0
        /// <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;
                }
            }
        }
Пример #18
0
        /// <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;
            }
        }
Пример #19
0
        /// <summary> Конструктор </summary>
        public ViewModelChatDetail(List <ModelContact> listModelContact)
        {
            var modelChat = DataSourceChat.GetModelChatByListModelContact(listModelContact);

            InitializatiOnoverallConstructors(modelChat);
        }
Пример #20
0
        /// <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>());
        }
Пример #21
0
        /// <summary> Обработчик изменения статусов контактов </summary>
        private void OnListModelContactStatusChanged(object sender, List <PackageModelContactStatus> packageModelContactStatuses)
        {
            Action action = () => DataSourceChat.RefreshModelContactChatStatus(CurrentListModelChat.ToList());

            CurrentDispatcher.BeginInvoke(action);
        }
Пример #22
0
        /// <summary> Обработчик изменения сообщений чатов внутри логики C++ </summary>
        private void LogicListModelChatMessageChangedHandler(string[] entityIds)
        {
            var listModelChatMessage = DataSourceChat.GetModelChatMessageById(entityIds);

            OnListModelChatMessageChanged(listModelChatMessage);
        }
Пример #23
0
        /// <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;
        }
Пример #24
0
 /// <summary> Разрешение редактировать сообщение </summary>
 public bool CanEditMessage(ModelChatMessage modelChatMessage)
 {
     return(DataSourceChat.CanEditMessage(modelChatMessage));
 }