@ -7,6 +7,7 @@ import (
"io/ioutil"
"math/big"
"net/http"
"strconv"
"strings"
"sync"
"time"
@ -38,39 +39,59 @@ type handleInfo struct {
h http . HandlerFunc
}
type Resquest struct {
Token string ` json:"token" `
OprMngCode string ` json:"oprMngCode" `
Method string ` json:"method" `
TalkText string ` json:"talkText" `
CallId string ` json:"callId" `
TelNo string ` json:"telNo" `
MentType string ` json:"mentType" `
RecordFilePath string ` json:"recordFilePath" `
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 Transrate struct {
TargetDnis string ` json:"target_dnis" `
}
type Response struct {
ResultCode int ` json:"resultCode" `
Token string ` json:"token" `
Action string ` json:"action" `
AnounceMents string ` json:"announceMents" `
Data ResData ` json:"DATA" `
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" `
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 int ` json:"voiceName" `
Speed int ` json:"speed" `
Volume int ` json:"volume" `
Pitch int ` 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
}
type ScenarioSession struct {
@ -149,15 +170,13 @@ func TTSFunc4(w http.ResponseWriter, r *http.Request) {
/////////////////////////////////////////////
//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 := Re s quest{ }
request := Re quest{ }
resBody , err := ioutil . ReadAll ( r . Body )
if err != nil {
fmt . Println ( err )
@ -165,76 +184,71 @@ func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) {
defer r . Body . Close ( )
err = json . Unmarshal ( resBody , & request )
fmt . Printf ( "%+v\n" , 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] ", 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 ( )
////////////////////////////////////
///////////// EXCEPT ///////////////
////////////////////////////////////
if conf . ExceptTest . TestInfo . Value {
// eType := conf.ExceptTest.TestInfo.Type
if request . Method == "INIT" {
response . ResultCode = conf . ExceptTest . TestInfo . ResultCode
response . Token = conf . ExceptTest . TestInfo . Token
response . Action = conf . ExceptTest . TestInfo . Action
response . AnounceMents = conf . ExceptTest . TestInfo . Announcement
response . Data . BargeIn = conf . ExceptTest . TestInfo . Bargein
response . Data . RecodingFile = conf . ExceptTest . TestInfo . Recodingfile
response . Data . SttMaxTime = conf . ExceptTest . TestInfo . Sttmaxtime
s . session [ conf . ExceptTest . TestInfo . Token ] = ResStatus { Count : 1 , Status : scnarioConf . Order [ 0 ] , NotUnderstand : 0 }
} else if request . TalkText == "ERROR_TTS" || request . TalkText == "ERROR_STT" {
response . ResultCode = 200
response . Token = request . Token
response . AnounceMents = "서비스에 문제가 발생하여 매장으로 연결해드릴게요."
response . Action = "TRANSFER"
response . Data . BargeIn = ""
response . Data . RecodingFile = ""
response . Data . SttMaxTime = 10
} else if request . Method != "INIT" && request . TalkText == "" {
response . ResultCode = 200
response . Token = request . Token
if s . session [ request . Token ] . NotUnderstand == 3 {
response . AnounceMents = "잘 이해하지 못했습니다. 정확한 상담을 위해 매장으로 연결해드릴게요."
response . Action = "END"
} else {
response . AnounceMents = "잘 이해하지 못했습니다. 다시 말씀해주세요."
response . Action = "STT"
s . session [ request . Token ] = ResStatus { Count : 1 , Status : scnarioConf . Order [ 0 ] , NotUnderstand : s . session [ request . Token ] . NotUnderstand + 1 }
}
response . Data . BargeIn = ""
response . Data . RecodingFile = ""
response . Data . SttMaxTime = 10
}
// switch eType {
// case "sizeup":
// if request.Method == "INIT" {
// response.ResultCode = conf.ExceptTest.TestInfo.ResultCode
// response.Token = conf.ExceptTest.TestInfo.Token
// response.Action = conf.ExceptTest.TestInfo.Action
// response.AnounceMents = conf.ExceptTest.TestInfo.Announcement
// response.Data.BargeIn = conf.ExceptTest.TestInfo.Bargein
// response.Data.RecodingFile = conf.ExceptTest.TestInfo.Recodingfile
// response.Data.SttMaxTime = conf.ExceptTest.TestInfo.Sttmaxtime
// s.session[conf.ExceptTest.TestInfo.Token] = ResStatus{Count: 1, Status: scnarioConf[dnis].Action[0], NotUnderstand: 0}
// } else if request.TalkText == "ERROR_TTS" || request.TalkText == "ERROR_STT" {
// response.ResultCode = 200
// response.Token = request.Token
// response.AnounceMents = "서비스에 문제가 발생하여 매장으로 연결해드릴게요."
// response.Action = "TRANSFER"
// response.Data.BargeIn = ""
// response.Data.RecodingFile = ""
// response.Data.SttMaxTime = 10
// } else if request.Method == "REFER" {
// response.ResultCode = 200
// response.Token = request.Token + "000000000000000000000000000000"
// response.Action = ""
// response.AnounceMents = ""
// response.Token = request.Token
// response.AnounceMents = "서비스에 문제가 발생하여 매장으로 연결해드릴게요."
// response.Action = "TRANSFER"
// response.Data.BargeIn = ""
// response.Data.RecodingFile = ""
// response.Data.SttMaxTime = 10
// } else if request.Method != "INIT" && request.TalkText == "" {
// response.ResultCode = 200
// response.Token = request.Token
// if s.session[request.Token].NotUnderstand == 3 {
// response.AnounceMents = "잘 이해하지 못했습니다. 정확한 상담을 위해 매장으로 연결해드릴게요."
// response.Action = "END"
// } else {
// response.AnounceMents = "잘 이해하지 못했습니다. 다시 말씀해주세요."
// response.Action = "STT"
// s.session[request.Token] = ResStatus{Count: 1, Status: scnarioConf[dnis].Action[0], NotUnderstand: s.session[request.Token].NotUnderstand + 1}
// }
// response.Data.BargeIn = ""
// response.Data.RecodingFile = ""
// response.Data.SttMaxTime = 10
// case "sizedown":
// case "space":
// case "null":
// }
} else {
////////////////////////////////////
//////// SCENARIO MAPPING///////////
////////////////////////////////////
// 현재 들어온 method로 분기
// next 시나리오로 넘겨주기
fmt . Printf ( "response %+v" , request )
fmt . Println ( request . Method )
if request . Method == "HANGUP" {
response . ResultCode = 200
response . Token = request . Token
@ -244,109 +258,402 @@ func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) {
response . Data . RecodingFile = ""
response . Data . SttMaxTime = 10
} else if request . Method != "INIT" && request . TalkText == "" {
response . ResultCode = 200
response . Token = request . Token
if s . session [ request . Token ] . NotUnderstand == 3 {
response . AnounceMents = "잘 이해하지 못했습니다. 정확한 상담을 위해 매장으로 연결해드릴게요."
response . Action = "END"
if request . TalkText == "" {
request . TalkText = "잘못된 값 입력 "
}
fmt . Println ( dnis )
if dnis == "AISB" || dnis == "07075999956" || dnis == "821462" || dnis == "1462" {
dnis = "9013"
}
fmt . Println ( dnis )
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 if dnis == "sim3" {
//시뮬레이터
response . ResultCode = 200
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 + 1 ] . Action }
} else {
s . session [ request . Token ] = ResStatus { LoopCount : s . session [ request . Token ] . LoopCount + 1 , Count : 1 , Status : scnarioConf [ dnis ] [ s . session [ request . Token ] . Count ] . Action }
}
} else {
response . AnounceMents = "잘 이해하지 못했습니다. 다시 말씀해주세요."
response . Action = "STT"
s . session [ request . Token ] = ResStatus { Count : 1 , Status : scnarioConf . Order [ 0 ] , NotUnderstand : s . session [ request . Token ] . NotUnderstand + 1 }
response . ResultCode = 200
response . Token = request . Token
response . Action = scnarioConf [ dnis ] [ 1 ] . Action
response . AnounceMents = scnarioConf [ dnis ] [ 1 ] . AnounceMents
response . AnnounceFilePath = scnarioConf [ dnis ] [ 1 ] . AudioFilePath
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 }
//s.m.Unlock()
}
response . Data . BargeIn = ""
response . Data . RecodingFile = ""
response . Data . SttMaxTime = 10
} else {
if request . Method == "HANGUP" {
s . ByeCheck ( request . Method , request . Token )
} else {
switch request . Method {
case "INIT" :
token := createToken ( request . CallId )
response . ResultCode = 200
response . Token = token
response . Action = scnarioConf . Order [ 1 ]
response . AnounceMents = scnarioConf . Value [ 0 ]
response . Data . BargeIn = scnarioConf . BargeIn [ 0 ]
response . Data . RecodingFile = "Y"
response . Data . SttMaxTime = scnarioConf . SttMaxTime [ 0 ]
s . m . Lock ( )
s . session [ token ] = ResStatus { Count : 1 , Status : scnarioConf . Order [ 0 ] , NotUnderstand : 0 }
s . m . Unlock ( )
case "STT" :
response . ResultCode = 200
response . Token = request . Token
response . Action = scnarioConf . Order [ s . session [ request . Token ] . Count + 1 ]
response . AnounceMents = scnarioConf . Value [ s . session [ request . Token ] . Count ]
response . Data . BargeIn = scnarioConf . BargeIn [ s . session [ request . Token ] . Count ]
fmt . Println ( "RECV METHOD" )
fmt . Println ( dnis )
// if dnis != "9012" && dnis != "9013" && dnis != "9014" {
// dnis = "sim"
// } else
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"
}
fmt . Println ( scnarioConf [ dnis ] )
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"
//s.m.Lock()
s . session [ token ] = ResStatus { Count : 1 , Status : scnarioConf [ dnis ] [ 0 ] . Action , NotUnderstand : 0 , PreEventNum : 1 }
// s.m.Unlock()
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"
response . Data . SttMaxTime = scnarioConf . SttMaxTime [ s . session [ request . Token ] . Count ]
s . m . Lock ( )
s . session [ request . Token ] = ResStatus { Count : s . session [ request . Token ] . Count + 1 , Status : scnarioConf . Order [ s . session [ request . Token ] . Count + 1 ] }
s . m . Unlock ( )
case "DTMF" :
response . ResultCode = 200
response . Token = request . Token
response . Action = scnarioConf . Order [ s . session [ request . Token ] . Count + 1 ]
response . AnounceMents = scnarioConf . Value [ s . session [ request . Token ] . Count ]
response . Data . BargeIn = "N"
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"
response . Data . SttMaxTime = 3
s . m . Lock ( )
s . session [ request . Token ] = ResStatus { Count : s . session [ request . Token ] . Count + 1 , Status : scnarioConf . Order [ s . session [ request . Token ] . Count + 1 ] }
s . m . Unlock ( )
case "REFER" :
response . ResultCode = 200
response . Token = request . Token
response . Action = "END"
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 . Order [ s . session [ request . Token ] . Count + 1 ] }
s . m . Unlock ( )
case "BYE" : // 전화 종료 요청
response . ResultCode = 200
response . Token = request . Token
response . Action = "END"
response . AnounceMents = "접수가 완료되었습니다."
response . Data . BargeIn = "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"
response . Data . SttMaxTime = 0
// case "HANGUP":
// response.ResultCode = 200
// response.Token = request.Token
// response.Action = ""
// response.AnounceMents = ""
// response.Data.BargeIn = ""
// response.Data.RecodingFile = ""
// response.Data.SttMaxTime = 0
// if ByeCheck(request.Method, request.Token) {
// }
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.m.Lock()
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()
case "TRNASFER2" : // 전화 종료 요청
response . ResultCode = 200
response . Token = request . Token
response . Action = "TRANSFER2"
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 }
// s.m.Unlock()
response . Token = request . Token
response . Action = "END"
response . AnounceMents = "접수가 완료되었습니다."
response . Data . BargeIn = "N"
response . Data . RecodingFile = "Y"
response . Data . SttMaxTime = 0
}
}
}
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 ) )
if scnarioConf . TimeValue [ s . session [ request . Token ] . Count ] {
l . Printf ( icslog . LOG_LEVEL_INFO , - 1 , "Time Sleep %d \r\n" , scnarioConf . TimeSleep [ s . session [ request . Token ] . Count ] )
time . Sleep ( time . Second * time . Duration ( time . Duration ( scnarioConf . TimeSleep [ s . session [ request . Token ] . Count ] ) ) )
}
// if s.session[request.Token].Count < len(scnarioConf[dnis]) && scnarioConf[dnis][s.session[request.Token].Count].TimeValue {
// l.Printf(icslog.LOG_LEVEL_INFO, -1, "Time Sleep %d \r\n", scnarioConf[dnis][s.session[request.Token].Count].TimeSleep)
// time.Sleep(time.Second * time.Duration(time.Duration(scnarioConf[dnis][s.session[request.Token].Count].TimeSleep)))
// } else {
// }
time . Sleep ( time . Second * 1 )
// send response
fmt . Fprintln ( w , string ( resMarshal ) )
@ -354,22 +661,9 @@ func (s *ScenarioSession) BOTPFunc(w http.ResponseWriter, r *http.Request) {
func createToken ( callId string ) string {
token := ""
// length := []int{8, 4, 4, 4, 12}
// codeAlphabet := "abcdefghijklmnopqrstuvwxyz"
// codeAlphabet += "0123456789"
// for i, v := range length {
// fmt.Println(i, v)
// for j := 0; j < v; j++ {
// token += string(codeAlphabet[cryptoRandSecure(int64(len(codeAlphabet)))])
// }
// if v != 12 {
// token += "-"
// }
// }
times := fmt . Sprintf ( "%d" , time . Now ( ) . UnixNano ( ) / 1000000 )
tokens := strings . Split ( callId , "@" ) [ 0 ] + times
token = tokens [ 0 : 8 ] + "-" + tokens [ 8 : 1 2] + "-" + tokens [ 12 : 16 ] + "-" + tokens [ 16 : 2 0] + "-" + tokens [ 20: 32 ]
token = tokens [ 0 : 8 ] + "-" + tokens [ 8 : 10 ] + "-" + tokens [ 10 : 23 ]
return token
}