index.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  1. package action
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "pbx-api-gin/internal/app/stc/active"
  7. "pbx-api-gin/internal/app/stc/priority"
  8. alstatus "pbx-api-gin/internal/app/stc/sendstatus"
  9. "pbx-api-gin/internal/pkg/configs"
  10. "pbx-api-gin/pkg/lfshook"
  11. "pbx-api-gin/pkg/utils"
  12. "sort"
  13. "strings"
  14. "time"
  15. "github.com/sirupsen/logrus"
  16. "github.com/tqcenglish/amigo-go"
  17. "github.com/tqcenglish/amigo-go/pkg"
  18. )
  19. var AminInstance *amigo.Amigo
  20. var trainInfo = ""
  21. func HandleAMI(event map[string]string) {
  22. switch event["Event"] {
  23. case "DTMFBegin": //ICP interrupt PAD
  24. lfshook.NewLogger().Infof("=========%s====caller:%s=====digit:%s==", event["Event"], event["CallerIDNum"], event["Digit"])
  25. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] != "" {
  26. //PA interrupt PAD
  27. switch event["Digit"] {
  28. case "#":
  29. //lfshook.NewLogger().Infof("===PA interrupt PAD====== ")
  30. InterruptRunningTask("PA")
  31. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  32. case "*": //Cab cab interrupt PAD
  33. //lfshook.NewLogger().Infof("===Cab cab interrupt PAD====== ")
  34. InterruptRunningTask("C2C")
  35. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  36. }
  37. }
  38. case "UserEvent": // RCD filename; PA;CPA; CabCab
  39. lfshook.NewLogger().Infof("========event:%s File:%s", event["Event"], event["FILENAME"])
  40. if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA start; check manual PA priority
  41. //PA & CPA interrupt others
  42. if utils.IsICP(event["CallerIDNum"]) { //PA
  43. if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
  44. Hangup(event["CallerIDNum"])
  45. }
  46. if priority.CheckPriority("ManuPa") {
  47. //hangup others if priority is higher
  48. lfshook.NewLogger().Infof("UserEvent event :PA start")
  49. InterruptRunningTask("PA") //PA interrupt other
  50. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  51. } else {
  52. Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
  53. }
  54. } else if utils.IsIO(event["CallerIDNum"]) { // CPA
  55. if priority.CheckPriority("CPA") {
  56. if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
  57. Hangup(event["CallerIDNum"])
  58. } else if active.ActivedCab == "1" && event["CallerIDNum"] == "1411" {
  59. Hangup(event["CallerIDNum"])
  60. } else if active.ActivedCab == "8" && event["CallerIDNum"] == "1481" {
  61. Hangup(event["CallerIDNum"])
  62. }
  63. //hangup others if priority is higher
  64. InterruptRunningTask("CPA") //CPA interrupt other
  65. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  66. } else {
  67. Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
  68. }
  69. }
  70. } else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab start; check cab cab priority
  71. if priority.CheckPriority("CabCab") { // interrupt OCC-PAD
  72. //C2C start PAD interrupt
  73. taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  74. lfshook.NewLogger().Infof("HighestPriorityRunningTask get task :%+v", taskName)
  75. if ok {
  76. if taskName == "PAD-ICP" || taskName == "PAD-TMS" || taskName == "PA" {
  77. InterruptRunningTask("C2C")
  78. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  79. } else {
  80. lfshook.NewLogger().Infof("CabCab hangup other the one caller %s", event["CallerIDNum"])
  81. if event["CallerIDNum"] == "2311" {
  82. Hangup("2381")
  83. } else {
  84. Hangup("2311")
  85. }
  86. }
  87. }
  88. } else { // hangup caller; C2C start failed
  89. lfshook.NewLogger().Infof("CabCab hangup caller %s", event["CallerIDNum"])
  90. Hangup(event["CallerIDNum"])
  91. }
  92. break
  93. //Get record file name ,encode and upload
  94. } else if event["UserEvent"] == "SetRecordFile" {
  95. if configs.ConfigGlobal.ProcessRecord != "yes" {
  96. break
  97. }
  98. //检测录音文件是否存在;最多检测5次,每次间隔1秒
  99. var fileExists bool
  100. for i := 0; i < 5; i++ {
  101. time.Sleep(time.Second) // 等待1秒
  102. if _, err := os.Stat(event["FILENAME"]); err == nil {
  103. fileExists = true
  104. //lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
  105. break
  106. } else if os.IsNotExist(err) {
  107. //lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
  108. } else {
  109. //lfshook.NewLogger().Infof("Error checking file: %v", err)
  110. }
  111. }
  112. if !fileExists { //5秒内没有生成录音文件
  113. lfshook.NewLogger().Infof("File %s not found after 5 attempts", event["FILENAME"])
  114. break
  115. }
  116. //获取录音文件时长,检测录音文件是否超过3min;
  117. duration, err := utils.GetDuration(event["FILENAME"])
  118. if err != nil {
  119. utils.Logger.Printf("Get duration err: %+v", err)
  120. break
  121. }
  122. //lfshook.NewLogger().Infof("==========duration===== %d", duration)
  123. //转wav文件的采样率到22kHz,并切割位180秒每段
  124. var FileNames []string
  125. if duration >= 600 { //超过600秒的超长文件,不处理
  126. lfshook.NewLogger().Infof("File over 600 sec, Ignored !")
  127. break
  128. } else if duration < 600 { //小于600秒文件进行转换和切割
  129. FileNames, err = utils.ConvertAndSegmentWAV(event["FILENAME"], strings.Replace(event["FILENAME"], ".wav", "", -1))
  130. if err != nil {
  131. lfshook.NewLogger().Infof("Get duration err: %+v", err)
  132. break
  133. }
  134. //lfshook.NewLogger().Infof("=============== File %+v found after convert", FileNames)
  135. }
  136. //执行加密操作,并将录音信息写入日志文件
  137. DstFile := ""
  138. if len(FileNames) > 0 { // 文件切割之后进入循环处理
  139. for _, filepathFull := range FileNames {
  140. file := strings.Replace(filepathFull, ".wav", "", -1)
  141. DstFile = fmt.Sprintf("%s-encrypted.wav", file)
  142. //lfshook.NewLogger().Infof("Bin file====%s", DstFile)
  143. err = utils.AudioFileEncode(DstFile, filepathFull)
  144. if err != nil {
  145. lfshook.NewLogger().Infof("Encode file: %s err: %+v", DstFile, err)
  146. continue
  147. }
  148. //切割&加密之后发送生成的文件名到STC;
  149. alstatus.SendRecordFile(DstFile, event["RecordType"])
  150. trainInfo = fmt.Sprintf("Train Number %s CabNumber %s", active.TrainNum, active.ActivedCab)
  151. if strings.Contains(event["FILENAME"], "PAD") {
  152. _, caller, callee := utils.GetPadInfo(event["FILENAME"])
  153. utils.Logger.Printf("Train Information:%s , MessageType: PAD , CabNumber: %c , LocationCode: %c, Connected: %s, RecordFileName:%s", trainInfo, caller[2], caller[3], callee, DstFile)
  154. } else if strings.Contains(event["FILENAME"], "PA") {
  155. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  156. utils.Logger.Printf("Train Information:%s , MessageType: PA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  157. } else if strings.Contains(event["FILENAME"], "C2C") {
  158. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  159. utils.Logger.Printf("Train Information:%s , MessageType: CabCab, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  160. } else if strings.Contains(event["FILENAME"], "CPA") {
  161. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  162. utils.Logger.Printf("Train Information:%s , MessageType: CPA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  163. } else if strings.Contains(event["FILENAME"], "EMG") {
  164. utils.Logger.Printf("Train Information:%s , MessageType: EMG, RecordFileName: %s", trainInfo, DstFile)
  165. } else if strings.Contains(event["FILENAME"], "STN") {
  166. utils.Logger.Printf("Train Information:%s , MessageType: STN, RecordFileName: %s", trainInfo, DstFile)
  167. } else if strings.Contains(event["FILENAME"], "DCS") {
  168. utils.Logger.Printf("Train Information:%s , MessageType: DCS, RecordFileName: %s", trainInfo, DstFile)
  169. } else if strings.Contains(event["FILENAME"], "SPC") {
  170. utils.Logger.Printf("Train Information:%s , MessageType: SPC, RecordFileName: %s", trainInfo, DstFile)
  171. } else if strings.Contains(event["FILENAME"], "CHK") {
  172. utils.Logger.Printf("Train Information:%s , MessageType: Self Check, RecordFileName: %s", trainInfo, DstFile)
  173. } else if strings.Contains(event["FILENAME"], "TONE") {
  174. utils.Logger.Printf("Train Information:%s , MessageType: TONE Test, RecordFileName: %s", trainInfo, DstFile)
  175. }
  176. }
  177. //Get path & generate recording XML file
  178. path := filepath.Dir(event["FILENAME"])
  179. rcdFileName := filepath.Base(event["FILENAME"])
  180. xmlFileName := strings.Replace(rcdFileName, "wav", "xml", 1)
  181. xmlFilePath := path + xmlFileName
  182. err := active.GenerateXML(xmlFilePath)
  183. if err != nil {
  184. lfshook.NewLogger().Infof("Generate recording XML err:%+v", err)
  185. }
  186. } else {
  187. lfshook.NewLogger().Infof("No files to upload!!!")
  188. break
  189. }
  190. }
  191. case "Hangup":
  192. lfshook.NewLogger().Infof("%s", event["Event"])
  193. //OCC answer PAD, hangup, redirect the next PAD to OCC
  194. if utils.IsIO(event["CallerIDNum"]) && (event["ConnectedLineNum"] == "ano1" || event["ConnectedLineNum"] == "ano8") && event["Context"] == "default" {
  195. lfshook.NewLogger().Infof("Hangup OCC-PAD event: %+v", event)
  196. // OCC hangup detected, hangup other running channels
  197. InterruptRunningTask("PAD-OCC")
  198. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  199. res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
  200. if res.Calls == "0" { //OCC queue is empty
  201. alstatus.OccPad("end")
  202. priority.OCCAnswer = 0
  203. priority.PADOccStart = 0
  204. //clean confbridge
  205. taskTmp, _ := priority.RegistryTask.Get("PAD-OCC")
  206. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  207. //check resume
  208. priority.RegistryTask.StopAndUnregister("PAD-OCC")
  209. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  210. if ok {
  211. if taskName == "EMG" {
  212. EMGConfbridgeReinvite(task.ConfbridgeID)
  213. } else if taskName == "CPA" {
  214. CPAConfbridgeReinvite(task.ConfbridgeID)
  215. }
  216. }
  217. break
  218. } else { //OCC queue is not empty
  219. time.Sleep(time.Millisecond * 100) //wait io idle
  220. //lfshook.NewLogger().Infof("====Start OCC-PAD===next==%+v", res)
  221. if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
  222. time.Sleep(time.Second)
  223. PADChan := ""
  224. for _, chanEntry := range res.Entrys {
  225. lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
  226. if chanEntry.Position == "1" {
  227. PADChan = chanEntry.Channel
  228. break
  229. }
  230. }
  231. if PADChan != "" {
  232. Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
  233. alstatus.AlarmStatus(Ext, "connect")
  234. go RedirectInQueue(PADChan, "1411", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
  235. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
  236. } else {
  237. lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
  238. }
  239. break
  240. } else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
  241. time.Sleep(time.Second)
  242. PADChan := ""
  243. for _, chanEntry := range res.Entrys {
  244. lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
  245. if chanEntry.Position == "1" {
  246. PADChan = chanEntry.Channel
  247. break
  248. }
  249. }
  250. if PADChan != "" {
  251. Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
  252. alstatus.AlarmStatus(Ext, "connect")
  253. go RedirectInQueue(PADChan, "1481", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
  254. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
  255. } else {
  256. lfshook.NewLogger().Infof("OCC QueueStatus PADCchan NULL")
  257. }
  258. break
  259. }
  260. }
  261. }
  262. if utils.IsPAIU(event["CallerIDNum"]) { // PAD hangup, check if PAD all end, send PAD end status
  263. number := strings.Split(strings.Split(event["Channel"], "-")[0], "/")[1]
  264. //lfshook.NewLogger().Infof("===hangup PAD =======================%s", number)
  265. if utils.IsPAIU(number) {
  266. res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
  267. res1, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
  268. lfshook.NewLogger().Infof("===Hangup PAD====== ICP Queue calls:%s OCC Queue calls:%s", res.Calls, res1.Calls)
  269. //if res.Calls == "0" && res1.Calls == "0" {
  270. if priority.PADStart == 1 {
  271. //SetPadTimer()
  272. alstatus.PaStatus("", "PAD", "end")
  273. priority.PADStart = 0
  274. //priority.PADTMSStart = 0
  275. //clean confbridge
  276. //PAD-ICP
  277. taskTmp, ok := priority.RegistryTask.Get("PAD-ICP")
  278. if ok {
  279. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  280. }
  281. priority.RegistryTask.StopAndUnregister("PAD-ICP")
  282. // PAD-TMS
  283. taskTmp, ok = priority.RegistryTask.Get("PAD-TMS")
  284. if ok {
  285. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  286. }
  287. priority.RegistryTask.StopAndUnregister("PAD-TMS")
  288. //PAD-OCC
  289. taskTmp, ok = priority.RegistryTask.Get("PAD-OCC")
  290. if ok {
  291. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  292. }
  293. priority.RegistryTask.StopAndUnregister("PAD-OCC")
  294. //check resume
  295. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  296. if ok {
  297. if taskName == "EMG" {
  298. EMGConfbridgeReinvite(task.ConfbridgeID)
  299. } else if taskName == "CPA" {
  300. CPAConfbridgeReinvite(task.ConfbridgeID)
  301. }
  302. }
  303. }
  304. priority.ICPAnswer = 0
  305. priority.OCCAnswer = 0
  306. break
  307. //}
  308. }
  309. }
  310. case "QueueCallerJoin":
  311. lfshook.NewLogger().Infof("=========%s", event["Event"])
  312. if priority.OCCAnswer == 1 && event["Queue"] == "0300" { //New PAD Goto the OCC queue in the first time, if OCC answered
  313. alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
  314. go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", event["CallerIDNum"])
  315. break
  316. }
  317. if utils.IsPAIU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue
  318. alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
  319. ICPQueue, err := QueueStatus("0300", "") // check ICP queue, get entries
  320. if err != nil {
  321. lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
  322. return
  323. }
  324. if priority.ICPAnswer == 0 && ICPQueue.Calls == "1" { //ICP did not answer any first call to the ICP queue ; Ready to Set Occ Queue Timer
  325. toRunpriority := priority.GetPriorityByKey("PAD-ICP")
  326. time.Sleep(time.Millisecond * 500) //wait high priority task start
  327. _, taskTmp, ok := priority.RegistryTask.HighestPriorityRunningTask()
  328. if ok {
  329. //lfshook.NewLogger().Infof("=1==QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
  330. if taskTmp.Priority < toRunpriority { //higher priority task running ,do not set timer
  331. break
  332. }
  333. }
  334. //lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
  335. //if (priority.RunningTypePriority > toRunpriority || priority.RunningTypePriority == 0) && event["ChannelStateDesc"] != "Up" {
  336. //active.SetTimer = true
  337. //lfshook.NewLogger().Logger.Infof("=========Start PAD timer !=============")
  338. if active.QueueTimer != nil {
  339. if active.QueueTimer.Stop() {
  340. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  341. } else {
  342. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  343. }
  344. }
  345. lfshook.NewLogger().Logger.Infof("=========Start PAD timer !======%d=======", active.PADTimeout)
  346. //active.QueueTimer = time.AfterFunc(time.Duration(active.PADTimeout)*time.Second, func() { // check the PAD 30s timeout
  347. active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
  348. //if both not active , return
  349. if active.ActivedCab == "" {
  350. return
  351. }
  352. res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
  353. if err != nil {
  354. lfshook.NewLogger().Infof("OCC QueueStatus err:%+v", err)
  355. return
  356. }
  357. if res.Calls == "0" { // OCC queue empty
  358. resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
  359. if err != nil {
  360. lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
  361. return
  362. }
  363. sort.Slice(resCaller.Entrys, func(i, j int) bool {
  364. return resCaller.Entrys[i].Position < resCaller.Entrys[j].Position
  365. })
  366. for _, caller := range resCaller.Entrys {
  367. priority.ICPAnswer = 0
  368. //lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
  369. lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
  370. //order by pos
  371. RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
  372. time.Sleep(time.Millisecond * 100) //200 ms delay
  373. }
  374. }
  375. })
  376. }
  377. break
  378. }
  379. //first PAD caller goto OCC
  380. //OCC dial PACUs;
  381. //PAD Page OCC+ICPs;
  382. if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0301" && priority.OCCAnswer == 0 { // The first PAD to OCC ,caller is PAD
  383. if priority.CheckPriority("PAD-OCC") {
  384. InterruptRunningTask("PAD-OCC") //PAD-OCC interrupt other
  385. time.Sleep(time.Millisecond * 100) //wait endpoimt release
  386. priority.OCCAnswer = 1
  387. time.Sleep(time.Millisecond * 300)
  388. if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
  389. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  390. go RedirectInQueue(event["Channel"], "1411", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  391. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
  392. } else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
  393. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  394. go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  395. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC8
  396. }
  397. } else {
  398. lfshook.NewLogger().Infof("====PAD-OCC Priority false===")
  399. }
  400. }
  401. case "ConfbridgeJoin":
  402. lfshook.NewLogger().Infof("=========%+v", event["Event"])
  403. lfshook.NewLogger().Infof("=========%+v", event)
  404. //set priority and send PA status msg
  405. switch event["CallerIDName"] {
  406. case "EMG":
  407. if event["Exten"] == "0502" {
  408. //================================
  409. task := priority.TaskInfo{
  410. RunChannel: event["Channel"],
  411. LocalChan: event["Channel"],
  412. RunType: "EMG",
  413. Priority: priority.AllTasks.EMG.Priority,
  414. ConfbridgeID: event["Conference"],
  415. Running: true,
  416. }
  417. priority.RegistryTask.Register("EMG", task)
  418. alstatus.PaStatus("", "EMG", "start")
  419. //check PAD timer
  420. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.EMG.Priority {
  421. if active.QueueTimer != nil {
  422. if active.QueueTimer.Stop() {
  423. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  424. } else {
  425. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  426. }
  427. }
  428. }
  429. return
  430. }
  431. case "SPC":
  432. if event["Exten"] == "0505" {
  433. //================================
  434. task := priority.TaskInfo{
  435. RunChannel: event["Channel"],
  436. LocalChan: event["Channel"],
  437. RunType: "SPC",
  438. Priority: priority.AllTasks.SPC.Priority,
  439. ConfbridgeID: event["Conference"],
  440. Running: true,
  441. }
  442. priority.RegistryTask.Register("SPC", task)
  443. alstatus.PaStatus("", "SPC", "start")
  444. //check PAD timer
  445. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.SPC.Priority {
  446. if active.QueueTimer != nil {
  447. if active.QueueTimer.Stop() {
  448. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  449. } else {
  450. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  451. }
  452. }
  453. }
  454. return
  455. }
  456. case "DCS":
  457. if event["Exten"] == "0504" {
  458. //================================
  459. task := priority.TaskInfo{
  460. RunChannel: event["Channel"],
  461. LocalChan: event["Channel"],
  462. RunType: "DCS",
  463. Priority: priority.AllTasks.DCS.Priority,
  464. ConfbridgeID: event["Conference"],
  465. Running: true,
  466. }
  467. priority.RegistryTask.Register("DCS", task)
  468. alstatus.PaStatus("", "DCS", "start")
  469. //check PAD timer
  470. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.DCS.Priority {
  471. if active.QueueTimer != nil {
  472. if active.QueueTimer.Stop() {
  473. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  474. } else {
  475. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  476. }
  477. }
  478. }
  479. return
  480. }
  481. case "STN":
  482. if event["Exten"] == "0503" {
  483. //================================
  484. task := priority.TaskInfo{
  485. RunChannel: event["Channel"],
  486. LocalChan: event["Channel"],
  487. RunType: "STN",
  488. Priority: priority.AllTasks.STN.Priority,
  489. ConfbridgeID: event["Conference"],
  490. Running: true,
  491. }
  492. priority.RegistryTask.Register("STN", task)
  493. alstatus.PaStatus("", "STN", "start")
  494. //check PAD timer
  495. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.STN.Priority {
  496. if active.QueueTimer != nil {
  497. if active.QueueTimer.Stop() {
  498. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  499. } else {
  500. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  501. }
  502. }
  503. }
  504. return
  505. }
  506. case "CHK":
  507. if event["Exten"] == "0510" {
  508. //================================
  509. task := priority.TaskInfo{
  510. RunChannel: event["Channel"],
  511. LocalChan: event["Channel"],
  512. RunType: "CHK",
  513. Priority: priority.AllTasks.CHK.Priority,
  514. ConfbridgeID: event["Conference"],
  515. Running: true,
  516. }
  517. priority.RegistryTask.Register("CHK", task)
  518. alstatus.PaStatus("", "CHK", "start")
  519. //check PAD timer
  520. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CHK.Priority {
  521. if active.QueueTimer != nil {
  522. if active.QueueTimer.Stop() {
  523. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  524. } else {
  525. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  526. }
  527. }
  528. }
  529. return
  530. }
  531. case "VOL": // tone-test
  532. if event["Exten"] == "0513" {
  533. //================================
  534. task := priority.TaskInfo{
  535. RunChannel: event["Channel"],
  536. LocalChan: event["Channel"],
  537. RunType: "VOL",
  538. Priority: priority.AllTasks.VOL.Priority,
  539. ConfbridgeID: event["Conference"],
  540. Running: true,
  541. }
  542. priority.RegistryTask.Register("VOL", task)
  543. alstatus.PaStatus("", "VOL", "start")
  544. //check PAD timer
  545. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.VOL.Priority {
  546. if active.QueueTimer != nil {
  547. if active.QueueTimer.Stop() {
  548. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  549. } else {
  550. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  551. }
  552. }
  553. }
  554. return
  555. }
  556. }
  557. /*
  558. //get confbridge id for join back to confbridge
  559. if event["Context"] == "pad-page-occ-icp" && utils.IsPAIU(event["CallerIDNum"]) {
  560. //active.ICPCONBID = event["Conference"] //pad-occ
  561. priority.AllTasks.PADOCC.ConfbridgeID = event["Conference"]
  562. }
  563. */
  564. //Send PA start msg to STC
  565. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start
  566. alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
  567. //================================
  568. task := priority.TaskInfo{
  569. RunChannel: event["Channel"],
  570. LocalChan: event["Channel"],
  571. RunType: "PA",
  572. Priority: priority.AllTasks.PA.Priority,
  573. ConfbridgeID: event["Conference"],
  574. Running: true,
  575. }
  576. priority.RegistryTask.Register("PA", task)
  577. //check PAD timer
  578. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.PA.Priority {
  579. if active.QueueTimer != nil {
  580. if active.QueueTimer.Stop() {
  581. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  582. } else {
  583. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  584. }
  585. }
  586. }
  587. break
  588. } else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
  589. alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
  590. //================================
  591. task := priority.TaskInfo{
  592. RunChannel: event["Channel"],
  593. LocalChan: event["Channel"],
  594. RunType: "CPA",
  595. Priority: priority.AllTasks.CPA.Priority,
  596. ConfbridgeID: event["Conference"],
  597. Running: true,
  598. }
  599. priority.RegistryTask.Register("CPA", task)
  600. //check PAD timer
  601. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CPA.Priority {
  602. if active.QueueTimer != nil {
  603. if active.QueueTimer.Stop() {
  604. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  605. } else {
  606. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  607. }
  608. }
  609. }
  610. return
  611. }
  612. //ICP answer PAD;PACUs connected ICP
  613. //PAD chanspy ICP1
  614. //ICP8 call PAD
  615. if event["ConnectedLineNum"] == "ani1" && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
  616. lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
  617. alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
  618. //================================
  619. task := priority.TaskInfo{
  620. RunChannel: event["Channel"],
  621. LocalChan: event["Channel"],
  622. RunType: "PAD-ICP",
  623. Priority: priority.AllTasks.PADICP.Priority,
  624. ConfbridgeID: event["Conference"],
  625. Running: true,
  626. }
  627. priority.RegistryTask.Register("PAD-ICP", task)
  628. lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
  629. go RedirectInQueue(event["ConnectedLineName"], "2311", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP1
  630. if ExtenStatus("2381") == "Idle" {
  631. go Dial("0402", event["ConnectedLineName"], "call-pad-rule", event["ConnectedLineName"], event["ConnectedLineName"], "8") // PAD call ICP8
  632. }
  633. }
  634. if event["ConnectedLineNum"] == "ani8" && event["Exten"] == "0511" { //PAD ansered by ICP8; PACUs connected ICP8
  635. lfshook.NewLogger().Infof("====PAD answered by ICP8:%s=====", event["ConnectedLineName"])
  636. alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
  637. //================================
  638. task := priority.TaskInfo{
  639. RunChannel: event["Channel"],
  640. LocalChan: event["Channel"],
  641. RunType: "PAD-ICP",
  642. Priority: priority.AllTasks.PADICP.Priority,
  643. ConfbridgeID: event["Conference"],
  644. Running: true,
  645. }
  646. priority.RegistryTask.Register("PAD-ICP", task)
  647. lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
  648. go RedirectInQueue(event["ConnectedLineName"], "2381", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP8
  649. if ExtenStatus("2311") == "Idle" {
  650. go Dial("0402", event["ConnectedLineName"], "call-pad-rule", event["ConnectedLineName"], event["ConnectedLineName"], "1") // PAD call ICP1
  651. }
  652. break
  653. }
  654. //OCC answer PAD;Set the task channel
  655. if utils.IsPAIU(event["CallerIDNum"]) && utils.IsIO(event["Exten"]) && event["Context"] == "pad-page-occ-icp" { //PAD Page OCC1+ICPs connected
  656. lfshook.NewLogger().Infof("====PAD answered by OCC:====")
  657. //================================
  658. task := priority.TaskInfo{
  659. RunChannel: event["Channel"],
  660. LocalChan: event["Channel"],
  661. RunType: "PAD-OCC",
  662. Priority: priority.AllTasks.PADOCC.Priority,
  663. ConfbridgeID: event["Conference"],
  664. Running: true,
  665. }
  666. priority.RegistryTask.Register("PAD-OCC", task)
  667. break
  668. }
  669. case "ConfbridgeLeave":
  670. lfshook.NewLogger().Infof("=========%s", event["Event"])
  671. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
  672. alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
  673. priority.RegistryTask.StopAndUnregister("PA")
  674. SetPadTimer()
  675. // check resume
  676. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  677. if ok {
  678. if taskName == "EMG" {
  679. EMGConfbridgeReinvite(task.ConfbridgeID)
  680. } else if taskName == "CPA" {
  681. CPAConfbridgeReinvite(task.ConfbridgeID)
  682. }
  683. }
  684. } else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
  685. alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
  686. //CPA
  687. taskTmp, ok := priority.RegistryTask.Get("CPA")
  688. if ok {
  689. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  690. }
  691. priority.RegistryTask.StopAndUnregister("CPA")
  692. SetPadTimer()
  693. //check resume
  694. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  695. if ok {
  696. if taskName == "EMG" {
  697. EMGConfbridgeReinvite(task.ConfbridgeID)
  698. }
  699. }
  700. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  701. } else if event["CallerIDName"] == "EMG" && event["Exten"] == "0502" { // EMG broadcast hangup
  702. alstatus.PaStatus("", "EMG", "end")
  703. //EMG
  704. taskTmp, ok := priority.RegistryTask.Get("EMG")
  705. if ok {
  706. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  707. }
  708. priority.RegistryTask.StopAndUnregister("EMG")
  709. SetPadTimer()
  710. //check resume
  711. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  712. if ok {
  713. if taskName == "CPA" {
  714. CPAConfbridgeReinvite(task.ConfbridgeID)
  715. }
  716. }
  717. } else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
  718. alstatus.PaStatus("", "STN", "end")
  719. //STN
  720. taskTmp, ok := priority.RegistryTask.Get("STN")
  721. if ok {
  722. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  723. }
  724. priority.RegistryTask.StopAndUnregister("STN")
  725. SetPadTimer()
  726. //check resume
  727. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  728. if ok {
  729. if taskName == "CPA" {
  730. CPAConfbridgeReinvite(task.ConfbridgeID)
  731. } else if taskName == "EMG" {
  732. EMGConfbridgeReinvite(task.ConfbridgeID)
  733. }
  734. }
  735. } else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
  736. alstatus.PaStatus("", "DCS", "end")
  737. //DSC
  738. taskTmp, ok := priority.RegistryTask.Get("DCS")
  739. if ok {
  740. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  741. }
  742. priority.RegistryTask.StopAndUnregister("DCS")
  743. SetPadTimer()
  744. //check resume
  745. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  746. if ok {
  747. if taskName == "CPA" {
  748. CPAConfbridgeReinvite(task.ConfbridgeID)
  749. } else if taskName == "EMG" {
  750. EMGConfbridgeReinvite(task.ConfbridgeID)
  751. }
  752. }
  753. } else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
  754. alstatus.PaStatus("", "SPC", "end")
  755. //SPC
  756. taskTmp, ok := priority.RegistryTask.Get("SPC")
  757. if ok {
  758. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  759. }
  760. priority.RegistryTask.StopAndUnregister("SPC")
  761. SetPadTimer()
  762. //check resume
  763. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  764. if ok {
  765. if taskName == "CPA" {
  766. CPAConfbridgeReinvite(task.ConfbridgeID)
  767. } else if taskName == "EMG" {
  768. EMGConfbridgeReinvite(task.ConfbridgeID)
  769. }
  770. }
  771. } else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
  772. alstatus.PaStatus("", "CHK", "end")
  773. //CHK
  774. taskTmp, ok := priority.RegistryTask.Get("CHK")
  775. if ok {
  776. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  777. }
  778. priority.RegistryTask.StopAndUnregister("CHK")
  779. SetPadTimer()
  780. //check resume
  781. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  782. if ok {
  783. if taskName == "CPA" {
  784. CPAConfbridgeReinvite(task.ConfbridgeID)
  785. } else if taskName == "EMG" {
  786. EMGConfbridgeReinvite(task.ConfbridgeID)
  787. }
  788. }
  789. } else if event["CallerIDName"] == "VOL" && event["Exten"] == "0513" {
  790. alstatus.PaStatus("", "VOL", "end")
  791. //VOL
  792. taskTmp, ok := priority.RegistryTask.Get("VOL")
  793. if ok {
  794. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  795. }
  796. priority.RegistryTask.StopAndUnregister("VOL")
  797. SetPadTimer()
  798. //check resume
  799. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  800. if ok {
  801. if taskName == "CPA" {
  802. CPAConfbridgeReinvite(task.ConfbridgeID)
  803. } else if taskName == "EMG" {
  804. EMGConfbridgeReinvite(task.ConfbridgeID)
  805. }
  806. }
  807. }
  808. case "DialEnd":
  809. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  810. //Cab Cab start
  811. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == " 0400" && event["DialStatus"] == "ANSWER" {
  812. //================================
  813. task := priority.TaskInfo{
  814. RunChannel: "",
  815. LocalChan: "",
  816. RunType: "C2C",
  817. Priority: priority.AllTasks.C2C.Priority,
  818. ConfbridgeID: "",
  819. Running: true,
  820. }
  821. priority.RegistryTask.Register("C2C", task)
  822. alstatus.PaStatus(event["CallerIDNum"], "C2C", "start")
  823. //check PAD timer
  824. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.C2C.Priority {
  825. if active.QueueTimer != nil {
  826. if active.QueueTimer.Stop() {
  827. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  828. } else {
  829. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  830. }
  831. }
  832. }
  833. } else if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "NOANSWER" {
  834. //lfshook.NewLogger().Infof("===%s======%s", event["Event"], event["DialStatus"])
  835. time.Sleep(time.Millisecond * 300)
  836. //check resume
  837. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  838. if ok {
  839. ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
  840. }
  841. }
  842. case "BridgeLeave":
  843. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  844. //Cab Cab end
  845. if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" {
  846. alstatus.PaStatus(event["CallerIDNum"], "C2C", "end")
  847. priority.RegistryTask.StopAndUnregister("C2C")
  848. time.Sleep(time.Millisecond * 300)
  849. SetPadTimer()
  850. //check resume
  851. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  852. if ok {
  853. ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
  854. }
  855. }
  856. case "ExtensionStatus":
  857. //lfshook.NewLogger().Infof("=========event:%s Ext:%s status:%s ", event["Event"], event["Exten"], event["StatusText"])
  858. //update extension status
  859. if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
  860. if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
  861. alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
  862. }
  863. }
  864. case "BridgeEnter": // TMS-ICP answer PAD; PACU connect ICP
  865. //lfshook.NewLogger().Infof("=========event:%s callerid:%s", event["Event"], event["CallerIDNum"])
  866. //PAD-OCC start
  867. if utils.IsIO(event["CallerIDNum"]) && utils.IsPAIU(event["ConnectedLineNum"]) {
  868. if priority.PADOccStart == 0 {
  869. alstatus.OccPad("start")
  870. priority.PADOccStart = 1
  871. }
  872. }
  873. if utils.IsPACU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) { //ICP and PACU connected
  874. //lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
  875. alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
  876. //=============================
  877. task := priority.TaskInfo{
  878. RunChannel: event["Channel"],
  879. LocalChan: event["Channel"],
  880. RunType: "PAD-TMS",
  881. Priority: priority.AllTasks.PADTMS.Priority,
  882. ConfbridgeID: "",
  883. Running: true,
  884. }
  885. priority.RegistryTask.Register("PAD-TMS", task)
  886. lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
  887. if active.ActivedCab == "1" {
  888. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  889. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  890. } else if active.ActivedCab == "8" {
  891. go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP8
  892. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2311", "2311", "1") //ICP1---call----PAD
  893. } else if active.ActivedCab == "" {
  894. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  895. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  896. }
  897. } else if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0405" { // PAD connect ICP-TMS;PACU not available
  898. //=============================
  899. task := priority.TaskInfo{
  900. RunChannel: event["Channel"],
  901. LocalChan: event["Channel"],
  902. RunType: "PAD-TMS",
  903. Priority: priority.AllTasks.PADTMS.Priority,
  904. ConfbridgeID: "",
  905. Running: true,
  906. }
  907. priority.RegistryTask.Register("PAD-TMS", task)
  908. lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
  909. alstatus.AlarmStatus(event["CallerIDNum"], "connect") // PAD connect ICP-TMS
  910. }
  911. }
  912. }
  913. func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) {
  914. lfshook.NewLogger().Info("Start AMI")
  915. settings := &amigo.Settings{
  916. Host: configs.ConfigGlobal.AsteriskAMIHost,
  917. Port: configs.ConfigGlobal.AsteriskAMIPort,
  918. Username: configs.ConfigGlobal.AsteriskAMIUser,
  919. Password: configs.ConfigGlobal.AsteriskAMISecret,
  920. LogLevel: logrus.ErrorLevel}
  921. //lfshook.NewLogger().Infof("ami setting: %+v", settings)
  922. AminInstance = amigo.New(settings, lfshook.NewLogger())
  923. AminInstance.EventOn(func(payload ...interface{}) {
  924. // lfshook.NewLogger().Infof("ami event on %+v", payload[0])
  925. event := payload[0].(map[string]string)
  926. go HandleAMI(event)
  927. for _, handle := range handleEvents {
  928. go handle(event)
  929. }
  930. })
  931. AminInstance.ConnectOn(func(payload ...interface{}) {
  932. //lfshook.NewLogger().Infof("ami connect on %+v", payload[0])
  933. if payload[0] == pkg.Connect_OK {
  934. connectOKCallBack()
  935. } else {
  936. lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
  937. active.Master = false
  938. }
  939. })
  940. AminInstance.Connect()
  941. }
  942. func Connected() bool {
  943. if AminInstance != nil {
  944. return AminInstance.Connected()
  945. }
  946. return false
  947. }