You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
voicebot/icshttp/handler.go

764 lines
30 KiB
Go

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()
}