diff --git a/package.json b/package.json index 1896451..ebefeea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-battery-logger", - "version": "2.2.1", + "version": "2.3.1", "description": "A digital battery logger for FRC", "main": "./dist/main/index.js", "type": "commonjs", diff --git a/src/main/api/periodicSync.ts b/src/main/api/periodicSync.ts index 7c7dbd3..1bb9035 100644 --- a/src/main/api/periodicSync.ts +++ b/src/main/api/periodicSync.ts @@ -5,10 +5,15 @@ const url = "https://www.google.com"; import { config } from "../store"; const minutes = config.store.api.syncTimeMinutes; export const startSync = () => { - cron.schedule(`*/${minutes % 60} */${minutes % 60} * * *`, () => { - if (!checkInternet()) return; - sync().catch(); - }); + cron.schedule( + `*/${minutes % 60} *${ + Math.floor(minutes / 60) != 0 ? "/" + Math.floor(minutes / 60) : "" + } * * *`, + () => { + if (!checkInternet()) return; + sync().catch(); + }, + ); }; const checkInternet = async () => { diff --git a/src/main/api/sheetsService.ts b/src/main/api/sheetsService.ts index a406f9a..c9a00f2 100644 --- a/src/main/api/sheetsService.ts +++ b/src/main/api/sheetsService.ts @@ -1,29 +1,30 @@ -import fs from "fs/promises"; +//import fs from "fs/promises"; import { google } from "googleapis"; -import { authenticate } from "@google-cloud/local-auth"; +//import { authenticate } from "@google-cloud/local-auth"; import path from "path"; -import process from "process"; -import { OAuth2Client } from "googleapis-common"; +import { app } from "electron"; +//import { OAuth2Client } from "googleapis-common"; import { batteryRecord } from "../db/models/battery"; import { iBatteryRecord } from "../types"; import { HydratedDocument } from "mongoose"; +import { config } from "../store"; const SCOPES = ["https://www.googleapis.com/auth/spreadsheets"]; -const TOKEN_PATH = path.join(process.cwd(), "token.json"); -const CREDENTIALS_PATH = path.join(process.cwd(), "credentials.json"); -const spreadsheetId = "1SX7XJvakIZy1HRAKwPCJXn5hu9fjtQ1SoHH57GadeV0"; +//const TOKEN_PATH = path.join(process.cwd(), "token.json"); +const CREDENTIALS_PATH = path.join(app.getPath("userData"), "credentials.json"); +//const spreadsheetId = "1SX7XJvakIZy1HRAKwPCJXn5hu9fjtQ1SoHH57GadeV0"; +const spreadsheetId = config.store.api.sheetLink; const valueInputOption = "RAW"; -export const sync = () => - authorize() - .then(syncDb) - .catch((err) => console.error(err)); +//export const sync = () => authorize().then(syncDb).catch((err) => console.error(err)); +export const sync = () => syncDb(); /** * checks to see if credentials exist * @return {Promise} * */ +/* async function loadSavedCredentialsIfExist(): Promise { try { const content = await fs.readFile(TOKEN_PATH); @@ -33,13 +34,14 @@ async function loadSavedCredentialsIfExist(): Promise { return null; } } - +*/ /** * Serializes credentials to a file comptible with GoogleAUth.fromJSON. * * @param {OAuth2Client} client * @return {Promise} */ +/** async function saveCredentials(client: OAuth2Client): Promise { const content = await fs.readFile(CREDENTIALS_PATH); const keys = JSON.parse(content.toString()); @@ -52,11 +54,12 @@ async function saveCredentials(client: OAuth2Client): Promise { }); await fs.writeFile(TOKEN_PATH, payload); } - +*/ /** * Load or request or authorization to call APIs. * @return {Promise} An authorized OAuth2 client. */ +/** async function authorize(): Promise { let client = await loadSavedCredentialsIfExist(); if (client) { @@ -71,71 +74,37 @@ async function authorize(): Promise { } return client; } - -async function syncDb(auth: OAuth2Client): Promise { - const sheets = google.sheets({ version: "v4", auth }); - const res = await sheets.spreadsheets.values - .get({ - spreadsheetId: spreadsheetId, - range: "Master Record!A2:E", - }) - .catch(); - let nextOpenRow: number; - if (res.data.values == undefined) { - nextOpenRow = 2; - } else { - nextOpenRow = res.data.values.length + 2; - } - const docs: HydratedDocument[] = await batteryRecord.find({ - updated: false, - }); - const range = `Master Record!A${nextOpenRow}:E`; - - const values = docs.map((doc) => { - return [ - `${doc.number.slice(0, 2)}${doc.number.slice(2, 4)}}`, - doc.out == true ? "in" : "out", - doc.soc, - doc.rint, - doc.time, - ]; - }); - const resource = { values }; - if (values.length > 0) { - await sheets.spreadsheets.values - .update({ +*/ +async function syncDb(): Promise { + if (!spreadsheetId) return; + try { + const auth2 = new google.auth.GoogleAuth({ + keyFile: CREDENTIALS_PATH, + scopes: SCOPES, + }); + const client = await auth2.getClient(); + //const sheets = google.sheets({ version: "v4", auth }); + const sheets = google.sheets({ version: "v4", auth: client }); + const res = await sheets.spreadsheets.values + .get({ spreadsheetId: spreadsheetId, - range: range, - valueInputOption: valueInputOption, - requestBody: resource, + range: "Master Record!A2:E", }) .catch(); - } - let batteries: string[] = []; - docs.forEach((doc) => { - let batteryString = - doc.number.toString().slice(0, 2) + - "." + - doc.number.toString().slice(2, 4); - if (!batteries.includes(batteryString)) { - batteries.push(batteryString); + let nextOpenRow: number; + if (res.data.values == undefined) { + nextOpenRow = 2; + } else { + nextOpenRow = res.data.values.length + 2; } - }); - batteries.sort((a, b) => { - let aNum = parseInt(a.replace(".", "")); - let bNum = parseInt(b.replace(".", "")); - return aNum - bNum; - }); - batteries.forEach(async (battery) => { - const docs: HydratedDocument[] = await batteryRecord - .find({ - number: parseInt(battery.replace(".", "")), - updated: false, - }) - .catch(); + const docs: HydratedDocument[] = await batteryRecord.find({ + updated: false, + }); + const range = `Master Record!A${nextOpenRow}:E`; + const values = docs.map((doc) => { return [ - `${doc.number.slice(0, 2)}${doc.number.slice(2, 4)}}`, + `${doc.number.slice(0, 2)}${doc.number.slice(2, 4)}`, doc.out == true ? "in" : "out", doc.soc, doc.rint, @@ -143,104 +112,149 @@ async function syncDb(auth: OAuth2Client): Promise { ]; }); const resource = { values }; - await sheets.spreadsheets.values - .get({ - spreadsheetId: spreadsheetId, - range: `${battery}!A2:E`, - }) - .catch(async (err) => { - if (Object.entries(err)[2][1] == 400) { - await addSheet(sheets, spreadsheetId, battery).then(async () => { - await sheets.spreadsheets.values - .get({ - spreadsheetId: spreadsheetId, - range: `${battery}!A2:E`, - }) - .catch((err) => { - return console.error(err); - }) - .then(async (res) => { - if (!res) return; + if (values.length > 0) { + await sheets.spreadsheets.values + .update({ + spreadsheetId: spreadsheetId, + range: range, + valueInputOption: valueInputOption, + requestBody: resource, + }) + .catch(); + } + let batteries: string[] = []; + docs.forEach((doc) => { + let batteryString = + doc.number.toString().slice(0, 2) + + "." + + doc.number.toString().slice(2, 4); + if (!batteries.includes(batteryString)) { + batteries.push(batteryString); + } + }); + batteries.sort((a, b) => { + let aNum = parseInt(a.replace(".", "")); + let bNum = parseInt(b.replace(".", "")); + return aNum - bNum; + }); + batteries.forEach(async (battery) => { + const docs: HydratedDocument[] = await batteryRecord + .find({ + number: parseInt(battery.replace(".", "")), + updated: false, + }) + .catch(); + const values = docs.map((doc) => { + return [ + `${doc.number.slice(0, 2)}${doc.number.slice(2, 4)}`, + doc.out == true ? "in" : "out", + doc.soc, + doc.rint, + doc.time, + ]; + }); + const resource = { values }; + await sheets.spreadsheets.values + .get({ + spreadsheetId: spreadsheetId, + range: `${battery}!A2:E`, + }) + .catch(async (err) => { + if (Object.entries(err)[2][1] == 400) { + await addSheet(sheets, spreadsheetId, battery).then(async () => { + await sheets.spreadsheets.values + .get({ + spreadsheetId: spreadsheetId, + range: `${battery}!A2:E`, + }) + .catch((err) => { + return console.error(err); + }) + .then(async (res) => { + if (!res) return; - let nextOpenRow: number; - if (res.data.values == undefined) { - nextOpenRow = 2; - } else { - nextOpenRow = res.data.values.length + 2; - } + let nextOpenRow: number; + if (res.data.values == undefined) { + nextOpenRow = 2; + } else { + nextOpenRow = res.data.values.length + 2; + } - const range = `${battery}!A${nextOpenRow}:E${ - nextOpenRow + docs.length - }`; + const range = `${battery}!A${nextOpenRow}:E${ + nextOpenRow + docs.length + }`; - if (values.length > 0) { - await sheets.spreadsheets.values - .update({ - spreadsheetId: spreadsheetId, - range: range, - valueInputOption: valueInputOption, - requestBody: resource, - }) - .catch(() => { - return; - }) - .then(async () => { - await batteryRecord - .updateMany( - { - number: parseInt(battery.replace(".", "")), - updated: false, - }, - { updated: true }, - ) - .catch(() => { - return; - }); - }); - } - }); - }); - } - }) - .then(async (res) => { - if (!res) return; + if (values.length > 0) { + await sheets.spreadsheets.values + .update({ + spreadsheetId: spreadsheetId, + range: range, + valueInputOption: valueInputOption, + requestBody: resource, + }) + .catch(() => { + return; + }) + .then(async () => { + await batteryRecord + .updateMany( + { + number: parseInt(battery.replace(".", "")), + updated: false, + }, + { updated: true }, + ) + .catch(() => { + return; + }); + }); + } + }); + }); + } + }) + .then(async (res) => { + if (!res) return; - let nextOpenRow: number; - if (res.data.values == undefined) { - nextOpenRow = 2; - } else { - nextOpenRow = res.data.values.length + 2; - } + let nextOpenRow: number; + if (res.data.values == undefined) { + nextOpenRow = 2; + } else { + nextOpenRow = res.data.values.length + 2; + } - const range = `${battery}!A${nextOpenRow + docs.length}:E`; + const range = `${battery}!A${nextOpenRow + docs.length}:E`; - if (values.length > 0) { - await sheets.spreadsheets.values - .update({ - spreadsheetId: spreadsheetId, - range: range, - valueInputOption: valueInputOption, - requestBody: resource, - }) - .catch(() => { - return; - }) - .then(async () => { - await batteryRecord - .updateMany( - { - number: parseInt(battery.replace(".", "")), - updated: false, - }, - { updated: true }, - ) - .catch(() => { - return; - }); - }); - } - }); - }); + if (values.length > 0) { + await sheets.spreadsheets.values + .update({ + spreadsheetId: spreadsheetId, + range: range, + valueInputOption: valueInputOption, + requestBody: resource, + }) + .catch(() => { + return; + }) + .then(async () => { + await batteryRecord + .updateMany( + { + number: parseInt(battery.replace(".", "")), + updated: false, + }, + { updated: true }, + ) + .catch(() => { + return; + }); + }); + } + }); + }); + } catch (err) { + return console.error(err); + } } /*** * Adds a new sheet to the spreadsheet diff --git a/src/main/index.ts b/src/main/index.ts index 129ce35..eeb355a 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -6,8 +6,7 @@ import { ipc } from "./IPC"; import path from "path"; import db from "./db/db"; const createWindow = () => { - // Create the browser window. - console.log(app.getPath("userData")); + // Create the browser window const mainWindow = new BrowserWindow({ width: 1024, height: 600, @@ -19,6 +18,7 @@ const createWindow = () => { contextIsolation: true, }, frame: false, + show: false, }); if (app.commandLine.hasSwitch("dev")) { @@ -36,7 +36,10 @@ const createWindow = () => { mainWindow.loadURL(`file://${__dirname}/../../.output/public/index.html`); // REDIRECT TO FIRST WEBPAGE AGAIN }); - mainWindow.webContents.setZoomLevel(0.6); + mainWindow.once("ready-to-show", () => { + mainWindow.webContents.setZoomLevel(-2.2); + mainWindow.show(); + }); }; // This method will be called when Electron has finished @@ -64,8 +67,7 @@ app.whenReady().then(() => { // dock icon is clicked and there are no other windows open. if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); - if (config.store.api.sheetsSync == true) startSync(); - app.getPath("userData"); + if (config.store.api.sheetsSync.toString() == "true") startSync(); }); // Quit when all windows are closed, except on macOS. There, it's common diff --git a/src/renderer/components/settingsMenu.vue b/src/renderer/components/settingsMenu.vue index 298a227..03f5047 100644 --- a/src/renderer/components/settingsMenu.vue +++ b/src/renderer/components/settingsMenu.vue @@ -133,7 +133,7 @@
-

Sheets Link

+

Sheets Id