2016-08-17 6 views
1

これは、Bot Framework(Nodejs)で初めての試みです。私は遅延メッセージをテストしたいと思います。たとえば、ボットはメッセージを受信して​​から5秒後に応答する必要があります。 は、だから私は、このコードを試してみました:MS Botのフレームワーク(Nodejs):セッションの有効期間と遅延メッセージ

var builder = require('botbuilder'); 

var connector = new builder.consoleconnector().listen(); 
var bot = new builder.universalbot(connector); 

bot.dialog('/', function (session) { 
    if (!session.userData.TimeoutStarted) { 
     session.send("I'll answer in 5 seconds"); 
     session.userData.TimeoutStarted = true; 

     setTimeout(function() { 
      session.send("Answer after 5 seconds"); 
      session.userData.TimeoutStarted = false; 
     }, 5000); 
    } else { 
     session.send("Bot is busy"); 
    } 
}); 

しかし、これは動作しません。 setTimeout内のコールバック関数は起動しますが、セッションを持つすべての操作はまったく機能しません。

だから、私はここに可能な解決策を見つける:How to send message later in bot frameworkをし、私のコードを書き換える:

var builder = require('botbuilder'); 

var connector = new builder.ConsoleConnector().listen(); 
var bot = new builder.UniversalBot(connector); 

bot.dialog('/', function (session) { 
    if (session.userData.Timeout > 0 && Date.now() - session.userData.Timeout > 5000) 
     session.userData.Timeout = 0; 

    if (!session.userData.Timeout) { 
     session.send("I'll answer in 5 seconds"); 

     var reply = session.message; 

     setTimeout(function() { 
      reply.text = "Answer after 5 seconds"; 
      bot.send(reply); 
     }, 5000); 

     session.userData.Timeout = Date.now(); 
    } else { 
     session.send("Bot is busy"); 
    } 
}); 

このコードは動作しますが、非常に多くのチェックとひどい見えます。だから私はいくつか質問があります:

  1. なぜ最初のコード例がうまくいかないのですか?私はセッションの生涯に問題があると思いますし、セッションの生涯は何ですか?
  2. この例ではsession.userDataをどのように設定するのですか?ですから最初のコード例では、setTimeoutの中にコールバック関数の中に設定したいのですが、それもうまくいきません。
  3. 遅延回答を作成する最も良い方法は何ですか?

答えて

2

この問題を調査しました。 ConsoleConnectorに同じsessionオブジェクトを使用して2つのメッセージを送信することができないバグがあるようです(内部バッチ処理のため、メッセージ間の所定の間隔を超えています)。 sendの間も状態が維持されるため、遅延状態の更新も機能しません。あなたのコールバックにsession.saveへのコールをsetTimeoutで追加した場合、それは新しい状態を維持します(ただしメッセージはまだ送信されません)。

私はあなたの最初の例がChatConnectorで動作すると信じています(ただし、試してみる機会はありませんでした)。私は修理依頼を作成してConsoleConnectorに修正します。

私はこれがあなたのすべての質問に答えることを願っています。

UPDATE

this issueやより詳細な情報については、関連するプルリクエストを参照してください。

アップデート2

それは、このコードを使用して、ChatConnectorで私の作品:ボットから遅れたメッセージを送ることに興味がある人々のために

var server = restify.createServer(); 
server.listen(process.env.port || process.env.PORT || 3978, function() { 
console.log('%s listening to %s', server.name, server.url); 
}); 

var connector = new builder.ChatConnector({ 
    appId: '', 
    appPassword: '' 
}); 

var bot = new builder.UniversalBot(connector); 

server.post('/api/messages', connector.listen()); 


bot.dialog('/', function (session) { 
    if (!session.userData.TimeoutStarted) { 
     session.send("I'll answer in 5 seconds"); 
     session.userData.TimeoutStarted = true; 

     setTimeout(function() { 
      session.send("Answer after 5 seconds"); 
      session.userData.TimeoutStarted = false; 
     }, 5000); 
    } else { 
     session.send("Bot is busy"); 
    } 
}); 
+0

参加していただきありがとうございます!私はChatConnectorでそれをテストし、同じ問題があります:どちらもメッセージを送信せず、コールバック内に状態を保存しません。しかしセッションは複数の送信で動作する可能性があります。たとえば、メッセージを受信して​​シーケンスを試しただけの場合です。session.send( "a"); session.send( "b"); - できます; – Ceridan

+0

本当ですか?それはChatConnectorを使って私と一緒に働いています。シークエンシングについては、正確ではありませんでしたが、GitHubの問題でその説明を見ることができます。基本的に、セッションオブジェクトはデフォルトでバッチ処理を行います。つまり、現在のセッションオブジェクトを送信する前に追加のメッセージが250ms待っています。それがあなたのシーケンシングで動作する理由ですが、最初のメッセージの後に5000ms待っても動作しません。 – Thegaram

+0

おかげで申し訳ありません。私は再びそれをテストし、あなたは絶対に正しいです。これはChatConnectorで実際に動作します。ご協力ありがとうございました! – Ceridan

1

、あなたがsession.delay(<ms>)

を使用することができます例えば、

session.send('msg') 
session.delay(5000) // delay 5 seconds 
session.endDialog() 
関連する問題