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