| package main | package main | ||||
| import ( | import ( | ||||
| "fmt" | |||||
| "log" | "log" | ||||
| "os" | |||||
| ) | ) | ||||
| func serveCommand(openID string, in InWechatMsg) (state chatState, processed bool) { | func serveCommand(openID string, in InWechatMsg) (state chatState, processed bool) { | ||||
| log.Println("process command") | log.Println("process command") | ||||
| return echoCommand(openID, in) | return echoCommand(openID, in) | ||||
| } | } | ||||
| func echoCommand(openID string, in InWechatMsg) (state chatState, processed bool) { | |||||
| processed = true | |||||
| str, err := BuildTextMsg(openID, "default") | |||||
| log.Println(in.header.MsgType) | |||||
| switch in.body.(type) { | |||||
| case TextMsg: | |||||
| m := in.body.(TextMsg) | |||||
| str, err = BuildTextMsg(openID, m.Content+"\n\n关键词 [转接] 将后续信息都转接到 客服") | |||||
| if m.Content == "转接" { | |||||
| processed = false | |||||
| } | |||||
| case PicMsg: | |||||
| m := in.body.(PicMsg) | |||||
| str = buildPicMsg(openID, m.MediaId) | |||||
| case VoiceMsg: | |||||
| m := in.body.(VoiceMsg) | |||||
| str = buildVoiceMsg(openID, m.MediaId) | |||||
| kfSendTxt(openID, "翻译结果:"+m.Recognition) | |||||
| case VideoMsg: | |||||
| m := in.body.(VideoMsg) | |||||
| str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId) | |||||
| case ShortVideoMsg: | |||||
| m := in.body.(ShortVideoMsg) | |||||
| str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId) | |||||
| case LocationMsg: | |||||
| m := in.body.(LocationMsg) | |||||
| mid := location2MediaID(m.Location_X, m.Location_Y) | |||||
| //str, _ = BuildTextMsg(openID, fmt.Sprintf("long=%f, lat=%f, scale=%d", m.Location_X, m.Location_Y, m.Scale)) | |||||
| str = buildPicMsg(openID, mid) | |||||
| url := location2URL(m.Location_X, m.Location_Y) | |||||
| kfSendTxt(openID, url) | |||||
| case LinkMsg: | |||||
| m := in.body.(LinkMsg) | |||||
| kfSendTxt(openID, m.Title+m.Description) | |||||
| str, _ = BuildTextMsg(openID, m.Url) | |||||
| case EventMsg: | |||||
| return echoEvents(openID, in) | |||||
| default: | |||||
| str, err = BuildTextMsg(openID, "text message") | |||||
| } | |||||
| state.OpenID = openID | |||||
| state.Procedure = "" | |||||
| state.response = str | |||||
| log.Println(str) | |||||
| if err != nil { | |||||
| log.Println("build response failed") | |||||
| processed = false | |||||
| } | |||||
| //state is any state that | |||||
| return | |||||
| } | |||||
| func echoEvents(openID string, in InWechatMsg) (state chatState, processed bool) { | |||||
| processed = true | |||||
| str := "" | |||||
| m := in.body.(EventMsg) | |||||
| log.Println("Event = " + m.Event) | |||||
| switch m.Event { | |||||
| case "LOCATION": | |||||
| mid := location2MediaID(m.Latitude, m.Longitude) | |||||
| str = buildPicMsg(openID, mid) | |||||
| case "CLICK": | |||||
| str, _ = BuildTextMsg(openID, m.EventKey) | |||||
| case "subscribe": | |||||
| str, _ = BuildTextMsg(openID, m.EventKey) | |||||
| case "unsubscribe": | |||||
| str, _ = BuildTextMsg(openID, m.EventKey) | |||||
| case "SCAN": | |||||
| str, _ = BuildTextMsg(openID, m.EventKey) | |||||
| case "VIEW": | |||||
| str, _ = BuildTextMsg(openID, m.EventKey) | |||||
| case "kf_create_session": | |||||
| kfSendTxt(openID, m.KfAccount) | |||||
| //str, _ = BuildTextMsg(openID, m.KfAccount) // response msg is ignored by wechat | |||||
| case "kf_close_session": | |||||
| kfSendTxt(openID, m.KfAccount+"\n close type ="+m.CloseType) | |||||
| //str, _ = BuildTextMsg(openID, m.KfAccount+"\n close type ="+m.CloseType) //response msg is ignored by wechat | |||||
| case "scancode_waitmsg": | |||||
| log.Println(m.ScanCodeInfo.ScanResult) | |||||
| log.Println(m.ScanCodeInfo.ScanType) | |||||
| msg := fmt.Sprintf("ScanResult =%s, ScanType=%s", m.ScanCodeInfo.ScanResult, m.ScanCodeInfo.ScanType) | |||||
| kfSendTxt(openID, msg) | |||||
| case "pic_photo_or_album": | |||||
| msg := fmt.Sprintf("Count = %d ", m.SendPicsInfo.Count) | |||||
| log.Println(m.SendPicsInfo.Count) | |||||
| for _, v := range m.SendPicsInfo.PicList.Item { | |||||
| log.Println(v.PicMd5Sum) | |||||
| kfSendTxt(openID, v.PicMd5Sum) | |||||
| } | |||||
| kfSendTxt(openID, msg) | |||||
| default: | |||||
| str, _ = BuildTextMsg(openID, " unknown event:"+m.Event) | |||||
| } | |||||
| state.response = str | |||||
| return | |||||
| } | |||||
| func location2MediaID(lat, long float64) (mediaID string) { | |||||
| url := fmt.Sprintf("https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&markers=color:red|label:S|%f,%f&zoom=17&size=1280x2014", lat, long, lat, long) | |||||
| file, _, _ := saveURL(url) | |||||
| mediaID = uploadImage(file) | |||||
| os.Remove(file) | |||||
| return | |||||
| } | |||||
| func location2URL(lat, long float64) (url string) { | |||||
| url = fmt.Sprintf("http://maps.google.com/maps?z=12&t=m&q=loc:%f+%f", lat, long) | |||||
| log.Println(url) | |||||
| return | |||||
| } |