| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- package action
- import (
- "fmt"
- "pbx-api-gin/internal/app/stc/priority"
- 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
- var trainInfo = ""
- func HandleAMI(event map[string]string) {
- switch event["Event"] {
- case "UserEvent": // RCD filename; PA;CPA; CabCab
- //lfshook.NewLogger().Infof("========event:%s File:%s", event["Event"], event["FILENAME"])
- if event["UserEvent"] == "CallType" && event["Type"] == "C2C" {
- if event["CallerIDNum"] == "9011" {
- Hangup("9071")
- } else if event["CallerIDNum"] == "9071" {
- Hangup("9011")
- }
- }
- case "QueueCallerJoin":
- lfshook.NewLogger().Infof("=========%s", event["Event"])
- resCaller, err := QueueStatus("0300", "")
- if err != nil {
- lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
- return
- }
- if resCaller == nil {
- return
- }
- if resCaller.Entrys != nil {
- pads := ""
- count := 0
- for _, caller := range resCaller.Entrys {
- pads = fmt.Sprintf("%s%s&", pads, caller.CallerIDNum)
- count++
- }
- alstatus.SendQueueStatus(pads, count)
- }
- case "QueueCallerLeave":
- lfshook.NewLogger().Infof("=========%s", event["Event"])
- resCaller, err := QueueStatus("0300", "")
- if err != nil {
- lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
- return
- }
- if resCaller == nil {
- return
- }
- if resCaller.Entrys != nil {
- pads := ""
- count := 0
- for _, caller := range resCaller.Entrys {
- pads = fmt.Sprintf("%s%s&", pads, caller.CallerIDNum)
- count++
- }
- alstatus.SendQueueStatus(pads, count)
- }
- case "ConfbridgeJoin":
- lfshook.NewLogger().Infof("=========%+v", event["Event"])
- //set priority and send PA status msg
- switch event["CallerIDName"] {
- case "PMC":
- if event["Exten"] == "0500" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "PMC",
- Priority: priority.AllTasks.PMC.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("PMC", task)
- if priority.TaskCreating == "PMC" {
- utils.LoggerDebug.Printf("PMC Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- alstatus.PaStatus("", "PMC", "start")
- return
- }
- case "PA":
- if event["Exten"] == "0501" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "PA",
- Priority: priority.AllTasks.PA.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("PA", task)
- if priority.TaskCreating == "PA" {
- utils.LoggerDebug.Printf("PA Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- alstatus.PaStatus("", "PA", "start")
- return
- }
- case "SVM":
- if event["Exten"] == "0502" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "SVM",
- Priority: priority.AllTasks.SVM.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("SVM", task)
- if priority.TaskCreating == "SVM" {
- utils.LoggerDebug.Printf("SVM Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- alstatus.PaStatus("", "SVM", "start")
- return
- }
- case "SVA":
- if event["Exten"] == "0503" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "SVA",
- Priority: priority.AllTasks.SVA.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("SVA", task)
- alstatus.PaStatus("", "SVA", "start")
- if priority.TaskCreating == "SVA" {
- utils.LoggerDebug.Printf("SVA Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- return
- }
- case "DCS":
- if event["Exten"] == "0504" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "DCS",
- Priority: priority.AllTasks.DCS.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("DCS", task)
- alstatus.PaStatus("", "DCS", "start")
- if priority.TaskCreating == "DCS" {
- utils.LoggerDebug.Printf("DCS Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- return
- }
- case "STNA":
- if event["Exten"] == "0505" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "STNA",
- Priority: priority.AllTasks.STNA.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("STNA", task)
- alstatus.PaStatus("", "STNA", "start")
- if priority.TaskCreating == "STNA" {
- utils.LoggerDebug.Printf("STNA Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- return
- }
- case "STNS":
- if event["Exten"] == "0506" {
- //================================
- task := priority.TaskInfo{
- RunChannel: event["Channel"],
- LocalChan: event["Channel"],
- RunType: "STNS",
- Priority: priority.AllTasks.STNS.Priority,
- ConfbridgeID: event["Conference"],
- Running: true,
- }
- utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
- priority.RegistryTask.Register("STNS", task)
- alstatus.PaStatus("", "STNS", "start")
- if priority.TaskCreating == "STNS" {
- utils.LoggerDebug.Printf("CHSTNSK Connected : Clean priority.TaskCreating = '' !")
- priority.TaskCreating = ""
- }
- return
- }
- }
- case "ConfbridgeLeave":
- lfshook.NewLogger().Infof("=========%s", event["Event"])
- if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { // PMC end
- alstatus.PaStatus(event["CallerIDNum"], "PMC", "end")
- priority.RegistryTask.StopAndUnregister("PMC")
- } else if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0501" { //PA end
- alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
- priority.RegistryTask.StopAndUnregister("PA")
- } else if event["Exten"] == "0502" { // EMG broadcast hangup
- alstatus.PaStatus("", "SVM", "end")
- priority.RegistryTask.StopAndUnregister("SVM")
- } else if event["Exten"] == "0503" {
- alstatus.PaStatus("", "SVA", "end")
- priority.RegistryTask.StopAndUnregister("SVA")
- } else if event["Exten"] == "0504" {
- alstatus.PaStatus("", "DCS", "end")
- priority.RegistryTask.StopAndUnregister("DCS")
- } else if event["Exten"] == "0505" {
- alstatus.PaStatus("", "STNA", "end")
- priority.RegistryTask.StopAndUnregister("STNA")
- } else if event["Exten"] == "0506" {
- alstatus.PaStatus("", "STNS", "end")
- priority.RegistryTask.StopAndUnregister("STNS")
- }
- case "ExtensionStatus":
- //lfshook.NewLogger().Infof("=========event:%s Ext:%s status:%s ", event["Event"], event["Exten"], event["StatusText"])
- //update PAD status
- if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
- if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
- alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
- }
- }
- //update ICP status
- if len(event["Exten"]) > 3 && utils.IsICP(event["Exten"]) {
- if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
- alstatus.SendICPStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
- }
- }
- }
- }
- 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)
- go 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)
- //active.Master = false
- }
- })
- AminInstance.Connect()
- }
- func Connected() bool {
- if AminInstance != nil {
- return AminInstance.Connected()
- }
- return false
- }
|