index.go 40 KB

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