package icshttp import ( "crypto/rand" "encoding/json" "fmt" "io/ioutil" "math/big" "net/http" "strings" "sync" "time" "gitlab.com/cinnamon/voiceagent/icsconf" "gitlab.com/cinnamon/voiceagent/icslog" "gitlab.com/cinnamon/voiceagent/icspacketer" "gitlab.com/cinnamon/voiceagent/icspacketparser" ) const HANDLE_NUM = 1024 const ( TTS_FUNC1 = iota TTS_FUNC2 TTS_FUNC3 TTS_FUNC4 BOT_FUNC ) type Handler struct { r *Router } type handleInfo struct { id int method string pattern string h http.HandlerFunc } type Request struct { Token string `json:"token"` OprMngCode string `json:"oprMngCode"` Method string `json:"method"` TalkText string `json:"talkText"` CallId string `json:"callId"` TrunkGroup string `json:"trunkGroup"` TelNo string `json:"telNo"` Dnis string `json:"dnis"` MentType string `json:"mentType"` RecordFilePath string `json:"recordFilePath"` ServerID string `json:"serverId"` ServerIP string `json:"serverIp"` Data json.RawMessage `json:"data"` } type TransLateInfo struct { Use bool `json:"use"` Token string `json:"token"` Text string `json:"text"` Lang string `json:"lang"` } type Response struct { ResultCode int `json:"resultCode"` Token string `json:"token"` Action string `json:"action"` AnounceMents string `json:"announceMents"` AnnounceFilePath string `json:"announceFilePath"` Data ResData `json:"DATA"` } type ResData struct { BargeIn string `json:"bargeIn"` RecodingFile string `json:"recodingFile"` SttMaxTime int `json:"sttMaxTime"` MaxDigit int `json:"maxDigit"` MinDigit int `json:"minDigit"` DigitTerm int `json:"digitTerm"` TelNo string `json:"telNo"` VoiceName string `json:"voiceName"` Speed string `json:"speed"` Volume string `json:"volume"` Pitch string `json:"pitch"` EndCharacter []string `json:"endCharacter"` MaxWaitTime int `json:"maxNoInputTime"` UUI json.RawMessage `json:"uui"` } type ResStatus struct { Count int Status string NotUnderstand int PreEventNum int PreEventNum2 int LoopCount int TransLateText string } type ScenarioSession struct { session map[string]ResStatus m *sync.Mutex } // var scenarioSession map[string]ResStatus var handles []*handleInfo var session []*ScenarioSession var tokenMap map[string]string func init() { handles = make([]*handleInfo, HANDLE_NUM) // session := make(map[string]ResStatus) // session init scenarioSession := new(ScenarioSession) scenarioSession.session = make(map[string]ResStatus, 200) scenarioSession.m = &sync.Mutex{} // session = make(map[string]ResStatus) // session init //TTS handles[TTS_FUNC1] = &handleInfo{method: "GET", pattern: "/tts/1", h: TTSFunc1} handles[TTS_FUNC2] = &handleInfo{method: "GET", pattern: "/tts/2", h: TTSFunc2} handles[TTS_FUNC3] = &handleInfo{method: "POST", pattern: "/tts/3", h: TTSFunc3} handles[TTS_FUNC4] = &handleInfo{method: "POST", pattern: "/tts/4", h: TTSFunc4} // bot sinario handles[BOT_FUNC] = &handleInfo{method: "POST", pattern: "/platform/api/call/process", h: scenarioSession.BOTPFunc} } func BuildHandler(r *Router) { for iter, handle := range handles { if handle != nil { //fmt.Println(handle) handle.id = iter r.HandleFunc(handle.method, handle.pattern, handle.h) } else { break } } } ///////////////////////////////////////////// //TTS func TTSFunc1(w http.ResponseWriter, r *http.Request) { h := icspacketparser.NewHTTP() err := icspacketer.PutPacket(r, &h) if err != nil { fmt.Println(err) } fmt.Fprintln(w, "TTS func 1", r) } func TTSFunc2(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "TTS func 2", r) } //post func TTSFunc3(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "TTS func 3", r) body := make([]byte, r.ContentLength) r.Body.Read(body) fmt.Println("TTS func 3", r.Method, r.URL) for iter, v := range r.Header { fmt.Println(iter, v) } fmt.Println(string(body)) } //post func TTSFunc4(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "TTS func 4", r) } func (s *ScenarioSession) GetSession(token string) ResStatus { s.m.Lock() defer s.m.Unlock() resStatus := s.session[token] return resStatus } func (s *ScenarioSession) UpdateSession(token string, data ResStatus) { s.m.Lock() defer s.m.Unlock() s.session[token] = data } func (s *ScenarioSession) GetScnario(dnis string, count int) icsconf.ScenarioConfig { s.m.Lock() defer s.m.Unlock() conf := icsconf.GetIcsConfig() resultConfig := conf.ScenarioConfig[dnis][count] return resultConfig } ///////////////////////////////////////////// //BOT func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) { // get scenario config l := icslog.GetIcsLog() conf := icsconf.GetIcsConfig() scnarioConf := conf.ScenarioConfig // Request json parsing request := Request{} resBody, err := ioutil.ReadAll(r.Body) if err != nil { fmt.Println(err) } defer r.Body.Close() err = json.Unmarshal(resBody, &request) if err != nil { l.Printf(icslog.LOG_LEVEL_INFO, -1, "response unmarshal error!!!!! ") } agent := strings.SplitN(request.CallId, "@", 2) l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> DATA INFO - method [%s], agent [%s], token [%s] talk[%s]", request.Method, agent, request.Token, request.TalkText) response := new(Response) dnis := request.Dnis var translateinfo TransLateInfo err = json.Unmarshal([]byte(request.Data), &translateinfo) if err != nil { return } if request.Method == "HANGUP" { response.ResultCode = 200 response.Token = request.Token response.Action = "" response.AnounceMents = "" response.Data.BargeIn = "" response.Data.RecodingFile = "" response.Data.SttMaxTime = 10 } else if (request.Method != "INIT" && request.TalkText == "") || (request.Method != "INIT" && translateinfo.Use) { response.ResultCode = 200 response.Token = request.Token scenario := s.GetScnario(dnis, 2) response.Action = scenario.Action response.AnounceMents = scenario.AnounceMents response.AnnounceFilePath = scenario.AudioFilePath response.Data.Speed = fmt.Sprintf("%d", scenario.Speed) // response.Data.VoiceName = scenario.VoiceName response.Data.VoiceName = fmt.Sprintf("%d", scenario.VoiceName) response.Data.Volume = fmt.Sprintf("%d", scenario.Volume) response.Data.Pitch = fmt.Sprintf("%d", scenario.Pitch) response.Data.MaxWaitTime = scenario.MaxWaitTime response.Data.BargeIn = scenario.BargeIn response.Data.SttMaxTime = scenario.SttMaxTime response.Data.MaxDigit = scenario.MaxDigit response.Data.RecodingFile = "Y" // fmt.Println("-------------------------") // fmt.Printf("lv 0 => %#v\n", translateinfo) // fmt.Printf("lv 1 =>%#v\n", request) // fmt.Printf("lv 2 =>%#v\n", response) // fmt.Println("-------------------------") if translateinfo.Use { srcSession := s.GetSession(request.Token) dstSession := s.GetSession(translateinfo.Token) if request.TalkText != "" { dstRlt := ResStatus{Count: dstSession.Count + 1, TransLateText: request.TalkText} s.UpdateSession(translateinfo.Token, dstRlt) } if srcSession.TransLateText != "" { response.AnounceMents = srcSession.TransLateText srcRlt := ResStatus{Count: srcSession.Count + 1, Status: scenario.Action, TransLateText: scenario.AnounceMents} s.UpdateSession(request.Token, srcRlt) } l.Printf(icslog.LOG_LEVEL_INFO, -1, "STT %s | TTS %s", request.TalkText, response.AnounceMents) } } else { switch request.Method { case "INIT": scenario := s.GetScnario(dnis, 1) token := createToken(request.CallId) response.ResultCode = 200 response.Token = token response.Action = scenario.Action response.AnounceMents = scenario.AnounceMents response.Data.Speed = fmt.Sprintf("%d", scenario.Speed) response.Data.VoiceName = fmt.Sprintf("%d", scenario.VoiceName) response.Data.Volume = fmt.Sprintf("%d", scenario.Volume) response.Data.Pitch = fmt.Sprintf("%d", scenario.Pitch) response.Data.MaxWaitTime = scenario.MaxWaitTime response.Data.BargeIn = scenario.BargeIn response.Data.SttMaxTime = scenario.SttMaxTime response.Data.MaxDigit = scenario.MaxDigit response.Data.RecodingFile = "Y" if translateinfo.Token != "" { response.AnounceMents = "고객 연결 성공" } else { s.session[token] = ResStatus{Count: 1, Status: scnarioConf[dnis][0].Action, NotUnderstand: 0, PreEventNum: 1} } } } response.Data.UUI = json.RawMessage{} uuiMap := map[string]interface{}{ "test1": "testdata1231", "test2": 123, "test3": 0.1, } // 맵을 JSON으로 마샬링 uuiJSON, err := json.Marshal(uuiMap) if err != nil { fmt.Println("Error marshaling UUI:", err) return } // 마샬링된 JSON을 json.RawMessage로 변환 response.Data.UUI = json.RawMessage(uuiJSON) response.Data.TelNo = request.TelNo // s.m.Unlock() // // response marshal resMarshal, jerr := json.Marshal(response) if jerr != nil { fmt.Println("Json Marshal error ", jerr) } l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send Message\n %s", string(resMarshal)) l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send From %s\n", request.TelNo) fmt.Fprintln(w, string(resMarshal)) } // func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) { // // get scenario config // l := icslog.GetIcsLog() // conf := icsconf.GetIcsConfig() // scnarioConf := conf.ScenarioConfig // // Request json parsing // request := Request{} // resBody, err := ioutil.ReadAll(r.Body) // if err != nil { // fmt.Println(err) // } // defer r.Body.Close() // err = json.Unmarshal(resBody, &request) // if err != nil { // l.Printf(icslog.LOG_LEVEL_INFO, -1, "response unmarshal error!!!!! ") // } // agent := strings.SplitN(request.CallId, "@", 2) // fmt.Printf(">>>>>> DATA INFO - method [%s], agent [%s], token [%s]\n", request.Method, agent, request.Token) // l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> DATA INFO - method [%s], agent [%s], token [%s] talk[%s]", request.Method, agent, request.Token, request.TalkText) // response := new(Response) // dnis := request.Dnis // s.m.Lock() // var translateinfo TransLateInfo // err = json.Unmarshal([]byte(request.Data), &translateinfo) // if err != nil { // return // } // if request.Method == "HANGUP" { // response.ResultCode = 200 // response.Token = request.Token // response.Action = "" // response.AnounceMents = "" // response.Data.BargeIn = "" // response.Data.RecodingFile = "" // response.Data.SttMaxTime = 10 // } else if (request.Method != "INIT" && request.TalkText == "") || (request.Method != "INIT" && translateinfo.Use) { // if dnis == "AISB" || dnis == "07075999956" || dnis == "821462" || dnis == "1462" { // dnis = "9013" // } // // if dnis != "07012345678" && dnis != "07077442711" { // // dnis = "sim" // // } // if dnis == "07012345678" || dnis == "07077442711" { // dnis = "sim3" // } // if dnis == "9012" { // response.ResultCode = 200 // response.Token = request.Token // response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action // response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents // if s.session[request.Token].Count != 0 && dnis == "9012" { // response.AnounceMents = strings.ReplaceAll(response.AnounceMents, "$", request.TalkText) // } // response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed // response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName // response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume // response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm // response.Data.RecodingFile = "Y" // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action} // } else { // response.ResultCode = 200 // response.Token = request.Token // response.Action = scnarioConf[dnis][2].Action // response.AnounceMents = scnarioConf[dnis][2].AnounceMents // response.AnnounceFilePath = scnarioConf[dnis][2].AudioFilePath // response.Data.Speed = scnarioConf[dnis][2].Speed // response.Data.VoiceName = scnarioConf[dnis][2].VoiceName // response.Data.Volume = scnarioConf[dnis][2].Volume // response.Data.Pitch = scnarioConf[dnis][2].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][2].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][2].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][2].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][2].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][2].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][2].DigitTerm // response.Data.RecodingFile = "Y" // fmt.Println("-------------------------") // fmt.Printf("lv 0 => %#v\n", translateinfo) // fmt.Printf("lv 1 =>%#v\n", request) // fmt.Printf("lv 2 =>%#v\n", response) // fmt.Println("-------------------------") // if translateinfo.Use { // if request.TalkText != "" { // s.session[translateinfo.Token] = ResStatus{Count: s.session[translateinfo.Token].Count + 1, TransLateText: request.TalkText} // } // if s.session[request.Token].TransLateText != "" { // response.Action = "STT" // response.AnounceMents = s.session[request.Token].TransLateText // response.Data.SttMaxTime = 15 // response.Data.MaxWaitTime = 30 // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, TransLateText: scnarioConf[dnis][2].AnounceMents} // } // } else { // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, TransLateText: scnarioConf[dnis][2].AnounceMents} // } // } // } else { // fmt.Println("RECV METHOD") // fmt.Println(dnis) // // if dnis == "AISB" || dnis == "07075999956" || dnis == "821462" || dnis == "1462" { // // dnis = "9013" // // } // fmt.Println(dnis) // // if dnis == "9012" || dnis == "07012345678" || dnis == "07077442711" { // // dnis = "sim3" // // } // // if dnis == "9013" { // // dnis = "9014" // // } // switch request.Method { // case "INIT": // token := createToken(request.CallId) // response.ResultCode = 200 // response.Token = token // response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action // response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents // response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed // response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName // response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume // response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm // response.AnnounceFilePath = scnarioConf[dnis][s.session[request.Token].Count+1].AudioFilePath // response.Data.RecodingFile = "Y" // if translateinfo.Token != "" { // response.AnounceMents = "고객 연결 성공" // } else { // s.session[token] = ResStatus{Count: 1, Status: scnarioConf[dnis][0].Action, NotUnderstand: 0, PreEventNum: 1} // } // case "STT", "DTMF", "BOTH", "MEMO", "NONE": // response.ResultCode = 200 // response.Token = request.Token // if dnis == "9013" || dnis == "9014" { // response.Action = scnarioConf[dnis][s.session[request.Token].Count+1].Action // response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count+1].AnounceMents // response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count+1].Speed // response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count+1].VoiceName // response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count+1].Volume // response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count+1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count+1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count+1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count+1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count+1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm // response.AnnounceFilePath = scnarioConf[dnis][s.session[request.Token].Count+1].AudioFilePath // response.Data.RecodingFile = "Y" // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action} // // s.m.Unlock() // } else if dnis == "9012" { // response.Action = scnarioConf[dnis][1].Action // response.AnounceMents = scnarioConf[dnis][1].AnounceMents // response.Data.Speed = scnarioConf[dnis][1].Speed // response.Data.VoiceName = scnarioConf[dnis][1].VoiceName // response.Data.Volume = scnarioConf[dnis][1].Volume // response.Data.Pitch = scnarioConf[dnis][1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit // // response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter} // // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count+1].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action} // // s.m.Unlock() // } else if dnis == "1000" { // preEventNum := s.session[request.Token].PreEventNum // fmt.Printf("\n num %+v\n", preEventNum) // switch preEventNum { // case 1: // actionNum, err := strconv.Atoi(request.TalkText) // if err == nil { // response.Action = scnarioConf[dnis][actionNum+2].Action // response.AnounceMents = scnarioConf[dnis][actionNum+2].AnounceMents // response.Data.Speed = scnarioConf[dnis][actionNum+2].Speed // response.Data.VoiceName = scnarioConf[dnis][actionNum+2].VoiceName // response.Data.Volume = scnarioConf[dnis][actionNum+2].Volume // response.Data.Pitch = scnarioConf[dnis][actionNum+2].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][actionNum+2].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][actionNum+2].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][actionNum+2].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][actionNum+2].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][actionNum+2].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][actionNum+2].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][actionNum+2].Action, PreEventNum: actionNum + 2} // // s.m.Unlock() // } else { // response.Action = scnarioConf[dnis][1].Action // response.AnounceMents = scnarioConf[dnis][1].AnounceMents // response.Data.Speed = scnarioConf[dnis][1].Speed // response.Data.VoiceName = scnarioConf[dnis][1].VoiceName // response.Data.Volume = scnarioConf[dnis][1].Volume // response.Data.Pitch = scnarioConf[dnis][1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1} // // s.m.Unlock() // } // case 2: // actionNum, err := strconv.Atoi(request.TalkText) // if err == nil { // if actionNum == 1 { // response.Action = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Action // response.AnounceMents = scnarioConf[dnis][s.session[request.Token].PreEventNum2].AnounceMents // response.Data.Speed = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Speed // response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].PreEventNum2].VoiceName // response.Data.Volume = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Volume // response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].PreEventNum2].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].PreEventNum2].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].PreEventNum2].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].PreEventNum2].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].PreEventNum2].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].PreEventNum2].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].PreEventNum2].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].PreEventNum2].Action, PreEventNum: s.session[request.Token].PreEventNum2} // // s.m.Unlock() // } else { // response.Action = scnarioConf[dnis][1].Action // response.AnounceMents = scnarioConf[dnis][1].AnounceMents // response.Data.Speed = scnarioConf[dnis][1].Speed // response.Data.VoiceName = scnarioConf[dnis][1].VoiceName // response.Data.Volume = scnarioConf[dnis][1].Volume // response.Data.Pitch = scnarioConf[dnis][1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1, PreEventNum2: 1} // // s.m.Unlock() // } // } else { // response.Action = scnarioConf[dnis][1].Action // response.AnounceMents = scnarioConf[dnis][1].AnounceMents // response.Data.Speed = scnarioConf[dnis][1].Speed // response.Data.VoiceName = scnarioConf[dnis][1].VoiceName // response.Data.Volume = scnarioConf[dnis][1].Volume // response.Data.Pitch = scnarioConf[dnis][1].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][1].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][1].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][1].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][1].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][1].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][1].Action, PreEventNum: 1} // // s.m.Unlock() // } // default: // response.Action = scnarioConf[dnis][2].Action // response.AnounceMents = "결과 " + request.TalkText + " " + scnarioConf[dnis][2].AnounceMents // response.Data.Speed = scnarioConf[dnis][2].Speed // response.Data.VoiceName = scnarioConf[dnis][2].VoiceName // response.Data.Volume = scnarioConf[dnis][2].Volume // response.Data.Pitch = scnarioConf[dnis][2].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][2].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][2].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][2].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][2].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][2].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][2].DigitTerm // response.Data.RecodingFile = "Y" // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][2].Action, PreEventNum: 2, PreEventNum2: s.session[request.Token].PreEventNum} // //s.m.Unlock() // } // } else { // //시뮬레이터 // response.Action = scnarioConf[dnis][s.session[request.Token].Count].Action // response.AnounceMents = scnarioConf[dnis][s.session[request.Token].Count].AnounceMents // response.Data.Speed = scnarioConf[dnis][s.session[request.Token].Count].Speed // response.Data.VoiceName = scnarioConf[dnis][s.session[request.Token].Count].VoiceName // response.Data.Volume = scnarioConf[dnis][s.session[request.Token].Count].Volume // response.Data.Pitch = scnarioConf[dnis][s.session[request.Token].Count].Pitch // response.Data.MaxWaitTime = scnarioConf[dnis][s.session[request.Token].Count].MaxWaitTime // response.Data.BargeIn = scnarioConf[dnis][s.session[request.Token].Count].BargeIn // response.Data.SttMaxTime = scnarioConf[dnis][s.session[request.Token].Count].SttMaxTime // response.Data.MaxDigit = scnarioConf[dnis][s.session[request.Token].Count].MaxDigit // response.Data.EndCharacter = []string{scnarioConf[dnis][s.session[request.Token].Count+1].EndCharacter} // response.Data.DigitTerm = scnarioConf[dnis][s.session[request.Token].Count].DigitTerm // response.Data.RecodingFile = "Y" // if s.session[request.Token].LoopCount > 100 { // s.session[request.Token] = ResStatus{LoopCount: s.session[request.Token].LoopCount, Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count].Action} // } else { // s.session[request.Token] = ResStatus{LoopCount: s.session[request.Token].LoopCount + 1, Count: s.session[request.Token].Count, Status: scnarioConf[dnis][s.session[request.Token].Count].Action} // } // // s.m.Lock() // // s.m.Unlock() // } // case "REFER": // response.ResultCode = 200 // response.Token = request.Token // response.Action = "TRANSFER" // response.AnounceMents = "네. 매장으로 연결해드릴게요." // response.Data.BargeIn = "" // response.Data.RecodingFile = "" // response.Data.SttMaxTime = 0 // response.Data.TelNo = request.TelNo // // s.m.Lock() // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action} // case "TRANSFER": // response.ResultCode = 200 // response.Token = request.Token // response.Action = "TRANSFER" // response.AnounceMents = "네. 매장으로 연결해드릴게요." // response.Data.BargeIn = "" // response.Data.RecodingFile = "" // response.Data.SttMaxTime = 0 // response.Data.TelNo = request.TelNo // s.session[request.Token] = ResStatus{Count: s.session[request.Token].Count + 1, Status: scnarioConf[dnis][s.session[request.Token].Count+1].Action} // } // } // response.Data.UUI = json.RawMessage{} // uuiMap := map[string]interface{}{ // "test1": "testdata1231", // "test2": 123, // "test3": 0.1, // } // // 맵을 JSON으로 마샬링 // uuiJSON, err := json.Marshal(uuiMap) // if err != nil { // fmt.Println("Error marshaling UUI:", err) // return // } // // 마샬링된 JSON을 json.RawMessage로 변환 // response.Data.UUI = json.RawMessage(uuiJSON) // response.Data.TelNo = request.TelNo // s.m.Unlock() // // response marshal // resMarshal, jerr := json.Marshal(response) // if jerr != nil { // fmt.Println("Json Marshal error ", jerr) // } // fmt.Printf("%+v", response) // l.Printf(icslog.LOG_LEVEL_INFO, -1, "Send Message\n %s", string(resMarshal)) // time.Sleep(time.Second * 1) // // send response // fmt.Fprintln(w, string(resMarshal)) // } func createToken(callId string) string { token := "" times := fmt.Sprintf("%d", time.Now().UnixNano()/1000000) tokens := strings.Split(callId, "@")[0] + times token = tokens[0:8] + "-" + tokens[8:10] + "-" + tokens[10:23] return token } func cryptoRandSecure(max int64) int64 { nBig, err := rand.Int(rand.Reader, big.NewInt(max)) if err != nil { fmt.Println(err) } return nBig.Int64() } func (s *ScenarioSession) ByeCheck(method string, token string) { l := icslog.GetIcsLog() // fmt.Printf(">>>>>> SESSION BYE INFO - token [%s]\n", token) l.Printf(icslog.LOG_LEVEL_INFO, -1, ">>>>>> SESSION BYE INFO - token [%s] ", token) s.m.Lock() delete(s.session, token) s.m.Unlock() }