public/Get-TLUserDialogs.ps1

function Get-TLUserDialogs {

    [cmdletbinding()]
    Param(
        [Parameter(Mandatory = $true)]
        [TLSharp.Core.TelegramClient]$TLClient,
        [Parameter(Mandatory = $false)]
        [int]$OffsetDate = 0,
        [Parameter(Mandatory = $false)]
        [int]$OffsetId = 0,
        [Parameter(Mandatory = $false)]
        [TeleSharp.TL.TLAbsPeer]$OffsetPeer = $Null,
        [Parameter(Mandatory = $false)]
        [int]$Limit = [int]::MaxValue,
        [Parameter(Mandatory = $false)]
        [switch]$PassThru

    )

    Begin {

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

        $LimitPerRequest = 100
        $Results = New-Object System.Collections.ArrayList

    }

    Process {

        Do {

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

            Write-Verbose "[$(Get-Date)] [INFO ] > GetUserDialogsAsync (${OffsetDate}, ${OffsetId}, ${OffsetPeer}, ${LimitPerRequest})"
            $Result = $TLClient.GetUserDialogsAsync($OffsetDate, $OffsetId, $OffsetPeer, $LimitPerRequest) | Wait-TLAsync
            [void] $Results.Add($Result)

            $OffsetDate = $Result.Messages.Date | Sort-Object | Select-Object -First 1
            $Limit -= $Result.Dialogs.Count

        } Until (($Result.Dialogs.Count -lt $LimitPerRequest) -or ($Results.Dialogs.Count -ge $Limit))

    }

    End {

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

        If ($PassThru) {

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

        } Else {

            $Result = [PSCustomObject]@{
                Dialogs = $Results.Dialogs
                Users = $Results.Users
                Chats = $Results.Chats
                Messages = $Results.Messages
            }

            ConvertFrom-TLUserDialog -TLUserDialog $Result -Verbose:$false

        }

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

    }

}