private void ProcessNewChatUserInfos(int chatId, Dictionary <int, ChatUserInfo> chatUserInfos)
        {
            if (chatUserInfos == null || !chatUserInfos.Any())
            {
                return;
            }

            lock (ChatUserInfosCache)
            {
                lock (_newChatUserInfosHandlers)
                {
                    foreach (var userInfo in chatUserInfos)
                    {
                        var id = new ChatUserId(userInfo.Key, chatId);
                        if (ChatUserInfosCache.ContainsKey(id))
                        {
                            ChatUserInfosCache[id] = userInfo.Value;
                        }
                        if (_newChatUserInfosHandlers.ContainsKey(id))
                        {
                            _newChatUserInfosHandlers[id]?.Invoke(this, userInfo.Value);
                        }
                    }
                }
            }
        }
        private void ProcessNewChatMembers(int chatId, IEnumerable <int> members)
        {
            if (members == null)
            {
                return;
            }

            var membersArray = members as int[] ?? members.ToArray();

            if (!membersArray.Any())
            {
                return;
            }

            lock (ChatsStorage)
            {
                lock (ChatUserInfosCache)
                {
                    var prevMembers = ChatsStorage[chatId].Users;
                    foreach (var excludedMember in prevMembers.Where(x => !membersArray.Contains(x)))
                    {
                        var key = new ChatUserId(excludedMember, chatId);
                        if (ChatUserInfosCache.ContainsKey(key))
                        {
                            ChatUserInfosCache.Remove(key);
                        }
                    }
                }
                ChatsStorage[chatId].Users = membersArray;
            }

            lock (_newChatMembersHandlers)
            {
                if (_newChatMembersHandlers.ContainsKey(chatId))
                {
                    _newChatMembersHandlers[chatId]?.Invoke(this, membersArray);
                }
            }
        }