| @@ -30,6 +30,10 @@ type openIDSessionData struct { | |||
| UpdateAt int32 `json:"UpdateAt"` //when is this session updated | |||
| Expire int32 `json:"Expire"` //unix timestamp of when this Procedure expires | |||
| KvPair map[string]string `json:"KvPair"` //key value pair persistant for this session | |||
| // | |||
| // | |||
| //current state for the prcedure | |||
| state chatState | |||
| } | |||
| func writeSession(ss openIDSessionData) (err error) { | |||
| @@ -148,3 +152,32 @@ func (c *openIDSessionData) setKvPair(key, val string) { | |||
| c.KvPair[key] = val | |||
| c.UpdateAt = int32(time.Now().Unix()) | |||
| } | |||
| //main entry point for processing each incoming message | |||
| //this stage has session date available | |||
| func (c *openIDSessionData) incomingMsg(v InWechatMsg) { | |||
| openID := v.header.FromUserName | |||
| //are we in an existing procedure | |||
| inProc, state := isInProc(openID) //if inside a procedure, resume last saved state | |||
| if inProc { | |||
| c.state = serveProc(state, v) //transit to new state | |||
| } else { | |||
| state, processed := serveCommand(openID, v) //menu or txt command e.g. search | |||
| if !processed { // transfer to Customer Service (kf) | |||
| kfSendTxt(openID, "未识别的命令,已转接校友会理事会,稍后答复您") | |||
| } | |||
| c.state = state | |||
| } | |||
| if !isEndingState(state) { | |||
| err := saveChatState(openID, state.Procedure, state) | |||
| if err != nil { | |||
| log.Println("Error Cannot Save chat sate") | |||
| log.Println(err) | |||
| log.Println(state) | |||
| } | |||
| } else { //state ending | |||
| cleanProcedure(openID, state.Procedure) | |||
| } | |||
| return | |||
| } | |||