· 6 years ago · Sep 04, 2019, 06:42 PM
1// ==UserScript==
2// @name EnigmaBot
3// @namespace http://tampermonkey.net/
4// @version 0.1
5// @description Notifies chime channel if the live contacts are pending on the dashboard
6// @author harniva@
7// @match https://awssupport.amazon.com/profile/dms
8// @grant GM_xmlhttpRequest
9// @require https://internal-cdn.amazon.com/btk.amazon.com/ajax/libs/jquery/1.9.1/jquery.min.js
10// @notes Use under your own risk.
11// @notes "Run at your own risk :D"
12// @run-at document-idle
13// ==/UserScript==
14
15var chimeWebHookURL = "<yourChimeWebHookURL>";
16
17$(document).ready(function(){ setTimeout(function () {
18 var succesfullCall = true;
19 if(succesfullCall){
20 var count = 0
21 setInterval(function () {
22 //getting the current local hour to activate the bot (12pm to 4pm PST)
23 var now = new Date().getHours();
24 var hour = Number(now)
25 if(hour == 12 || hour == 13 || hour == 14 || hour == 15){
26 console.log("It is the hour");
27 //the only way to know if live contact is in \
28 //current queue is by checking integer in document title
29 if((document.title).includes("(")){
30 //====================
31 //Prepare map of LCs with all the required info
32 //====================
33 var lcList = {};
34 var lcs = document.getElementById('accordion').getElementsByClassName('glyphicon');
35 var shouldPublish = 0
36 for(var i = 0; i< lcs.length; i++){
37 var lcName = document.getElementById('accordion').getElementsByClassName('glyphicon')[i].nextSibling.innerHTML;
38 var lcTime = document.getElementById('accordion').getElementsByClassName('glyphicon')[i].parentNode.getElementsByClassName("pull-right")[0].innerText;
39 var timeElapsed = Number(lcTime.substring(lcTime.indexOf(":") + 1, lcTime.lastIndexOf(":")))
40 //type of lc::: chat: glyphicon glyphicon-comment, call: glyphicon glyphicon-earphone
41 var lc = lcs[i];
42 var lcType = 'Call';
43 if(/.*comment$/.test(lc.className)){
44 lcType = 'Chat';
45 }
46 if(lcName.includes('Chat') || lcName.includes('Call')){
47 var fullyQualifiedLcName = "AWS" + lcName + "-live-queue-table";
48 }
49 else{
50 fullyQualifiedLcName = "AWS" + lcName + lcType + "-live-queue-table";
51 }
52 console.log(fullyQualifiedLcName)
53 var paragonURL = document.getElementById(fullyQualifiedLcName).getElementsByTagName('td')[3].children[0].getAttribute("href");
54 console.log(paragonURL);
55 //get case title
56 var caseTitle = document.getElementById(fullyQualifiedLcName).getElementsByTagName('td')[3].innerText;
57 //building the object
58 var metadata = {};
59 metadata['timeElapsed'] = timeElapsed;
60 metadata['lcType'] = lcType;
61 metadata['paragonURL'] = paragonURL;
62 metadata['caseTitle'] = caseTitle;
63 //if conditions meet, write it to the list of LCs
64 if(timeElapsed > 1){
65 if(timeElapsed == 10 || timeElapsed == 18 || timeElapsed == 28){
66 lcList[lcName] = metadata; //{"lcName": {lcType, timeElapsed, paragonURL, caseTitle}}
67 shouldPublish = 1
68 }
69 else{
70 lcList[lcName] = metadata; //{"lcName": {lcType, timeElapsed, paragonURL, caseTitle}}
71 }
72 }
73 }
74 if((Object.keys(lcList).length > 0) && (shouldPublish == 1)){
75 //====================
76 //Preparing the message
77 //====================
78 var finalMessage = "@present \n"
79 for (var key in lcList) {
80 if (lcList.hasOwnProperty(key)) {
81 console.log(key, lcList[key]);
82 //setting contact type emoji
83 if(lcType == "Chat"){
84 var contactSymbol = ":speech_balloon:"
85 }
86 else{
87 contactSymbol = ":telephone_receiver:"
88 }
89 //setting LC emoji
90 if(timeElapsed == 10){
91 var timeSymbol = "more than 10"
92 }
93 else if(timeElapsed == 18){
94 timeSymbol = ":fire: :fire: :fire:"
95 }
96 else if(timeElapsed == 28){
97 timeSymbol = ":fearful: :fearful: :fearful:"
98 }
99 else{
100 timeSymbol = ""
101 }
102 }
103 finalMessage = finalMessage + timeSymbol + "\n" + contactSymbol + " " + key + " is waiting for " + lcList[key].timeElapsed.toString() + " minutes. \n" + "Title: " + lcList[key].caseTitle + "\n" + "Case: " + lcList[key].paragonURL + "\n\n";
104 }
105 //====================
106 //Making HTTP POST request to the API GW endpoint
107 //====================
108 var http = new XMLHttpRequest();
109 var url = chimeWebHookURL;
110 http.open('POST', url, true);
111 http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
112
113 http.send(JSON.stringify({"Content":finalMessage}));
114 }
115 } //check if document title has LCs
116 //====================
117 //Check for high severity cases
118 //====================
119 var table = document.getElementById("cases-table");
120 var caseFinalMessage = ":rotating_light: :rotating_light: :rotating_light: \n" + "High severity case(s) still not assigned to an enginner \n"
121 var caseShouldPublish = 0
122 for (var z = 0, row; row = table.rows[z]; z++) {
123 //iterate through rows
124 //rows would be accessed using the "row" variable assigned in the for loop
125 if(z>0){
126 var severity = document.getElementById("cases-table").rows[z].getElementsByClassName('nowrap')[2].innerText;
127 if(severity == 5 || severity == 1){
128 var serviceName = document.getElementById("cases-table").rows[z].getElementsByClassName('nowrap')[8].innerText;
129 var subject = document.getElementById("cases-table").rows[z].getElementsByClassName('nowrap')[6].innerText;
130 var caseURL = document.getElementById("cases-table").rows[z].getElementsByClassName('nowrap')[6].children[0].getAttribute("href");
131 var caseStatus = document.getElementById("cases-table").rows[z].getElementsByClassName('nowrap')[7].innerText;
132 if(caseStatus == "WIP" || caseStatus == "UNA" || caseStatus == "MAC"){
133 caseFinalMessage = caseFinalMessage + "\n" + "Severity: " + severity + "\n" + "Service: " + serviceName + "\n" + "Title: " + subject + "\n" + "Case: " + caseURL + "\n\n";
134 caseShouldPublish = 1;
135 }
136 }
137 }
138 } //for loop
139 if(caseShouldPublish == 1 && count > 1 && (count % 15 === 0)){
140 var http2 = new XMLHttpRequest();
141 var url2 = chimeWebHookURL;
142 http2.open('POST', url2, true);
143 http2.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
144 //http.setRequestHeader('Access-Control-Allow-Origin', '*');
145 http2.send(JSON.stringify({"Content": caseFinalMessage}));
146 }
147 else{
148 console.log("No High Sev cases to report")
149 }
150 //====================
151 //Check for Engineer Availability
152 //====================
153 var enginnerTable = document.getElementById('single-agent-availability-table');
154 var availabilitymessage = "Following enginners are in after/missed contact for more than 45 mins: \n";
155 for (var y = 1, row2; row2 = enginnerTable.rows[y]; y++){
156 var enginnerStatus = document.getElementById('single-agent-availability-table').rows[y].getElementsByClassName('nowrap')[0].innerText;
157 var engineerName = document.getElementById('single-agent-availability-table').rows[y].getElementsByTagName('td')[1].getElementsByTagName('span')[0].textContent;
158 var engineerSite = document.getElementById('single-agent-availability-table').rows[y].getElementsByTagName('td')[2].innerText;
159 //Engineer's timings
160 var rawtime = document.getElementById('single-agent-availability-table').rows[y].getElementsByTagName('td')[3].getElementsByTagName('span')[0].textContent;
161 var timeArray = rawtime.split(":")
162 if(timeArray[0] == 0 && timeArray[1] >45){
163 var timeAlert = 1
164 }
165 else if(timeArray[0] > 0){
166 timeAlert = 1
167 }
168 else{
169 timeAlert = 0
170 }
171 if((enginnerStatus == "After " || enginnerStatus == "Missed ") && (timeAlert == 1) && (engineerSite == "SEA")){
172 //console.log(engineerName + ":" + engineerStatus + ":" + engineerSite + ":" + timeArray);
173 availabilitymessage = availabilitymessage + engineerName + "@" + "\n"
174 }
175 }
176 if(count > 1 && count % 60 === 0){
177 var http3 = new XMLHttpRequest();
178 var url3 = chimeWebHookURL;
179 http3.open('POST', url3, true);
180 http3.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
181 //http.setRequestHeader('Access-Control-Allow-Origin', '*');
182 http3.send(JSON.stringify({"Content": availabilitymessage}));
183 }
184 } //hour
185 //console.log(lcList);
186 count = count + 1;
187 console.log(count)
188 }, 58000);
189 }
190}, 3000)});