index.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package action
  2. import (
  3. "fmt"
  4. "pbx-api-gin/internal/app/stc/priority"
  5. alstatus "pbx-api-gin/internal/app/stc/sendstatus"
  6. "pbx-api-gin/internal/pkg/configs"
  7. "pbx-api-gin/pkg/lfshook"
  8. "pbx-api-gin/pkg/utils"
  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. var trainInfo = ""
  15. func HandleAMI(event map[string]string) {
  16. switch event["Event"] {
  17. case "UserEvent": // RCD filename; PA;CPA; CabCab
  18. //lfshook.NewLogger().Infof("========event:%s File:%s", event["Event"], event["FILENAME"])
  19. if event["UserEvent"] == "CallType" && event["Type"] == "C2C" {
  20. if event["CallerIDNum"] == "9011" {
  21. Hangup("9071")
  22. } else if event["CallerIDNum"] == "9071" {
  23. Hangup("9011")
  24. }
  25. }
  26. case "QueueCallerJoin":
  27. lfshook.NewLogger().Infof("=========%s", event["Event"])
  28. resCaller, err := QueueStatus("0300", "")
  29. if err != nil {
  30. lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
  31. return
  32. }
  33. if resCaller == nil {
  34. return
  35. }
  36. if resCaller.Entrys != nil {
  37. pads := ""
  38. count := 0
  39. for _, caller := range resCaller.Entrys {
  40. pads = fmt.Sprintf("%s%s&", pads, caller.CallerIDNum)
  41. count++
  42. }
  43. alstatus.SendQueueStatus(pads, count)
  44. }
  45. case "QueueCallerLeave":
  46. lfshook.NewLogger().Infof("=========%s", event["Event"])
  47. resCaller, err := QueueStatus("0300", "")
  48. if err != nil {
  49. lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
  50. return
  51. }
  52. if resCaller == nil {
  53. return
  54. }
  55. if resCaller.Entrys != nil {
  56. pads := ""
  57. count := 0
  58. for _, caller := range resCaller.Entrys {
  59. pads = fmt.Sprintf("%s%s&", pads, caller.CallerIDNum)
  60. count++
  61. }
  62. alstatus.SendQueueStatus(pads, count)
  63. }
  64. case "ConfbridgeJoin":
  65. lfshook.NewLogger().Infof("=========%+v", event["Event"])
  66. //set priority and send PA status msg
  67. switch event["CallerIDName"] {
  68. case "PMC":
  69. if event["Exten"] == "0500" {
  70. //================================
  71. task := priority.TaskInfo{
  72. RunChannel: event["Channel"],
  73. LocalChan: event["Channel"],
  74. RunType: "PMC",
  75. Priority: priority.AllTasks.PMC.Priority,
  76. ConfbridgeID: event["Conference"],
  77. Running: true,
  78. }
  79. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  80. priority.RegistryTask.Register("PMC", task)
  81. if priority.TaskCreating == "PMC" {
  82. utils.LoggerDebug.Printf("PMC Connected : Clean priority.TaskCreating = '' !")
  83. priority.TaskCreating = ""
  84. }
  85. alstatus.PaStatus("", "PMC", "start")
  86. return
  87. }
  88. case "PA":
  89. if event["Exten"] == "0501" {
  90. //================================
  91. task := priority.TaskInfo{
  92. RunChannel: event["Channel"],
  93. LocalChan: event["Channel"],
  94. RunType: "PA",
  95. Priority: priority.AllTasks.PA.Priority,
  96. ConfbridgeID: event["Conference"],
  97. Running: true,
  98. }
  99. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  100. priority.RegistryTask.Register("PA", task)
  101. if priority.TaskCreating == "PA" {
  102. utils.LoggerDebug.Printf("PA Connected : Clean priority.TaskCreating = '' !")
  103. priority.TaskCreating = ""
  104. }
  105. alstatus.PaStatus("", "PA", "start")
  106. return
  107. }
  108. case "SVM":
  109. if event["Exten"] == "0502" {
  110. //================================
  111. task := priority.TaskInfo{
  112. RunChannel: event["Channel"],
  113. LocalChan: event["Channel"],
  114. RunType: "SVM",
  115. Priority: priority.AllTasks.SVM.Priority,
  116. ConfbridgeID: event["Conference"],
  117. Running: true,
  118. }
  119. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  120. priority.RegistryTask.Register("SVM", task)
  121. if priority.TaskCreating == "SVM" {
  122. utils.LoggerDebug.Printf("SVM Connected : Clean priority.TaskCreating = '' !")
  123. priority.TaskCreating = ""
  124. }
  125. alstatus.PaStatus("", "SVM", "start")
  126. return
  127. }
  128. case "SVA":
  129. if event["Exten"] == "0503" {
  130. //================================
  131. task := priority.TaskInfo{
  132. RunChannel: event["Channel"],
  133. LocalChan: event["Channel"],
  134. RunType: "SVA",
  135. Priority: priority.AllTasks.SVA.Priority,
  136. ConfbridgeID: event["Conference"],
  137. Running: true,
  138. }
  139. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  140. priority.RegistryTask.Register("SVA", task)
  141. alstatus.PaStatus("", "SVA", "start")
  142. if priority.TaskCreating == "SVA" {
  143. utils.LoggerDebug.Printf("SVA Connected : Clean priority.TaskCreating = '' !")
  144. priority.TaskCreating = ""
  145. }
  146. return
  147. }
  148. case "DCS":
  149. if event["Exten"] == "0504" {
  150. //================================
  151. task := priority.TaskInfo{
  152. RunChannel: event["Channel"],
  153. LocalChan: event["Channel"],
  154. RunType: "DCS",
  155. Priority: priority.AllTasks.DCS.Priority,
  156. ConfbridgeID: event["Conference"],
  157. Running: true,
  158. }
  159. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  160. priority.RegistryTask.Register("DCS", task)
  161. alstatus.PaStatus("", "DCS", "start")
  162. if priority.TaskCreating == "DCS" {
  163. utils.LoggerDebug.Printf("DCS Connected : Clean priority.TaskCreating = '' !")
  164. priority.TaskCreating = ""
  165. }
  166. return
  167. }
  168. case "STNA":
  169. if event["Exten"] == "0505" {
  170. //================================
  171. task := priority.TaskInfo{
  172. RunChannel: event["Channel"],
  173. LocalChan: event["Channel"],
  174. RunType: "STNA",
  175. Priority: priority.AllTasks.STNA.Priority,
  176. ConfbridgeID: event["Conference"],
  177. Running: true,
  178. }
  179. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  180. priority.RegistryTask.Register("STNA", task)
  181. alstatus.PaStatus("", "STNA", "start")
  182. if priority.TaskCreating == "STNA" {
  183. utils.LoggerDebug.Printf("STNA Connected : Clean priority.TaskCreating = '' !")
  184. priority.TaskCreating = ""
  185. }
  186. return
  187. }
  188. case "STNS":
  189. if event["Exten"] == "0506" {
  190. //================================
  191. task := priority.TaskInfo{
  192. RunChannel: event["Channel"],
  193. LocalChan: event["Channel"],
  194. RunType: "STNS",
  195. Priority: priority.AllTasks.STNS.Priority,
  196. ConfbridgeID: event["Conference"],
  197. Running: true,
  198. }
  199. utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
  200. priority.RegistryTask.Register("STNS", task)
  201. alstatus.PaStatus("", "STNS", "start")
  202. if priority.TaskCreating == "STNS" {
  203. utils.LoggerDebug.Printf("CHSTNSK Connected : Clean priority.TaskCreating = '' !")
  204. priority.TaskCreating = ""
  205. }
  206. return
  207. }
  208. }
  209. case "ConfbridgeLeave":
  210. lfshook.NewLogger().Infof("=========%s", event["Event"])
  211. if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { // PMC end
  212. alstatus.PaStatus(event["CallerIDNum"], "PMC", "end")
  213. priority.RegistryTask.StopAndUnregister("PMC")
  214. } else if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0501" { //PA end
  215. alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
  216. priority.RegistryTask.StopAndUnregister("PA")
  217. } else if event["Exten"] == "0502" { // EMG broadcast hangup
  218. alstatus.PaStatus("", "SVM", "end")
  219. priority.RegistryTask.StopAndUnregister("SVM")
  220. } else if event["Exten"] == "0503" {
  221. alstatus.PaStatus("", "SVA", "end")
  222. priority.RegistryTask.StopAndUnregister("SVA")
  223. } else if event["Exten"] == "0504" {
  224. alstatus.PaStatus("", "DCS", "end")
  225. priority.RegistryTask.StopAndUnregister("DCS")
  226. } else if event["Exten"] == "0505" {
  227. alstatus.PaStatus("", "STNA", "end")
  228. priority.RegistryTask.StopAndUnregister("STNA")
  229. } else if event["Exten"] == "0506" {
  230. alstatus.PaStatus("", "STNS", "end")
  231. priority.RegistryTask.StopAndUnregister("STNS")
  232. }
  233. case "ExtensionStatus":
  234. //lfshook.NewLogger().Infof("=========event:%s Ext:%s status:%s ", event["Event"], event["Exten"], event["StatusText"])
  235. //update PAD status
  236. if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
  237. if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
  238. alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
  239. }
  240. }
  241. //update ICP status
  242. if len(event["Exten"]) > 3 && utils.IsICP(event["Exten"]) {
  243. if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
  244. alstatus.SendICPStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
  245. }
  246. }
  247. }
  248. }
  249. func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) {
  250. lfshook.NewLogger().Info("Start AMI")
  251. settings := &amigo.Settings{
  252. Host: configs.ConfigGlobal.AsteriskAMIHost,
  253. Port: configs.ConfigGlobal.AsteriskAMIPort,
  254. Username: configs.ConfigGlobal.AsteriskAMIUser,
  255. Password: configs.ConfigGlobal.AsteriskAMISecret,
  256. LogLevel: logrus.ErrorLevel}
  257. //lfshook.NewLogger().Infof("ami setting: %+v", settings)
  258. AminInstance = amigo.New(settings, lfshook.NewLogger())
  259. AminInstance.EventOn(func(payload ...interface{}) {
  260. // lfshook.NewLogger().Infof("ami event on %+v", payload[0])
  261. event := payload[0].(map[string]string)
  262. go HandleAMI(event)
  263. for _, handle := range handleEvents {
  264. go handle(event)
  265. }
  266. })
  267. AminInstance.ConnectOn(func(payload ...interface{}) {
  268. //lfshook.NewLogger().Infof("ami connect on %+v", payload[0])
  269. if payload[0] == pkg.Connect_OK {
  270. connectOKCallBack()
  271. } else {
  272. lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
  273. //active.Master = false
  274. }
  275. })
  276. AminInstance.Connect()
  277. }
  278. func Connected() bool {
  279. if AminInstance != nil {
  280. return AminInstance.Connected()
  281. }
  282. return false
  283. }