Public/Authoral/Read-FromRabbitMQ.ps1

class RabbitMessageAction {
    [string]$name;
    [string]$action;
}

class RabbitMessage {
    [string]$type;
    [string]$title;
    [datetime]$schedule;
    [string]$description;
    [RabbitMessageAction[]]$actions;
}



function Read-FromRabbitMQ {
    param(
        [parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]
        $QueueName = 'Powershell',

        [parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]
        $Exchange = "Notifications",

        [parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]
        $ExchangeType = "Direct",

        [parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]
        $RoutingKey = "notification"
    )
    begin {
        class NotificationHandler {
            [void] Handler($listener, $params) {

                [RabbitMessage]$message = $params;
                # Write-Host "Running $($listener.Running)"
                if ($message.type -eq 'notification') {
                    $message_params = @{
                        ToastTitle = $message.title;
                        ToastText  = $message.description;
                    }
                    if ($message.schedule.Year -ne '0001') {
                        $message_params.Add("Schedule", $message.schedule);
                    }
                    Show-Notification @message_params
                }
            }
        }

        class ActionsHandler {
            [void] Handler($listener, $params) {
                [RabbitMessage]$message = $params;
                if ($message.type -eq 'action') {
                    $message.actions | ForEach-Object {
                        $action = $_.action
                        $scriptBlock = [Scriptblock]::Create($action)
                        $scriptBlock.Invoke()
                    }
                }
            }
        }

        $receiver = New-Object MessagesReceiver
        $notificationHandler = New-Object NotificationHandler
        $actionsHandler = New-Object ActionsHandler
        if ($null -eq $env:RabbitMQ_User) {
            throw "Voce deve criar as variaveis de usuario e senha da conexao ao rabbit no seu perfil powershell antes de utilizar este commando!

            Crie as variaves abaixo:
            [string]$env:RabbitMQ_User = 'username'
            [string]$env:RabbitMQ_Password = 'userpassword'
            "

        }
    }
    process {
        $handleRabbitMessage = {
            param($listener, $params)

            $notificationHandler.Handler($listener, $params)
            $actionsHandler.Handler($listener, $params)
        }

        $receiver.RegisterObserver($handleRabbitMessage)

        $receiver.Listen(
            $QueueName,
            $Exchange,
            $ExchangeType,
            $RoutingKey
        )
    }
}

Set-Alias rabbit Read-FromChat