Advertisement
Guest User

Untitled

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