public/Get-TLHistory.ps1

function Get-TLHistory {

    [cmdletbinding()]
    Param(
        $TLClient,
        [object]$TLPeer,
        [int]$OffsetId = 0,
        [int]$OffsetDate = 0,
        [int]$AddOffset = 0,
        [int]$Limit = [int]::MaxValue,
        [int]$MaxId = 0,
        [int]$MinId = 0,
        [switch]$PassThru
    )

    Begin {

        Write-Verbose "[$(Get-Date)] [BEGIN] $($MyInvocation.MyCommand)"

        $MessageTotal = 0
        $LimitPerRequest = 100

        $Results = New-Object System.Collections.ArrayList

        $TLInputPeer = ConvertTo-TLInputPeer -TLPeer $TLPeer -Verbose:$false

    }

    Process {



        Do {

            If ($Limit -lt $LimitPerRequest) { $LimitPerRequest = $Limit }

            Do {
                Write-Verbose "[$(Get-Date)] [INFO ] > GetHistoryAsync ($TLInputPeer, ${OffsetId}, ${OffsetDate}, ${AddOffSet}, ${LimitPerRequest}, ${MaxId}, ${MinId})"
                $Result = $TLClient.GetHistoryAsync($TLInputPeer, $OffsetId, $OffsetDate, $AddOffSet, $LimitPerRequest, $MaxId, $MinId) | Wait-TLAsync
            } While ($Result -eq $false)

            [void] $Results.Add($Result)

            $OffsetId = $Result.Messages[-1].Id
            $Limit -= $LimitPerRequest


        } Until (($Limit -eq 0) -or ($Result.Messages.Count -lt $LimitPerRequest))

    }

    End {

        Switch ($Results[0].GetType().Name) {
            'TLChannelMessages' { $MessageCount = $Results[0].Count }
            'TLMessagesSlice'   { $MessageCount = $Results[0].Count }
            'TLMessages'        { $MessageCount = $Results[0].Messages.Count }
            Default {
                Write-Warning "Unknown Type returned : $_"
            }
        }

        Write-Verbose "[$(Get-Date)] [INFO ] > Messages: $($Results.Messages.Count) | Users: $($Results.Users.Count) | Chats: $($Results.Chats.Count) | Count: $($MessageCount)"

        If ($PassThru) {

            ForEach ($Result in $Results) { $Result }

        } Else {

            [PSCustomObject]@{
                InputPeer = $TLInputPeer
                Users     = $Results.Users
                Chats     = $Results.Chats
                Messages  = $Results.Messages
                Count     = $MessageCount
            }

        }

        Write-Verbose "[$(Get-Date)] [END ] $($MyInvocation.MyCommand)"

    }

}