diff --git a/js/background.js b/js/background.js index 0953cab1..31abec64 100644 --- a/js/background.js +++ b/js/background.js @@ -1,6 +1,8 @@ updateBadge(true); +var grades; +loadDataBase() /* Handle messages and their commands from content and popup scripts*/ -chrome.runtime.onMessage.addListener(function(request, sender, response) { +chrome.runtime.onMessage.addListener(function (request, sender, response) { switch (request.command) { case "courseStorage": if (request.action == "add") { @@ -31,6 +33,8 @@ chrome.runtime.onMessage.addListener(function(request, sender, response) { case "updateCourseList": updateTabs(); break; + case "gradesQuery": + executeQuery(request.query, response); default: const xhr = new XMLHttpRequest(); const method = request.method ? request.method.toUpperCase() : "GET"; @@ -51,35 +55,35 @@ chrome.runtime.onMessage.addListener(function(request, sender, response) { }); /* Initially set the course data in storage */ -chrome.runtime.onInstalled.addListener(function(details) { +chrome.runtime.onInstalled.addListener(function (details) { if (details.reason == "install") { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { if (!data.savedCourses) { var arr = new Array(); chrome.storage.sync.set({ savedCourses: arr - }, function() { + }, function () { console.log('initial course list'); }); chrome.storage.sync.set({ courseConflictHighlight: true - }, function() { + }, function () { console.log('initial highlighting: true'); }); chrome.storage.sync.set({ loadAll: true - }, function() { + }, function () { console.log('initial loadAll: true'); }); } }); } else if (details.reason == "update") { console.log("updated"); - chrome.storage.sync.get('loadAll', function(data) { + chrome.storage.sync.get('loadAll', function (data) { if (data.loadAll == undefined) { chrome.storage.sync.set({ loadAll: true - }, function() { + }, function () { console.log('initial loadAll: true'); }); } @@ -88,8 +92,39 @@ chrome.runtime.onInstalled.addListener(function(details) { }); +function executeQuery(query, sendResponse) { + console.log(grades) + var res = grades.exec(query)[0]; + sendResponse({ + data: res, + }); +} + + +/* Load the database*/ +function loadDataBase() { + sql = window.SQL; + loadBinaryFile('grades.db', function (data) { + var sqldb = new SQL.Database(data); + grades = sqldb; + }); +} +/* load the database from file */ +function loadBinaryFile(path, success) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", chrome.extension.getURL(path), true); + xhr.responseType = "arraybuffer"; + xhr.onload = function () { + var data = new Uint8Array(xhr.response); + var arr = new Array(); + for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); + success(arr.join("")); + }; + xhr.send(); +}; + function updateBadge(first) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { if (data.savedCourses) { let text = ""; if (data.savedCourses.length > 0) { @@ -105,7 +140,7 @@ function updateBadge(first) { }); timeout = 200; } - setTimeout(function() { + setTimeout(function () { chrome.browserAction.setBadgeBackgroundColor({ color: '#bf5700' }); @@ -117,7 +152,7 @@ function updateBadge(first) { /* 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) { + chrome.storage.sync.get('savedCourses', function (data) { var conflicts = []; var courses = data.savedCourses; for (var i = 0; i < courses.length; i++) { @@ -144,7 +179,7 @@ function checkConflicts(sendResponse) { /* 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) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; var conflict = false; for (var i = 0; i < courses.length; i++) { @@ -188,7 +223,7 @@ function isConflict(adtarr, bdtarr) { /* Add the requested course to the storage*/ function add(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; if (!contains(courses, request.course.unique)) { courses.push(request.course) @@ -206,7 +241,7 @@ function add(request, sender, sendResponse) { } /* Find and Remove the requested course from the storage*/ function remove(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; console.log(courses); var index = 0; @@ -227,7 +262,7 @@ function remove(request, sender, sendResponse) { /* Find if the unique is already contained within the storage*/ function alreadyContains(unique, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; sendResponse({ alreadyContains: contains(courses, unique) @@ -247,7 +282,7 @@ function contains(courses, unique) { } function updateTabs() { - chrome.tabs.query({}, function(tabs) { + chrome.tabs.query({}, function (tabs) { for (var i = 0; i < tabs.length; i++) { chrome.tabs.sendMessage(tabs[i].id, { command: "updateCourseList" @@ -260,7 +295,7 @@ const UPDATE_INTERVAL = 1000 * 60 * 16; setInterval(updateStatus, UPDATE_INTERVAL); // updateStatus(); function updateStatus(sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; var nochange = true; for (let i = 0; i < courses.length; i++) { @@ -268,25 +303,29 @@ function updateStatus(sendResponse) { let c = courses[i]; let oldstatus = c.status; let oldlink = c.link; - $.ajax({url: oldlink, success: function(result){ - if(result){ - console.log(result); - var object = $('
').html(result).contents(); - let newstatus = object.find('[data-th="Status"]').text(); - let registerlink = object.find('td[data-th="Add"] a'); - if (registerlink) { - registerlink = registerlink.attr('href'); + $.ajax({ + url: oldlink, + success: function (result) { + if (result) { + console.log(result); + var object = $('
').html(result).contents(); + let newstatus = object.find('[data-th="Status"]').text(); + let registerlink = object.find('td[data-th="Add"] a'); + if (registerlink) { + registerlink = registerlink.attr('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; } - 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(e); console.log('Not logged into UT Coursebook. Could not update class statuses.'); diff --git a/js/content.js b/js/content.js index 4c15d0d7..670f3fd3 100644 --- a/js/content.js +++ b/js/content.js @@ -34,9 +34,6 @@ const butdelay = 75; console.log('UT Registration Plus is running on this page.'); - -var utplanner = false; - if (document.querySelector('#fos_fl')) { let params = (new URL(document.location)).searchParams; let dep = params.get("fos_fl"); @@ -51,25 +48,14 @@ if (document.querySelector('#fos_fl')) { next = $("#next_nav_link"); -if(next){ +if (next) { chrome.storage.sync.get('loadAll', function (data) { if (data.loadAll) { $('[title*="next listing"]').remove(); } }); } -if($('html').hasClass('gr__utexas_collegescheduler_com')){ - utplanner = true; - $.initialize("table.section-detail-grid", function() { - $(this).find('thead>tr').append(' Plustr').each(function(){ - $(this).append(``); - }) - }); -} - -loadDataBase(); //make heading and modal if (!$("#kw_results_table").length) { $("table thead th:last-child").after('Plus'); @@ -470,27 +456,30 @@ function getDistribution(sem) { query += "and sem like '%" + sem + "%'"; } query += "order by a1+a2+a3+b1+b2+b3+c1+c2+c3+d1+d2+d3+f desc"; - var res = grades.exec(query)[0]; - var output = ""; - if (!sem) { - openDialog(department, coursename, "aggregate", profname, res); - } else { - var data; - if (typeof res == 'undefined' || profname == "") { - data = []; + alert(query) + chrome.runtime.sendMessage({ + command: "gradesQuery", + query: query + }, function (response) { + var res = response.data; + if (!sem) { + openDialog(department, coursename, "aggregate", profname, res); } else { - data = res.values[0]; + var data; + if (typeof res == 'undefined' || profname == "") { + data = []; + } else { + data = res.values[0]; + } + setChart(data); } - setChart(data); - } + }); } /*Open the modal and show all the data*/ function openDialog(dep, cls, sem, professor, res) { $("#myModal").fadeIn(fadetime); //initial text on the "save course button" - - chrome.runtime.sendMessage({ command: "alreadyContains", unique: uniquenum @@ -734,77 +723,59 @@ function getDescription() { // console.log(window.location.href); // console.log(profurl); console.log('hello'); - $.ajax({url: profurl, success: function(response){ - if (response) { - console.log(profurl); - var output = ""; - var object = $('
').html(response).contents(); - object.find('#details > p').each(function () { - var sentence = $(this).text(); - if (sentence.indexOf("Prerequisite") == 0) { - sentence = "
  • " + sentence + "
  • "; - } else if (sentence.indexOf("May be") >= 0) { - sentence = "
  • " + sentence + "
  • "; - } else if (sentence.indexOf("Restricted to") == 0) { - sentence = "
  • " + sentence + "
  • "; - } else { - sentence = "
  • " + sentence + "
  • "; + $.ajax({ + url: profurl, + success: function (response) { + if (response) { + console.log(profurl); + var output = ""; + var object = $('
    ').html(response).contents(); + object.find('#details > p').each(function () { + var sentence = $(this).text(); + if (sentence.indexOf("Prerequisite") == 0) { + sentence = "
  • " + sentence + "
  • "; + } else if (sentence.indexOf("May be") >= 0) { + sentence = "
  • " + sentence + "
  • "; + } else if (sentence.indexOf("Restricted to") == 0) { + sentence = "
  • " + sentence + "
  • "; + } else { + sentence = "
  • " + sentence + "
  • "; + } + output += sentence; + }); + description = output; + console.log(response); + if (!description) { + description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " + } + $("#description").animate({ + 'opacity': 0 + }, 200, function () { + $(this).html(description).animate({ + 'opacity': 1 + }, 200); + }); + var first = object.find('td[data-th="Instructor"]').text(); + first = first.substring(first.indexOf(", "), first.indexOf(" ", first.indexOf(", ") + 2)); + first = first.substring(2); + rmpLink = `http://www.ratemyprofessors.com/search.jsp?queryBy=teacherName&schoolName=university+of+texas+at+austin&queryoption=HEADER&query=${first} ${profname};&facetSearch=true`; + if (profname == "") { + eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?s_in_action_sw=S&s_in_search_type_sw=C&s_in_max_nbr_return=10&s_in_search_course_dept=${department}&s_in_search_course_num=${course_nbr}`; + } else { + eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?&s_in_action_sw=S&s_in_search_type_sw=N&s_in_search_name=${profname.substring(0, 1) + profname.substring(1).toLowerCase()}%2C%20${first.substring(0, 1) + first.substring(1).toLowerCase()}`; } - output += sentence; - }); - description = output; - console.log(response); - if (!description) { - description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " - } - $("#description").animate({ - 'opacity': 0 - }, 200, function () { - $(this).html(description).animate({ - 'opacity': 1 - }, 200); - }); - var first = object.find('td[data-th="Instructor"]').text(); - first = first.substring(first.indexOf(", "), first.indexOf(" ", first.indexOf(", ") + 2)); - first = first.substring(2); - rmpLink = `http://www.ratemyprofessors.com/search.jsp?queryBy=teacherName&schoolName=university+of+texas+at+austin&queryoption=HEADER&query=${first} ${profname};&facetSearch=true`; - if (profname == "") { - eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?s_in_action_sw=S&s_in_search_type_sw=C&s_in_max_nbr_return=10&s_in_search_course_dept=${department}&s_in_search_course_num=${course_nbr}`; } else { - eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?&s_in_action_sw=S&s_in_search_type_sw=N&s_in_search_name=${profname.substring(0, 1) + profname.substring(1).toLowerCase()}%2C%20${first.substring(0, 1) + first.substring(1).toLowerCase()}`; + description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " + $("#description").animate({ + 'opacity': 0 + }, 200, function () { + $(this).html(description).animate({ + 'opacity': 1 + }, 200); + }); + rmpLink = "http://www.ratemyprofessors.com/campusRatings.jsp?sid=1255"; + eCISLink = "http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?"; } - } else { - description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " - $("#description").animate({ - 'opacity': 0 - }, 200, function () { - $(this).html(description).animate({ - 'opacity': 1 - }, 200); - }); - rmpLink = "http://www.ratemyprofessors.com/campusRatings.jsp?sid=1255"; - eCISLink = "http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?"; } - }}); -} -/* Load the database*/ -function loadDataBase() { - sql = window.SQL; - loadBinaryFile('grades.db', function (data) { - var sqldb = new SQL.Database(data); - grades = sqldb; }); -} -/* load the database from file */ -function loadBinaryFile(path, success) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", chrome.extension.getURL(path), true); - xhr.responseType = "arraybuffer"; - xhr.onload = function () { - var data = new Uint8Array(xhr.response); - var arr = new Array(); - for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); - success(arr.join("")); - }; - xhr.send(); -}; +} \ No newline at end of file diff --git a/js/utplanner.js b/js/utplanner.js new file mode 100644 index 00000000..594d479e --- /dev/null +++ b/js/utplanner.js @@ -0,0 +1,9 @@ +if ($('html').hasClass('gr__utexas_collegescheduler_com')) { + $.initialize("table.section-detail-grid", function () { + console.log('hello') + $(this).find('thead>tr').append(' Plustr').each(function () { + $(this).append(``); + }) + }); +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 2c3e10e2..8cdd775d 100644 --- a/manifest.json +++ b/manifest.json @@ -9,15 +9,19 @@ "declarativeContent", "storage", "*://*.utdirect.utexas.edu/apps/registrar/course_schedule/*", - "*://*.utexas.collegescheduler.com/terms/*/schedules/*", + "*://*.utexas.collegescheduler.com/*", "*://*.catalog.utexas.edu/ribbit/", "*://*.registrar.utexas.edu/schedules/*", "*://*.login.utexas.edu/login/*" ], "content_scripts": [{ "css": ["css/styles.css"], - "js": ["js/moment.min.js", "js/sql-memory-growth.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/jquery.initialize.min.js", "js/content.js"], - "matches": ["https://utdirect.utexas.edu/apps/registrar/course_schedule/*", "https://utexas.collegescheduler.com/terms/*"] + "js": ["js/moment.min.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/jquery.initialize.min.js", "js/content.js"], + "matches": ["https://utdirect.utexas.edu/apps/registrar/course_schedule/*"] + }, { + "css": ["css/styles.css"], + "js": ["js/moment.min.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/jquery.initialize.min.js", "js/utplanner.js"], + "matches": ["https://utexas.collegescheduler.com/*"] }, { "css": ["css/styles.css"], "js": ["js/moment.min.js", "js/sql-memory-growth.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/import.js"], @@ -27,7 +31,7 @@ "grades.db", "images/disticon.png" ], "background": { - "scripts": ["js/jquery-3.3.1.min.js", "js/background.js", "js/moment.min.js"], + "scripts": ["js/jquery-3.3.1.min.js", "js/sql-memory-growth.js", "js/background.js", "js/moment.min.js"], "persistent": true }, "browser_action": { @@ -45,4 +49,4 @@ "48": "icons/icon48.png", "128": "icons/icon128.png" } -} +} \ No newline at end of file