diff --git a/js/background.js b/js/background.js index 67c31b1c..8e82fa77 100644 --- a/js/background.js +++ b/js/background.js @@ -1,368 +1,368 @@ updateBadge(true); /* Handle messages and their commands from content and popup scripts*/ -chrome.runtime.onMessage.addListener(function (request, sender, response) { - switch (request.command) { - case "courseStorage": - if (request.action == "add") { - add(request, sender, response); - } - if (request.action == "remove") { - remove(request, sender, response); - } - break; - case "isSingleConflict": - isSingleConflict(request.dtarr, request.unique, response); - break; - case "checkConflicts": - checkConflicts(response); - break; - case "updateBadge": - updateBadge(); - break; - case "updateStatus": - updateStatus(response); - break; - case "getLine": - getLine(request.dtarr, response); - break; - case "alreadyContains": - alreadyContains(request.unique, response); - break; - case "updateCourseList": - updateTabs(); - break; - default: - const xhr = new XMLHttpRequest(); - const method = request.method ? request.method.toUpperCase() : "GET"; - xhr.open(method, request.url, true); - console.log(request); - xhr.onload = () => response(xhr.responseText); - xhr.onerror = () => response(xhr.statusText); - if (method == "POST") { - xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - } - xhr.send(request.data); - break; - } - return true; +chrome.runtime.onMessage.addListener(function(request, sender, response) { + switch (request.command) { + case "courseStorage": + if (request.action == "add") { + add(request, sender, response); + } + if (request.action == "remove") { + remove(request, sender, response); + } + break; + case "isSingleConflict": + isSingleConflict(request.dtarr, request.unique, response); + break; + case "checkConflicts": + checkConflicts(response); + break; + case "updateBadge": + updateBadge(); + break; + case "updateStatus": + updateStatus(response); + break; + case "getLine": + getLine(request.dtarr, response); + break; + case "alreadyContains": + alreadyContains(request.unique, response); + break; + case "updateCourseList": + updateTabs(); + break; + default: + const xhr = new XMLHttpRequest(); + const method = request.method ? request.method.toUpperCase() : "GET"; + xhr.open(method, request.url, true); + console.log(request); + xhr.onload = () => response(xhr.responseText); + xhr.onerror = () => response(xhr.statusText); + if (method == "POST") { + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + } + xhr.send(request.data); + break; + } + return true; }); /* Initially set the course data in storage */ -chrome.runtime.onInstalled.addListener(function (details) { - if (details.reason == "install") { - chrome.storage.sync.get('savedCourses', function (data) { - if (!data.savedCourses) { - var arr = new Array(); - chrome.storage.sync.set({ - savedCourses: arr - }, function () { - console.log('initial course list'); - }); - chrome.storage.sync.set({ - courseConflictHighlight: true - }, function () { - console.log('initial highlighting: true'); - }); - chrome.storage.sync.set({ - loadAll: true - }, function () { - console.log('initial loadAll: true'); - }); - } - }); - } else if (details.reason == "update") { - console.log("updated"); - chrome.storage.sync.get('loadAll', function (data) { - if (data.loadAll == undefined) { - chrome.storage.sync.set({ - loadAll: true - }, function () { - console.log('initial loadAll: true'); - }); - } - }); - } +chrome.runtime.onInstalled.addListener(function(details) { + if (details.reason == "install") { + chrome.storage.sync.get('savedCourses', function(data) { + if (!data.savedCourses) { + var arr = new Array(); + chrome.storage.sync.set({ + savedCourses: arr + }, function() { + console.log('initial course list'); + }); + chrome.storage.sync.set({ + courseConflictHighlight: true + }, function() { + console.log('initial highlighting: true'); + }); + chrome.storage.sync.set({ + loadAll: true + }, function() { + console.log('initial loadAll: true'); + }); + } + }); + } else if (details.reason == "update") { + console.log("updated"); + chrome.storage.sync.get('loadAll', function(data) { + if (data.loadAll == undefined) { + chrome.storage.sync.set({ + loadAll: true + }, function() { + console.log('initial loadAll: true'); + }); + } + }); + } }); function updateBadge(first) { - chrome.storage.sync.get('savedCourses', function (data) { - if (data.savedCourses) { - let text = ""; - if (data.savedCourses.length > 0) { - text += data.savedCourses.length - } - chrome.browserAction.setBadgeText({ - text: text - }); - let timeout = 0; - if (!first) { - chrome.browserAction.setBadgeBackgroundColor({ - color: '#FF5722' - }); - timeout = 200; - } - setTimeout(function () { - chrome.browserAction.setBadgeBackgroundColor({ - color: '#bf5700' - }); - }, timeout); + chrome.storage.sync.get('savedCourses', function(data) { + if (data.savedCourses) { + let text = ""; + if (data.savedCourses.length > 0) { + text += data.savedCourses.length + } + chrome.browserAction.setBadgeText({ + text: text + }); + let timeout = 0; + if (!first) { + chrome.browserAction.setBadgeBackgroundColor({ + color: '#FF5722' + }); + timeout = 200; + } + setTimeout(function() { + chrome.browserAction.setBadgeBackgroundColor({ + color: '#bf5700' + }); + }, timeout); - } - }); + } + }); } /* Find all the conflicts in the courses and send them out/ if there is even a conflict*/ function checkConflicts(sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var conflicts = []; - var courses = data.savedCourses; - for (var i = 0; i < courses.length; i++) { - for (var j = i + 1; j < courses.length; j++) { - if (isConflict(courses[i].datetimearr, courses[j].datetimearr)) { - console.log("conflict"); - conflicts.push([courses[i], courses[j]]); - } - } - } - if (conflicts.length == 0) { - sendResponse({ - isConflict: false - }); - } else { - console.log(conflicts); - sendResponse({ - isConflict: true, - between: conflicts - }); - } - }); + chrome.storage.sync.get('savedCourses', function(data) { + var conflicts = []; + var courses = data.savedCourses; + for (var i = 0; i < courses.length; i++) { + for (var j = i + 1; j < courses.length; j++) { + if (isConflict(courses[i].datetimearr, courses[j].datetimearr)) { + console.log("conflict"); + conflicts.push([courses[i], courses[j]]); + } + } + } + if (conflicts.length == 0) { + sendResponse({ + isConflict: false + }); + } else { + console.log(conflicts); + sendResponse({ + isConflict: true, + between: conflicts + }); + } + }); } /* Find if the course at unique and with currdatearr is contained in the saved courses and if it conflicts with any other courses*/ function isSingleConflict(currdatearr, unique, sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var courses = data.savedCourses; - var conflict = false; - for (var i = 0; i < courses.length; i++) { - if (isConflict(currdatearr, courses[i].datetimearr)) { - conflict = true; - break; - } - } - var contains = false; - var i = 0; - while (i < courses.length && !contains) { - if (courses[i].unique == unique) { - contains = true; - } - i++; - } - sendResponse({ - isConflict: conflict, - alreadyContains: contains - }); - }); + chrome.storage.sync.get('savedCourses', function(data) { + var courses = data.savedCourses; + var conflict = false; + for (var i = 0; i < courses.length; i++) { + if (isConflict(currdatearr, courses[i].datetimearr)) { + conflict = true; + break; + } + } + var contains = false; + var i = 0; + while (i < courses.length && !contains) { + if (courses[i].unique == unique) { + contains = true; + } + i++; + } + sendResponse({ + isConflict: conflict, + alreadyContains: contains + }); + }); } /* Check if conflict between two date-time-arrs*/ function isConflict(adtarr, bdtarr) { - for (var i = 0; i < adtarr.length; i++) { - var currday = adtarr[i][0]; - var currtimes = adtarr[i][1]; - for (var j = 0; j < bdtarr.length; j++) { - var nextday = bdtarr[j][0]; - var nextimes = bdtarr[j][1]; - if (nextday == currday) { - if (currtimes[0] < nextimes[1] && currtimes[1] > nextimes[0]) { - return true; - } - } - } - } - return false; + for (var i = 0; i < adtarr.length; i++) { + var currday = adtarr[i][0]; + var currtimes = adtarr[i][1]; + for (var j = 0; j < bdtarr.length; j++) { + var nextday = bdtarr[j][0]; + var nextimes = bdtarr[j][1]; + if (nextday == currday) { + if (currtimes[0] < nextimes[1] && currtimes[1] > nextimes[0]) { + return true; + } + } + } + } + return false; } /* Add the requested course to the storage*/ function add(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var courses = data.savedCourses; - if (!contains(courses, request.course.unique)) { - courses.push(request.course) - console.log(courses); - chrome.storage.sync.set({ - savedCourses: courses - }); - } - updateBadge(); - sendResponse({ - done: "Added: (" + request.course.unique + ") " + request.course.coursename, - label: "Remove Course -" - }); - }); + chrome.storage.sync.get('savedCourses', function(data) { + var courses = data.savedCourses; + if (!contains(courses, request.course.unique)) { + courses.push(request.course) + console.log(courses); + chrome.storage.sync.set({ + savedCourses: courses + }); + } + updateBadge(); + sendResponse({ + done: "Added: (" + request.course.unique + ") " + request.course.coursename, + label: "Remove Course -" + }); + }); } /* Find and Remove the requested course from the storage*/ function remove(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var courses = data.savedCourses; - console.log(courses); - var index = 0; - while (index < courses.length && courses[index].unique != request.course.unique) { - index++; - } - courses.splice(index, 1); - chrome.storage.sync.set({ - savedCourses: courses - }); - updateBadge(); - sendResponse({ - done: "Removed: (" + request.course.unique + ") " + request.course.coursename, - label: "Add Course +" - }); - }); + chrome.storage.sync.get('savedCourses', function(data) { + var courses = data.savedCourses; + console.log(courses); + var index = 0; + while (index < courses.length && courses[index].unique != request.course.unique) { + index++; + } + courses.splice(index, 1); + chrome.storage.sync.set({ + savedCourses: courses + }); + updateBadge(); + sendResponse({ + done: "Removed: (" + request.course.unique + ") " + request.course.coursename, + label: "Add Course +" + }); + }); } /* Find if the unique is already contained within the storage*/ function alreadyContains(unique, sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var courses = data.savedCourses; - sendResponse({ - alreadyContains: contains(courses, unique) - }); - }); + chrome.storage.sync.get('savedCourses', function(data) { + var courses = data.savedCourses; + sendResponse({ + alreadyContains: contains(courses, unique) + }); + }); } function contains(courses, unique) { - var i = 0; - while (i < courses.length) { - if (courses[i].unique == unique) { - return true; - } - i++; - } - return false; + var i = 0; + while (i < courses.length) { + if (courses[i].unique == unique) { + return true; + } + i++; + } + return false; } function updateTabs() { - chrome.tabs.query({}, function (tabs) { - for (var i = 0; i < tabs.length; i++) { - chrome.tabs.sendMessage(tabs[i].id, { - command: "updateCourseList" - }); - } - }); + chrome.tabs.query({}, function(tabs) { + for (var i = 0; i < tabs.length; i++) { + chrome.tabs.sendMessage(tabs[i].id, { + command: "updateCourseList" + }); + } + }); } -const UPDATE_INTERVAL = 1000 * 60; // 1 mins +const UPDATE_INTERVAL = 1000 * 60 * 16; // 16 mins setInterval(updateStatus, UPDATE_INTERVAL); function updateStatus(sendResponse) { - chrome.storage.sync.get('savedCourses', function (data) { - var courses = data.savedCourses; - var nochange = true; - for (let i = 0; i < courses.length; i++) { - try { - let c = courses[i]; - let oldstatus = c.status; - let oldlink = c.registerlink; - var xhr = new XMLHttpRequest(); - xhr.open("GET", c.link, false); - xhr.send(); - let result = xhr.responseText; - let dummy = document.createElement('html'); - dummy.innerHTML = result; - let newstatus = dummy.querySelector('[data-th="Status"]').textContent; - let registerlink = dummy.querySelector('td[data-th="Add"] a'); - if (registerlink) { - registerlink = registerlink.getAttribute('href'); - } - var haschanged = (newstatus == oldstatus && registerlink == oldlink); - if (!haschanged) { - console.log(c.unique + 'updated from ' + oldstatus + " to " + newstatus + " and " + oldlink + " to " + registerlink); - } - nochange &= haschanged; - c.registerlink = registerlink; - c.status = newstatus; - } catch (e) { - console.log('Not logged into UT Coursebook. Could not update class statuses.'); - } - } - if (!nochange) { - chrome.storage.sync.set({ - savedCourses: courses - }); - console.log('updated status'); - } else { - // console.log('no change'); - } - // console.log("updated status' and registerlinks"); - }); + chrome.storage.sync.get('savedCourses', function(data) { + var courses = data.savedCourses; + var nochange = true; + for (let i = 0; i < courses.length; i++) { + try { + let c = courses[i]; + let oldstatus = c.status; + let oldlink = c.registerlink; + var xhr = new XMLHttpRequest(); + xhr.open("GET", c.link, false); + xhr.send(); + let result = xhr.responseText; + let dummy = document.createElement('html'); + dummy.innerHTML = result; + let newstatus = dummy.querySelector('[data-th="Status"]').textContent; + let registerlink = dummy.querySelector('td[data-th="Add"] a'); + if (registerlink) { + registerlink = registerlink.getAttribute('href'); + } + var haschanged = (newstatus == oldstatus && registerlink == oldlink); + if (!haschanged) { + console.log(c.unique + 'updated from ' + oldstatus + " to " + newstatus + " and " + oldlink + " to " + registerlink); + } + nochange &= haschanged; + c.registerlink = registerlink; + c.status = newstatus; + } catch (e) { + console.log('Not logged into UT Coursebook. Could not update class statuses.'); + } + } + if (!nochange) { + chrome.storage.sync.set({ + savedCourses: courses + }); + console.log('updated status'); + } else { + // console.log('no change'); + } + // console.log("updated status' and registerlinks"); + }); } /* Find if the unique is already contained within the storage*/ function getLine(datetimearr, sendResponse) { - var output = makeLine(datetimearr); - console.log(output); - sendResponse({ - line: output - }); + var output = makeLine(datetimearr); + console.log(output); + sendResponse({ + line: output + }); } /* convert from the dtarr and maek the time lines*/ function makeLine(datetimearr) { - //converted times back - var output = []; - var dtmap = makeMap(datetimearr); - var timearr = Array.from(dtmap.keys()); - var dayarr = Array.from(dtmap.values()); - for (var i = 0; i < dayarr.length; i++) { - var place = findLoc(dayarr[i], timearr[i], datetimearr); - var building = place.substring(0, place.search(/\d/) - 1); - if (building == "") { - building = "Undecided Location"; - } - output.push([dayarr[i], timearr[i].split(",")[0], timearr[i].split(",")[1], 'https://maps.utexas.edu/buildings/UTM/' + building, place]); - } - return output; + //converted times back + var output = []; + var dtmap = makeMap(datetimearr); + var timearr = Array.from(dtmap.keys()); + var dayarr = Array.from(dtmap.values()); + for (var i = 0; i < dayarr.length; i++) { + var place = findLoc(dayarr[i], timearr[i], datetimearr); + var building = place.substring(0, place.search(/\d/) - 1); + if (building == "") { + building = "Undecided Location"; + } + output.push([dayarr[i], timearr[i].split(",")[0], timearr[i].split(",")[1], 'https://maps.utexas.edu/buildings/UTM/' + building, place]); + } + return output; } function makeMap(datetimearr) { - var dtmap = new Map([]); - for (var i = 0; i < datetimearr.length; i++) { - //console.log(datetimearr[i][1][0]); - datetimearr[i][1][0] = moment(datetimearr[i][1][0], ["HH:mm A"]).format("h:mm A"); - datetimearr[i][1][1] = moment(datetimearr[i][1][1], ["HH:mm A"]).format("h:mm A"); - } - for (var i = 0; i < datetimearr.length; i++) { - if (dtmap.has(String(datetimearr[i][1]))) { - dtmap.set(String(datetimearr[i][1]), dtmap.get(String(datetimearr[i][1])) + datetimearr[i][0]); - } else { - dtmap.set(String(datetimearr[i][1]), datetimearr[i][0]); - } - } - return dtmap + var dtmap = new Map([]); + for (var i = 0; i < datetimearr.length; i++) { + //console.log(datetimearr[i][1][0]); + datetimearr[i][1][0] = moment(datetimearr[i][1][0], ["HH:mm A"]).format("h:mm A"); + datetimearr[i][1][1] = moment(datetimearr[i][1][1], ["HH:mm A"]).format("h:mm A"); + } + for (var i = 0; i < datetimearr.length; i++) { + if (dtmap.has(String(datetimearr[i][1]))) { + dtmap.set(String(datetimearr[i][1]), dtmap.get(String(datetimearr[i][1])) + datetimearr[i][0]); + } else { + dtmap.set(String(datetimearr[i][1]), datetimearr[i][0]); + } + } + return dtmap } //find the location of a class given its days and timearrs. function findLoc(day, timearr, datetimearr) { - for (let i = 0; i < datetimearr.length; i++) { - var dtl = datetimearr[i]; - // console.log(dtl[1]); - // console.log(timearr); - if (day.includes(dtl[0])) { - if (JSON.stringify(timearr) == JSON.stringify(fixDtl1(dtl[1]))) { - return dtl[2]; - } - } - } + for (let i = 0; i < datetimearr.length; i++) { + var dtl = datetimearr[i]; + // console.log(dtl[1]); + // console.log(timearr); + if (day.includes(dtl[0])) { + if (JSON.stringify(timearr) == JSON.stringify(fixDtl1(dtl[1]))) { + return dtl[2]; + } + } + } } function fixDtl1(dtl1) { - let output = ""; - for (let i = 0; i < dtl1.length; i++) { - output += dtl1[i]; - if (i != dtl1.length - 1) { - output += ","; - } - } - return output; + let output = ""; + for (let i = 0; i < dtl1.length; i++) { + output += dtl1[i]; + if (i != dtl1.length - 1) { + output += ","; + } + } + return output; } \ No newline at end of file diff --git a/popup.html b/popup.html index 3a5ba765..240177c2 100644 --- a/popup.html +++ b/popup.html @@ -10,9 +10,9 @@