2016-04-04 22 views
0

私は、RiveScript(ノード用のチャットボットモジュール)を使用するMeteorアプリケーションを持っています。モジュールは、ユーザー入力のいくつかの側面を節約することができます。私の問題は、サーバー上でモジュールを実行すると、1人のユーザーではなくすべてのユーザーに対して状態が保存されることです。各ユーザーの状態を作成するにはどうすればよいですか?Meteorアプリケーションのサーバー状態とユーザー、状態の作成方法は?

一つの方法は、そのように、各ユーザーのための新たなボットを作成するには、次のようになります。

let RiveScript = require('rivescript'); 
let users = {}; 
Meteor.onConnection(connection => { 
    users[connection.id] = new RiveScript({utf8: true}); 
    users[connection.id].bot.loadDirectory('directory/', 
     () => { 
      users[connection.id].bot.sortReplies(); 
     } 
    ); 
    connection.onClose(() => { 
     delete users[connection.id] 
    }) 
}); 

ただし、メモリ管理の観点から、これは問題を引き起こす可能性があります。この点でよく使われるパターンはありますか?

答えて

0

私はMeteorやRiveScriptに慣れていないので、あなたの質問に答えることを願っています。

会話ごとに一定の状態を維持したい場合は、

  • チャット#1:ボットは、特定の質問に答えるために、ユーザーを待っている
  • チャット#2:ボットは...コマンド
  • を待っている

なぜドンあなたの会話の識別子(またはあなたのケースではconnection.id、私が推測している)を現在の状態にマッピングするシンプルな配列を使用していませんか?

例:

// Just to simulate an enumeration 
var States = {WAITING: 0, WAITING_XXX_CONFIRMATION: 1, ...} 


var state = []; 

Meteor.onConnection(connection => { 
    state[connection.id] = States.WAITING; 

}); 

// Somewhere else, e.g. in response to a command 
    if (state[connection.id] == WAITING_XXX_CONFIRMATION && input === 'yes') { 
     // do something 

     // reset the state 
     set[connection.id] = WAITING; 
    } 

あなたはその後、すべての会話の状態を追跡し、それに応じて行動することができます。また、このようなStateManager.of(chatId).set(newState)として呼び出しを行うことができるように、例えばStateManager(使用することがより多くの再利用可能と素敵にするためにオブジェクトの内部状態の管理をラップすることができます。

この情報がお役に立てば幸いです。

+0

状態がによって処理されますRiveScriptオブジェクトであり、他の方法でそのオブジェクトの外側の状態を明示的に処理することはできません。私はあなたの提案を完全に把握しているとは思いませんか? –

関連する問題