Guest User

Untitled

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