Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calendar integration #15

Open
wants to merge 40 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
af640ed
La til key
jorgengaldal Oct 9, 2022
bcbc672
Kontakt med OAuth2
jorgengaldal Oct 9, 2022
556fadc
Endrer OAuth til popup
jorgengaldal Oct 9, 2022
c2ae071
Test for scope calendar
jorgengaldal Oct 9, 2022
1af9c03
Insert request, men fungerer ikke
jorgengaldal Oct 19, 2022
268a885
Endret request til INSERT
jorgengaldal Oct 23, 2022
05a2826
Fikset for å sette inn ny sekundærkalender
jorgengaldal Oct 23, 2022
3e4c446
#6 Checking if calendar exists
julian-ao Oct 26, 2022
dfff9c2
Sette calendar id til cookie
jorgengaldal Oct 26, 2022
e1b90bd
Merget sjekk-kalender med lagre kalender id i cookie
jorgengaldal Oct 26, 2022
fdeabef
Fikset issue #9
jorgengaldal Nov 2, 2022
1dd0bf6
Changed console.logs for easier debugging
julian-ao Nov 2, 2022
e8170a8
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
julian-ao Nov 2, 2022
9f22238
Setter token til user-token i localStorage
jorgengaldal Nov 9, 2022
1fa3456
Flyttet API_KEY fra URL til variabel
jorgengaldal Nov 9, 2022
c02a9ad
addEvent
linnerudskoghsander Nov 9, 2022
e9fdbe7
merge conflict
linnerudskoghsander Nov 9, 2022
43b8c62
Merge branch 'restrukturering' into calendar-integration
jorgengaldal Nov 9, 2022
fbf432d
Gjorde masse rot for å kunne poste events. Fungerer enda ikke helt.
jorgengaldal Nov 13, 2022
6ce5e44
Nå kan den i hvert fall poste events
jorgengaldal Jan 24, 2023
cf8ec58
ryddet vekk noen filer
jorgengaldal Jan 24, 2023
8b6e931
Skrev litt dokumentasjon om hvordan filene jobber sammen
jorgengaldal Jan 24, 2023
013a6b5
Formaterte filene + noen kommentarer
julian-ao Jan 28, 2023
181fc68
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
julian-ao Jan 28, 2023
25d1c98
Litt kommentering
jorgengaldal Jan 29, 2023
b614de9
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
jorgengaldal Jan 29, 2023
40c3eac
Fjernet ubrukte funksjoner i oauth.js og renamed til popup.js
jorgengaldal Jan 29, 2023
04cbbec
Skilte ut event til parameter.
jorgengaldal Jan 29, 2023
ee41afa
Fjernet ubrukt knapp for kontrollering av cookie
jorgengaldal Jan 29, 2023
968cf06
Henter data fra Online API-et ved hjelp av eventID i urlen, og poster…
julian-ao Jan 29, 2023
2331cef
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
julian-ao Jan 29, 2023
696aa2f
Kommentarer
jorgengaldal Jan 29, 2023
8ea1652
Kommentarer til background.js
jorgengaldal Jan 29, 2023
39aab90
Infomld om man er på ventelista før beskrivelsen av arrangementet
julian-ao Jan 29, 2023
1b4180e
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
jorgengaldal Jan 29, 2023
649147b
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
julian-ao Jan 29, 2023
24d8722
Bedre kode
julian-ao Jan 29, 2023
a69df48
La inn en kommentar
jorgengaldal Jan 29, 2023
e414b14
Merge branch 'calendar-integration' of https://github.com/appKom/cale…
jorgengaldal Jan 29, 2023
715d898
Fikset hvordan det addes ny kalender om den ikke eksisterer.
jorgengaldal Feb 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
# calendar-extension

Denne chrome-extensionen legger dine online arrangementer rett inn i google calender ved påmelding.


## Litt om hvordan det fungerer


### oauth.js
Kjører i popup.html og hører etter trykk på knappene. Sender melding (gjennom chrome.runtime.sendMessage) når bruker skal autentiseres. Denne meldingen plukkes opp av background.js og bruker autentiseres så mot Google.

### background.js
background.js kjører hele tiden når utvidelsen kjører.
Denne håndterer messages mellom de ulike scriptsene.

Ved autentisering (se oauth.js) lagres key og token i localStorage, slik at background.js kan sende denne informasjonen til content script-et (foreløpig addEvent.js) når det skal postes et event til API-et
104 changes: 94 additions & 10 deletions addEvent.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,98 @@
// Ved å legge til lenken: https://online.ntnu.no/events/* under "content_scripts" i manifest.json, kan vi bestemme spesefike scripts og css-filer
// som skal kjøres ved følgende url. * betyr at filene vi legger til vil kjøres på alt som oppfyller alt frem til stjernen og uansett hva som kommer etter.
/* Denne filen blir insertet når man går til en online-side.
Brukes så for å posteEvent()*/

// Her legger vi til en eventlistener på siden vi befinner oss på.
document.addEventListener("click", (e)=> {
async function postEvent(event) {
/* Funksjon postEvent()

// her trekker vi ut teksten til knappen som ble klikket på, og sjekker om det samsvarer med den knappen vi ønsker å gi funksjonalitet til.
if (e.target.innerText == "Meld meg på") {
console.log("Du har nå blitt meldt på! ");
Resultat:
Legger til event til autentisert brukers kalender.

Beskrivelse:
Ytre funksjon som fetcher riktige credentials (fra background.js) og deretter
caller PostEventInner med disse og eventet.*/

// Brukes for å sende request til background.js
const extension_id = "elijkjhoojegfcnehlpgbkacplephicj"

// Sender requests til background.js etter credentials.
chrome.runtime.sendMessage(
extension_id,
{ request: "credentials" },
async function (response) {
// Response er et objekt med verdiene API_KEY og token
await postEventInner(response, event)
}
)
}


async function postEventInner(credentials) {
/* Indre funksjon som blir callet fra postEvent() og gjør
selve POST-requesten til kalender-API-et.*/

const API_KEY = credentials.API_KEY
const token = credentials.token

let eventData = await getEventData()

chrome.storage.local.get(["online_calendar_id"], (result) => {
const online_calendar_id = result.online_calendar_id

/* Statisk HTTP-header som brukes for å poste event */
var init = {
method: "POST",
async: true,
headers: {
Authorization: "Bearer " + token,
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify(eventData),
}
else if (e.target.innerText == "Meld meg på venteliste") {
console.log("Du har nå blitt satt på venteliste. Du er nummer # i køen");

// Poster event til kalender-API
fetch(
"https://www.googleapis.com/calendar/v3/calendars/" +
online_calendar_id + "/events?key=" + API_KEY,
init
)
.then((response) => response.json())
.then((data) => {
console.log("Test inni fetch")
console.log(data) // Respons fra event
})
})
}

// Returnerer et objekt med eventData som skal plasseres i body i postEvent
async function getEventData() {
eventID = window.location.href.split("/")[4]
let response = await fetch('https://old.online.ntnu.no/api/v1/events/' + eventID + '/')
let data = await response.json()

let eventFull = data.max_capacity == data.number_of_seats_taken

return {
summary: "Online | " + data.title,
description: eventFull ? "OBS: Da du meldte deg på arrangementet, ble du lagt til i ventelista. \n---\n \n": "" + data.description,
location: data.location,
colorId: "9", // Blueberry: #3f51b5 | All colors: https://lukeboyle.com/blog/posts/google-calendar-api-color-id
start: {
dateTime: data.event_start,
timeZone: "Europe/Oslo"
},
end: {
dateTime: data.event_end,
timeZone: "Europe/Oslo"
}
})
}
}


document.addEventListener("click", (e) => {
/* Hører etter alle klikk og sjekker om det er riktig
knapp ved å sjekke objektets innerText */
if (e.target.innerText == "Meld meg på"
|| e.target.innerText == "Meld meg på venteliste") {
postEvent();
}})
133 changes: 133 additions & 0 deletions background.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,137 @@
// NOTE: Vurder å bruke chrome.storage.sync i stedet for chrome.storage.local

async function addCalendarAndStoreCalendarId(token) {
console.log("token: " + token)
data = await addNewSecondaryCalendar(token)
calendarId = data.id
console.log("Fra autorisering, id: " + calendarId)
chrome.storage.local.set({ online_calendar_id: calendarId })
// localStorage.setItem("online_calendar_id", calendarId)
}

// Returnerer id-en til opprettet kalender.
async function addNewSecondaryCalendar(token) {
// Returnerer id-en til opprettet kalender basert på token.
console.log("Adding new secondary calendar")
var init = {
method: "POST",
async: true,
headers: {
Authorization: "Bearer " + token,
Accept: "application/json",
"Content-Type": "application/json",
},
body: "{'summary': 'Extension-test'}",
}

response = await fetch(
"https://www.googleapis.com/calendar/v3/calendars?alt=json&key=" + API_KEY,
init
)
data = await response.json()
return data
}

function check_if_calendar_exists(data, calendar_id) {
/* Itererer over listen over kalendre for å se om extensionkalenderen finnes*/

for (var i = 0; i < data.items.length; i++) {
console.log(data.items[i].id)
if (data.items[i].id == calendar_id) {
return true
}
}
return false
}

// Lager en ny kalender for brukeren, og lagrer id-en til kalenderen i chrome.storage.local
async function doAuth() {
/* Autentiserer bruker mot Google Calendar-API og får
tilbake credentials (token) som lagres i storage.local for å */

chrome.storage.local.get(["online_calendar_id"], (result) => {
// Henter ID-en til kalender
const online_calendar_id = result.online_calendar_id

/* getAuthToken åpner interaktivt vindu hvor man logger inn med
Google-bruker. */
chrome.identity.getAuthToken({ interactive: true }, function (token) {

// Lagrer API_KEY og token for senere bruk.
let API_KEY = "AIzaSyCL3vj18BOFVjgfPjHUEMxYfcxqwKZOpss"
chrome.storage.local.set({ API_KEY: API_KEY })
chrome.storage.local.set({ token: token })

// Statiske headers som brukes for GET-request
var init = {
method: "GET",
async: true,
headers: {
Authorization: "Bearer " + token,
Accept: "application/json",
"Content-Type": "application/json",
},
contentType: "json",
}

// Fetcher liste over alle kalendere i Google for bruker
fetch(
"https://www.googleapis.com/calendar/v3/users/me/calendarList",
init
)
.then((response) => response.json()) // Gjør response til json
.then(function (data) {
console.log(data)

online_calendar_exists = false
if (online_calendar_id) {
if (check_if_calendar_exists(data, online_calendar_id)) {
console.log("Calendar already exists")
online_calendar_exists = true
} else {
console.log("Calendar does not exist")
}
} else {
console.log("No calendarID in chrome.storage")
}

if (!online_calendar_exists) {
// CREATE NEW CALENDAR
addCalendarAndStoreCalendarId(token)
}
})
})
})
}


chrome.runtime.onMessage.addListener(
/* Handler alle incoming messages fra andre filer som
må handles her grunnet API-restriksjoner */
function (request, sender, sendResponse) {

if (request.request === "oauth") {
/* Kjøres når den får melding fra popup.js om å
autentisere. */
doAuth()
return true
}

if (request.request === "credentials") {
/* Kjøres når content-scriptet (addEvent.js) brukes
for å poste events. */
chrome.storage.local.get(["token"], (result) => {
const token = result.token
chrome.storage.local.get(["API_KEY"], (result) => {
const API_KEY = result.API_KEY

// Sender API-key og token
sendResponse({
API_KEY: API_KEY,
token: token,
})
})
})
return true
}
})
18 changes: 15 additions & 3 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,25 @@
"version": "0.1",
"manifest_version": 3,
"action": {
"default_title": "Test"
"default_title": "Test",
"default_popup": "popup.html"
},
"background": {
"service_worker": "background.js"
},
"permissions": [
"identity",
"activeTab",
"scripting"
"scripting",
"storage"
],

"oauth2": {
"client_id": "680508743663-kl9g5s3u3kcu3a7ftr3jkkpvn54o59ev.apps.googleusercontent.com",
"scopes": ["https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/calendar"]
},
"host_permissions": ["https://www.googleapis.com/*"],
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApx6EaRGuiqJlc7BMYtXqxX80Vly9RjMIKtkzT/IvLklLYrPOJsJZWRQJqXG+Eu8AKG3PTT7lBEq3n7Ze8Qh2zt7hQPLRKksowIcxPDlZQ1T/xiJ4qNEoj6hfiBv2lN93QOdZMQykZoP5VI4FphmEuMq4QcPR1o3YMwj1oaBk8dnh16331h78c5RdWK6/HOqK7afD/JeaniRSN99FLvI0WSR/cgVRP5+cTTbz95T4ApNGnn8u7Cbg5LWFL+wfoLaWAtco6QVcwCvCu45x94CG5q5mBI4V5qyJ80wgxpu+ecvABeOlgXBKWZaoFpaeXibDaGXTuE4whhwGe6pAtof16QIDAQAB",
"content_scripts": [
{
"matches": ["https://online.ntnu.no/events/*"],
Expand Down
6 changes: 5 additions & 1 deletion popup.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="popup.css" />
<link rel="stylesheet" href="popup.css">
<script type="text/javascript" src="popup.js"></script>
<title>Online i Google Calendar</title>
</head>
<body>
<button id="gammel-knapp">Logg inn med Google</button>

<footer>
<img
src="media/logo_hvit.png"
Expand All @@ -16,5 +19,6 @@
id="footer-logo"
/>
</footer>
<!-- <script src="https://apis.google.com/js/client.js?onload=onGAPILoad"></script> -->
</body>
</html>
13 changes: 13 additions & 0 deletions popup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
window.onload = function () {
/* Registrerer klikk på Logg inn-knapp og
sender melding til background.js som gjør autentisering
mot Googles API. */
document
.getElementById("gammel-knapp")
.addEventListener("click", function () {
chrome.runtime.sendMessage({ request: "oauth" }, () => {
console.log("Authorized user")
})
})
}