package ami import ( "net" "pbx-api-gin/internal/app/ami/model" "pbx-api-gin/internal/app/mysql" status "pbx-api-gin/internal/app/stc/sendstatus" "pbx-api-gin/internal/pkg/configs" "pbx-api-gin/pkg/lfshook" "github.com/sirupsen/logrus" "github.com/tqcenglish/amigo-go" "github.com/tqcenglish/amigo-go/pkg" ) var AminInstance *amigo.Amigo 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 handleAMI(event map[string]string, conn net.Conn) { switch event["Event"] { case "DialBegin": status.AlarmStatus(event["DestCallerIDNum"], event["StatusText"], conn) case "DialEnd": //stc.AlarmStatus(event["DestCallerIDNum"], event["StatusText"], conn) //stop dial ICP(Reset dial status) case "ExtensionStatus": 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()) } //stc.AlarmStatus(event["Exten"], event["StatusText"], conn) // idle + unavailable case "BridgeEnter": //stc.AlarmStatus(event["CallerIDNum"], event["StatusText"], conn) // alarm connected } } func Connected() bool { if AminInstance != nil { return AminInstance.Connected() } return false }