diff --git a/lib/glpiParse.js b/lib/glpiParse.js index b6e0015..4d76d90 100644 --- a/lib/glpiParse.js +++ b/lib/glpiParse.js @@ -13,149 +13,161 @@ const glpiUrl = conf.glpiConfig.apiurl.replace("apirest.php", ""); exports.parseTickets = async (bot, messageData) => { let listTickets = await glpm.getAllItems('Ticket', 5); for(let i = 4; i >= 0; i--){ - let ticketId; - if(!listTickets[i]) break; - ticketId = listTickets[i].id; - if(ticketId <= messageData.ticket) continue; - if(listTickets[i].users_id_recipient != conf.glpiConfig.user_id){ - let usersArray = await glpm.getUsers(ticketId); - let authorEmail; - if(!usersArray[0]) continue; - if(usersArray[0].hasOwnProperty('alternative_email') && usersArray[0].alternative_email){ - authorEmail = usersArray[0].alternative_email; - }else{ - let temp = await glpm.getItem("User", usersArray[0].users_id); - authorEmail = temp.firstname + ' ' + temp.realname; + try{ + let ticketId; + if(!listTickets[i]) break; + ticketId = listTickets[i].id; + if(ticketId <= messageData.ticket) continue; + if(listTickets[i].users_id_recipient != conf.glpiConfig.user_id){ + let usersArray = await glpm.getUsers(ticketId); + let authorEmail; + if(!usersArray[0]) continue; + if(usersArray[0].hasOwnProperty('alternative_email') && usersArray[0].alternative_email){ + authorEmail = usersArray[0].alternative_email; + }else{ + let temp = await glpm.getItem("User", usersArray[0].users_id); + authorEmail = temp.firstname + ' ' + temp.realname; + } + let text = await htmlToText(listTickets[i].content); + let messageText = `🟢 ЗАЯВКА №${ticketId}\n\n`; + messageText += `Автор заявки: ${authorEmail}\n`; + messageText += `Проблема: ${listTickets[i].name}\nОписание: `; + messageText += text; + if(messageText.length > 600){ + messageText = `${messageText.substring(0, 500)} + '\n\nЧитать дальше`; + } + let messg = await bot.telegram.sendMessage(conf.supportChatId, messageText, { + parse_mode: 'HTML', + reply_markup: { inline_keyboard: cns.inlineKeyboards.open } + }); + await editMessageText(bot, messg.message_id, messageText, cns.inlineKeyboards.open); + messageData.data[ticketId] = { + messageId: messg.message_id, + status: 1 + }; + let title = `🟢 ${ticketId} - ${listTickets[i].name}`; + await createThread(bot, messageData, ticketId, title); + await sleep(1000); } - let text = await htmlToText(listTickets[i].content); - let messageText = `🟢 ЗАЯВКА №${ticketId}\n\n`; - messageText += `Автор заявки: ${authorEmail}\n`; - messageText += `Проблема: ${listTickets[i].name}\nОписание: `; - messageText += text; - if(messageText.length > 600){ - messageText = `${messageText.substring(0, 500)} + '\n\nЧитать дальше`; - } - let messg = await bot.telegram.sendMessage(conf.supportChatId, messageText, { - parse_mode: 'HTML', - reply_markup: { inline_keyboard: cns.inlineKeyboards.open } - }); - await editMessageText(bot, messg.message_id, messageText, cns.inlineKeyboards.open); - messageData.data[ticketId] = { - messageId: messg.message_id, - status: 1 - }; - let title = `🟢 ${ticketId} - ${listTickets[i].name}`; - await createThread(bot, messageData, ticketId, title); - await sleep(1000); + messageData.ticket = ticketId; + fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** parseTickets:\n" + e, null, 3)); } - messageData.ticket = ticketId; } - fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); } exports.parseComments = async (bot, messageData) => { let listComments = await glpm.getAllItems('ITILFollowup', 5); for (let i = 4; i >= 0; i--) { - if(!listComments[i]) break; - let commentId = listComments[i].id; - if(commentId <= messageData.comment) continue; - if(listComments[i].users_id != conf.glpiConfig.user_id){ - let ticketId = listComments[i].items_id; - if(!messageData.data.hasOwnProperty(ticketId) || !messageData.data[ticketId].hasOwnProperty("threadId")) continue; - let comment = await htmlToText(listComments[i].content); - let user; - if(listComments[i].users_id){ - let temp = await glpm.getItem("User", listComments[i].users_id); - user = temp.firstname + ' ' + temp.realname; - }else{ - let temp = await glpm.getUsers(ticketId); - user = temp[0].alternative_email; + try{ + if(!listComments[i]) break; + let commentId = listComments[i].id; + if(commentId <= messageData.comment) continue; + if(listComments[i].users_id != conf.glpiConfig.user_id){ + let ticketId = listComments[i].items_id; + if(!messageData.data.hasOwnProperty(ticketId) || !messageData.data[ticketId].hasOwnProperty("threadId")) continue; + let comment = await htmlToText(listComments[i].content); + let user; + if(listComments[i].users_id){ + let temp = await glpm.getItem("User", listComments[i].users_id); + user = temp.firstname + ' ' + temp.realname; + }else{ + let temp = await glpm.getUsers(ticketId); + user = temp[0].alternative_email; + } + if(!messageData.data.hasOwnProperty(ticketId) || !messageData.data[ticketId].hasOwnProperty('threadId')){ + return; + } + let messageText = `Комментарий от ${user}:\n\n${comment}`; + if(messageText.length > 2400){ + messageText = `${messageText.substring(0, 2400)} + '\n\nЧитать дальше`; + } + await bot.telegram.sendMessage(conf.supportChatId, messageText, {parse_mode: "HTML", message_thread_id: messageData.data[ticketId].threadId}); + await sleep(1000); } - if(!messageData.data.hasOwnProperty(ticketId) || !messageData.data[ticketId].hasOwnProperty('threadId')){ - return; - } - let messageText = `Комментарий от ${user}:\n\n${comment}`; - if(messageText.length > 2400){ - messageText = `${messageText.substring(0, 2400)} + '\n\nЧитать дальше`; - } - await bot.telegram.sendMessage(conf.supportChatId, messageText, {parse_mode: "HTML", message_thread_id: messageData.data[ticketId].threadId}); - await sleep(1000); + messageData.comment = commentId; + fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** parseComments:\n" + e, null, 3)); } - messageData.comment = commentId; - fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); } } exports.refreshStatus = async (bot, messageData) => { let listTickets = await glpm.getAllItems('Ticket', 100); for(let i = 99; i >= 0; i--){ - let ticketId = listTickets[i].id; - if(!listTickets[i] || !messageData.data.hasOwnProperty(ticketId)) continue; - let td = messageData.data[ticketId]; - try{ - if(td.status != listTickets[i].status){ - let usersArray = await glpm.getUsers(ticketId); + try{ + let ticketId = listTickets[i].id; + if(!listTickets[i] || !messageData.data.hasOwnProperty(ticketId)) continue; + let td = messageData.data[ticketId]; + if(td.status != listTickets[i].status){ + let usersArray = await glpm.getUsers(ticketId); let message = await htmlToText(listTickets[i].content); - let authorEmail; + let authorEmail; if(!usersArray[0]) authorEmail == "Unknown"; - else if(usersArray[0].hasOwnProperty('alternative_email') && usersArray[0].alternative_email){ - authorEmail = usersArray[0].alternative_email; - }else if(usersArray[0].users_id == conf.glpiConfig.user_id){ + else if(usersArray[0].hasOwnProperty('alternative_email') && usersArray[0].alternative_email){ + authorEmail = usersArray[0].alternative_email; + }else if(usersArray[0].users_id == conf.glpiConfig.user_id){ await editTicketStatus(bot, messageData, message); continue; }else{ - let temp = await glpm.getItem("User", usersArray[0].users_id); - authorEmail = temp.firstname + ' ' + temp.realname; - } + let temp = await glpm.getItem("User", usersArray[0].users_id); + authorEmail = temp.firstname + ' ' + temp.realname; + } let color = await getTicketColor(listTickets[i].status); - let messageText = `${color} ЗАЯВКА №${ticketId}\n\n`; - messageText += `Автор заявки: ${authorEmail}\n`; - messageText += `Проблема: ${listTickets[i].name}\nОписание: `; - messageText += message; - if(messageText.length > 600){ - messageText = `${messageText.substring(0, 500)} + '\n\nЧитать дальше`; - } - let inKeyboard = await getKeyboardFromStatus(listTickets[i].status); - if(td.hasOwnProperty('threadId')){ + let messageText = `${color} ЗАЯВКА №${ticketId}\n\n`; + messageText += `Автор заявки: ${authorEmail}\n`; + messageText += `Проблема: ${listTickets[i].name}\nОписание: `; + messageText += message; + if(messageText.length > 600){ + messageText = `${messageText.substring(0, 500)} + '\n\nЧитать дальше`; + } + let inKeyboard = await getKeyboardFromStatus(listTickets[i].status); + if(td.hasOwnProperty('threadId')){ if(listTickets[i].status == 5 || listTickets[i].status == 6){ await closeThread(bot, messageData, ticketId); }else{ let title = `${color} ${ticketId} - ${listTickets[i].name}`; await bot.telegram.editForumTopic(conf.supportChatId, td.threadId, { name: title }); } - } + } await editMessageText(bot, td.messageId, messageText, inKeyboard); await editMessageText(bot, td.pinMessageId, messageText, inKeyboard); - messageData.data[ticketId].status = listTickets[i].status; + messageData.data[ticketId].status = listTickets[i].status; }else if(td.hasOwnProperty('threadId') && (listTickets[i].status == 5 || listTickets[i].status == 6)){ await closeThread(bot, messageData, ticketId); } }catch(e){ - fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("refreshStatus function: " + e, null, 3)); + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** refreshStatus:\n" + e, null, 3)); } } fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); } exports.editTicketStatus = async (bot, messageData, message) => { - let ticketId = message.text.split('№')[1].split('\n')[0]; - let ticket = await glpm.getItem('Ticket', ticketId); - let inKeyboard = await getKeyboardFromStatus(ticket.status); - if(messageData.data[ticketId].status != ticket.status){ - messageData.data[ticketId].status = ticket.status; - let color = await getTicketColor(ticket.status); - let title = ticket.name; - if(messageData.data[ticketId].hasOwnProperty('userChatId')){ - title = `${title.split(' - ')[1]} - ${title.split(' - ')[2]}`; + try{ + let ticketId = message.text.split('№')[1].split('\n')[0]; + let ticket = await glpm.getItem('Ticket', ticketId); + let inKeyboard = await getKeyboardFromStatus(ticket.status); + if(messageData.data[ticketId].status != ticket.status){ + messageData.data[ticketId].status = ticket.status; + let color = await getTicketColor(ticket.status); + let title = ticket.name; + if(messageData.data[ticketId].hasOwnProperty('userChatId')){ + title = `${title.split(' - ')[1]} - ${title.split(' - ')[2]}`; + } + title = `${color} ${ticketId} - ${title}`; + if(messageData.data[ticketId].hasOwnProperty('threadId')){ + await bot.telegram.editForumTopic(conf.supportChatId, messageData.data[ticketId].threadId, { name: title }); + } + let messageText = await parseMessageText(message, messageData, ticketId); + await editMessageText(bot, messageData.data[ticketId].messageId, messageText, inKeyboard); + await editMessageText(bot, messageData.data[ticketId].pinMessageId, messageText, inKeyboard); } - title = `${color} ${ticketId} - ${title}`; - if(messageData.data[ticketId].hasOwnProperty('threadId')){ - await bot.telegram.editForumTopic(conf.supportChatId, messageData.data[ticketId].threadId, { name: title }); - } - let messageText = await parseMessageText(message, messageData, ticketId); - await editMessageText(bot, messageData.data[ticketId].messageId, messageText, inKeyboard); - await editMessageText(bot, messageData.data[ticketId].pinMessageId, messageText, inKeyboard); + await editMessageMarkup(bot, message.message_id, inKeyboard); + fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** editTicketStatus:\n" + e, null, 3)); } - await editMessageMarkup(bot, message.message_id, inKeyboard); - fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); } \ No newline at end of file diff --git a/lib/glpm.js b/lib/glpm.js index 2ca87fe..f388993 100644 --- a/lib/glpm.js +++ b/lib/glpm.js @@ -26,7 +26,7 @@ exports.createTicket = async (title, description) => { }); return response.data.id; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** createTicket:\n" + e, null, 3)); } } @@ -51,7 +51,7 @@ exports.changeStatusTicket = async (ticketId, statusId) => { }); return response; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** changeStatusTicket:\n" + e, null, 3)); } } @@ -77,7 +77,7 @@ exports.assignTicket = async (ticketId, userId) => { }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** assignTicket:\n" + e, null, 3)); } } @@ -96,7 +96,7 @@ exports.getItem = async(item, id) => { // ITILFollowup = комментари }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** getItem:\n" + e, null, 3)); } } @@ -115,7 +115,7 @@ exports.getAllItems = async(item, cnt) => { }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** getAllItems:\n" + e, null, 3)); } } @@ -141,7 +141,7 @@ exports.addComment = async(ticketId, comment) => { }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** addComment:\n" + e, null, 3)); } } @@ -166,7 +166,7 @@ exports.removeComment = async(ticketId, commentId) => { }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** removeComment:\n" + e, null, 3)); } } @@ -185,6 +185,6 @@ exports.getUsers = async(ticketId) => { }); return response.data; }catch(e){ - fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify(e, null, 3)); + fs.appendFileSync(__dirname + "/../logs/logs.json", JSON.stringify("*** getUsers:\n" + e, null, 3)); } } \ No newline at end of file diff --git a/lib/utils.js b/lib/utils.js index 467d638..c56759a 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -8,54 +8,66 @@ const conf = JSON.parse(fs.readFileSync(dir + "/../data/conf.json")); const glpiUrl = conf.glpiConfig.apiurl.replace("apirest.php", ""); exports.htmlToText = async (text) => { - let temp = html.convert(he.decode(text), {preserveNewlines: true}); - textArray = temp.split('\n'); - for(let i in textArray){ - if(textArray[i].indexOf("[/front/document.send.php?docid=") >= 0){ - delete textArray[i-1]; - delete textArray[i]; + try{ + let temp = html.convert(he.decode(text), {preserveNewlines: true}); + textArray = temp.split('\n'); + for(let i in textArray){ + if(textArray[i].indexOf("[/front/document.send.php?docid=") >= 0){ + delete textArray[i-1]; + delete textArray[i]; + } } - } - let messageText = ''; - for(let k in textArray){ - if(textArray[k][0] != '>' && textArray[k].trim() && textArray[k].indexOf('ts@krtech.ru писал') == -1 && textArray[k].indexOf('cellpadding="0"') == -1){ - messageText += textArray[k].trim().replace(/[<>]/g, '') + ' '; + let messageText = ''; + for(let k in textArray){ + if(textArray[k][0] != '>' && textArray[k].trim() && textArray[k].indexOf('ts@krtech.ru писал') == -1 && textArray[k].indexOf('cellpadding="0"') == -1){ + messageText += textArray[k].trim().replace(/[<>]/g, '') + ' '; + } } + return messageText.replace(/\[.*?\]/g, ''); + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** htmlToText:\n" + e, null, 3)); } - return messageText.replace(/\[.*?\]/g, ''); } exports.parseMessageText = async (message, messageData, ticketId) => { - let color = await this.getTicketColor(messageData.data[ticketId].status); - text = message.text.split('\n'); - messageText = `${color} ЗАЯВКА №${ticketId}\n\n`; - for(let i = 2; i < text.length; i++){ - if(text[i].indexOf(':') >= 0) messageText += `${text[i].replace(':', ':')}\n`; - } - if(text[text.length - 1].indexOf("Читать дальше") >= 0){ - messageText = `${messageText.replace('Читать дальше', '')}\nЧитать дальше`; - } - return messageText; + try{ + let color = await this.getTicketColor(messageData.data[ticketId].status); + text = message.text.split('\n'); + messageText = `${color} ЗАЯВКА №${ticketId}\n\n`; + for(let i = 2; i < text.length; i++){ + if(text[i].indexOf(':') >= 0) messageText += `${text[i].replace(':', ':')}\n`; + } + if(text[text.length - 1].indexOf("Читать дальше") >= 0){ + messageText = `${messageText.replace('Читать дальше', '')}\nЧитать дальше`; + } + return messageText; + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** parseMessageText:\n" + e, null, 3)); + } } exports.createThread = async (bot, messageData, ticketId, title) => { - let td = messageData.data[ticketId]; - let thread = await bot.telegram.createForumTopic(conf.supportChatId, title, { - icon_custom_emoji_id: '5357315181649076022' - }); - let status = td.status; - messageData.data[ticketId].threadId = thread.message_thread_id; - let inKeyboard = await this.getKeyboardFromStatus(status); - await this.editMessageMarkup(bot, td.messageId, inKeyboard); - let msg = await bot.telegram.copyMessage(conf.supportChatId, conf.supportChatId, td.messageId, { - parse_mode: 'HTML', - disable_notification: true, - message_thread_id: thread.message_thread_id, - reply_markup: { inline_keyboard: inKeyboard } - }); - await bot.telegram.pinChatMessage(conf.supportChatId, msg.message_id, { disable_notification: true }); - messageData.data[ticketId].pinMessageId = msg.message_id; - fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); + try{ + let td = messageData.data[ticketId]; + let thread = await bot.telegram.createForumTopic(conf.supportChatId, title, { + icon_custom_emoji_id: '5357315181649076022' + }); + let status = td.status; + messageData.data[ticketId].threadId = thread.message_thread_id; + let inKeyboard = await this.getKeyboardFromStatus(status); + await this.editMessageMarkup(bot, td.messageId, inKeyboard); + let msg = await bot.telegram.copyMessage(conf.supportChatId, conf.supportChatId, td.messageId, { + parse_mode: 'HTML', + disable_notification: true, + message_thread_id: thread.message_thread_id, + reply_markup: { inline_keyboard: inKeyboard } + }); + await bot.telegram.pinChatMessage(conf.supportChatId, msg.message_id, { disable_notification: true }); + messageData.data[ticketId].pinMessageId = msg.message_id; + fs.writeFileSync(dir + "/../data/messageData.json", JSON.stringify(messageData, null, 3)); + }catch(e){ + fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify("*** createThread:\n" + e, null, 3)); + } } exports.closeThread = async (bot, messageData, ticketId) => { @@ -93,7 +105,7 @@ exports.editMessageText = async (bot, messageId, messageText, keyboard) => { reply_markup: {inline_keyboard: keyboard} }); }catch(e){ - fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify(e, null, 3)); + //fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify(e, null, 3)); } } @@ -101,7 +113,7 @@ exports.editMessageMarkup = async (bot, messageId, keyboard) => { try{ await bot.telegram.editMessageReplyMarkup(conf.supportChatId, messageId, undefined, {inline_keyboard: keyboard}); }catch(e){ - fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify(e, null, 3)); + //fs.appendFileSync(dir + "/../logs/logs.json", JSON.stringify(e, null, 3)); } }