diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/index.ts | 53 | ||||
| -rw-r--r-- | src/sheets.ts | 96 |
2 files changed, 124 insertions, 25 deletions
diff --git a/src/index.ts b/src/index.ts index 3f0c7ef..7553b56 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,36 +1,43 @@ import { App } from "@tinyhttp/app"; import { logger } from "@tinyhttp/logger"; import config from "./config"; -import { broadcast } from "./sheets"; +import { buildSheetsClient } from "./sheets"; import { bot } from "./tg"; -const app = new App({ - onError: (err, _req, res) => { - console.log(err); - res.status(500).send("Something bad happened"); - }, -}); +const main = async () => { + const sheets = await buildSheetsClient(); -app - .use(logger({ - timestamp: { - format: "YYYY-MM-DDTHH:mm:ssZ[Z]", + const app = new App({ + onError: (err, _req, res) => { + console.log(err); + res.status(500).send("Something bad happened"); }, - })) - .use(bot.webhookCallback("/webhook/telegram")) - .get("/", async (_, res) => { - res.send({ service: "hommabot2 API" }); - }) - .post("/scheduler/trigger", async (_req, res) => { - await broadcast(); - res.send({ scheduler: "trigger" }); }); -console.log(`Setting up webhook on ${config.tgWebhookUrl}`); -bot.telegram.setWebhook(config.tgWebhookUrl); + app + .use(logger({ + timestamp: { + format: "YYYY-MM-DDTHH:mm:ssZ[Z]", + }, + })) + .use(bot.webhookCallback("/webhook/telegram")) + .get("/", async (_, res) => { + res.send({ service: "hommabot2 API" }); + }) + .post("/scheduler/trigger", async (_req, res) => { + await sheets.fetchSheetData(); + res.send({ scheduler: "trigger" }); + }); -console.log(`Serving on http://localhost:${config.port}`); -app.listen(config.port); + console.log(`Setting up webhook on ${config.tgWebhookUrl}`); + bot.telegram.setWebhook(config.tgWebhookUrl); + + console.log(`Serving on http://localhost:${config.port}`); + app.listen(config.port); + +}; + +main(); // Enable graceful stop process.once("SIGINT", () => bot.stop("SIGINT")); diff --git a/src/sheets.ts b/src/sheets.ts index a03e349..8f6c81c 100644 --- a/src/sheets.ts +++ b/src/sheets.ts @@ -1,3 +1,95 @@ -export const broadcast = async (): Promise<void> => { - // TODO +import got from "got"; +import { google } from "googleapis"; +import config from "./config"; + +export const fetchIdToken = async function (aud: string): Promise<string> { + const metadataServerTokenURL = `http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${aud}`; + + let resp; + try { + resp = await got(metadataServerTokenURL, { + headers: { + "Metadata-Flavor": "Google", + }, + }); + } catch (err) { + console.error(err); + throw new Error("Failed to fetch ID token from Google metadata endpoint"); + } + + const token = resp.body; + if (!token) { + throw new Error("ID token from Google metadata endpoint is empty"); + } + + return token; }; + +export const buildSheetsClient = async () => { + const auth = new google.auth.GoogleAuth({ + // Scopes can be specified either as an array or as a single, space-delimited string. + scopes: [ + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly", + ], + }); + + // Acquire an auth client, and bind it to all future calls + const authClient = await auth.getClient(); + google.options({ auth: authClient }); + + const fetchSheetData = async (): Promise<void> => { + // TODO + try { + const sheets = google.sheets({ version: "v4" }); + const res = await sheets.spreadsheets.values.get({ + spreadsheetId: config.sheetsSpreadsheetId, + range: config.sheetsRange, + }); + + console.log("res", res); + } catch (err) { + console.error(err); + throw err; + } + }; + + return { + fetchSheetData, + }; +}; + + +/* +def fetch_sheet_data(service: Resource) -> list[SheetsRow]: + logging.info("Calling Sheets API to fetch data...") + sheet = service.spreadsheets() + result = ( + sheet.values() + .get( + spreadsheetId=getenv("SHEETS_SPREADSHEET_ID"), + range=getenv("SHEETS_RANGE"), + ) + .execute() + ) + + rows = result.get("values", []) + logging.info(f"Fetched {len(rows)} rows of data") + return [_row_to_dataclass(row) for row in rows] + + +def update_sheet_last_done_column(service: Resource, new_datestamps: list[str]): + logging.info("Calling Sheets API to update last done column...") + range = getenv("SHEETS_RANGE") + sheet = service.spreadsheets() + last_done_column_range = _get_rightmost_column_in_range(range) + + body = {"values": [[datestamp] for datestamp in new_datestamps]} + + sheet.values().update( + spreadsheetId=getenv("SHEETS_SPREADSHEET_ID"), + range=last_done_column_range, + valueInputOption="RAW", + body=body, + ).execute() +*/
\ No newline at end of file |
