index.go 43 KB

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