Get-PhoneCall.ps1

function Get-PhoneCall
{
    <#
    .Synopsis
        Gets information about phone calls
    .Description
        Gets information about phone calls sent to or from any Twilio Number
    .Example
        Get-PhoneCall
    .Link
        Send-PhoneCall
    .Link
        Get-Web
    .Link
        http://twilio.com/
 
    #>

    [OutputType([PSObject])]
    param(
    # The call identifier
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [Alias('Sid')] 
    [string]
    $CallSid, 

    # The Twilio credential
    [Management.Automation.PSCredential]
    $Credential,
    
    
    # The status of the phone call
    [ValidateSet("queued", "ringing", "in-progress", "completed", "failed", "busy", "no-answer")]    
    [string]$Status,
    
    # The number the phone call was sent to
    [string]$To,
    
    # The number the phone call came from
    [string]$From,
        
    # Twilio connection settings
    [Parameter(ValueFromPipelineByPropertyName=$true)]       
    [string[]]
    $Setting = @("TwilioAccountKey", "TwilioAccountSecret"),

    # If set, will include the recording information with the call
    [Switch]$IncludeRecording,
    
    # If set, will include transcription information with the call
    [Switch]$IncludeTranscript

    )
    
    process {
        #region Resolve the Twilio Credential
        if (-not $Credential -and $Setting) {
            if ($setting.Count -eq 1) {

                $userName = Get-WebConfigurationSetting -Setting "${Setting}_UserName"
                $password = Get-WebConfigurationSetting -Setting "${Setting}_Password"
            } elseif ($setting.Count -eq 2)  {
                $userName = Get-secureSetting -Name $Setting[0] -ValueOnly
                $password= Get-secureSetting -Name $Setting[1] -ValueOnly
            }

            if ($userName -and $password) {                
                $password = ConvertTo-SecureString -AsPlainText -Force $password
                $credential  = New-Object Management.Automation.PSCredential $username, $password 
            } elseif ((Get-SecureSetting -Name "$Setting" -ValueOnly | Select-Object -First 1)) {
                $credential = (Get-SecureSetting -Name "$Setting" -ValueOnly | Select-Object -First 1)
            }
            
            
        }

        if (-not $Credential) {
            Write-Error "No Twilio Credential provided. Use -Credential or Add-SecureSetting TwilioAccountDefault -Credential (Get-Credential) first"               
            return
        }
        #endregion Resolve the Twilio Credential

        #region Define the default web parameters
        $getWebParams = @{
            WebCredential=$Credential
            Url="https://api.twilio.com/2010-04-01/Accounts/$($Credential.GetNetworkCredential().Username.Trim())/Calls/?"           
            AsXml =$true                        
            UseWebRequest = $true
        }
        
        if ($psBoundParameters.Status) {
            $getWebParams.Url += "&Status=$status"
        }
        
        if ($psBoundParameters.To) {
            $getWebParams.Url += "&To=$to"
        }
        
        if ($psBoundParameters.From) {
            $getWebParams.Url += "&From=$from"
        }                
        
        if ($callSid) {
            $getWebParams.Url = 
                "https://api.twilio.com/2010-04-01/Accounts/$($Credential.GetNetworkCredential().Username.Trim())/Calls/$CallSid"           
        }         
        #endregion Define the default web parameters
        
        do {
            # Get the response from Twilio
            $twiResponse = Get-Web @getwebParams |            
                Select-Object -ExpandProperty TwilioResponse 
            
            #region Extract out call information
            $twiResponse | 
                Select-Object -ExpandProperty Calls | 
                Select-Object -ExpandProperty Call |
                ForEach-Object {
                    $item = $_
                    $_.pstypenames.clear()
                    $_.pstypenames.add('Twilio.PhoneCall')
                    if ($includeRecording) {
                        $recording = 
                            Get-TwilioRecording -CallSid $_.CallSid -Credential $credential -Asmp3 -errorAction SilentlyContinue
                        $_ | 
                            Add-Member NoteProperty Recording $recording -Force                     
                    }
                
                    if ($includeTranscript) {                    
                        $recording= 
                            Get-TwilioRecording -CallSid $item.Sid -Credential $credential -errorAction SilentlyContinue
                        if ($recording) {
                            Get-TwilioTranscription -RecordingSid $recording.Sid -Credential $credential 
                        }                                            
                    }
                    $_                
                }
            #endregion Extract out call information

            if ($twiResponse.Calls.NextPageUri) {
                # If there's a next page, slightly change the URL
                    $getWebParams.Url="https://api.twilio.com" + $twiResponse.Calls.NextPageUri
                    

            }
        } while ($twiResponse.Calls.NextPageUri)        
    }       
}