From 3dde62d629e231257f75f5146297e1ad9002776b Mon Sep 17 00:00:00 2001 From: Patrick Peng Sun Date: Sun, 28 May 2017 21:48:29 +1000 Subject: [PATCH] state machine redesign state saving is controlled by main routine, serveProc procude state transit, its input is old state, output is new state. --- chatState.go | 9 +++++++-- procedure.go | 2 +- server.go | 20 +++++++++++++------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/chatState.go b/chatState.go index 4f1261c..66e3fd3 100644 --- a/chatState.go +++ b/chatState.go @@ -96,6 +96,11 @@ type ValidationResult struct { //Validator function type for validating all wechat inputs type Validator func(s chatState) ValidationResult -func saveChatState(state chatState) { - +func saveChatState(openID, procedure string, state chatState) (err error) { + if isExpired(state.Expire) { + //skip saving sate + return + } + _, err = setCurrentState(openID, procedure, state) + return } diff --git a/procedure.go b/procedure.go index a57a940..61f2889 100644 --- a/procedure.go +++ b/procedure.go @@ -99,6 +99,6 @@ func isInProc(openID string) (result bool, state chatState) { } //follow procedure, if there is any -func serveProc(openID string, input InWechatMsg) (next chatState) { +func serveProc(state chatState, input InWechatMsg) (next chatState) { return } diff --git a/server.go b/server.go index 38bd15c..cf374a5 100644 --- a/server.go +++ b/server.go @@ -72,23 +72,29 @@ func answerWechatPost(w http.ResponseWriter, r *http.Request) { //are we in an existing procedure openID := in.header.FromUserName - yes, state := isInProc(openID) - if yes { - state := serveProc(openID, in) - reply = state.response + inProc, state := isInProc(openID) //if inside a procedure, resume last saved state + if inProc { + state = serveProc(state, in) //transit to new state + reply = state.response //xml response } else { - state, processed := serveCommand(openID, in) //search or other command + state, processed := serveCommand(openID, in) //menu or txt command e.g. search if !processed { // transfer to Customer Service (kf) reply = buildKfForwardMsg(openID, "") + kfSendTxt(openID, "未识别的命令,已转接校友会理事会,稍后答复您") } else { reply = state.response } } - log.Println(reply) + log.Println(reply) //instant reply, answering user's request w.Header().Set("Content-Type", "text/xml; charset=utf-8") fmt.Fprint(w, reply) - saveChatState(state) + err := saveChatState(openID, state.Procedure, state) + if err != nil { + log.Println("Error Cannot Save chat sate") + log.Println(err) + log.Println(state) + } return }