index.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package action
  2. import (
  3. "net"
  4. alstatus "pbx-api-gin/internal/app/stc/sendstatus"
  5. "pbx-api-gin/internal/pkg/configs"
  6. "pbx-api-gin/pkg/lfshook"
  7. "pbx-api-gin/pkg/utils"
  8. "github.com/sirupsen/logrus"
  9. "github.com/tqcenglish/amigo-go"
  10. "github.com/tqcenglish/amigo-go/pkg"
  11. )
  12. var AminInstance *amigo.Amigo
  13. const pacu1 = "2111"
  14. const pacu2 = "2121"
  15. const pacu3 = "2131"
  16. const pacu4 = "2141"
  17. const pacu5 = "2151"
  18. const pacu6 = "2161"
  19. const pacu7 = "2171"
  20. const pacu8 = "2181"
  21. //type Operation func(src, dst string, whisper, bargein bool)
  22. func HandleAMI(event map[string]string, conn net.Conn) {
  23. switch event["Event"] {
  24. case "DialBegin":
  25. lfshook.NewLogger().Infof("=========%s", event["Event"])
  26. if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["DestCallerIDNum"]) {
  27. alstatus.AlarmStatus(event["CallerIDNum"], "dial", conn) // Alarm dial ICP start
  28. }
  29. case "Newchannel":
  30. lfshook.NewLogger().Infof("=========%s", event["Event"])
  31. if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0300" { // Alarm dial queue start
  32. alstatus.AlarmStatus(event["CallerIDNum"], "dial", conn)
  33. }
  34. case "DialEnd":
  35. lfshook.NewLogger().Infof("=========%s", event["Event"])
  36. if utils.IsPAIU(event["CallerIDNum"]) {
  37. alstatus.AlarmStatus(event["CallerIDNum"], "Idle", conn) // Alarm dial end
  38. }
  39. case "QueueCallerJoin":
  40. lfshook.NewLogger().Infof("=========%s", event["Event"])
  41. if utils.IsPAIU(event["CallerIDNum"]) { // Alarm join the queue
  42. alstatus.AlarmStatus(event["CallerIDNum"], "queue", conn)
  43. switch string(event["CallerIDNum"][2]) { // connect the pacu to pad acording to the pad number
  44. case "1":
  45. ChanSpy(event["CallerIDNum"], pacu1, false, true) //connect pacu to pad
  46. case "2":
  47. ChanSpy(event["CallerIDNum"], pacu2, false, true) //connect pacu to pad
  48. case "3":
  49. ChanSpy(event["CallerIDNum"], pacu3, false, true) //connect pacu to pad
  50. case "4":
  51. ChanSpy(event["CallerIDNum"], pacu4, false, true) //connect pacu to pad
  52. case "5":
  53. ChanSpy(event["CallerIDNum"], pacu5, false, true) //connect pacu to pad
  54. case "6":
  55. ChanSpy(event["CallerIDNum"], pacu6, false, true) //connect pacu to pad
  56. case "7":
  57. ChanSpy(event["CallerIDNum"], pacu7, false, true) //connect pacu to pad
  58. case "8":
  59. ChanSpy(event["CallerIDNum"], pacu8, false, true) //connect pacu to pad
  60. }
  61. }
  62. case "ExtensionStatus":
  63. lfshook.NewLogger().Infof("=========%s", event["Event"])
  64. if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
  65. //status := &model.Extension{
  66. // Extension: event["Exten"],
  67. // Status: event["StatusText"],
  68. //}
  69. //_, err := mysql.DBOrmInstance.Where("exten = ?", status.Extension).Cols("status").Update(status)
  70. //if err != nil {
  71. // lfshook.NewLogger().Infof("update extension status err : %+v", err.Error())
  72. //}
  73. if len(event["Exten"]) > 3 {
  74. alstatus.AlarmStatus(event["Exten"], event["StatusText"], conn) // Alarm idle + unavailable
  75. }
  76. }
  77. case "BridgeEnter":
  78. lfshook.NewLogger().Infof("=========%s", event["Event"])
  79. if utils.IsPAIU(event["CallerIDNum"]) {
  80. alstatus.AlarmStatus(event["CallerIDNum"], "connect", conn) // Alarm connected
  81. }
  82. }
  83. }
  84. func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string), conn net.Conn) {
  85. lfshook.NewLogger().Info("Start AMI")
  86. settings := &amigo.Settings{
  87. Host: configs.ConfigGlobal.AsteriskAMIHost,
  88. Port: configs.ConfigGlobal.AsteriskAMIPort,
  89. Username: configs.ConfigGlobal.AsteriskAMIUser,
  90. Password: configs.ConfigGlobal.AsteriskAMISecret,
  91. LogLevel: logrus.ErrorLevel}
  92. lfshook.NewLogger().Infof("ami setting: %+v", settings)
  93. AminInstance = amigo.New(settings, lfshook.NewLogger())
  94. AminInstance.EventOn(func(payload ...interface{}) {
  95. // lfshook.NewLogger().Infof("ami event on %+v", payload[0])
  96. event := payload[0].(map[string]string)
  97. HandleAMI(event, conn)
  98. for _, handle := range handleEvents {
  99. go handle(event)
  100. }
  101. })
  102. AminInstance.ConnectOn(func(payload ...interface{}) {
  103. lfshook.NewLogger().Infof("ami connect on %+v", payload[0])
  104. if payload[0] == pkg.Connect_OK {
  105. connectOKCallBack()
  106. } else {
  107. lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
  108. }
  109. })
  110. AminInstance.Connect()
  111. }
  112. func Connected() bool {
  113. if AminInstance != nil {
  114. return AminInstance.Connected()
  115. }
  116. return false
  117. }