Files
BetterSEQTA-Plus/src/background.js
T
2023-11-15 06:47:42 +00:00

300 lines
7.4 KiB
JavaScript

/*global chrome*/
export const openDB = () => {
return new Promise((resolve, reject) => {
const request = indexedDB.open('MyDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('backgrounds', { keyPath: 'id' });
};
request.onsuccess = () => {
resolve(request.result);
};
request.onerror = (event) => {
reject('Error opening database: ' + event.target.errorCode);
};
});
};
export const writeData = async (type, data) => {
const db = await openDB();
const tx = db.transaction('backgrounds', 'readwrite');
const store = tx.objectStore('backgrounds');
const request = await store.put({ id: 'customBackground', type, data });
return request.result;
};
export const readData = () => {
return new Promise((resolve, reject) => {
openDB()
.then(db => {
const tx = db.transaction('backgrounds', 'readonly');
const store = tx.objectStore('backgrounds');
// Retrieve the custom background
const getRequest = store.get('customBackground');
// Attach success and error event handlers
getRequest.onsuccess = function(event) {
resolve(event.target.result);
};
getRequest.onerror = function(event) {
console.error('An error occurred:', event);
reject(event);
};
})
.catch(error => {
console.error('An error occurred:', error);
reject(error);
});
});
};
function reloadSeqtaPages() {
chrome.tabs.query({}, function (tabs) {
for (let tab of tabs) {
if (tab.title.includes('SEQTA Learn')) {
chrome.tabs.reload(tab.id);
}
}
});
}
// Helper function to handle setting permissions
const handleAddPermissions = () => {
if (typeof chrome.declarativeContent !== 'undefined') {
chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {});
}
chrome.permissions.request(
{ permissions: ['declarativeContent'], origins: ['*://*/*'] },
(granted) => {
if (granted) {
const rules = [
// Define your rules here
];
rules.forEach(rule => {
chrome.declarativeContent.onPageChanged.addRules([rule]);
});
alert('Permissions granted. Reload SEQTA pages to see changes. If this workaround doesn\'t work, please contact the developer. It will be an easy fix');
}
}
);
};
// Main message listener
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
switch (request.type) {
case 'reloadTabs':
reloadSeqtaPages();
break;
case 'currentTab':
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, request, function (response) {
sendResponse(response);
});
});
return true;
case 'githubTab':
chrome.tabs.create({ url: 'github.com/SethBurkart123/EvenBetterSEQTA' });
break;
case 'setDefaultStorage':
SetStorageValue(DefaultValues);
break;
case 'addPermissions':
handleAddPermissions();
break;
case 'sendNews':
GetNews(sendResponse);
return true;
default:
console.log('Unknown request type');
}
});
function GetNews(sendResponse) {
// Gets the current date
const date = new Date();
const from =
date.getFullYear() +
'-' +
(date.getMonth() + 1) +
'-' +
(date.getDate() - 1);
let url = `https://newsapi.org/v2/everything?domains=abc.net.au&from=${from}&apiKey=17c0da766ba347c89d094449504e3080`;
fetch(url)
.then((result) => result.json())
.then((response) => {
if (response.code == 'rateLimited') {
url += '%00';
GetNews();
} else {
sendResponse({ news: response });
}
});
}
const DefaultValues = {
onoff: true,
animatedbk: true,
bksliderinput: 50,
transparencyEffects: false,
lessonalert: true,
notificationcollector: true,
defaultmenuorder: [],
menuitems: {},
menuorder: [],
subjectfilters: {},
selectedColor: 'linear-gradient(40deg, rgba(201,61,0,1) 0%, RGBA(170, 5, 58, 1) 100%)',
DarkMode: true,
shortcuts: [
{
name: 'YouTube',
enabled: false,
},
{
name: 'Outlook',
enabled: true,
},
{
name: 'Office',
enabled: true,
},
{
name: 'Spotify',
enabled: false,
},
{
name: 'Google',
enabled: true,
},
{
name: 'DuckDuckGo',
enabled: false,
},
{
name: 'Cool Math Games',
enabled: false,
},
{
name: 'SACE',
enabled: false,
},
{
name: 'Google Scholar',
enabled: false,
},
{
name: 'Gmail',
enabled: false,
},
{
name: 'Netflix',
enabled: false,
},
{
name: 'Education Perfect',
enabled: false,
},
],
customshortcuts: [],
};
function SetStorageValue(object) {
for (var i in object) {
chrome.storage.local.set({ [i]: object[i] });
}
}
function UpdateCurrentValues() {
chrome.storage.local.get(null, function (items) {
var CurrentValues = items;
const NewValue = Object.assign({}, DefaultValues, CurrentValues);
function CheckInnerElement(element) {
for (let i in element) {
if (typeof element[i] === 'object') {
if (typeof DefaultValues[i].length == 'undefined') {
NewValue[i] = Object.assign({}, DefaultValues[i], CurrentValues[i]);
} else {
// If the object is an array, turn it back after
let length = DefaultValues[i].length;
NewValue[i] = Object.assign({}, DefaultValues[i], CurrentValues[i]);
let NewArray = [];
for (let j = 0; j < length; j++) {
NewArray.push(NewValue[i][j]);
}
NewValue[i] = NewArray;
}
}
}
}
CheckInnerElement(DefaultValues);
if (items['customshortcuts']) {
NewValue['customshortcuts'] = items['customshortcuts'];
}
SetStorageValue(NewValue);
});
}
function migrateOldStorage() {
chrome.storage.local.get(null, function (items) {
let shouldUpdate = false; // Flag to check if there is anything to update
// Check for the old "Name" field and convert it to "name"
if (items.shortcuts && items.shortcuts.length > 0 && 'Name' in items.shortcuts[0]) {
shouldUpdate = true;
items.shortcuts = items.shortcuts.map((shortcut) => {
return {
name: shortcut.Name, // Convert "Name" to "name"
enabled: shortcut.enabled // Keep the "enabled" field as is
};
});
}
// Check for "educationperfect" and convert it to "Education Perfect"
if (items.shortcuts && items.shortcuts.length > 0) {
for (let shortcut of items.shortcuts) {
if (shortcut.name === 'educationperfect' || shortcut.name === 'Education Perfect') {
shouldUpdate = true;
shortcut.name = 'Education Perfect';
}
}
}
// If there"s something to update, set the new values in storage
if (shouldUpdate) {
chrome.storage.local.set({ shortcuts: items.shortcuts }, function() {
console.log('Migration completed.');
});
}
});
}
chrome.runtime.onInstalled.addListener(function (event) {
chrome.storage.local.remove(['justupdated']);
UpdateCurrentValues();
if ( event.reason == 'install', event.reason == 'update' ) {
chrome.storage.local.set({ justupdated: true });
migrateOldStorage();
}
});