package action import ( "net" 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 const pacu1 = "2111" const pacu2 = "2121" const pacu3 = "2131" const pacu4 = "2141" const pacu5 = "2151" const pacu6 = "2161" const pacu7 = "2171" const pacu8 = "2181" //type Operation func(src, dst string, whisper, bargein bool) func HandleAMI(event map[string]string, conn net.Conn) { 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", conn) // Alarm dial ICP start } case "Newchannel": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0300" { // Alarm dial queue start alstatus.AlarmStatus(event["CallerIDNum"], "dial", conn) } case "DialEnd": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) { alstatus.AlarmStatus(event["CallerIDNum"], "Idle", conn) // Alarm dial end } case "QueueCallerJoin": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) { // Alarm join the queue alstatus.AlarmStatus(event["CallerIDNum"], "queue", conn) switch string(event["CallerIDNum"][2]) { // connect the pacu to pad acording to the pad number case "1": ChanSpy(event["CallerIDNum"], pacu1, false, true) //connect pacu to pad case "2": ChanSpy(event["CallerIDNum"], pacu2, false, true) //connect pacu to pad case "3": ChanSpy(event["CallerIDNum"], pacu3, false, true) //connect pacu to pad case "4": ChanSpy(event["CallerIDNum"], pacu4, false, true) //connect pacu to pad case "5": ChanSpy(event["CallerIDNum"], pacu5, false, true) //connect pacu to pad case "6": ChanSpy(event["CallerIDNum"], pacu6, false, true) //connect pacu to pad case "7": ChanSpy(event["CallerIDNum"], pacu7, false, true) //connect pacu to pad case "8": ChanSpy(event["CallerIDNum"], pacu8, false, true) //connect pacu to pad } } case "ExtensionStatus": lfshook.NewLogger().Infof("=========%s", event["Event"]) if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" { //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 len(event["Exten"]) > 3 { alstatus.AlarmStatus(event["Exten"], event["StatusText"], conn) // Alarm idle + unavailable } } case "BridgeEnter": lfshook.NewLogger().Infof("=========%s", event["Event"]) if utils.IsPAIU(event["CallerIDNum"]) { alstatus.AlarmStatus(event["CallerIDNum"], "connect", conn) // Alarm connected } } } func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string), conn net.Conn) { 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, conn) 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 }