| func (ss *openIDSessionData) Save() { | func (ss *openIDSessionData) Save() { | ||||
| //invalid procedure | //invalid procedure | ||||
| if isExpired(ss.Expire) || ss.Procedure == "" { | if isExpired(ss.Expire) || ss.Procedure == "" { | ||||
| log.Printf("delete session [%s], %d, now=%d", ss.Procedure, ss.Expire, time.Now().Unix()) | |||||
| ss.Delete() | ss.Delete() | ||||
| } else { | } else { | ||||
| ss.writeSession() | ss.writeSession() | ||||
| openID := v.header.FromUserName | openID := v.header.FromUserName | ||||
| //kfSendTxtAs(openID, "信息收到"+v.header.MsgType, "孙鹏") | //kfSendTxtAs(openID, "信息收到"+v.header.MsgType, "孙鹏") | ||||
| //are we in an existing procedure | //are we in an existing procedure | ||||
| log.Printf("current procedure = %s", ss.Procedure) | |||||
| proc, found := AllProc[ss.Procedure] | proc, found := AllProc[ss.Procedure] | ||||
| if found { | if found { | ||||
| proc.serve(ss, v) //transit to new state | proc.serve(ss, v) //transit to new state | ||||
| } else { | } else { | ||||
| processed := ss.serveCommand(v) //menu or txt command e.g. search | processed := ss.serveCommand(v) //menu or txt command e.g. search | ||||
| if !processed { // transfer to Customer Service (kf) | |||||
| log.Printf("current procedure after command = %s", ss.Procedure) | |||||
| if !processed { // transfer to Customer Service (kf) | |||||
| //start transfer | //start transfer | ||||
| ss.state.response, _ = BuildKFTransferAnyOneMsg(openID) | ss.state.response, _ = BuildKFTransferAnyOneMsg(openID) | ||||
| v.replyXML(ss.state.response) | v.replyXML(ss.state.response) |
| if in.header.MsgType == "text" { | if in.header.MsgType == "text" { | ||||
| if in.body.(TextMsg).Content == "结束Echo" || in.body.(TextMsg).Content == "结束echo" { | if in.body.(TextMsg).Content == "结束Echo" || in.body.(TextMsg).Content == "结束echo" { | ||||
| stopEcho = true | stopEcho = true | ||||
| return | |||||
| } | } | ||||
| } | } | ||||
| if in.header.MsgType == "voice" { | if in.header.MsgType == "voice" { |
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "log" | |||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| ) | ) | ||||
| } | } | ||||
| if cmd != "" { | if cmd != "" { | ||||
| if f, hasFunction := commandMap[cmd]; hasFunction { | if f, hasFunction := commandMap[cmd]; hasFunction { | ||||
| return f(ss, in) | |||||
| processed = f(ss, in) | |||||
| log.Printf("cmd...%s", ss.Procedure) | |||||
| return | |||||
| } | } | ||||
| if cmd == "所有命令" || cmd == "all command" { | if cmd == "所有命令" || cmd == "all command" { | ||||
| return allCommand(ss, in) | return allCommand(ss, in) |
| //save session data to disk | //save session data to disk | ||||
| data := m.sessions[openID].data | data := m.sessions[openID].data | ||||
| data.Save() | data.Save() | ||||
| log.Printf("procedure name when saving =%s", data.Procedure) | |||||
| //close job channels | //close job channels | ||||
| s := m.sessions[openID] | s := m.sessions[openID] | ||||
| close(s.jobs) | close(s.jobs) | ||||
| m.checkOpenID(openID, v) | m.checkOpenID(openID, v) | ||||
| s := m.sessions[openID] | s := m.sessions[openID] | ||||
| s.data.incomingMsg(v) //<=== main logic for processing each incoming message | s.data.incomingMsg(v) //<=== main logic for processing each incoming message | ||||
| log.Printf("after incoming message %s", s.data.Procedure) | |||||
| m.sessions[openID] = s | |||||
| jobFinished.consumed++ | jobFinished.consumed++ | ||||
| default: | default: | ||||
| hasJob = false | hasJob = false |