Доброго дня. Подключаюсь к Asterisk с помощью библиотеки asterisk-ami-client.
Мониторю очередь на входящие звонки и пытаюсь собрать данные из двух разных событий в один объект.
При первом событии AgentConnect создаю в Redis ключ-значение с первичными данными о звонке.
При окончании звонка события AgentComplete и Cdr приходят одновременно и мне нужно собрать из них данные.
В этих двух событиях первым делом получаю существующие данные из Redis, дополняю объект и пишу обратно.
В итоге в обоих событиях получаю неполный объект, который в таком же виде записывается в базу.
Перед записью в базу проверяю объект на полноту, но и тут промах.
Как собрать данные из двух событий в один объект и по окончанию сборки записать??
Видимо не хватает навыков программирования или понимания алгоритма. Просветите пожалуйста.
module.exports = function (AmiClientConn, AmiClient, redisClient, queue_list, queue_member_list, RestClient, settings) {
const {promisify} = require("util");
const fs = require("fs");
let hmgetAsync = promisify(redisClient.hmget).bind(redisClient)
let hmsetAsync = promisify(redisClient.hmset).bind(redisClient)
AmiClientConn.then(() => {
AmiClient.on('AgentConnect', async event => {
console.warn(event.Event, event.Uniqueid);
let call_obj = {
calltime: '',
number: event.CallerIDNum,
queue: event.Queue,
dialstatus: '',
uniqid: event.Uniqueid,
talktime: '',
holdtime: event.HoldTime,
reason: '',
agnum: event.MemberName
}
let redis_agent_connect_obj_string = JSON.stringify(call_obj);
console.warn(event.Event, event);
let redis_result = await hmsetAsync(`agentconnect`, {[event.Uniqueid]: redis_agent_connect_obj_string})
console.log('AgentConnectRedis', redis_result)
});
AmiClient.on('AgentComplete', async event => {
let agent_connect_complete_data_string = await hmgetAsync(`agentconnect`, event.Uniqueid)
if (agent_connect_complete_data_string[0] !== null) {
let agent_connect_complete_data_obj = JSON.parse(agent_connect_complete_data_string[0]);
console.log('ПОЛУЧИЛ ДАННЫЕ В AgentComplete', agent_connect_complete_data_obj)
let redis_agent_complete_data_obj = {
...agent_connect_complete_data_obj,
talktime: event.TalkTime,
reason: event.Reason
};
let redis_agent_complete_data_obj_string = JSON.stringify(redis_agent_complete_data_obj)
let redis_result = await hmsetAsync(`agentconnect`, {[event.Uniqueid]: redis_agent_complete_data_obj_string})
console.log('AgentCompleteRedis', redis_result);
let last_redis_complite_check_string = await hmgetAsync(`agentconnect`, event.Uniqueid)
let last_redis_complite_check_obj = JSON.parse(last_redis_complite_check_string);
let rest_agent_complete_data_obj = {
data: {
...last_redis_complite_check_obj
},
headers: {"Content-Type": "application/json"}
};
console.log('ОБЪЕКТ В AGENTCOMPLETE', last_redis_complite_check_obj)
if (last_redis_complite_check_obj.calltime !== '') {
await RestClient.post(`${settings.serverUri}/callin/create`, rest_agent_complete_data_obj, function (data, response) {
console.log('СОЗДАНИЕ ЗАПИСИ В АГЕНТКОМПЛИТ', data);
fs.appendFile("call_logger.txt", `${JSON.stringify(data)}\n`, function (error) {
if (error) throw error; // если возникла ошибка
console.log("Асинхронная запись файла завершена.");
})
})
}
}
});
AmiClient.on('Cdr', async event => {setTimeout()
let agent_connect_cdr_data_string = await hmgetAsync(`agentconnect`, event.UniqueID)
if(agent_connect_cdr_data_string[0] !== null) {
let agent_connect_cdr_data_obj = JSON.parse(agent_connect_cdr_data_string[0]);
console.log('ПОЛУЧИЛ ДАННЫЕ В Cdr', agent_connect_cdr_data_obj)
if(agent_connect_cdr_data_obj.calltime === '') {
let redis_agent_cdr_data_obj = {
...agent_connect_cdr_data_obj,
calltime: event.StartTime,
dialstatus: event.Disposition
};
let redis_agent_cdr_data_obj_string = JSON.stringify(redis_agent_cdr_data_obj)
let redis_result = await hmsetAsync(`agentconnect`, {[event.UniqueID]: redis_agent_cdr_data_obj_string})
console.log('AgentCdrRedis', redis_result)
let last_redis_cdr_check_string = await hmgetAsync(`agentconnect`, event.UniqueID)
let last_redis_cdr_check_obj = JSON.parse(last_redis_cdr_check_string);
let rest_agent_cdr_data_obj = {
data: {
...last_redis_cdr_check_obj
},
headers: {"Content-Type": "application/json"}
};
console.log('ОБЪЕКТ В CDR', last_redis_cdr_check_obj)
if (last_redis_cdr_check_obj.talktime !== '') {
await RestClient.post(`${settings.serverUri}/callin/create`, rest_agent_cdr_data_obj, function (data, response) {
console.log('СОЗДАНИЕ ЗАПИСИ В СДР', data);
fs.appendFile("call_logger.txt", `${JSON.stringify(data)}\n`, function (error) {
if (error) throw error; // если возникла ошибка
console.log("Асинхронная запись файла завершена.");
})
})
}
}
}
});
})
.catch(error => console.log(error))
}