[Resolvido] Extensão Agendador


#1

Boa tarde.

Sou novo no blip e fui recentemente apresentado ao Chatbot. Intusiasta como sou, já estou desenvolvendo uns bots e já tenho 1001 idéias.

Tenho umas dúvidas ao utilizar a Extenção de agendamento de mensagens, vamos lá.

1- Como posso fazer um agendamento utilizando o state no application.json passando a data escolhida pelo usuário que está salva no banco?

2 - É possível uma mensagem automática ao ser enviada, apresentar uma lista para o cliente?

3 - É possível fazer um agendamento recorrente?

Obrigado a todos.


#2

Olá @Thiago_Henrique, fico feliz em saber que está usando o BLiP :slight_smile:

Vamos as dúvidas:

1- Atualmente, vc não consegue fazer o agendamento de uma mensagem diretamente pelo arquivo application.json.

Você precisa colocar a regra de agendar a mensagem dentro de um Receiver. Além disso, faça com que esse Receiver seja alcançado quando o usuário estive no state X. Entendeu ?

2- Não entendi sua dúvida ? Poderia me explicar melhor, de preferencia com um exemplo ?

3- Atualmente, o agendamento é atômico, ou seja só é possível realizar um agendamento para uma dada mensagem.

Abraço!


#3

Sobre a dúvida 2 é o seguinte:

É possível a mensagem que é enviada pelo agendador, o conteúdo desta mensagem ser uma lista para que o usuário possa escolher um determinado item?

Caso não, é possível definir um “outstate” para mensagem enviada pelo agendador?


#4

Entendi @Thiago_Henrique. É possível sim. :wink:

Quando vc agenda uma mensagem através da extensão scheduler (agendador) vc pode escolher qualquer um dos tipos de conteúdo do BLiP.

Veja só esse JSON de exemplo para um agendamento de Quick Reply para um usuário do Messenger:

{  
    "id": "1",
    "to": "postmaster@scheduler.msging.net",
    "method": "set",
    "uri": "/schedules",
    "type": "application/vnd.iris.schedule+json",
    "resource": {  
        "message": {  
            "id": "ad19adf8-f5ec-4fff-8aeb-2e7ebe9f7a67",
            "to": "312316283196273@messenger.gw.msging.net",
            "type":"application/vnd.lime.select+json",
            "content": {
                "text":"Escolha uma das opções",
                "scope": "immediate",
                "options":[
                    {
                        "text":"Primeira opção"
                    },
                    {
                        "text":"Segunda opção"
                    },
                    {
                        "text":"Terceira opção"
                    }
                ]
            }
        },
        "when": "2017-12-25T17:50:00.000Z"
    }
}

Resumindo o objeto message que vai no resource do comando de agendamento pode conter qualquer tipo.


#5

Perfeito @rafaelpa , muito obrigado.
Mas só uma última coisinha.

Como eu posso fazer isso usando a classe em C#.
Veja como eu estou fazendo o agendamento.

SchedulerExtension scheduler = new SchedulerExtension(_sender);
DateTime tomorrow= DateTime.Now.AddDays(1);

Message messageScheduler10Minutos = new Message()
{
    Id = EnvelopeId.NewId(),
    To = envelope.From,
    Content = new PlainText() { Text = "Texto da Mensagem" }
};

scheduler.ScheduleMessageAsync(messageScheduler10Minutos, new DateTimeOffset(tomorrow));

Nesse caso o scheduler recebe um objeto Message() que não tem outras opções para definir todo o content. Como faria isso?


#6

Veja só este exemplo @Thiago_Henrique:
(Dado que vc possui um receiver PlainTextMessageReceiver)

public class PlainTextMessageReceiver : IMessageReceiver
{
    private readonly ISchedulerExtension _schedulerExtension;

    public PlainTextMessageReceiver (ISchedulerExtension schedulerExtension)
    {
        _schedulerExtension = schedulerExtension;
    }

    public async Task ReceiveAsync(Message receivedMessage, CancellationToken cancellationToken)
    {
        var schedullingDate = DateTimeOffset.Now.AddMinutes(10);
        var messageContent = "Scheduling test";

        var message = new Message
        {
            Id = Guid.NewGuid().ToString(),
            To = receivedMessage.From,
            Content = new PlainText { Text = messageContent }
        };

        //Schedule a message to next 10 minutes
        await _schedulerExtension.ScheduleMessageAsync(message, schedullingDate);
    }
}

Algumas observações:

  • Sempre que precisar utilizar qualquer extensão no SDK C#, adicione uma referencia a interface desta extensão (por exemplo ISchedulerExtension) no construtor do seu receiver. O SDK C# injeta automaticamente todas as dependencias do BLiP no construtor dos receivers do seu bot.

Exemplo de inicialização correta de uma extensão:

private readonly ISchedulerExtension _schedulerExtension;

public PlainTextMessageReceiver (ISchedulerExtension schedulerExtension)
{
    _schedulerExtension = schedulerExtension;
}
  • O Content da mensagem que vc está agendando pode ser qualquer um dos tipos de conteúdo do BLiP. No exemplo acima estou agendando uma mensagem com o conteúdo PlainText, mas vc poderia utilizar qualquer outro tipo como: Select, MediaLink e etc…

#7

@rafaelpa, você está me ajudando demais.
Recebendo as extensões por injeção da dependencia é bem melhor.
Agora, neste modelo, como eu poderia definir um “outState” para essa mensagem que será enviada automáticamente pelo agendador.

Muito obrigado mesmo pela ajuda que está me dando.


#8

Não é possível setar um estado (outState) para um usuário fazendo um agendamento. Minha sugestão é que vc faça agendamentos que possuam gatilhos para algum estado do seu bot (Menu, quick replies ou carroseis)

Dessa forma a mudança de estado do cliente acontecerá apenas se o mesmo interagir com a sua mensagem. Entendeu ?

Qualquer dúvida estamos por aqui :wink:


#9

Obrigado Rafael. Me ajudou demais… Forte abraço.


fechou #10

abriu #11