From ce0cab277dd775bf15789e8aba6bdff8524d2346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Babi=C4=8D?= Date: Thu, 15 Jul 2021 07:13:16 +0200 Subject: [PATCH] move gcal push hook from gists to sources --- .../hook.js | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 how-update-gooogle-calendar-pre-push-hook/hook.js diff --git a/how-update-gooogle-calendar-pre-push-hook/hook.js b/how-update-gooogle-calendar-pre-push-hook/hook.js new file mode 100644 index 0000000..8233a67 --- /dev/null +++ b/how-update-gooogle-calendar-pre-push-hook/hook.js @@ -0,0 +1,106 @@ +#!/usr/bin/env node + +const fs = require("fs") +const readline = require("readline") +const { google } = require("googleapis") +const util = require("util") +const exec = util.promisify(require("child_process").exec) + +// If modifying these scopes, delete token.json. +const SCOPES = ["https://www.googleapis.com/auth/calendar.events"] +// The file token.json stores the user's access and refresh tokens, and is +// created automatically when the authorization flow completes for the first +// time. +const TOKEN_PATH = "token.json" + +// Load client secrets from a local file. +fs.readFile("credentials.json", (err, content) => { + if (err) return console.log("Error loading client secret file:", err) + // Authorize a client with credentials, then call the Google Calendar API. + //authorize(JSON.parse(content), listEvents); + authorize(JSON.parse(content), patchCalendar) +}) + +/** + * Create an OAuth2 client with the given credentials, and then execute the + * given callback function. + * @param {Object} credentials The authorization client creden:Qtials. + * @param {function} callback The callback to call with the authorized client. + */ +const authorize = (credentials, callback) => { + const { client_secret, client_id, redirect_uris } = credentials.installed + const oAuth2Client = new google.auth.OAuth2( + client_id, + client_secret, + redirect_uris[0] + ) + + // Check if we have previously stored a token. + fs.readFile(TOKEN_PATH, (err, token) => { + if (err) return getAccessToken(oAuth2Client, callback) + oAuth2Client.setCredentials(JSON.parse(token)) + callback(oAuth2Client) + }) +} + +/** + * Get and store new token after prompting for user authorization, and then + * execute the given callback with the authorized OAuth2 client. + * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for. + * @param {getEventsCallback} callback The callback for the authorized client. + */ +const getAccessToken = (oAuth2Client, callback) => { + const authUrl = oAuth2Client.generateAuthUrl({ + access_type: "offline", + scope: SCOPES, + }) + console.log("Authorize this app by visiting this url:", authUrl) + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }) + rl.question("Enter the code from that page here: ", code => { + rl.close() + oAuth2Client.getToken(code, (err, token) => { + if (err) return console.error("Error retrieving access token", err) + oAuth2Client.setCredentials(token) + // Store the token to disk for later program executions + fs.writeFile(TOKEN_PATH, JSON.stringify(token), err => { + if (err) return console.error(err) + console.log("Token stored to", TOKEN_PATH) + }) + callback(oAuth2Client) + }) + }) +} + +const slideCount = async () => { + const cmd = "grep '##' src/presentation.md | wc -l" + const { stdout } = await exec(cmd) + return stdout +} + +const patchCalendar = async auth => { + const preExistingSlides = 84 + const targetSlides = 120 + const eventId = "0g1fr1etmld3i9p54v3oti2lep" + const calendar = google.calendar({ version: "v3", auth }) + + const event = await calendar.events.get({ + calendarId: "primary", + eventId, + }) + + const resource = event.data + const slides = await slideCount() + const adjustedSlides = slides - preExistingSlides + resource.summary = `Coach: ${adjustedSlides}/${targetSlides} slides` + + await calendar.events.patch({ + calendarId: "primary", + eventId, + resource, + }) + + console.log(`SLIDES: ${adjustedSlides}/${targetSlides}`) +}