package action import ( "pbx-api-gin/internal/app/ami/model" "pbx-api-gin/internal/app/mysql" "pbx-api-gin/internal/app/stc/active" alstatus "pbx-api-gin/internal/app/stc/sendstatus" "pbx-api-gin/internal/pkg/configs" "pbx-api-gin/pkg/lfshook" "pbx-api-gin/pkg/utils" "github.com/sirupsen/logrus" "github.com/tqcenglish/amigo-go" "github.com/tqcenglish/amigo-go/pkg" ) var AminInstance *amigo.Amigo //type Operation func(src, dst string, whisper, bargein bool) func HandleAMI(event map[string]string) { //return if not actived if !active.Actived { return } switch event["Event"] { /*case "DialBegin": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["DestCallerIDNum"]) { alstatus.AlarmStatus(event["CallerIDNum"], "dial") // Alarm dial ICP start } */ case "UserEvent": lfshook.NewLogger().Infof("========event:%s File:%s", event["Event"], event["FILENAME"]) if event["UserEvent"] == "SetRecordFile" { //get record file name alstatus.SendRecordFile(event["FILENAME"], event["RecordType"]) } case "Newchannel": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0300" { // Alarm dial queue start; PAD dialing alstatus.PaStatus(event["CallerIDNum"], "PAD", "start") alstatus.AlarmStatus(event["CallerIDNum"], "dial") } case "Hangup": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["Exten"]) { // PAD status , hangup alstatus.PaStatus(event["CallerIDNum"], "PAD", "end") } case "QueueCallerJoin": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue alstatus.AlarmStatus(event["CallerIDNum"], "queue") } case "QueueCallerLeave": // Alarm timeout , redirect to OCC if utils.IsPAIU(event["CallerIDNum"]) { // caller is PAD var infoExt model.Extension PacuNum := utils.GetPacuByPad(event["CallerIDNum"]) _, er := mysql.DBOrmInstance.Where("exten = ?", PacuNum).Get(&infoExt) if er != nil { lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error()) } if infoExt.Status == "Idle" { //check PACU status if active.CabNum == "1" && active.Actived { Dial("0401", PacuNum, "default", PacuNum, event["CallerIDNum"], "1") // PACU dial OCC1 } else if active.CabNum == "8" && active.Actived { Dial("0401", PacuNum, "default", PacuNum, event["CallerIDNum"], "8") // PACU dial OCC8 } } else { if active.CabNum == "1" && active.Actived { RedirectInQueue(event["CallerIDNum"], "0401", "default", "1") // PAD dial OCC1 } else if active.CabNum == "8" && active.Actived { RedirectInQueue(event["CallerIDNum"], "0401", "default", "8") // PAD dial OCC8 } } } case "ConfbridgeJoin": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start lfshook.NewLogger().Infof("====PA status:%s=====", "start") alstatus.PaStatus(event["CallerIDNum"], "PA", "start") } if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { //CPA start lfshook.NewLogger().Infof("====CPA status:%s=====", "start") alstatus.PaStatus(event["CallerIDNum"], "CPA", "start") } case "ConfbridgeLeave": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end lfshook.NewLogger().Infof("====PA status =====%s", "end") alstatus.PaStatus(event["CallerIDNum"], "PA", "end") } if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { //CPA end lfshook.NewLogger().Infof("====CPA status =====%s", "end") alstatus.PaStatus(event["CallerIDNum"], "CPA", "end") } case "DialEnd": lfshook.NewLogger().Infof("=========%s", event["Event"]) //Cab Cab start if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "ANSWER" { alstatus.PaStatus(event["CallerIDNum"], "C2C", "start") } case "BridgeLeave": //Cab Cab end if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" { alstatus.PaStatus(event["CallerIDNum"], "C2C", "end") } case "ExtensionStatus": lfshook.NewLogger().Infof("=========event:%s status:%s", event["Event"], event["StatusText"]) status := &model.Extension{ Extension: event["Exten"], Status: event["StatusText"], } _, err := mysql.DBOrmInstance.Where("exten = ?", status.Extension).Cols("status").Update(status) if err != nil { lfshook.NewLogger().Infof("update extension status err : %+v", err.Error()) } if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" { if len(event["Exten"]) > 3 { alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable } } case "BridgeEnter": //ICP and PAD connected if utils.IsPACU(event["CallerIDNum"]) { if utils.IsPAIU(event["CallerIDName"]) { //relate to PACU Dial ICP caller name in AlarmHandle lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"]) alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule", "") // 1车ICP接听PAIU } } else if utils.IsPAIU(event["CallerIDNum"]) { //No PACU available in the cab lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"]) alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected } } } func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) { lfshook.NewLogger().Info("Start AMI") settings := &amigo.Settings{ Host: configs.ConfigGlobal.AsteriskAMIHost, Port: configs.ConfigGlobal.AsteriskAMIPort, Username: configs.ConfigGlobal.AsteriskAMIUser, Password: configs.ConfigGlobal.AsteriskAMISecret, LogLevel: logrus.ErrorLevel} lfshook.NewLogger().Infof("ami setting: %+v", settings) AminInstance = amigo.New(settings, lfshook.NewLogger()) AminInstance.EventOn(func(payload ...interface{}) { // lfshook.NewLogger().Infof("ami event on %+v", payload[0]) event := payload[0].(map[string]string) HandleAMI(event) for _, handle := range handleEvents { go handle(event) } }) AminInstance.ConnectOn(func(payload ...interface{}) { lfshook.NewLogger().Infof("ami connect on %+v", payload[0]) if payload[0] == pkg.Connect_OK { connectOKCallBack() } else { lfshook.NewLogger().Errorf("ami connect failure %+v", payload) } }) AminInstance.Connect() } func Connected() bool { if AminInstance != nil { return AminInstance.Connected() } return false }