Reimplements error system

This commit is contained in:
Ajay Ramachandran
2019-07-31 23:17:40 -04:00
parent e1dc5fbdf5
commit 3a0a267e12

201
popup.js
View File

@@ -1,35 +1,65 @@
// References //make this a function to allow this to run on the content page
function runThePopup() {
//is it in the popup or content script
var inPopup = true;
if (chrome.tabs == undefined) {
//this is on the content script, use direct communication
chrome.tabs = {};
chrome.tabs.sendMessage = function(id, request, callback) {
messageListener(request, null, callback);
}
//add a dummy query method
chrome.tabs.query = function(config, callback) {
callback([{
url: document.URL,
id: -1
}]);
}
inPopup = false;
}
var SB = {}; var SB = {};
SB.sponsorStart = document.getElementById("sponsorStart"); ["sponsorStart",
SB.clearTimes = document.getElementById("clearTimes"); "clearTimes",
SB.submitTimes = document.getElementById("submitTimes"); "submitTimes",
SB.showNoticeAgain = document.getElementById("showNoticeAgain"); "showNoticeAgain",
SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); "hideVideoPlayerControls",
SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); "showVideoPlayerControls",
SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); "hideInfoButtonPlayerControls",
SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); "showInfoButtonPlayerControls",
SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); "hideDeleteButtonPlayerControls",
SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); "showDeleteButtonPlayerControls",
SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); "disableSponsorViewTracking",
SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); "enableSponsorViewTracking",
SB.optionsButton = document.getElementById("optionsButton"); "optionsButton",
SB.reportAnIssue = document.getElementById("reportAnIssue"); "reportAnIssue",
// sponsorTimesContributions // sponsorTimesContributions
SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); "sponsorTimesContributionsContainer",
SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); "sponsorTimesContributionsDisplay",
SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); "sponsorTimesContributionsDisplayEndWord",
// sponsorTimesViewsDisplay // sponsorTimesViewsDisplay
SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); "sponsorTimesViewsContainer",
SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); "sponsorTimesViewsDisplay",
SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); "sponsorTimesViewsDisplayEndWord",
// discordButtons // discordButtons
SB.discordButtonContainer = document.getElementById("discordButtonContainer"); "discordButtonContainer",
SB.hideDiscordButton = document.getElementById("hideDiscordButton"); "hideDiscordButton",
// submitTimesInfoMessage // submitTimesInfoMessage
SB.submitTimesInfoMessageContainer = document.getElementById("submitTimesInfoMessage"); "submitTimesInfoMessageContainer",
SB.submitTimesInfoMessage = document.getElementById("submitTimesInfoMessage"); "submitTimesInfoMessage"
// More
"submissionSection",
"mainControls",
"loadingIndicator",
"videoFound",
"sponsorMessageTimes",
"downloadedSponsorMessageTimes",
].forEach(id => SB[id] = document.getElementById(id));
//setup click listeners //setup click listeners
SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); SB.sponsorStart.addEventListener("click", sendSponsorStartMessage);
@@ -48,18 +78,26 @@ SB.optionsButton.addEventListener("click", openOptions);
SB.reportAnIssue.addEventListener("click", reportAnIssue); SB.reportAnIssue.addEventListener("click", reportAnIssue);
SB.hideDiscordButton.addEventListener("click", hideDiscordButton); SB.hideDiscordButton.addEventListener("click", hideDiscordButton);
//setup error message languages
var EN_US = new Map();
EN_US.set(400, 'Server said this request was invalid"')
.set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?')
.set(409, 'This has already been submitted before')
.set(502, 'It seems the server is down. Contact the dev to inform them.')
.set('Unknown', 'There was an error submitting your sponsor times, please try again later.');
//if true, the button now selects the end time //if true, the button now selects the end time
var startTimeChosen = false; let startTimeChosen = false;
//the start and end time pairs (2d) //the start and end time pairs (2d)
var sponsorTimes = []; let sponsorTimes = [];
//current video ID of this tab //current video ID of this tab
var currentVideoID = null; let currentVideoID = null;
//is this a YouTube tab? //is this a YouTube tab?
var isYouTubeTab = false; let isYouTubeTab = false;
//see if discord link can be shown //see if discord link can be shown
chrome.storage.sync.get(["hideDiscordLink"], function(result) { chrome.storage.sync.get(["hideDiscordLink"], function(result) {
@@ -81,7 +119,7 @@ chrome.storage.sync.get(["hideDiscordLink"], function(result) {
} }
}); });
//if the don't show notice again variable is true, an option to //if the don't show notice again letiable is true, an option to
// disable should be available // disable should be available
chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) {
let dontShowNoticeAgain = result.dontShowNoticeAgain; let dontShowNoticeAgain = result.dontShowNoticeAgain;
@@ -164,6 +202,7 @@ chrome.tabs.query({
currentWindow: true currentWindow: true
}, loadTabData); }, loadTabData);
function loadTabData(tabs) { function loadTabData(tabs) {
//set current videoID //set current videoID
currentVideoID = getYouTubeVideoID(tabs[0].url); currentVideoID = getYouTubeVideoID(tabs[0].url);
@@ -189,7 +228,7 @@ function loadTabData(tabs) {
displaySponsorTimes(); displaySponsorTimes();
//show submission section //show submission section
document.getElementById("submissionSection").style.display = "unset"; SB.submissionSection.style.display = "unset";
showSubmitTimesIfNecessary(); showSubmitTimesIfNecessary();
} }
@@ -213,19 +252,19 @@ function infoFound(request) {
//if request is undefined, then the page currently being browsed is not YouTube //if request is undefined, then the page currently being browsed is not YouTube
if (request != undefined) { if (request != undefined) {
//this must be a YouTube video //this must be a YouTube video
//set variable //set letiable
isYouTubeTab = true; isYouTubeTab = true;
//remove loading text //remove loading text
document.getElementById("mainControls").style.display = "unset" SB.mainControls.style.display = "unset"
document.getElementById("loadingIndicator").innerHTML = ""; SB.loadingIndicator.innerHTML = "";
if (request.found) { if (request.found) {
document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" SB.videoFound.innerHTML = "This video's sponsors are in the database!"
displayDownloadedSponsorTimes(request); displayDownloadedSponsorTimes(request);
} else { } else {
document.getElementById("videoFound").innerHTML = "No sponsors found" SB.videoFound.innerHTML = "No sponsors found"
} }
} }
} }
@@ -269,36 +308,33 @@ function startSponsorCallback(response) {
displaySponsorTimes(); displaySponsorTimes();
//show submission section //show submission section
document.getElementById("submissionSection").style.display = "unset"; SB.submissionSection.style.display = "unset";
showSubmitTimesIfNecessary(); showSubmitTimesIfNecessary();
} }
//display the video times from the array //display the video times from the array
function displaySponsorTimes() { function displaySponsorTimes() {
//set it to the message
let sponsorMessageTimes = document.getElementById("sponsorMessageTimes");
//remove all children //remove all children
while (sponsorMessageTimes.firstChild) { while (SB.sponsorMessageTimes.firstChild) {
sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild);
} }
//add sponsor times //add sponsor times
sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes));
} }
//display the video times from the array at the top, in a different section //display the video times from the array at the top, in a different section
function displayDownloadedSponsorTimes(request) { function displayDownloadedSponsorTimes(request) {
if (request.sponsorTimes != undefined) { if (request.sponsorTimes != undefined) {
//set it to the message //set it to the message
document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); SB.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes);
//add them as buttons to the issue reporting container //add them as buttons to the issue reporting container
let container = document.getElementById("issueReporterTimeButtons"); let container = document.getElementById("issueReporterTimeButtons");
for (let i = 0; i < request.sponsorTimes.length; i++) { for (let i = 0; i < request.sponsorTimes.length; i++) {
let sponsorTimeButton = document.createElement("button"); let sponsorTimeButton = document.createElement("button");
sponsorTimeButton.className = "warningButton"; sponsorTimeButton.className = "warningButton popupElement";
sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]);
let votingButtons = document.createElement("div"); let votingButtons = document.createElement("div");
@@ -313,13 +349,13 @@ function displayDownloadedSponsorTimes(request) {
let upvoteButton = document.createElement("img"); let upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
upvoteButton.className = "voteButton"; upvoteButton.className = "voteButton popupElement";
upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); upvoteButton.src = chrome.extension.getURL("icons/upvote.png");
upvoteButton.addEventListener("click", () => vote(1, UUID)); upvoteButton.addEventListener("click", () => vote(1, UUID));
let downvoteButton = document.createElement("img"); let downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
downvoteButton.className = "voteButton"; downvoteButton.className = "voteButton popupElement";
downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); downvoteButton.src = chrome.extension.getURL("icons/downvote.png");
downvoteButton.addEventListener("click", () => vote(0, UUID)); downvoteButton.addEventListener("click", () => vote(0, UUID));
@@ -378,13 +414,13 @@ function getSponsorTimesMessageDiv(sponsorTimes) {
for (let i = 0; i < sponsorTimes.length; i++) { for (let i = 0; i < sponsorTimes.length; i++) {
let currentSponsorTimeContainer = document.createElement("div"); let currentSponsorTimeContainer = document.createElement("div");
currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; currentSponsorTimeContainer.id = "sponsorTimeContainer" + i;
currentSponsorTimeContainer.className = "sponsorTime"; currentSponsorTimeContainer.className = "sponsorTime popupElement";
let currentSponsorTimeMessage = ""; let currentSponsorTimeMessage = "";
let deleteButton = document.createElement("span"); let deleteButton = document.createElement("span");
deleteButton.id = "sponsorTimeDeleteButton" + i; deleteButton.id = "sponsorTimeDeleteButton" + i;
deleteButton.innerText = "Delete"; deleteButton.innerText = "Delete";
deleteButton.className = "mediumLink"; deleteButton.className = "mediumLink popupElement";
let index = i; let index = i;
deleteButton.addEventListener("click", () => deleteSponsorTime(index)); deleteButton.addEventListener("click", () => deleteSponsorTime(index));
@@ -394,7 +430,7 @@ function getSponsorTimesMessageDiv(sponsorTimes) {
let editButton = document.createElement("span"); let editButton = document.createElement("span");
editButton.id = "sponsorTimeEditButton" + i; editButton.id = "sponsorTimeEditButton" + i;
editButton.innerText = "Edit"; editButton.innerText = "Edit";
editButton.className = "mediumLink"; editButton.className = "mediumLink popupElement";
editButton.addEventListener("click", () => editSponsorTime(index)); editButton.addEventListener("click", () => editSponsorTime(index));
for (let s = 0; s < sponsorTimes[i].length; s++) { for (let s = 0; s < sponsorTimes[i].length; s++) {
@@ -431,36 +467,39 @@ function editSponsorTime(index) {
return; return;
} }
//hide submit button
document.getElementById("submitTimesContainer").style.display = "none";
let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index);
//get sponsor time minutes and seconds boxes //get sponsor time minutes and seconds boxes
let startTimeMinutes = document.createElement("input"); let startTimeMinutes = document.createElement("input");
startTimeMinutes.id = "startTimeMinutes" + index; startTimeMinutes.id = "startTimeMinutes" + index;
startTimeMinutes.className = "sponsorTime"; startTimeMinutes.className = "sponsorTime popupElement";
startTimeMinutes.type = "text"; startTimeMinutes.type = "text";
startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]);
startTimeMinutes.style.width = "45"; startTimeMinutes.style.width = "45px";
let startTimeSeconds = document.createElement("input"); let startTimeSeconds = document.createElement("input");
startTimeSeconds.id = "startTimeSeconds" + index; startTimeSeconds.id = "startTimeSeconds" + index;
startTimeSeconds.className = "sponsorTime"; startTimeSeconds.className = "sponsorTime popupElement";
startTimeSeconds.type = "text"; startTimeSeconds.type = "text";
startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]);
startTimeSeconds.style.width = "60"; startTimeSeconds.style.width = "60px";
let endTimeMinutes = document.createElement("input"); let endTimeMinutes = document.createElement("input");
endTimeMinutes.id = "endTimeMinutes" + index; endTimeMinutes.id = "endTimeMinutes" + index;
endTimeMinutes.className = "sponsorTime"; endTimeMinutes.className = "sponsorTime popupElement";
endTimeMinutes.type = "text"; endTimeMinutes.type = "text";
endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]);
endTimeMinutes.style.width = "45"; endTimeMinutes.style.width = "45px";
let endTimeSeconds = document.createElement("input"); let endTimeSeconds = document.createElement("input");
endTimeSeconds.id = "endTimeSeconds" + index; endTimeSeconds.id = "endTimeSeconds" + index;
endTimeSeconds.className = "sponsorTime"; endTimeSeconds.className = "sponsorTime popupElement";
endTimeSeconds.type = "text"; endTimeSeconds.type = "text";
endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]);
endTimeSeconds.style.width = "60"; endTimeSeconds.style.width = "60px";
let colonText = document.createElement("span"); let colonText = document.createElement("span");
colonText.innerText = ":"; colonText.innerText = ":";
@@ -485,14 +524,13 @@ function editSponsorTime(index) {
let saveButton = document.createElement("span"); let saveButton = document.createElement("span");
saveButton.id = "sponsorTimeSaveButton" + index; saveButton.id = "sponsorTimeSaveButton" + index;
saveButton.innerText = "Save"; saveButton.innerText = "Save";
saveButton.className = "mediumLink"; saveButton.className = "mediumLink popupElement";
saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); saveButton.addEventListener("click", () => saveSponsorTimeEdit(index));
let editButton = document.getElementById("sponsorTimeEditButton" + index); let editButton = document.getElementById("sponsorTimeEditButton" + index);
let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); let sponsorTimesContainer = document.getElementById("sponsorTimesContainer");
sponsorTimesContainer.removeChild(editButton); sponsorTimesContainer.replaceChild(saveButton, editButton);
sponsorTimesContainer.appendChild(saveButton);
} }
function saveSponsorTimeEdit(index) { function saveSponsorTimeEdit(index) {
@@ -510,6 +548,8 @@ function saveSponsorTimeEdit(index) {
chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes});
displaySponsorTimes(); displaySponsorTimes();
showSubmitTimesIfNecessary();
} }
//deletes the sponsor time submitted at an index //deletes the sponsor time submitted at an index
@@ -587,17 +627,9 @@ function clearTimes() {
resetStartTimeChosen(); resetStartTimeChosen();
} }
var EN_US = new Map(); function getErrorMessage(lang, statusCode) {
if(lang.has(statusCode)) return lang.get(statusCode);
EN_US.set(400, 'Server said this request was invalid"') return lang.get('Unknown').concat(" Error code: ") + statusCode;
.set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?')
.set(409, 'This has already been submitted before')
.set(502, 'It seems the server is down. Contact the dev to inform them.')
.set('Unknown', 'There was an error submitting your sponsor times, please try again later.');
function ErrorParser (Lang, statusCode) {
if(Lang.has(statusCode)) return Lang.get(statusCode);
return Lang.get('Unknown').concat(" Error code: ") + statusCode;
} }
function submitTimes() { function submitTimes() {
@@ -614,9 +646,14 @@ function submitTimes() {
if (response.statusCode == 200) { if (response.statusCode == 200) {
//hide loading message //hide loading message
SB.submitTimesInfoMessageContainer.style.display = "none"; SB.submitTimesInfoMessageContainer.style.display = "none";
clearTimes(); clearTimes();
} else { } else {
ErrorParser(EN_US, response.statusCode); let errorMessage = getErrorMessage(EN_US, response.statusCode);
document.getElementById("submitTimesInfoMessage").innerText = errorMessage;
document.getElementById("submitTimesInfoMessageContainer").style.display = "unset";
SB.submitTimesInfoMessageContainer.style.display = "unset"; SB.submitTimesInfoMessageContainer.style.display = "unset";
} }
} }
@@ -776,7 +813,7 @@ function enableSponsorViewTracking() {
} }
function updateStartTimeChosen() { function updateStartTimeChosen() {
//update startTimeChosen variable //update startTimeChosen letiable
if (!startTimeChosen) { if (!startTimeChosen) {
startTimeChosen = true; startTimeChosen = true;
SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; SB.sponsorStart.innerHTML = "Sponsorship Ends Now";
@@ -922,8 +959,20 @@ function sendRequestToServer(type, address, callback) {
xmlhttp.send(); xmlhttp.send();
} }
function getYouTubeVideoID(url) { // Return video id or false function getYouTubeVideoID(url) { // Returns with video id else returns false
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
var match = url.match(regExp); var match = url.match(regExp);
return (match && match[7].length == 11) ? match[7] : false; var id = new URL(url).searchParams.get("v");
return (match && match[7].length == 11) ? id : false;
}
//end of function
}
if (chrome.tabs != undefined) {
//add the width restriction (because Firefox)
document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0);
//this means it is actually opened in the popup
runThePopup();
} }