package main import ( "fmt" "log" "strings" "time" ) type commandFunction func(*openIDSessionData, *InWechatMsg) bool var commandMap = map[string]commandFunction{ "版本信息": cmdVersion, "version": cmdVersion, //"所有命令": allCommand, //include it will cause initialization loop "回音": cmdEcho, } func (ss *openIDSessionData) serveCommand(in *InWechatMsg) (processed bool) { switch in.header.MsgType { case "text": processed = ss.serveTextCommand(in) case "image": in.replyText("图片收到") processed = true case "voice": processed = ss.serveTextCommand(in) case "video": case "shortvideo": case "location": case "link": case "event": processed = ss.serveEvents(in) default: processed = false } return } func (ss *openIDSessionData) serveTextCommand(in *InWechatMsg) (processed bool) { cmd := "" if in.header.MsgType == "text" { cmd = in.body.(TextMsg).Content } else if in.header.MsgType == "voice" { cmd = voice2Cmd(in.body.(VoiceMsg)) } if cmd != "" { if f, hasFunction := commandMap[cmd]; hasFunction { processed = f(ss, in) log.Printf("cmd...%s", ss.Procedure) return } if cmd == "所有命令" || cmd == "all command" { return allCommand(ss, in) } if proc, hasProc := AllProc[cmd]; hasProc { startProc(proc, ss, in) processed = true return true } } return false //不认识的命令,我们选择这个信息不处理 } func startProc(proc chatProcedure, ss *openIDSessionData, in *InWechatMsg) { proc.init(ss) proc.intro(ss, in) proc.start(ss, in) } func allCommand(ss *openIDSessionData, in *InWechatMsg) (processed bool) { processed = true msg := "命令如下:\n" count := 0 for k := range commandMap { count++ msg = msg + fmt.Sprintf("%0d : %s \n", count, k) } for k := range AllProc { count++ msg = msg + fmt.Sprintf("%0d : %s \n", count, k) } in.replyText(msg) return } func cmdVersion(ss *openIDSessionData, in *InWechatMsg) (processed bool) { processed = true in.replyText("这是测试版本" + time.Now().Format("2006/01/02 03:04:05")) return } func cmdEcho(ss *openIDSessionData, in *InWechatMsg) (processed bool) { processed = true procEcho.init(ss) procEcho.intro(ss, in) procEcho.start(ss, in) return } func voice2Cmd(v VoiceMsg) (cmd string) { cmd = v.Recognition cmd = strings.TrimSuffix(cmd, "。") //去掉末尾的标点符号,句号 return }