2022-11-26 01:40:41 +00:00
|
|
|
var browser, chrome, settings;
|
|
|
|
var enableConsoleLog = true;
|
|
|
|
var logPrepend = "[FediFollow]";
|
|
|
|
|
|
|
|
var tokenRegex = /"access_token":".*?",/gm;
|
|
|
|
|
|
|
|
// required settings keys with defauls
|
|
|
|
var settingsDefaults = {
|
|
|
|
fedifollow_homeinstance: null,
|
|
|
|
fedifollow_showfollows: true
|
|
|
|
}
|
|
|
|
|
|
|
|
// create alarm every 3 minutes
|
|
|
|
chrome.alarms.create('refresh', { periodInMinutes: 1 });
|
|
|
|
|
|
|
|
function onError(error){
|
|
|
|
console.error(`${logPrepend} Error: ${error}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
// wrapper to prepend to log messages
|
|
|
|
function log(text) {
|
|
|
|
if (enableConsoleLog) {
|
|
|
|
console.log(logPrepend + ' ' + text)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-02 21:45:34 +00:00
|
|
|
// get redirect url (it will be the url on the toot authors home instance)
|
|
|
|
async function resolveToot(url) {
|
|
|
|
return new Promise(async function(resolve) {
|
|
|
|
var res = await fetch(url, {method: 'HEAD'})
|
|
|
|
if (res.redirected) {
|
|
|
|
resolve(res.url)
|
|
|
|
} else {
|
|
|
|
resolve(false)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-11-26 01:40:41 +00:00
|
|
|
async function fetchBearerToken() {
|
|
|
|
var url = "https://" + settings.fedifollow_homeinstance;
|
|
|
|
var res = await fetch(url);
|
|
|
|
var text = await res.text();
|
|
|
|
if (text) {
|
|
|
|
// dom parser is not available in background workers, so we use regex to parse the html....
|
|
|
|
// for some reason, regex groups do not seem to work in chrome background workers... the following is ugly but should work fine
|
|
|
|
var content = text.match(tokenRegex)[0];
|
|
|
|
if (content) {
|
|
|
|
var indexOne = content.search(/"access_token":"/);
|
|
|
|
var indexTwo = content.search(/",/);
|
|
|
|
if (indexOne > -1 && indexTwo > -1) {
|
|
|
|
indexOne = indexOne + 16
|
|
|
|
var token = content.substring(indexOne, indexTwo);
|
|
|
|
console.log(token)
|
|
|
|
if (token.length > 16) {
|
|
|
|
settings.fedifollow_token = token;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// reset token for inject.js to know
|
|
|
|
settings.fedifollow_token = null;
|
|
|
|
log("Token could not be found.");
|
|
|
|
}
|
|
|
|
|
2022-12-02 21:45:34 +00:00
|
|
|
async function fetchData() {
|
2022-11-26 01:40:41 +00:00
|
|
|
settings = await (browser || chrome).storage.local.get(settingsDefaults);
|
|
|
|
if (settings.fedifollow_homeinstance) {
|
2022-12-02 21:45:34 +00:00
|
|
|
await fetchBearerToken()
|
2022-11-26 01:40:41 +00:00
|
|
|
} else {
|
|
|
|
log("Home instance not set");
|
|
|
|
}
|
|
|
|
await (browser || chrome).storage.local.set(settings);
|
|
|
|
}
|
|
|
|
|
2022-12-02 21:45:34 +00:00
|
|
|
chrome.runtime.onInstalled.addListener(fetchData);
|
|
|
|
chrome.alarms.onAlarm.addListener(fetchData);
|
|
|
|
|
|
|
|
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
|
|
|
resolveToot(request.url).then(sendResponse)
|
|
|
|
return true
|
|
|
|
});
|