從本章起將開始進入到 Bot Framework V4 的開發內容,首先從一個概觀的角度來說明,在Bot Framework V4裡一個 bot 與 使用者間的對話是如何運行的,建立起基本概念後,再搭配程式碼就比較容易理解。
(Ref : https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&tabs=cs)
我們先看上面這張圖,它具體描述了Bot 如何與使用者進行對話,首先可以看到一個對話的開始會先引發二次的conversation update事件,這二次的conversation update事件分別代表了使用者加入對話以及Bot加入對話,這點從模擬器也可以看的出來。
接著才是對話訊息的傳送,而對話訊息的傳送主要是透過message activities來處理,這裡面不只包含文字,更可能包含有圖片、檔案等資訊內容,而事實上在整個Bot Framework V4裡,有個很重要的類別 - activity,在整個 Bot 程式裡幾乎都是圍繞著activity物件在做相關的處理,activity代表著 Bot與User間任何的活動,不只是對話內容,還包含了狀態的更新或是其它的動作,這一點從activity的ActivityTypes原始碼可以得到證明,從程式碼可以得知當ActivityTypes是Message時,表示目前這個Activity是對話的處理,而像是conversation update則ActivityTypes會是ConversationUpdate,從這裡可以得到一個重點就是要在Bot Framework V4處理任何的動作,只要從activity下手準沒錯。
在Bot Framework V4裡除了activity物件之外,另一個重要的概念就是turn,一個turn指的是bot與user間的一次來回,所謂的一次來回就是使用者對 Bot 的傳入活動,以及 Bot 回覆給使用者,稱做一個turn,換言之,來來回回的多次對話就分別是不同的turn。開啟EchoBotV4Bot.cs,我們可以看到有個OnTurnAsync的方法,任何的bot邏輯處理在Bot Framework V4裡是透過繼承IBot,實作OnTurnAsync方法來進行的,這個方法在每次turn時會被呼叫,而方法參數中有個turnContext物件,這個turnContext物件會提供包含這次活動內的所有資訊,而我們上面提到的activity同樣的被包含在turnContext物件裡。
最後我們再用程式碼來回顧一下前面提供的概念,當使用者啟動對話時,其訊息的內容會被包含在一個activity物件裡,同時一個turn開始作用,OnTurnAsync被調用,activity物件被包含在turnContext物件內,此時要取得使用者所送進來的訊息資料,可透過turnContext.Activity.Text來取得,而最後bot則透過呼叫turnContext.SendActivityAsync方法,做為回覆使用者的動作,到此做為一個turn的結束。
要提醒旳是bot與使用者間的互動是透過許多的activity物件來回傳播,意謂著有不同型態的activity,因此當bot是要處理對話時,請記得必須先判斷目前的activity是否為message類型,才能進一步加以處理。
在下一篇裡我們將說明如何傳送文字訊息以及圖卡式的回覆
By No.18