call.go 6.6 KB

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