Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 19.95 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "database/sql"
  6.     "encoding/json"
  7.     "fmt"
  8.     "net/http"
  9.     "os"
  10.     "path/filepath"
  11.     "strconv"
  12.     "strings"
  13.     "time"
  14.  
  15.     _ "github.com/go-sql-driver/mysql"
  16.     "github.com/ivahaev/amigo"
  17. )
  18.  
  19. type AccountCode struct {
  20.     o string
  21.     e int
  22.     t string
  23. }
  24. type Config struct {
  25.     Manager struct {
  26.         User string `json:"user"`
  27.         Pass string `json:"pass"`
  28.         Host string `json:"host"`
  29.     } `json:"manager"`
  30.     Database struct {
  31.         User string `json:"user"`
  32.         Pass string `json:"pass"`
  33.         Host string `json:"host"`
  34.         Name string `json:"name"`
  35.     } `json:"database"`
  36.     API struct {
  37.         URLCrm     string `json:"url_crm"`
  38.         URLPeerUse string `json:"url_peer_use"`
  39.         Key        string `json:"key"`
  40.     } `json:"api"`
  41. }
  42.  
  43. var db *sql.DB
  44. var a *amigo.Amigo
  45. var config Config
  46.  
  47. func JSON(operator, type_call, status, num, uniqueid string) {
  48.     vid := map[string]string{
  49.         "operator":  operator,
  50.         "type_call": type_call,
  51.         "status":    status,
  52.         "num":       num,
  53.         "uniqueid":  uniqueid}
  54.     vid1, _ := json.Marshal(vid)
  55.     vidEvent := string(vid1)
  56.     fmt.Println(vidEvent, "\n")
  57.     eventsBusVid(vidEvent)
  58. }
  59.  
  60. func httpPOST(urlSet, data string) error {
  61.     //fmt.Println("URL:>", urlSet, "\n")
  62.     //fmt.Println("DATA:>", data, "\n")
  63.     var jsonStr = []byte(data)
  64.     req, err := http.NewRequest("POST", urlSet, bytes.NewBuffer(jsonStr))
  65.     req.Header.Set("Content-Type", "application/json")
  66.     if err != nil {
  67.         return err
  68.     }
  69.     client := &http.Client{
  70.     //Timeout: 150 * time.Millisecond,
  71.     }
  72.     _, err = client.Do(req)
  73.     if err != nil {
  74.         return err
  75.     }
  76.     return nil
  77. }
  78.  
  79. func httpPOSTkey(urlSet, data string) error {
  80.     //fmt.Println("URL:> \n", urlSet)
  81.     //fmt.Println("DATA:> \n", data)
  82.     var jsonStr = []byte(data)
  83.     req, err := http.NewRequest("POST", urlSet, bytes.NewBuffer(jsonStr))
  84.     req.Header.Set("Content-Type", "application/json")
  85.     req.Header.Set("keyaccess", config.API.Key)
  86.     if err != nil {
  87.         return err
  88.     }
  89.     client := &http.Client{
  90.     //Timeout: 150 * time.Millisecond,
  91.     }
  92.     _, err = client.Do(req)
  93.     if err != nil {
  94.         return err
  95.     }
  96.     return nil
  97. }
  98.  
  99. func delDB(exten, callerid, extenOR, calleridOR string) {
  100.  
  101.     sqlInsert := "delete from calls where `exten`='" + exten + "' OR `callerid`='" + callerid + "' OR `exten`='" + extenOR + "' OR `callerid`='" + calleridOR + "'"
  102.     _, err := db.Exec(sqlInsert)
  103.     if err != nil {
  104.         fmt.Println("Error delete DB:( --> %s", err)
  105.     }
  106. }
  107.  
  108. func eventsBusVid(event string) {
  109.     if event == "" {
  110.         fmt.Println("Event_bus: Ошибка - нет данных \n")
  111.     } else {
  112.         err := httpPOST(config.API.URLCrm, event)
  113.         if err != nil {
  114.             fmt.Printf("Ошибка EventBus: %v\n", err)
  115.         }
  116.  
  117.     }
  118. }
  119.  
  120. //функция изменения состояния пира, разговаривает или нет
  121. func peerUse(peer_use string, use_status string) {
  122.     if config.API.URLPeerUse == "" {
  123.         return
  124.     }
  125.     mapS := map[string]string{"operator": peer_use, "queue": "", "status": use_status}
  126.     event, _ := json.Marshal(mapS)
  127.     eventUse := string(event)
  128.     err := httpPOSTkey(config.API.URLPeerUse, eventUse)
  129.     if err != nil {
  130.         fmt.Printf("Ошибка PEERUSE: %v\n", err)
  131.     }
  132.  
  133. }
  134.  
  135. func dialBeginHandler(data map[string]string) {
  136.     fmt.Println("Событие DialBEGIN \n", data, "\n")
  137.  
  138.     var chann, type_call, log_EXTEN_db, log_CAllerID_db, log_Uniqueid_caller_db, log_Uniqueid_answer_db string
  139.     var autocall int
  140.  
  141.     if len(data["Context"]) == 0 {
  142.         return
  143.     }
  144.     if data["Context"] == "autocall-normal" {
  145.         return
  146.     }
  147.     //срез
  148.     arr := (data["DialString"])
  149.     fmc_dialstring := arr[0:3]
  150.  
  151.     //срез
  152.     if (data["Context"] == "macro-dialout-trunk") || (data["Context"] == "fenix-local") || (data["Context"] == "fenix") || len(data["AccountCode"]) != 0 { //костыль
  153.  
  154.         if fmc_dialstring == "fmc" && len(data["AccountCode"]) == 0 {
  155.             type_call = "in"
  156.         } else {
  157.             type_call = "out"
  158.         }
  159.         //костыли для FMC!!!!!!!!!!!!!!!
  160.         //$type_call = "out";
  161.  
  162.     } else {
  163.         type_call = "in"
  164.     }
  165.  
  166.     if data["Context"] == "ext-queues" {
  167.         fmt.Println("ЭТО Звонок в очереди, не конечный звонок - ВЫХОД")
  168.         fmt.Println(data)
  169.         return
  170.     }
  171.     if (data["Context"] == "macro-dial-one") && (data["CallerIDNum"] == "<unknown>") {
  172.         out_channel := data["Channel"] //запрашиваем название канала
  173.         find_str_1 := "/"
  174.         find_str_2 := "@"
  175.         pos1 := strings.Index(out_channel, find_str_1) //возращение вхождения strbos
  176.         cid := out_channel[pos1+1:]                    // срез substr
  177.         pos2 := strings.Index(cid, find_str_2)         //возращение вхождения
  178.  
  179.         out_cid := cid[:pos2] //узнаем логин пира который совершает звонок
  180.         fmt.Println("OUT CID ==>> ", out_cid, "\n")
  181.         //$setcid = $manager->SetVar($data['Channel'], 'CALLERID(ALL)', "{$out_cid} <{$out_cid}>");
  182.  
  183.         log_CAllerID_db = out_cid
  184.     } else {
  185.         if (data["Context"] == "macro-dialout-trunk") && (data["CallerIDNum"] == "<unknown>") { //нужно при звонке через FMC
  186.             out_channel := data["Channel"] //запраиваем название канала
  187.             find_str_1 := "/"
  188.             find_str_2 := "@"
  189.             pos1 := strings.Index(out_channel, find_str_1)
  190.             cid := out_channel[pos1+1:]
  191.             pos2 := strings.Index(cid, find_str_2)
  192.             out_cid := cid[:pos2] //узнаем номер абонента
  193.             fmt.Println("OUT CID ==>> ", out_cid, "\n")
  194.             log_CAllerID_db = out_cid
  195.         } else {
  196.             log_CAllerID_db = data["CallerIDNum"]
  197.         }
  198.     }
  199.  
  200.     if _, err := strconv.ParseInt(data["DialString"], 0, 64); err == nil { //определяем число или нет
  201.         log_EXTEN_db = data["DialString"]
  202.     } else {
  203.         log_EXTEN_db = data["DestCallerIDNum"]
  204.         //$log_EXTEN_db = $data['DestExten'];     Проверяем ощибку S для FMC
  205.     }
  206.     chan_caller := data["Channel"]
  207.     chan_answer := data["DestChannel"]
  208.     log_Uniqueid_caller_db = data["Uniqueid"]
  209.     log_Uniqueid_answer_db = data["DestUniqueid"]
  210.  
  211.     //делаем правильный callerid для предиктивных звонков
  212.  
  213.     //Проверяем вспомогательный канал
  214.     find_str_1 := ";2"
  215.     pos1Des := strings.Index(log_Uniqueid_caller_db, find_str_1)
  216.     fmt.Println(log_Uniqueid_caller_db)
  217.  
  218.     if pos1Des != -1 {
  219.         chann = "2"
  220.         log_Uniqueid_caller_db = log_Uniqueid_caller_db[:pos1Des]
  221.     } else {
  222.         chann = ""
  223.     }
  224.     //Забираем все данные из accountcode
  225.     fmt.Println(data)
  226.     var vidArr map[string]string
  227.     json.Unmarshal([]byte(data["AccountCode"]), &vidArr)
  228.     fmt.Println(vidArr)
  229.     //Забираем все данные из accountcode
  230.  
  231.     if (len(vidArr["o"]) != 0) && (chann == "2") {
  232.         log_CAllerID_db = vidArr["o"]
  233.     }
  234.     //делаем правильный callerid для предиктивных звонков
  235.  
  236.     //узнаем этот звонок с автообзвона или нет
  237.     if vidArr["o"] == "autocall" {
  238.         autocall = 1
  239.     } else {
  240.         autocall = 0
  241.     }
  242.     //время
  243.     t := time.Now()
  244.     times := t.Format("2006-01-02 15:04:05")
  245.  
  246.     //узнаем этот звонок с автообзвона или нет
  247.     //запись в базу
  248.     var sqlInsert = "INSERT INTO calls (type_call,exten,callerid,unigueid_caller,status_call,chan_caller,chan_answer,unigueid_answer,date_start,autocall) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
  249.  
  250.     _, err := db.Exec(sqlInsert, type_call, log_EXTEN_db, log_CAllerID_db, log_Uniqueid_caller_db, "1", chan_caller, chan_answer, log_Uniqueid_answer_db, times, autocall)
  251.     if err != nil {
  252.         fmt.Println("Ошибка записи в базу :( --> %s", err)
  253.         return
  254.     }
  255.  
  256.     //событие по виджету (event_bus)
  257.     //fmt.Println("AccountCode ================>>>>>>>", data["AccountCode"], type_call, chann)
  258.     //
  259.     if len(data["AccountCode"]) != 0 {
  260.  
  261.         if (chann == "2") && (vidArr["t"] != "pred") {
  262.             return
  263.         }
  264.         if (chann != "2") && (vidArr["t"] == "pred") {
  265.             return
  266.         }
  267.         if (chann == "2") && (vidArr["t"] == "norm") {
  268.             return
  269.         }
  270.         if (vidArr["o"] != data["CallerIDNum"]) && (vidArr["t"] == "norm") {
  271.             return
  272.         }
  273.         JSON(vidArr["o"], type_call, "ring", vidArr["e"], log_Uniqueid_caller_db)
  274.  
  275.     } else {
  276.         //если это звонок не из АПИ то параметры подставляем в зависимости от типа звонка
  277.         if type_call == "in" {
  278.             JSON(log_EXTEN_db, type_call, "ring", log_CAllerID_db, log_Uniqueid_caller_db)
  279.  
  280.         } else {
  281.             JSON(log_CAllerID_db, type_call, "ring", log_EXTEN_db, log_Uniqueid_caller_db)
  282.         }
  283.     }
  284.     //событие по виджету (event_bus)
  285.  
  286.     //обновляем статус пира
  287.     peerUse(log_EXTEN_db, "IN_USE")
  288.     peerUse(log_CAllerID_db, "IN_USE")
  289.  
  290. }
  291.  
  292. func dialEndHandler(data map[string]string) {
  293.  
  294.     var chann, type_call, cid, log_EXTEN_db, log_CAllerID_db, date_start, date_answer, ringing, callerid, log_Uniqueid_caller_db string
  295.     var autocall int
  296.     //Uniqueid = data["Uniqueid"]
  297.     fmt.Println("Событие DialEND \n", data, "\n")
  298.  
  299.     if len(data["Context"]) == 0 {
  300.         return
  301.     }
  302.     if data["Context"] == "autocall-normal" {
  303.         return
  304.     }
  305.     if data["Context"] == "ext-queues" {
  306.         fmt.Println("ЭТО Звонок в очереди, не конечный звонок - ВЫХОД")
  307.         return
  308.     }
  309.     if data["DialStatus"] == "ANSWER" {
  310.         log_CAllerID_db = data["CallerIDNum"]
  311.         log_EXTEN_db = data["DestCallerIDNum"]
  312.         log_Uniqueid_caller_db = data["Uniqueid"]
  313.  
  314.         //
  315.         //Проверяем вспомогательный канал
  316.         find_str_1 := ";2"
  317.         pos1Des := strings.Index(log_Uniqueid_caller_db, find_str_1)
  318.         if pos1Des != -1 {
  319.             chann = "2"
  320.             log_Uniqueid_caller_db = log_Uniqueid_caller_db[:pos1Des]
  321.         } else {
  322.             chann = ""
  323.         }
  324.         //Проверяем вспомогательный канал
  325.  
  326.         //Забираем все данные из AccountCode
  327.         var vidArr map[string]string
  328.         json.Unmarshal([]byte(data["AccountCode"]), &vidArr)
  329.         fmt.Println(vidArr)
  330.         //
  331.         if (len(vidArr["o"]) != 0) && (chann == "2") {
  332.             log_CAllerID_db = vidArr["o"]
  333.         } else {
  334.             if (data["Context"] == "macro-dialout-trunk") && (data["CallerIDNum"] == "<unknown>") {
  335.                 out_channel := data["Channel"]
  336.                 findStr1 := "/"
  337.                 findStr2 := "@"
  338.                 pos1 := strings.Index(out_channel, findStr1)
  339.                 cid = out_channel[pos1+1:]
  340.                 pos2 := strings.Index(cid, findStr2)
  341.                 out_cid := cid[:pos2] //узнаем номер абонента
  342.                 log_CAllerID_db = out_cid
  343.             } else {
  344.                 fmt.Println("Проверить на рабочем событии \n\n")
  345.                 cid = ""
  346.             }
  347.         }
  348.         //узнаем этот звонок с автообзвона или нет
  349.         if vidArr["o"] == "autocall" {
  350.             autocall = 1
  351.  
  352.         } else {
  353.             autocall = 0
  354.         }
  355.         //узнаем этот звонок с автообзвона или нет
  356.  
  357.         //время
  358.         t := time.Now()
  359.         times := t.Format("2006-01-02 15:04:05")
  360.  
  361.         //узнаем этот звонок с автообзвона или нет
  362.         //запись в базу
  363.  
  364.         sqlInsert := "Update calls set status_call=2, shower=0, date_answer='" + times + "'  where `chan_caller`='" + data["Channel"] + "' OR `chan_answer`='" + data["Channel"] + "';"
  365.         _, err := db.Exec(sqlInsert)
  366.         if err != nil {
  367.             fmt.Println("Error insert :( --> %s", err)
  368.         }
  369.  
  370.         rows, err := db.Query("select date_start, date_answer, (UNIX_TIMESTAMP(date_answer) - UNIX_TIMESTAMP(date_start)) AS ringing, autocall, callerid,type_call from calls where chan_caller=?", data["Channel"])
  371.         if err != nil {
  372.             fmt.Println("Ошибка в запросе BD: %v\n", err)
  373.         }
  374.         for rows.Next() {
  375.             rows.Scan(&date_start, &date_answer, &ringing, &autocall, &callerid, &type_call)
  376.             //fmt.Println("date_start", date_start)
  377.             //fmt.Println("date_answer", date_answer)
  378.             //fmt.Println("ringing", ringing)
  379.             //fmt.Println("autocall", autocall)
  380.             //fmt.Println("callerid", callerid)
  381.             //fmt.Println("type_call", type_call, "\n")
  382.         }
  383.         if (cid == "") || (log_CAllerID_db == log_EXTEN_db) {
  384.             log_CAllerID_db = callerid
  385.         }
  386.  
  387.         //событие по виджету (event_bus)
  388.         if len(data["AccountCode"]) != 0 {
  389.  
  390.             fmt.Println("chan ===>>> ", chann)
  391.             fmt.Println("type_call ===>>> ", vidArr["t"])
  392.             fmt.Println("Operator ===>>> ", vidArr["o"])
  393.             fmt.Println("CallerIDNum ===>>> ", data["CallerIDNum"], "\n")
  394.  
  395.             if (chann == "2") && (vidArr["t"] == "pred") {
  396.                 return
  397.             }
  398.             //if (log_Uniqueid_caller_db != data["Uniqueid"]) && (vidArr["t"] == "norm") {
  399.             //  return
  400.             //}
  401.             if (chann == "2") && (vidArr["t"] == "norm") {
  402.                 return
  403.             }
  404.             if vidArr["o"] != data["CallerIDNum"] && vidArr["t"] == "norm" {
  405.                 return
  406.             }
  407.             JSON(vidArr["o"], type_call, "answer", vidArr["e"], log_Uniqueid_caller_db)
  408.  
  409.             if vidArr["t"] == "pred" {
  410.                 //запись в канал
  411.                 setcid, _ := a.Action(map[string]string{"Action": "Setvar", "Channel": data["Channel"], "Variable": "CALLERID(ALL)", "Value": vidArr["e"] + ` <` + vidArr["e"] + `>`})
  412.                 fmt.Println("SETVAR ===>>> ", setcid, "\n")
  413.             }
  414.             //eventsBusVid(vidEvent)
  415.         } else {
  416.             //если это звонок не из АПИ то параметры подставляем в зависимости от типа звонка
  417.             if type_call == "in" {
  418.                 JSON(log_EXTEN_db, type_call, "answer", log_CAllerID_db, log_Uniqueid_caller_db)
  419.  
  420.             } else {
  421.                 JSON(log_CAllerID_db, type_call, "answer", log_EXTEN_db, log_Uniqueid_caller_db)
  422.  
  423.             }
  424.         }
  425.         //запись в канал
  426.         _, err = a.Action(map[string]string{"Action": "Setvar", "Channel": data["Channel"], "Variable": "CDR(ringing)", "Value": ringing})
  427.         if err != nil {
  428.             fmt.Println("Ошибка отправки данных в канала: %v\n", err)
  429.         }
  430.         //fmt.Println("!!!!!!!!!!!!!!!!!!SETVAR!!!!!!!!!!!!!!!!!!!", setvar, "!!!!!!!!!!!!!!!!!!!!!!!SETVAR!!!!!!")
  431.  
  432.     } else {
  433.         return
  434.     }
  435. }
  436.  
  437. func hangupHandler(data map[string]string) {
  438.  
  439.     var log_CAllerID_db, chann, chan_caller, log_EXTEN_db, autocall, type_call, log_Uniqueid_caller_db string
  440.     var err error
  441.     fmt.Println("Хенгап!!!!! \n", data, "\n")
  442.  
  443.     if data["Cause-txt"] == "Unknown" {
  444.         return
  445.     }
  446.  
  447.     var vidArr map[string]string
  448.     json.Unmarshal([]byte(data["AccountCode"]), &vidArr)
  449.     fmt.Println(vidArr)
  450.  
  451.     if data["Context"] == "autocall-normal" {
  452.         return
  453.     }
  454.     //запрашиваем CID и Exten
  455.     rows, err := db.Query("select `exten`, `callerid`, `unigueid_caller`, `chan_caller`, `autocall`, `type_call` from calls where (`chan_caller`='" + data["Channel"] + "' OR `chan_answer`='" + data["Channel"] + "') AND `chan_caller`!=''")
  456.     if err != nil {
  457.         fmt.Println("Ошибка запроса CID и Exten \n")
  458.         return
  459.     }
  460.     for rows.Next() {
  461.         rows.Scan(&log_EXTEN_db, &log_CAllerID_db, &log_Uniqueid_caller_db, &chan_caller, &autocall, &type_call)
  462.         fmt.Println("exten", log_EXTEN_db)
  463.         fmt.Println("calleridr", log_CAllerID_db)
  464.         fmt.Println("unigueid_caller", log_Uniqueid_caller_db)
  465.         fmt.Println("chan_caller", chan_caller)
  466.         fmt.Println("autocall", autocall)
  467.         fmt.Println("type_call", type_call, "\n")
  468.     }
  469.  
  470.     //Проверяем вспомогательный канал
  471.     findStr1 := ";2"
  472.     pos1Des := strings.Index(data["Uniqueid"], findStr1)
  473.     if pos1Des != -1 {
  474.         chann = "2"
  475.         log_Uniqueid_caller_db = data["Uniqueid"][:pos1Des]
  476.     } else {
  477.         chann = ""
  478.     }
  479.     //Проверяем вспомогательный канал
  480.  
  481.     if type_call != "" {
  482.         if len(data["AccountCode"]) != 0 {
  483.             fmt.Println("chan ===>>> ", chann, "\n")
  484.             fmt.Println("type_call ===>>> ", vidArr["t"], "\n")
  485.             fmt.Println("Operator ===>>> ", vidArr["o"], "\n")
  486.             fmt.Println("CallerIDNum ===>>> ", data["CallerIDNum"], "\n\n")
  487.  
  488.             if (chann == "2") && (vidArr["t"] == "norm") {
  489.                 return
  490.             }
  491.             if (log_Uniqueid_caller_db != data["Uniqueid"]) && (vidArr["t"] == "norm") {
  492.                 return
  493.             }
  494.             if (vidArr["o"] != data["CallerIDNum"]) && (vidArr["t"] == "norm") {
  495.                 return
  496.             }
  497.             if (vidArr["o"] == data["CallerIDNum"]) && (vidArr["t"] == "pred") {
  498.                 return
  499.             }
  500.             if (chann != "2") && (vidArr["t"] == "pred") {
  501.                 return
  502.             }
  503.  
  504.             JSON(vidArr["o"], type_call, "hangup", vidArr["e"], log_Uniqueid_caller_db)
  505.             delDB(vidArr["o"], vidArr["o"], vidArr["e"], vidArr["e"])
  506.             //sqlInsert = "delete from calls where `exten`='" + vidArr["o"] + "' OR `callerid`='" + vidArr["o"] + "' OR `exten`='" + vidArr["e"] + "' OR `callerid`='" + vidArr["e"] + "'"
  507.             //_, err := db.Exec(sqlInsert)
  508.             //if err != nil {
  509.             //  fmt.Println("Error insert :( --> %s", err)
  510.             //}
  511.  
  512.         } else {
  513.             if type_call == "in" {
  514.                 JSON(log_EXTEN_db, type_call, "hangup", log_CAllerID_db, log_Uniqueid_caller_db)
  515.                 delDB(log_EXTEN_db, log_EXTEN_db, log_CAllerID_db, log_CAllerID_db)
  516.  
  517.                 //sqlInsert = "delete from calls where `exten`='" + log_EXTEN_db + "' OR `callerid`='" + log_EXTEN_db + "' OR `exten`='" + log_CAllerID_db + "' OR `callerid`='" + log_CAllerID_db + "'"
  518.                 //_, err := db.Exec(sqlInsert)
  519.                 //if err != nil {
  520.                 //      fmt.Println("Error insert :( --> %s", err)
  521.                 //  }
  522.  
  523.             } else {
  524.                 JSON(log_CAllerID_db, type_call, "hangup", log_EXTEN_db, log_Uniqueid_caller_db)
  525.                 delDB(log_EXTEN_db, log_EXTEN_db, log_CAllerID_db, log_CAllerID_db)
  526.  
  527.                 //sqlInsert = "delete from calls where `exten`='" + log_EXTEN_db + "' OR `callerid`='" + log_EXTEN_db + "' OR `exten`='" + log_CAllerID_db + "' OR `callerid`='" + log_CAllerID_db + "'"
  528.                 //_, err := db.Exec(sqlInsert)
  529.                 //if err != nil {
  530.                 //  fmt.Println("Error insert :( --> %s", err)
  531.                 //}
  532.             }
  533.         }
  534.     } else {
  535.         fmt.Println("Пусто")
  536.         return
  537.     }
  538.  
  539.     peerUse(log_CAllerID_db, "NOT_IN_USE")
  540.     peerUse(log_EXTEN_db, "NOT_IN_USE")
  541.  
  542. }
  543.  
  544. func eventsProcessor(ch <-chan map[string]string) {
  545.     for data := range ch {
  546.         switch data["Event"] {
  547.         case "Dial":
  548.             switch data["SubEvent"] { //for asterisrk 11
  549.             case "Begin": //for asterisrk 11
  550.                 dialBeginHandler(data)
  551.             case "End": //for asterisrk 11
  552.                 dialEndHandler(data)
  553.             default: //for asterisrk 11
  554.                 fmt.Printf("Unknown Dial SubEvent: %s\n", data["SubEvent"])
  555.             }
  556.         case "DialBegin":
  557.             dialBeginHandler(data)
  558.         case "DialEnd":
  559.             dialEndHandler(data)
  560.         case "Hangup":
  561.             hangupHandler(data)
  562.         }
  563.     }
  564. }
  565.  
  566. func main() {
  567.     //Загрузка конфиг файла
  568.     dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  569.     if err != nil {
  570.         fmt.Println("Ошибка", err)
  571.     }
  572.     fmt.Println(dir)
  573.  
  574.     configFile, err := os.Open(dir + "/config.json")
  575.     if err != nil {
  576.         fmt.Println("Конфиг не найден")
  577.         return
  578.     }
  579.     jsonParser := json.NewDecoder(configFile)
  580.     err = jsonParser.Decode(&config)
  581.     defer configFile.Close()
  582.  
  583.     db, err = sql.Open("mysql", config.Database.User+":"+config.Database.Pass+"@tcp("+config.Database.Host+")/"+config.Database.Name)
  584.     if err != nil {
  585.         panic(err)
  586.     }
  587.     defer db.Close()
  588.  
  589.     //Подключаемя к AMI
  590.     settings := &amigo.Settings{Username: config.Manager.User, Password: config.Manager.Pass, Host: config.Manager.Host}
  591.     a = amigo.New(settings)
  592.  
  593.     // Listen for connection events
  594.     a.On("connect", func(message string) {
  595.         fmt.Println("Connected", message)
  596.     })
  597.     a.On("error", func(message string) {
  598.         fmt.Println("Connection error:", message)
  599.     })
  600.  
  601.     a.Connect()
  602.  
  603.     chans := map[string]chan map[string]string{}
  604.     c := make(chan map[string]string, 100)
  605.     a.SetEventChannel(c)
  606.  
  607.     for data := range c {
  608.         uniqueID := data["UniqueID"]
  609.         if len(uniqueID) == 0 {
  610.             uniqueID = data["Uniqueid"]
  611.         }
  612.  
  613.         switch data["Event"] {
  614.         case "Dial":
  615.             {
  616.                 if ch, ok := chans[uniqueID]; ok {
  617.                     ch <- data
  618.                     continue
  619.                 }
  620.  
  621.                 ch := make(chan map[string]string, 3) // capacity is 3 because only 3 events will handled
  622.                 ch <- data
  623.                 chans[uniqueID] = ch
  624.                 go eventsProcessor(ch)
  625.             }
  626.         case "DialBegin": // asterisk 13
  627.             {
  628.                 ch := make(chan map[string]string, 3)
  629.                 ch <- data
  630.                 chans[uniqueID] = ch
  631.                 go eventsProcessor(ch)
  632.             }
  633.         case "DialEnd": // asterisk 13
  634.             if ch, ok := chans[uniqueID]; ok {
  635.                 ch <- data
  636.                 continue
  637.             }
  638.  
  639.         case "Hangup":
  640.             if ch, ok := chans[uniqueID]; ok {
  641.                 ch <- data
  642.                 close(ch)
  643.                 delete(chans, uniqueID)
  644.                 continue
  645.             }
  646.             fmt.Printf("Unknown UniqueID on Hangup event: %s\n", uniqueID)
  647.         }
  648.     }
  649. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement