mainCalendar.js

//////////////////////////////////////////////////////////////////////
//	Copyright (C) Hiroshi SUGIMURA 2020.10.30
//////////////////////////////////////////////////////////////////////
/**
 * @module mainCalendar
 */
'use strict'

//////////////////////////////////////////////////////////////////////
// 基本ライブラリ
const path = require('path');
const fs = require('fs');
const axios = require('axios');
const Store = require('electron-store');
const store = new Store();
const cron = require('node-cron');  
require('date-utils'); // for log


//////////////////////////////////////////////////////////////////////
const appname = 'PLIS';
const isWin = process.platform == "win32" ? true : false;
const userHome = process.env[isWin ? "USERPROFILE" : "HOME"];
const databaseDir = path.join(userHome, appname);  // SQLite3ファイルの置き場


let config = {
	debug: false
}


//////////////////////////////////////////////////////////////////////
// メッセージ管理
let sendIPCMessage = null;


let mainCalendar = {
	isRun: false,  // 多重起動防止
	holidayData: null,
	holidaysURL: 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv', // 内閣府
	observationTask: null,  // cronオブジェクト

	//////////////////////////////////////////////////////////////////////
	// interfaces
	/**
	 * @func start
	 * @desc 初期化と機能開始
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	start: function (_sendIPCMessage) {
		sendIPCMessage = _sendIPCMessage;

		config.debug      = store.get('config.Calendar.debug', false);

		config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendarStart()') : 0;

		if (mainCalendar.isRun) {
			sendIPCMessage('createCalendar', mainCalendar.holidayData);  // re-rentry
			return;
		}
		mainCalendar.isRun = true;

		//////////////////////////////////////////////////////////////////////
		// 基本設定,electronのファイル読み込み対策,developmentで変更できるようにした(けどつかってない)
		fs.readFile(path.join(databaseDir, "syukujitsu.csv"), "utf-8", (err, data) => {
			if (err) {
				console.error(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar() syukujitsu.csv is NOT found. error:', err);
				console.error(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| ', err);
				mainCalendar.getHolidays();  // カレンダーデータ無いから取得する
				return;
			}
			mainCalendar.holidayData = data;
			sendIPCMessage('createCalendar', mainCalendar.holidayData);
		});


		// 日替わりでカレンダー更新
		mainCalendar.observationTask = cron.schedule('0 0 * * *', async () => { // 毎日0時0分
			config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendarStart.observationTask') : 0;
			sendIPCMessage('renewCalendar');
		});

		mainCalendar.observationTask.start();
	},

	/**
	 * @func stopWithoutSave
	 * @desc stop observationJob
	 */
	stopWithoutSave: function () {
		config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar.stop()') : 0;

		if (mainCalendar.observationJob) {
			mainCalendar.observationJob.stop();
			mainCalendar.observationJob = null;
			config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar.stopObserve() is stopped.') : 0;
		} else {
			config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar.stopObserve() has already stopped.') : 0;
		}

		mainCalendar.isRun = false;
	},

	
	/**
	 * @func setConfig
	 * @desc setConfig
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	setConfig: async function(_config) {
		config = mergeDeeply( config, _config );
		await store.set('config.Calendar', config);
		sendIPCMessage( "renewCalendarConfigView", config );
		sendIPCMessage( "configSaved", 'Calendar' );  // 保存したので画面に通知
	},

	/**
	 * @func getConfig
	 * @desc getConfig
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	getConfig: function () {
		return config;
	},

	/**
	 * @func getPersist
	 * @desc getPersist
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	getPersist: function() {
		return persist;
	},


	//////////////////////////////////////////////////////////////////////
	// 内部関数
	/**
	 * @func getHolidays
	 * @desc 祝日データを内閣府からHTTPで取得して、ストレージにファイルとして保存する
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	getHolidays: function () {
		config.debug ? console.log(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar.getHolidays()') : 0;

		axios.get(mainCalendar.holidaysURL).then((res) => {
			fs.writeFile(path.join(databaseDir, "syukujitsu.csv"), res.data, (err, data) => {
				if (err) {
					console.error(new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainCalendar.getHolidays() syukujitsu.csv is NOT saved. error:', err);
					return;
				}
				sendIPCMessage('renewCalendar', res.data);
			});
		});
	}

};


module.exports = mainCalendar;
//////////////////////////////////////////////////////////////////////
// EOF
//////////////////////////////////////////////////////////////////////