文件预览

gcal.js

查看 Mufi Calendar 技能包中的文件内容。

文件内容

scripts/lib/gcal.js

/**
 * Google Calendar API 클라이언트
 */

const fs = require('fs').promises;
const path = require('path');
const { google } = require('googleapis');
const os = require('os');

const CREDENTIALS_PATH = path.join(os.homedir(), '.secrets', 'google-calendar-credentials.json');
const TOKEN_PATH = path.join(os.homedir(), '.secrets', 'google-calendar-token.json');

async function getCalendar() {
  // credentials 읽기
  const credentialsContent = await fs.readFile(CREDENTIALS_PATH, 'utf8');
  const credentials = JSON.parse(credentialsContent);
  const { client_id, client_secret, redirect_uris } = credentials.installed || credentials.web;

  const oauth2Client = new google.auth.OAuth2(
    client_id,
    client_secret,
    redirect_uris ? redirect_uris[0] : 'http://localhost:3000/oauth2callback'
  );

  // 토큰 읽기
  try {
    const tokenContent = await fs.readFile(TOKEN_PATH, 'utf8');
    const token = JSON.parse(tokenContent);
    oauth2Client.setCredentials(token);
  } catch (err) {
    console.error('❌ 토큰이 없습니다. 먼저 인증하세요: node scripts/auth.js');
    process.exit(1);
  }

  // 토큰 갱신 콜백
  oauth2Client.on('tokens', async (tokens) => {
    if (tokens.refresh_token) {
      const currentTokens = JSON.parse(await fs.readFile(TOKEN_PATH, 'utf8'));
      currentTokens.refresh_token = tokens.refresh_token;
      await fs.writeFile(TOKEN_PATH, JSON.stringify(currentTokens, null, 2));
    }
  });

  return google.calendar({ version: 'v3', auth: oauth2Client });
}

module.exports = { getCalendar };