Twitter での認証プロセスを使用して、Dialog を使用して MS Bot Framework でボットを開発しました。(私はFacebookのgithubプロジェクトをフォローしました)
ビジネス ロジック フローを追加し、MS のドキュメントを読んで、FormFlow のベスト プラクティスに従いました。
これで、Twitter 認証のコアを含むダイアログと、BL を含む FormFlow ができました。現時点では、Auth プロセスと BL プロセスをマージするのに苦労しています。
私の目標は:
- ユーザーがボットに接続し、認証が開始されます (ダイアログ)
- 認証後、BL(FormFlow)を開始したい
それをマージする最良の方法について何か提案はありますか? 実装を分離したまま認証が完了している場合にのみ、FormFlow を実行できますか?
いくつかのコード
これは承認を伴う私のダイアログです
public static readonly IDialog<string> dialog = Chain
.PostToChain()
.Switch(
new Case<IMessageActivity, IDialog<string>>((msg) =>
{
var regex = new Regex("^login", RegexOptions.IgnoreCase);
return regex.IsMatch(msg.Text);
}, (ctx, msg) =>
{
// User wants to login, send the message to Twitter Auth Dialog
return Chain.ContinueWith(new SimpleTwitterAuthDialog(msg),
async (context, res) =>
{
// The Twitter Auth Dialog completed successfully and returend the access token in its results
var token = await res;
var name = await TwitterHelpers.GetTwitterProfileName(token);
context.UserData.SetValue("name", name);
context.PrivateConversationData.SetValue<bool>("isLogged", true);
return Chain.Return($"Your are logged in as: {name}");
});
}),
new DefaultCase<IMessageActivity, IDialog<string>>((ctx, msg) =>
{
string token;
string name = string.Empty;
if (ctx.PrivateConversationData.TryGetValue(AuthTokenKey, out token) && ctx.UserData.TryGetValue("name", out name))
{
var validationTask = TwitterHelpers.ValidateAccessToken(token);
validationTask.Wait();
if (validationTask.IsCompleted && validationTask.Result)
{
Chain.ContinueWith(new TwitterDialog(),
async (context2, res2) =>
{
var result2 = await res2;
return Chain.Return($"Done.");
});
return Chain.Return($"Your are logged in as: {name}");
}
else
{
return Chain.Return($"Your Token has expired! Say \"login\" to log you back in!");
}
}
else
{
return Chain.Return("Say \"login\" when you want to login to Twitter!");
}
})
).Unwrap().PostToUser();
これは BL を使用した FormFlow です。
public static IForm<Tweet> BuildForm()
{
OnCompletionAsyncDelegate<Tweet> processTweet = async (context, state) =>
{
await context.PostAsync($"We are currently processing your tweet . We will message you the status. );
//...some code here ...
};
return new FormBuilder<Tweet>()
.Message("Tweet bot !")
.Field(nameof(TweetHashtags))
.Field(nameof(Tweet.DeliveryTime), "When do you want publish your tweet? {||}")`
.Confirm("Are you sure ?")
.AddRemainingFields()
.Message("Thanks, your tweet will be post!")
.OnCompletion(processTweet)
.Build();
これがコントローラー
public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
{
// QUESTION 1 :
// when user send the first message, How can I check if user is already logged in or not?
//QUESTION 2:
// Based on Question 1 answer, How can switch between Auth Dialog and FormFlow if user is not logged in ?
//QUESTION 3:
// is this the right place where I have to check the Question 1 and Question 2 or I have to do in another place ?
}