package asterisk import ( "fmt" "net/http" "pbx-api-gin/api/model" "pbx-api-gin/internal/app/ami/action" "strings" "github.com/gin-gonic/gin" ) // @tags Asterisk-Call // @Summary 挂断 // @Description 挂断分机或通道数组 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body []string true "需要挂断的分机或通道数组" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/hangup [post] func Hangup(extens string) { //var extensions []string extensions := strings.Split(extens, ";") for _, extension := range extensions { action.Hangup(extension) } } // @tags Asterisk-Call // @Summary 拨打电话 // @Description 拨打指定的分机 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.DialVO true "需要拨打的分机信息" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/dial [post] func Dial(ctx *gin.Context) { var info model.DialVO if err := ctx.ShouldBindJSON(&info); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } // 根据参数确定主叫, 再考虑用户登录的分机信息 myExtension := info.CallerNumber if myExtension == "" { ID, _ := ctx.Get("ID") myExtension = "====================" if myExtension == "" { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: fmt.Sprintf("not found user extension by ID %d", ID)}) return } } dialplan := "default" if info.CallerID == "" { info.CallerID = info.Extension } // 喊话 主动挂断被叫 action.Hangup(info.Extension) action.Dial(myExtension, info.Extension, dialplan, info.CallerID, "================", "Local") ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: info}) } // @tags Asterisk-Call // @Summary 强拆() // @Description 将当前正在进行的通话保持,src 与 正在通话的 dst建立通话。 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.SrcDstInfo true "src, dst" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/clear [post] func Clear(ctx *gin.Context) { var input model.SrcDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } action.Redirect(input.Src, input.Dst, "default") ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 密语(悄悄话) // @Description 将 src 插入到 dst 的通话中,与 dst 密语 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.ExtensionDstInfo true "src, dst" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/whisper [post] func extenWhisper(ctx *gin.Context) { var input model.ExtensionDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } action.ChanSpy(input.Extension, input.Dst, true, false) ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 强插(三方通话) // @Description 将 src 插入 dst 的通话中 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.ExtensionDstInfo true "src, dst" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/bargein [post] func extenBargeIn(ctx *gin.Context) { var input model.ExtensionDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } action.ChanSpy(input.Extension, input.Dst, false, true) ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 监听 // @Description 将当前正在进行的通话终止,并与分机建立通话。 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.ExtensionDstInfo true "src 为已进行的通话分机, dst 为未通话的分机" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/spy [post] func extenSpy(ctx *gin.Context) { var input model.ExtensionDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } action.ChanSpy(input.Extension, input.Dst, false, false) ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 转接 // @Description 转接 src 到 dst // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.SrcDstInfo true "src, dst" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/transfer [post] func transfer(ctx *gin.Context) { var input model.SrcDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } myExtension := "" if myExtension == "" { ID, _ := ctx.Get("ID") myExtension = "=============================" if myExtension == "" { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: fmt.Sprintf("not found user extension by ID %d", ID)}) return } } //action.BlindTransfer(input.Src, input.Dst, mysql.GetDialPlanByExtension(myExtension)) action.Redirect(input.Src, input.Dst, "default") ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 转移 // @Description 通话已进行, 将 Src 的通话转移到 Dst, 挂断后 Dst 与 Src 继续通话 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.ChannelDstInfo true "src, dst" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/atxfer [post] func atxfer(ctx *gin.Context) { var input model.ChannelDstInfo if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } //ID, _ := ctx.Get("ID") dialplan := "default" // admin 用户通过主叫获取 action.Atxfer(input.Channel, input.Dst, dialplan) ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) } // @tags Asterisk-Call // @Summary 广播 // @Description 广播 // @Security ApiKeyAuth // @Accept json // @Produce json // @Param data body model.PageVO true "广播参数" // @Success 200 {object} model.APIOK "请求成功" // @Router /ginapi/plugin-asterisk/call/page [post] func page(ctx *gin.Context) { var input model.PageVO if err := ctx.ShouldBindJSON(&input); err != nil { ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()}) return } // 主动挂断被叫 for _, exten := range input.Extensions { action.Hangup(exten) } action.Page(input.Src, input.Extensions, input.Duplex) ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input}) }