Commit 2d6d2f87 authored by 神楽坂玲奈's avatar 神楽坂玲奈

2.0.7

parent 5d9d8c65
...@@ -10,29 +10,46 @@ module.exports = (grunt) => { ...@@ -10,29 +10,46 @@ module.exports = (grunt) => {
break; break;
case 'win32': case 'win32':
grunt.loadNpmTasks('grunt-electron-installer'); grunt.loadNpmTasks('grunt-electron-installer');
release_task = ['electron:win32', 'create-windows-installer:ia32', 'create-windows-installer:x64', 'copy:bundle-ia32', 'copy:bundle-x64', 'create-windows-installer:bundle-ia32', 'create-windows-installer:bundle-x64']; release_task = ['electron:win32-ia32', 'electron:win32-x64', 'create-windows-installer:ia32', 'create-windows-installer:x64', 'copy:bundle-ia32', 'copy:bundle-x64', 'create-windows-installer:bundle-ia32', 'create-windows-installer:bundle-x64'];
break; break;
} }
grunt.initConfig({ grunt.initConfig({
clean: ["build2", "build3", "build4-bundle"], clean: ["build2", "build3", "build4-bundle"],
copy: { copy: {
app: { 'app-ia32': {
expand: true, expand: true,
options: { options: {
timestamp: true timestamp: true
}, },
src: ['package.json', 'README.txt', 'LICENSE.txt', 'main.js', 'apps.js', 'index.html', 'css/**', 'font/**', 'js/**'], src: ['package.json', 'README.txt', 'LICENSE.txt', 'main.js', 'apps.js', 'index.html', 'css/**', 'font/**', 'js/**'],
dest: 'build2' dest: 'build2/win32-ia32'
}, },
node_modules: { 'app-x64': {
expand: true, expand: true,
options: { options: {
timestamp: true timestamp: true
}, },
cwd: 'build1', src: ['package.json', 'README.txt', 'LICENSE.txt', 'main.js', 'apps.js', 'index.html', 'css/**', 'font/**', 'js/**'],
dest: 'build2/win32-x64'
},
'node_modules-ia32': {
expand: true,
options: {
timestamp: true
},
cwd: 'build1/win32-ia32',
src: ['node_modules/**', 'bin/**'],
dest: 'build2/win32-ia32'
},
'node_modules-x64': {
expand: true,
options: {
timestamp: true
},
cwd: 'build1/win32-x64',
src: ['node_modules/**', 'bin/**'], src: ['node_modules/**', 'bin/**'],
dest: 'build2' dest: 'build2/win32-x64'
}, },
'bundle-ia32': { 'bundle-ia32': {
expand: true, expand: true,
...@@ -62,17 +79,27 @@ module.exports = (grunt) => { ...@@ -62,17 +79,27 @@ module.exports = (grunt) => {
out: 'build3', out: 'build3',
platform: 'darwin', platform: 'darwin',
arch: 'all', arch: 'all',
icon: 'resources/darwin/icon.icns' icon: 'resources/osx/icon.icns'
} }
}, },
win32: { 'win32-ia32': {
options: { options: {
name: 'mycard', name: 'mycard',
dir: 'build2', dir: 'build2/win32-ia32',
out: 'build3', out: 'build3',
platform: 'win32', platform: 'win32',
arch: 'all', arch: 'ia32',
icon: 'resources/win32/icon.ico' icon: 'resources/win/icon.ico'
}
},
'win32-x64': {
options: {
name: 'mycard',
dir: 'build2/win32-x64',
out: 'build3',
platform: 'win32',
arch: 'x64',
icon: 'resources/win/icon.ico'
} }
} }
}, },
...@@ -83,43 +110,43 @@ module.exports = (grunt) => { ...@@ -83,43 +110,43 @@ module.exports = (grunt) => {
outputDirectory: 'build4/win32-ia32', outputDirectory: 'build4/win32-ia32',
authors: 'MyCard', authors: 'MyCard',
exe: 'mycard.exe', exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico', setupIcon: 'resources/win/icon.ico',
noMsi: true, noMsi: true,
loadingGif: 'resources/win32/setup.gif' loadingGif: 'resources/win/setup.gif'
}, },
x64: { x64: {
appDirectory: 'build3/mycard-win32-x64', appDirectory: 'build3/mycard-win32-x64',
outputDirectory: 'build4/win32-x64', outputDirectory: 'build4/win32-x64',
authors: 'MyCard', authors: 'MyCard',
exe: 'mycard.exe', exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico', setupIcon: 'resources/win/icon.ico',
noMsi: true, noMsi: true,
loadingGif: 'resources/win32/setup.gif' loadingGif: 'resources/win/setup.gif'
}, },
'bundle-ia32': { 'bundle-ia32': {
appDirectory: 'build3/mycard-win32-ia32', appDirectory: 'build3/mycard-win32-ia32',
outputDirectory: 'build4-bundle/win32-ia32', outputDirectory: 'build4-bundle/win32-ia32',
authors: 'MyCard', authors: 'MyCard',
exe: 'mycard.exe', exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico', setupIcon: 'resources/win/icon.ico',
noMsi: true, noMsi: true,
loadingGif: 'resources/win32/setup.gif' loadingGif: 'resources/win/setup.gif'
}, },
'bundle-x64':{ 'bundle-x64':{
appDirectory: 'build3/mycard-win32-x64', appDirectory: 'build3/mycard-win32-x64',
outputDirectory: 'build4-bundle/win32-x64', outputDirectory: 'build4-bundle/win32-x64',
authors: 'MyCard', authors: 'MyCard',
exe: 'mycard.exe', exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico', setupIcon: 'resources/win/icon.ico',
noMsi: true, noMsi: true,
loadingGif: 'resources/win32/setup.gif' loadingGif: 'resources/win/setup.gif'
} }
}, },
appdmg: { appdmg: {
options: { options: {
title: 'MyCard', title: 'MyCard',
icon: 'resources/darwin/icon.icns', icon: 'resources/osx/icon.icns',
background: 'resources/darwin/TestBkg.png', background: 'resources/osx/TestBkg.png',
'icon-size': 80, 'icon-size': 80,
contents: [ contents: [
{ {
...@@ -144,7 +171,7 @@ module.exports = (grunt) => { ...@@ -144,7 +171,7 @@ module.exports = (grunt) => {
grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-electron'); grunt.loadNpmTasks('grunt-electron');
grunt.registerTask('build', ['clean', 'copy:app', 'copy:node_modules']); grunt.registerTask('build', ['clean', 'copy:app-ia32', 'copy:app-x64','copy:node_modules-ia32','copy:node_modules-x64']);
grunt.registerTask('release', ['build'].concat(release_task)); grunt.registerTask('release', ['build'].concat(release_task));
grunt.registerTask('default', ['release']); grunt.registerTask('default', ['release']);
}; };
\ No newline at end of file
## Build ## Build
### Windows ### Windows
```bash ```bash
npm install --prefix build1 --production glob ini mkdirp ws winreg windows-shortcuts del /s /q build1
robocopy resources\win32 build1\bin\ *.exe *.dll npm install --prefix build1\win32-ia32 --production glob ini mkdirp ws aria2 winreg windows-shortcuts
xcopy /S /Y /I build1\win32-ia32 build1\win32-x64
robocopy resources\win build1\win32-ia32\bin\ *.exe *.dll
robocopy resources\win build1\win32-x64\bin\ *.exe *.dll
robocopy resources\win32 build1\win32-ia32\bin\ *.exe *.dll
robocopy resources\win64 build1\win32-x64\bin\ *.exe *.dll
grunt grunt
``` ```
### OSX ### OSX
```bash ```bash
npm install --prefix build1 --production glob ini mkdirp ws npm install --prefix build1 --production glob ini mkdirp ws aria2
grunt grunt
``` ```
\ No newline at end of file
...@@ -3,11 +3,14 @@ ...@@ -3,11 +3,14 @@
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const child_process = require('child_process'); const child_process = require('child_process');
const querystring = require('querystring');
const ini = require('ini'); const ini = require('ini');
const glob = require("glob"); const glob = require("glob");
const mkdirp = require('mkdirp'); const mkdirp = require('mkdirp');
const Aria2 = require('aria2');
const EventEmitter = require('events'); const EventEmitter = require('events');
const eventemitter = new EventEmitter(); const eventemitter = new EventEmitter();
...@@ -44,7 +47,6 @@ function save_db() { ...@@ -44,7 +47,6 @@ function save_db() {
} }
eventemitter.on('install', (app, options) => { eventemitter.on('install', (app, options) => {
console.log(app, options);
if (db.local[app.id]) return; if (db.local[app.id]) return;
db.apps[app.id] = app; db.apps[app.id] = app;
...@@ -61,19 +63,18 @@ eventemitter.on('install', (app, options) => { ...@@ -61,19 +63,18 @@ eventemitter.on('install', (app, options) => {
eventemitter.emit('update', app, local, 'install-started'); eventemitter.emit('update', app, local, 'install-started');
mkdirp(local.path, ()=> { mkdirp(local.path, ()=> {
let options = {
let tar; stdio: 'inherit',
cwd: __dirname
};
if (db.platform == 'win32') { if (db.platform == 'win32') {
tar = child_process.spawn(path.join(__dirname, 'bin', 'tar.exe'), ['fx', '-'], { options.env = {PATH: path.join(__dirname, 'bin')}
cwd: local.path,
stdio: ['pipe', 'inherit', 'inherit']
});
child_process.spawn(path.join(__dirname, 'bin', 'xz.exe'), ['-d', '-c', path.join(__dirname, app.id + '.tar.xz')], {stdio: ['inherit', tar.stdin, 'inherit']});
} else {
tar = child_process.spawn('tar', ['fx', path.join(__dirname, app.id + '.tar.xz'), '-C', local.path], {stdio: 'inherit'});
} }
console.log(options);
let tar = child_process.spawn('tar', ['fx', app.id + '.tar.xz', '-C', local.path], options);
console.log(tar);
tar.on('exit', (code) => { tar.on('exit', (code) => {
console.log(code)
if (code == 0) { if (code == 0) {
load(app, local, ()=> { load(app, local, ()=> {
...@@ -90,6 +91,7 @@ eventemitter.on('install', (app, options) => { ...@@ -90,6 +91,7 @@ eventemitter.on('install', (app, options) => {
}) })
}); });
let running = [];
eventemitter.on('action', function (app_id, action, options) { eventemitter.on('action', function (app_id, action, options) {
let local = db.local[app_id]; let local = db.local[app_id];
Object.assign(local.files['system.conf'].content, options); Object.assign(local.files['system.conf'].content, options);
...@@ -105,15 +107,17 @@ eventemitter.on('action', function (app_id, action, options) { ...@@ -105,15 +107,17 @@ eventemitter.on('action', function (app_id, action, options) {
} else { } else {
main = 'ygopro_vs.exe' main = 'ygopro_vs.exe'
} }
console.log(main, [args], {cwd: local.path});
let child = child_process.spawn(main, [args], {cwd: local.path, stdio: 'inherit'}); let child = child_process.spawn(main, [args], {cwd: local.path, stdio: 'inherit'});
running.push(child);
child.on('exit', ()=> { child.on('exit', ()=> {
running.splice(running.indexOf(child), 1);
if (running.length == 0) {
for (let window of BrowserWindow.getAllWindows()) { for (let window of BrowserWindow.getAllWindows()) {
window.restore() window.restore()
} }
}
}) })
}) })
}); });
...@@ -148,11 +152,14 @@ for (let app_id in db.local) { ...@@ -148,11 +152,14 @@ for (let app_id in db.local) {
delete db.local[app_id]; delete db.local[app_id];
eventemitter.emit('install', db.apps[app_id], options); eventemitter.emit('install', db.apps[app_id], options);
} else { } else {
db.local[app_id].status = 'ready';
pending++; pending++;
load(db.apps[app_id], db.local[app_id], done); load(db.apps[app_id], db.local[app_id], done);
} }
} }
child_process.spawn(path.join(__dirname, 'bin', 'aria2c'), ['--enable-rpc', '--rpc-allow-origin-all']);
done(); done();
function done() { function done() {
...@@ -208,11 +215,13 @@ function start_server() { ...@@ -208,11 +215,13 @@ function start_server() {
save_db(); save_db();
}); });
if (process.platform == 'win32' && db.local['ygopro'] && db.local['ygopro'].status == 'ready') { const platform = {win32: 'win'}[process.platform] + {
autoUpdater.setFeedURL('https://mycard.moe/update/' + {win32: 'win'}[process.platform] + {
ia32: '32', ia32: '32',
x64: '64' x64: '64'
}[process.arch]); }[process.arch];
if (process.platform == 'win32' && db.local['ygopro'] && db.local['ygopro'].status == 'ready') {
autoUpdater.setFeedURL('https://mycard.moe/update/' + platform);
if (process.argv[1] == '--squirrel-firstrun') { if (process.argv[1] == '--squirrel-firstrun') {
setTimeout(()=> { setTimeout(()=> {
autoUpdater.checkForUpdates(); autoUpdater.checkForUpdates();
...@@ -229,10 +238,104 @@ function start_server() { ...@@ -229,10 +238,104 @@ function start_server() {
}); });
autoUpdater.on('update-available', ()=>{ autoUpdater.on('update-available', ()=>{
console.log('update-available') console.log('update-available')
});
autoUpdater.on('update-not-available', ()=>{
console.log('update-not-available')
});*/ });*/
autoUpdater.on('update-not-available', ()=> {
// check for ygopro update
const aria2 = new Aria2();
//debug
aria2.onsend = function (m) {
console.log('aria2 OUT', m);
};
aria2.onmessage = function (m) {
console.log('aria2 IN', m);
};
let params = {platform: platform};
params.ygopro = db.apps.ygopro.version;
let meta = {};
let update_count = 0;
let pending_install = [];
let download_dir = app.getPath('temp');
aria2.open(()=> {
console.log('checking apps update');
aria2.addUri(['https://mycard.moe/apps.meta4?' + querystring.stringify(params)], {'dir': download_dir}, (error, gid)=> {
meta = gid
})
});
/*aria2.onDownloadStart = function (response) {
aria2.getFiles(response.gid, (error, response)=> {
console.log('start', error, JSON.stringify(response))
})
};*/
aria2.onDownloadComplete = function (response) {
aria2.tellStatus(response.gid, (error, response)=> {
if (meta == response.gid) {
if (response.followedBy) {
update_count = response.followedBy.length;
}
} else {
console.log('download complete', response.files);
pending_install.push(path.basename(response.files[0].path));
if (pending_install.length == update_count) {
for (let child of running) {
child.kill()
}
let app = db.apps.ygopro; //hacky
let local = db.local.ygopro;
local.status = 'updating';
eventemitter.emit('update', app, local, 'update');
pending_install.sort();
(function extract() {
let file = pending_install.shift();
console.log(file);
if (file) {
let options = {
stdio: 'inherit',
cwd: download_dir
};
if (db.platform == 'win32') {
options.env = {PATH: path.join(__dirname, 'bin')}
}
console.log(options);
let tar = child_process.spawn('tar', ['fx', file, '-C', local.path], options);
tar.on('exit', (code) => {
if (code == 0) {
let matched = file.match(/ygopro-update-win32-(.+)\.tar\.xz/);
if (matched) {
app.version = matched[1];
save_db();
}
extract()
} else {
load(app, local, ()=> {
local.status = 'ready';
eventemitter.emit('update', app, local, 'update-failed');
});
}
});
} else {
load(app, local, ()=> {
local.status = 'ready';
eventemitter.emit('update', app, local, 'update-successful');
});
}
})();
}
}
})
};
aria2.onDownloadError = function (response) {
let app = db.apps.ygopro; //hacky
let local = db.local.ygopro;
eventemitter.emit('update', app, local, 'update-failed');
/*aria2.tellStatus(response.gid, (error, response)=> {
console.log('onDownloadComplete', error, JSON.stringify(response))
})*/
};
});
autoUpdater.on('update-downloaded', ()=> { autoUpdater.on('update-downloaded', ()=> {
autoUpdater.quitAndInstall() autoUpdater.quitAndInstall()
}) })
...@@ -260,7 +363,7 @@ function load(app, local, callback) { ...@@ -260,7 +363,7 @@ function load(app, local, callback) {
//console.log('ini pending'); //console.log('ini pending');
fs.readFile(path.join(local.path, file), 'utf8', (error, content)=> { fs.readFile(path.join(local.path, file), 'utf8', (error, content)=> {
if (error)return done(); if (error)return done();
local.files[file] = {content: ini.parse(content)}; local.files[file] = {content: ini.parse(content)} || {};
if (file == 'system.conf') { if (file == 'system.conf') {
pending += 2; pending += 2;
//console.log('fonts pending + 2'); //console.log('fonts pending + 2');
...@@ -273,7 +376,11 @@ function load(app, local, callback) { ...@@ -273,7 +376,11 @@ function load(app, local, callback) {
textfonts = [path.join(process.env.SystemRoot, 'fonts/msyh.ttc'), path.join(process.env.SystemRoot, 'fonts/msyh.ttf'), path.join(process.env.SystemRoot, 'fonts/simsun.ttc')] textfonts = [path.join(process.env.SystemRoot, 'fonts/msyh.ttc'), path.join(process.env.SystemRoot, 'fonts/msyh.ttf'), path.join(process.env.SystemRoot, 'fonts/simsun.ttc')]
break; break;
} }
first_exists([path.resolve(local.path, local.files[file].content.textfont.split(' ')[0])].concat(textfonts), (textfont)=> { let origin = [];
if (local.files[file] && local.files[file].content && local.files[file].content.textfont) {
origin.push(path.resolve(local.path, local.files[file].content.textfont.split(' ')[0]))
}
first_exists(origin.concat(textfonts), (textfont)=> {
if (textfont) { if (textfont) {
local.files[file].content.textfont = path.relative(local.path, textfont) + ' 14'; local.files[file].content.textfont = path.relative(local.path, textfont) + ' 14';
} }
...@@ -312,7 +419,6 @@ function load(app, local, callback) { ...@@ -312,7 +419,6 @@ function load(app, local, callback) {
if (!watcher[app.id]) { if (!watcher[app.id]) {
fs.watch(db.local[app.id].path, {recursive: true}, (event, filename)=> { fs.watch(db.local[app.id].path, {recursive: true}, (event, filename)=> {
console.log(event, filename)
load(db.apps[app.id], db.local[app.id], ()=> { load(db.apps[app.id], db.local[app.id], ()=> {
eventemitter.emit('update', app, local, event) eventemitter.emit('update', app, local, event)
}); });
......
{ {
"name": "mycard", "name": "mycard",
"description": "a game platform", "description": "a game platform",
"version": "2.0.6", "version": "2.0.7",
"main": "main.js", "main": "main.js",
"license": "UNLICENSED", "license": "UNLICENSED",
"repository": "github:mycard/mycard", "repository": "github:mycard/mycard",
......
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment