Advertisement
Guest User

Untitled

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