call.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package action
  2. import (
  3. "fmt"
  4. "pbx-api-gin/pkg/lfshook"
  5. "pbx-api-gin/pkg/utils"
  6. "strings"
  7. "time"
  8. )
  9. // Hangup 挂断指定分机或通道
  10. func Hangup(channel string) {
  11. lfshook.NewLogger().Infof("hangup extensions/channel %s", channel)
  12. if !utils.IsChannel(channel) {
  13. channel = fmt.Sprintf(`/^(PJ)?SIP\/%s-.*$/`, channel)
  14. }
  15. action := map[string]string{
  16. "Action": "hangup",
  17. "Channel": channel,
  18. }
  19. lfshook.NewLogger().Infof("hangup action %+v", action)
  20. if _, _, err := AminInstance.Send(action); err != nil {
  21. lfshook.NewLogger().Errorf("Hangup %+v", err)
  22. }
  23. }
  24. // Dial 拨打号码
  25. func Dial(src, dst, dialrule, callerID, callerName string, callType string) {
  26. //chanel := fmt.Sprintf("%s/%s", callType, src)
  27. chanel := fmt.Sprintf("Local/%s@pacu-ani-rule", src)
  28. action := map[string]string{
  29. "Action": "Originate",
  30. "Channel": chanel,
  31. "Exten": dst,
  32. "Context": dialrule,
  33. "CallerID": fmt.Sprintf("%s<%s>", callerName, callerID),
  34. "Priority": "1",
  35. "Variable": fmt.Sprintf("CAB=%s", callType),
  36. "async": "true",
  37. }
  38. lfshook.NewLogger().Infof("dial action %+v", action)
  39. res, _, err := AminInstance.Send(action)
  40. if err != nil {
  41. lfshook.NewLogger().Errorf("%+v", err)
  42. }
  43. lfshook.NewLogger().Info(res)
  44. }
  45. // PACU ChanSpy
  46. func ChanSpy(src, dst string, whisper, bargein bool) {
  47. lfshook.NewLogger().Infof("chan spy src:%s dst:%s", src, dst)
  48. //channel := fmt.Sprintf("%s/%s", utils.DialPrefix, dst)
  49. channel := fmt.Sprintf("Local/%s@aio-rule", dst)
  50. data := fmt.Sprintf("%s/%s,qBE", utils.DialPrefix, src)
  51. /*
  52. if whisper {
  53. data = fmt.Sprintf("%s,w", data)
  54. }
  55. if bargein {
  56. data = fmt.Sprintf("%s,B", data)
  57. }
  58. */
  59. action := map[string]string{
  60. "Action": "Originate",
  61. "Channel": channel, // 不存在的通话
  62. "Application": "ChanSpy",
  63. "Data": data, // 存在的通话
  64. "CallerID": dst,
  65. "Async": "true",
  66. }
  67. lfshook.NewLogger().Infof("PACU ChanSpy action %+v", action)
  68. _, _, err := AminInstance.Send(action)
  69. if err != nil {
  70. lfshook.NewLogger().Errorf("%+v", err)
  71. }
  72. }
  73. // Page
  74. func Page(src string, extensions []string, duplex bool) {
  75. channel := fmt.Sprintf("%s/%s", utils.DialPrefix, src)
  76. data := make([]string, 0)
  77. for _, exten := range extensions {
  78. data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
  79. }
  80. appData := strings.Join(data, "&")
  81. if duplex {
  82. appData = fmt.Sprintf("%s,db(header-handler^addheader^1)", appData)
  83. } else {
  84. appData = fmt.Sprintf("%s,b(header-handler^addheader^1)", appData)
  85. }
  86. //timeout
  87. appData = fmt.Sprintf("%s,30", appData)
  88. action := map[string]string{
  89. "Action": "Originate",
  90. "Channel": channel,
  91. "Application": "page",
  92. "Data": appData,
  93. "CallerID": src,
  94. "CallerSrc": src,
  95. "Variable": "PJSIP_HEADER(add,answer-after)=0",
  96. "async": "true",
  97. }
  98. lfshook.NewLogger().Infof("page action %+v", action)
  99. res, _, err := AminInstance.Send(action)
  100. if err != nil {
  101. lfshook.NewLogger().Errorf("%+v", err)
  102. }
  103. lfshook.NewLogger().Infof("%+v", res)
  104. }
  105. // Play 转 AGI 播放
  106. func Play(name, UUID string, extensions []string, hangupAll bool, autoanswer string) {
  107. if hangupAll {
  108. lfshook.NewLogger().Infof("hangup all before play to %+v", extensions)
  109. for _, extension := range extensions {
  110. Hangup(extension)
  111. }
  112. time.Sleep(3 * time.Second)
  113. }
  114. channel := "Local/broadcast@broadcast"
  115. data := make([]string, 0)
  116. for _, exten := range extensions {
  117. data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
  118. }
  119. appData := strings.Join(data, "&")
  120. //timeout
  121. /*if autoanswer == "yes" {
  122. appData = fmt.Sprintf("%s,%s,%d", appData, "b(header-handler^addheader^1)", configs.ConfigGlobal.AsteriskBroadcastTimeout)
  123. } else {
  124. appData = fmt.Sprintf("%s,,%d", appData, configs.ConfigGlobal.AsteriskBroadcastTimeout)
  125. }*/
  126. variable := fmt.Sprintf("task_UUID=%s", UUID)
  127. action := map[string]string{
  128. "Action": "Originate",
  129. "Channel": channel,
  130. "Application": "page",
  131. "Data": appData,
  132. "Variable": variable,
  133. //"CallerID": fmt.Sprintf("%s<%s>", configs.ConfigGlobal.AsteriskBroadcastName, configs.ConfigGlobal.AsteriskBroadcastID),
  134. "CallerID": fmt.Sprintf("%s<%s>", name, name),
  135. "CallSrc": name,
  136. "async": "true",
  137. }
  138. lfshook.NewLogger().Infof("play action %+v", action)
  139. _, _, err := AminInstance.Send(action)
  140. if err != nil {
  141. lfshook.NewLogger().Errorf("%+v", err)
  142. }
  143. }
  144. // Redirect 转接
  145. func Redirect(channel, dst, dialrule string) (err error) {
  146. callerID := "redirect"
  147. lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
  148. if !utils.IsChannel(channel) {
  149. callerID = channel
  150. if channel, err = GetChannelByExten(channel); err != nil {
  151. return err
  152. }
  153. }
  154. action := map[string]string{
  155. "Action": "Redirect",
  156. "Channel": channel,
  157. "Exten": dst,
  158. "Context": dialrule,
  159. "CallerID": callerID,
  160. "Priority": "1",
  161. "async": "true",
  162. }
  163. lfshook.NewLogger().Infof("redirect %+v", action)
  164. res, _, err := AminInstance.Send(action)
  165. if err != nil {
  166. lfshook.NewLogger().Error(err)
  167. }
  168. lfshook.NewLogger().Info(res)
  169. return err
  170. }
  171. // Redirect 转接
  172. func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
  173. //callerID := "redirect"
  174. lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
  175. if !utils.IsChannel(channel) {
  176. //callerID = channel
  177. if channel, err = GetChannelByExtenNotBridged(channel); err != nil {
  178. return err
  179. }
  180. }
  181. action := map[string]string{
  182. "Action": "Redirect",
  183. "Channel": channel,
  184. "Exten": dst,
  185. "Context": dialrule,
  186. "CallerID": callerID,
  187. "Priority": "1",
  188. "async": "true",
  189. }
  190. lfshook.NewLogger().Infof("redirect %+v", action)
  191. res, _, err := AminInstance.Send(action)
  192. if err != nil {
  193. lfshook.NewLogger().Error(err)
  194. }
  195. lfshook.NewLogger().Info(res)
  196. return err
  197. }
  198. // Redirect 转接
  199. func BlindTransfer(channel, dst, dialrule string) (err error) {
  200. lfshook.NewLogger().Infof("BlindTransfer src %s to dst %s", channel, dst)
  201. if !utils.IsChannel(channel) {
  202. if channel, err = GetExtenChan(channel); err != nil {
  203. return err
  204. }
  205. }
  206. action := map[string]string{
  207. "Action": "BlindTransfer",
  208. "Channel": channel,
  209. "Exten": dst,
  210. "Context": dialrule,
  211. }
  212. lfshook.NewLogger().Infof("BlindTransfer %+v", action)
  213. res, _, err := AminInstance.Send(action)
  214. if err != nil {
  215. lfshook.NewLogger().Error(err)
  216. }
  217. lfshook.NewLogger().Info(res)
  218. return err
  219. }
  220. // Atxfer
  221. func Atxfer(channel, dst, dialrule string) (err error) {
  222. // 获取通道
  223. if !utils.IsChannel(channel) {
  224. if channel, err = GetChannelByExten(channel); err != nil {
  225. return err
  226. }
  227. }
  228. action := map[string]string{
  229. "Action": "Atxfer",
  230. "Channel": channel,
  231. "Exten": dst,
  232. "Context": dialrule,
  233. }
  234. lfshook.NewLogger().Infof("atxfer action %+v", action)
  235. res, _, err := AminInstance.Send(action)
  236. if err != nil {
  237. lfshook.NewLogger().Errorf("%+v", err)
  238. return err
  239. }
  240. lfshook.NewLogger().Debugf("atxfer res %+v", res)
  241. return err
  242. }