index.go 40 KB

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