Advertisement
Guest User

Untitled

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