Public/Chat/Send-SlackMessage.ps1

function Send-SlackMessage {
    [cmdletbinding()]
    param(
        [parameter(Mandatory)]
        [string]
        $token,
    
        [parameter(Mandatory)]
        [string]
        $channel,

        [ValidateLength(1, 4000)]
        [string]
        $text,

        [switch]
        $as_user,

        [pscustomobject[]]
        $attachments,

        [pscustomobject[]]
        $blocks,

        [ValidateScript( { $_.StartsWith(":") -and $_.EndsWith(":") })]
        [string]
        $icon_emoji,

        [string]
        $icon_url,

        [switch]
        $link_names,

        [bool]
        $mrkdwn = $true,

        [string]
        $parse = "none",

        [switch]
        $reply_broadcast,

        [string]
        $thread_ts,

        [switch]
        $unfurl_links,

        [bool]
        $unfurl_media = $true,

        [string]
        $username
    )

    $Headers = @{
        Authorization = "Bearer $token"
    }

    # Construct the Body based on parameters
    $Body = [PSCustomObject]@{
        channel = $channel
        text    = "placeholder text"
    }

    if ($text) {
        $Body.text = $text
    }

    if ($as_user -and !$username) {
        $Body | Add-Member -NotePropertyName "as_user" -NotePropertyValue $true
    }
    elseif ($as_user -and $username) {
        Write-Error "as_user cannot be set with a username."
    }

    if ($attachments) {
        $Body | Add-Member -NotePropertyName "attachments" -NotePropertyValue $attachments
    }

    if ($blocks) {
        $Body | Add-Member -NotePropertyName "blocks" -NotePropertyValue $blocks
    }

    if ($icon_emoji -and !$as_user) {
        $Body | Add-Member -NotePropertyName "icon_emoji" -NotePropertyValue $icon_emoji
    }
    elseif ($icon_emoji -and $as_user) {
        Write-Error "icon_emoji cannot be used with as_user set to true"
    }

    if($icon_url -and !$as_user){
        $Body | Add-Member -NotePropertyName "icon_url" -NotePropertyValue $icon_url
    }
    elseif ($icon_url -and $as_user){
        Write-Error
    }

    if ($username -and !$as_user) {
        $Body | Add-Member -NotePropertyName "username" -NotePropertyValue $username
    }
    elseif($username -and $as_user) {
        Write-Error "Username cannot be set with as_user set to true."
    }

    Invoke-RestMethod -Method Post -Uri 'https://slack.com/api/chat.postMessage' -Headers $Headers -ContentType 'application/json;charset=iso-8859-1' -Body ($Body | ConvertTo-Json -Depth 100)
}