function system(mainWindow, dir, lang, dirname) { const electron = require('electron') const app = electron.app const join = require('path').join var Jimp = require('jimp') const fs = require('fs') var JSON5 = require('json5') var ipc = electron.ipcMain const clipboard = electron.clipboard var tmp_img = join(app.getPath('userData'), 'tmp.png') var ha_path = join(app.getPath('userData'), 'hardwareAcceleration') var ua_path = join(app.getPath('userData'), 'useragent') var lang_path = join(app.getPath('userData'), 'language') var log_dir_path = join(app.getPath('userData'), 'logs') //ログ var today = new Date() //今日のやつ var todayStr = today.getFullYear() + '' + (today.getMonth() + 1) + '' + today.getDate() + '.log' //昨日のやつ today.setDate(today.getDate() - 1) var yestStr = today.getFullYear() + '' + (today.getMonth() + 1) + '' + today.getDate() + '.log' //一昨日のやつ today.setDate(today.getDate() - 1) var yest2Str = today.getFullYear() + '' + (today.getMonth() + 1) + '' + today.getDate() + '.log' const BrowserWindow = electron.BrowserWindow const dialog = electron.dialog const os = require('os') const language = require('../main/language.js') //プラットフォーム ipc.on('getPlatform', function(e, arg) { try { var gitHash = fs.readFileSync('git', 'utf8') } catch { var gitHash = null } e.sender.webContents.send('platform', [ process.platform, process.arch, process.version, process.versions.chrome, process.versions.electron, gitHash ]) }) //言語 ipc.on('lang', function(e, arg) { console.log('set:' + arg) fs.writeFileSync(lang_path, arg) e.sender.webContents.send('langres', arg) }) //エクスポートのダイアログ ipc.on('exportSettings', function(e, args) { dialog.showSaveDialog( mainWindow, { title: 'Export', properties: ['openFile', 'createDirectory'], defaultPath: 'export.thedeskconfig.json5' }, savedFiles => { if (!savedFiles) { return false } e.sender.webContents.send('exportSettingsFile', savedFiles) } ) }) //インポートのダイアログ ipc.on('importSettings', function(e, args) { dialog.showOpenDialog( mainWindow, { title: 'Import', properties: ['openFile'], filters: [ { name: 'TheDesk Config', extensions: ['thedeskconfig', 'thedeskconfigv2', 'json5'] } ] }, fileNames => { console.log('imported from: ', fileNames) if (!fileNames) { return false } e.sender.webContents.send('config', JSON5.parse(fs.readFileSync(fileNames[0], 'utf8'))) } ) }) //保存フォルダのダイアログ ipc.on('savefolder', function(e, args) { dialog.showOpenDialog( mainWindow, { title: 'Save folder', properties: ['openDirectory'] }, fileNames => { e.sender.webContents.send('savefolder', fileNames[0]) } ) }) //カスタムサウンドのダイアログ ipc.on('customSound', function(e, arg) { dialog.showOpenDialog( mainWindow, { title: 'Custom sound', properties: ['openFile'], filters: [ { name: 'Audio', extensions: ['mp3', 'aac', 'wav', 'flac', 'm4a'] }, { name: 'All', extensions: ['*'] } ] }, fileNames => { e.sender.webContents.send('customSoundRender', [arg, fileNames[0]]) } ) }) //ハードウェアアクセラレーションの無効化 ipc.on('ha', function(e, arg) { if (arg == 'true') { fs.writeFileSync(ha_path, arg) } else { fs.unlink(ha_path, function(err) {}) } app.relaunch() app.exit() }) ipc.on('ua', function(e, arg) { if (arg == '') { fs.unlink(ua_path, function(err) {}) } else { fs.writeFileSync(ua_path, arg) } app.relaunch() app.exit() }) ipc.on('quit', (e, args) => { app.quit() }) ipc.on('about', (e, args) => { about() }) function about() { var ver = app.getVersion() var window = new BrowserWindow({ webPreferences: { webviewTag: false, nodeIntegration: false, contextIsolation: true, preload: join(dirname, 'js', 'platform', 'preload.js') }, width: 300, height: 500, transparent: false, // ウィンドウの背景を透過 frame: false, // 枠の無いウィンドウ resizable: false }) window.loadURL(dir + '/about.html?ver=' + ver) return 'true' } ipc.on('nano', function(e, x, y) { var nano_info_path = join(app.getPath('userData'), 'nano-window-position.json') var window_pos try { window_pos = JSON.parse(fs.readFileSync(nano_info_path, 'utf8')) } catch (e) { window_pos = [0, 0] // デフォルトバリュー } var nanowindow = new BrowserWindow({ webPreferences: { webviewTag: false, nodeIntegration: false, contextIsolation: true, preload: join(dirname, 'js', 'platform', 'preload.js') }, width: 350, height: 140, transparent: false, // ウィンドウの背景を透過 frame: false, // 枠の無いウィンドウ resizable: false }) nanowindow.loadURL(dir + '/nano.html') nanowindow.setAlwaysOnTop(true) //nanowindow.toggleDevTools() nanowindow.setPosition(window_pos[0], window_pos[1]) nanowindow.on('close', function() { fs.writeFileSync(nano_info_path, JSON.stringify(nanowindow.getPosition())) }) return true }) var cbTimer1 ipc.on('startmem', (e, arg) => { event = e.sender cbTimer1 = setInterval(mems, 1000) }) function mems() { var mem = os.totalmem() - os.freemem() if (mainWindow) { event.webContents.send('memory', [mem, os.cpus()[0].model, os.totalmem()]) } } ipc.on('endmem', (e, arg) => { if (cbTimer1) { clearInterval(cbTimer1) } }) ipc.on('export', (e, args) => { fs.writeFileSync(args[0], JSON5.stringify(args[1])) e.sender.webContents.send('exportAllComplete', '') }) //フォント function object_array_sort(data, key, order, fn) { //デフォは降順(DESC) var num_a = -1 var num_b = 1 if (order === 'asc') { //指定があれば昇順(ASC) num_a = 1 num_b = -1 } data = data.sort(function(a, b) { var x = a[key] var y = b[key] if (x > y) return num_a if (x < y) return num_b return 0 }) //重複排除 var arrObj = {} for (var i = 0; i < data.length; i++) { arrObj[data[i]['family']] = data[i] } data = [] for (var key in arrObj) { data.push(arrObj[key]) } fn(data) // ソート後の配列を返す } ipc.on('fonts', (e, arg) => { const fm = require('font-manager') var fonts = fm.getAvailableFontsSync() object_array_sort(fonts, 'family', 'asc', function(fonts_sorted) { e.sender.webContents.send('font-list', fonts_sorted) }) }) //コピー ipc.on('copy', (e, arg) => { clipboard.writeText(arg) }) //ログ ipc.on('log', (e, arg) => { var today = new Date() var todayStr = today.getFullYear() + '' + (today.getMonth() + 1) + '' + today.getDate() var log_path = join(log_dir_path, todayStr + '.log') fs.appendFile(log_path, '\n' + arg, function(err) { if (err) { throw err } }) }) ipc.on('getLogs', (e, arg) => { var logs = '' var todayLog = '' var yestLog = '' var yest2Log = '' fs.readdir(log_dir_path, function(err, files) { if (err) throw err files.filter(function(file) { if (file == todayStr) { todayLog = fs.readFileSync(join(log_dir_path, file), 'utf8') } if (file == yestStr) { yestLog = logs + fs.readFileSync(join(log_dir_path, file), 'utf8') } if (file == yest2Str) { yest2Log = fs.readFileSync(join(log_dir_path, file), 'utf8') } logs = todayLog + yestLog + yest2Log }) logs = yest2Log + yestLog + todayLog e.sender.webContents.send('logData', logs) }) }) //起動時ログディレクトリ存在確認と作成、古ログ削除 fs.access(log_dir_path, fs.constants.R_OK | fs.constants.W_OK, error => { if (error) { if (error.code === 'ENOENT') { fs.mkdirSync(log_dir_path) } else { return } } else { fs.readdir(log_dir_path, function(err, files) { if (err) throw err files.filter(function(file) { if (file != todayStr && file != yestStr && file != yest2Str) { fs.unlinkSync(join(log_dir_path, file)) } }) }) } }) var $ = require('nodobjc') $.framework('Foundation') $.framework('AppKit') var GetSongs = $.NSObject.extend('Delegate') GetSongs.addMethod('getMySongs:', 'v@:@', function(self, _cmd, notif) { var userInfo = notif('userInfo') var keys = userInfo('keyEnumerator') var key var song = {} while ((key = keys('nextObject'))) { var value = userInfo('objectForKey', key) song[key.toString()] = value.toString() } console.log(song) }) GetSongs.register() var gs = GetSongs('alloc')('init') var nc = $.NSDistributedNotificationCenter('defaultCenter') var selector = $.NSSelectorFromString($('getMySongs:')) var notification = $('com.apple.iTunes.playerInfo') nc('addObserver', gs, 'selector', 'getMySongs:', 'name', notification, 'object', null) var app = $.NSApplication('sharedApplication') function runLoop() { var pool = $.NSAutoreleasePool('alloc')('init') try { app( 'nextEventMatchingMask', $.NSAnyEventMask.toString(), 'untilDate', $.NSDate('distantFuture'), 'inMode', $.NSDefaultRunLoopMode, 'dequeue', 1 ) } catch (e) { console.error('run loop error', e.message) } pool('drain') setTimeout(runLoop, 1000) //process.nextTick(runLoop); } runLoop() } exports.system = system