| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | 
							- package action
 
- import (
 
- 	"fmt"
 
- 	"pbx-api-gin/pkg/lfshook"
 
- 	"pbx-api-gin/pkg/utils"
 
- 	"strings"
 
- 	"time"
 
- )
 
- // Hangup 挂断指定分机或通道
 
- func Hangup(channel string) {
 
- 	lfshook.NewLogger().Infof("hangup extensions/channel %s", channel)
 
- 	if !utils.IsChannel(channel) {
 
- 		channel = fmt.Sprintf(`/^(PJ)?SIP\/%s-.*$/`, channel)
 
- 	}
 
- 	action := map[string]string{
 
- 		"Action":  "hangup",
 
- 		"Channel": channel,
 
- 	}
 
- 	lfshook.NewLogger().Infof("hangup action %+v", action)
 
- 	if _, _, err := AminInstance.Send(action); err != nil {
 
- 		lfshook.NewLogger().Errorf("Hangup %+v", err)
 
- 	}
 
- }
 
- // Dial 拨打号码
 
- func Dial(src, dst, dialrule, callerID, callerName string, callType string) {
 
- 	chanel := fmt.Sprintf("%s/%s@ani-rule", "Local", src)
 
- 	//chanel := fmt.Sprintf("Local/%s@pacu-ani-rule", src)
 
- 	action := map[string]string{
 
- 		"Action":   "Originate",
 
- 		"Channel":  chanel,
 
- 		"Exten":    dst,
 
- 		"Context":  dialrule,
 
- 		"CallerID": fmt.Sprintf("%s<%s>", callerName, callerID),
 
- 		"Priority": "1",
 
- 		"async":    "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("dial action %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Errorf("%+v", err)
 
- 	}
 
- 	lfshook.NewLogger().Info(res)
 
- }
 
- // PACU ChanSpy
 
- func ChanSpy(src, dst string, whisper, bargein bool) {
 
- 	lfshook.NewLogger().Infof("chan spy src:%s dst:%s", src, dst)
 
- 	//channel := fmt.Sprintf("%s/%s", utils.DialPrefix, dst)
 
- 	channel := fmt.Sprintf("Local/%s@aio-rule", dst)
 
- 	data := fmt.Sprintf("%s/%s,qBE", utils.DialPrefix, src)
 
- 	/*
 
- 		if whisper {
 
- 			data = fmt.Sprintf("%s,w", data)
 
- 		}
 
- 		if bargein {
 
- 			data = fmt.Sprintf("%s,B", data)
 
- 		}
 
- 	*/
 
- 	action := map[string]string{
 
- 		"Action":      "Originate",
 
- 		"Channel":     channel, // 不存在的通话
 
- 		"Application": "ChanSpy",
 
- 		"Data":        data, // 存在的通话
 
- 		"CallerID":    dst,
 
- 		"Async":       "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("PACU ChanSpy action %+v", action)
 
- 	_, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Errorf("%+v", err)
 
- 	}
 
- }
 
- // Page
 
- func Page(src string, extensions []string, duplex bool) {
 
- 	channel := fmt.Sprintf("%s/%s", utils.DialPrefix, src)
 
- 	data := make([]string, 0)
 
- 	for _, exten := range extensions {
 
- 		data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
 
- 	}
 
- 	appData := strings.Join(data, "&")
 
- 	if duplex {
 
- 		appData = fmt.Sprintf("%s,db(header-handler^addheader^1)", appData)
 
- 	} else {
 
- 		appData = fmt.Sprintf("%s,b(header-handler^addheader^1)", appData)
 
- 	}
 
- 	//timeout
 
- 	appData = fmt.Sprintf("%s,30", appData)
 
- 	action := map[string]string{
 
- 		"Action":      "Originate",
 
- 		"Channel":     channel,
 
- 		"Application": "page",
 
- 		"Data":        appData,
 
- 		"CallerID":    src,
 
- 		"CallerSrc":   src,
 
- 		"Variable":    "PJSIP_HEADER(add,answer-after)=0",
 
- 		"async":       "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("page action %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Errorf("%+v", err)
 
- 	}
 
- 	lfshook.NewLogger().Infof("%+v", res)
 
- }
 
- // Play 转 AGI 播放
 
- func Play(name, UUID string, extensions []string, hangupAll bool, autoanswer string) {
 
- 	if hangupAll {
 
- 		lfshook.NewLogger().Infof("hangup all before play to %+v", extensions)
 
- 		for _, extension := range extensions {
 
- 			Hangup(extension)
 
- 		}
 
- 		time.Sleep(3 * time.Second)
 
- 	}
 
- 	channel := "Local/broadcast@broadcast"
 
- 	data := make([]string, 0)
 
- 	for _, exten := range extensions {
 
- 		data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
 
- 	}
 
- 	appData := strings.Join(data, "&")
 
- 	//timeout
 
- 	/*if autoanswer == "yes" {
 
- 		appData = fmt.Sprintf("%s,%s,%d", appData, "b(header-handler^addheader^1)", configs.ConfigGlobal.AsteriskBroadcastTimeout)
 
- 	} else {
 
- 		appData = fmt.Sprintf("%s,,%d", appData, configs.ConfigGlobal.AsteriskBroadcastTimeout)
 
- 	}*/
 
- 	variable := fmt.Sprintf("task_UUID=%s", UUID)
 
- 	action := map[string]string{
 
- 		"Action":      "Originate",
 
- 		"Channel":     channel,
 
- 		"Application": "page",
 
- 		"Data":        appData,
 
- 		"Variable":    variable,
 
- 		//"CallerID":    fmt.Sprintf("%s<%s>", configs.ConfigGlobal.AsteriskBroadcastName, configs.ConfigGlobal.AsteriskBroadcastID),
 
- 		"CallerID": fmt.Sprintf("%s<%s>", name, name),
 
- 		"CallSrc":  name,
 
- 		"async":    "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("play action %+v", action)
 
- 	_, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Errorf("%+v", err)
 
- 	}
 
- }
 
- // Redirect 转接
 
- func Redirect(channel, dst, dialrule string) (err error) {
 
- 	callerID := "redirect"
 
- 	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
 
- 	if !utils.IsChannel(channel) {
 
- 		callerID = channel
 
- 		if channel, err = GetChannelByExten(channel); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	action := map[string]string{
 
- 		"Action":   "Redirect",
 
- 		"Channel":  channel,
 
- 		"Exten":    dst,
 
- 		"Context":  dialrule,
 
- 		"CallerID": callerID,
 
- 		"Priority": "1",
 
- 		"async":    "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("redirect %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Error(err)
 
- 	}
 
- 	lfshook.NewLogger().Info(res)
 
- 	return err
 
- }
 
- // Redirect 转接
 
- func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 
- 	//callerID := "redirect"
 
- 	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
 
- 	if !utils.IsChannel(channel) {
 
- 		//callerID = channel
 
- 		if channel, err = GetChannelByExtenNotBridged(channel); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	action := map[string]string{
 
- 		"Action":   "Redirect",
 
- 		"Channel":  channel,
 
- 		"Exten":    dst,
 
- 		"Context":  dialrule,
 
- 		"CallerID": callerID,
 
- 		"Priority": "1",
 
- 		"async":    "true",
 
- 	}
 
- 	lfshook.NewLogger().Infof("redirect %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Error(err)
 
- 	}
 
- 	lfshook.NewLogger().Info(res)
 
- 	return err
 
- }
 
- // Redirect 转接
 
- func BlindTransfer(channel, dst, dialrule string) (err error) {
 
- 	lfshook.NewLogger().Infof("BlindTransfer src %s to dst %s", channel, dst)
 
- 	if !utils.IsChannel(channel) {
 
- 		if channel, err = GetExtenChan(channel); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	action := map[string]string{
 
- 		"Action":  "BlindTransfer",
 
- 		"Channel": channel,
 
- 		"Exten":   dst,
 
- 		"Context": dialrule,
 
- 	}
 
- 	lfshook.NewLogger().Infof("BlindTransfer %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Error(err)
 
- 	}
 
- 	lfshook.NewLogger().Info(res)
 
- 	return err
 
- }
 
- // Atxfer
 
- func Atxfer(channel, dst, dialrule string) (err error) {
 
- 	// 获取通道
 
- 	if !utils.IsChannel(channel) {
 
- 		if channel, err = GetChannelByExten(channel); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	action := map[string]string{
 
- 		"Action":  "Atxfer",
 
- 		"Channel": channel,
 
- 		"Exten":   dst,
 
- 		"Context": dialrule,
 
- 	}
 
- 	lfshook.NewLogger().Infof("atxfer action %+v", action)
 
- 	res, _, err := AminInstance.Send(action)
 
- 	if err != nil {
 
- 		lfshook.NewLogger().Errorf("%+v", err)
 
- 		return err
 
- 	}
 
- 	lfshook.NewLogger().Debugf("atxfer res %+v", res)
 
- 	return err
 
- }
 
 
  |