call.go 6.7 KB

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