Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement