index.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package ami
  2. import (
  3. "net"
  4. "pbx-api-gin/internal/app/ami/model"
  5. "pbx-api-gin/internal/app/mysql"
  6. status "pbx-api-gin/internal/app/stc/sendstatus"
  7. "pbx-api-gin/internal/pkg/configs"
  8. "pbx-api-gin/pkg/lfshook"
  9. "github.com/sirupsen/logrus"
  10. "github.com/tqcenglish/amigo-go"
  11. "github.com/tqcenglish/amigo-go/pkg"
  12. )
  13. var AminInstance *amigo.Amigo
  14. func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string), conn net.Conn) {
  15. lfshook.NewLogger().Info("Start AMI")
  16. settings := &amigo.Settings{
  17. Host: configs.ConfigGlobal.AsteriskAMIHost,
  18. Port: configs.ConfigGlobal.AsteriskAMIPort,
  19. Username: configs.ConfigGlobal.AsteriskAMIUser,
  20. Password: configs.ConfigGlobal.AsteriskAMISecret,
  21. LogLevel: logrus.ErrorLevel}
  22. lfshook.NewLogger().Infof("ami setting: %+v", settings)
  23. AminInstance = amigo.New(settings, lfshook.NewLogger())
  24. AminInstance.EventOn(func(payload ...interface{}) {
  25. // lfshook.NewLogger().Infof("ami event on %+v", payload[0])
  26. event := payload[0].(map[string]string)
  27. handleAMI(event, conn)
  28. for _, handle := range handleEvents {
  29. go handle(event)
  30. }
  31. })
  32. AminInstance.ConnectOn(func(payload ...interface{}) {
  33. lfshook.NewLogger().Infof("ami connect on %+v", payload[0])
  34. if payload[0] == pkg.Connect_OK {
  35. connectOKCallBack()
  36. } else {
  37. lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
  38. }
  39. })
  40. AminInstance.Connect()
  41. }
  42. func handleAMI(event map[string]string, conn net.Conn) {
  43. switch event["Event"] {
  44. case "DialBegin":
  45. status.AlarmStatus(event["DestCallerIDNum"], event["StatusText"], conn)
  46. case "DialEnd":
  47. //stc.AlarmStatus(event["DestCallerIDNum"], event["StatusText"], conn) //stop dial ICP(Reset dial status)
  48. case "ExtensionStatus":
  49. status := &model.Extension{
  50. Extension: event["Exten"],
  51. Status: event["StatusText"],
  52. }
  53. _, err := mysql.DBOrmInstance.Where("exten = ?", status.Extension).Cols("status").Update(status)
  54. if err != nil {
  55. lfshook.NewLogger().Infof("update extension status err : %+v", err.Error())
  56. }
  57. //stc.AlarmStatus(event["Exten"], event["StatusText"], conn) // idle + unavailable
  58. case "BridgeEnter":
  59. //stc.AlarmStatus(event["CallerIDNum"], event["StatusText"], conn) // alarm connected
  60. }
  61. }
  62. func Connected() bool {
  63. if AminInstance != nil {
  64. return AminInstance.Connected()
  65. }
  66. return false
  67. }