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

2.0.7

parent 5d9d8c65
......@@ -10,29 +10,46 @@ module.exports = (grunt) => {
break;
case 'win32':
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;
}
grunt.initConfig({
clean: ["build2", "build3", "build4-bundle"],
copy: {
app: {
'app-ia32': {
expand: true,
options: {
timestamp: true
},
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,
options: {
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/**'],
dest: 'build2'
dest: 'build2/win32-x64'
},
'bundle-ia32': {
expand: true,
......@@ -62,17 +79,27 @@ module.exports = (grunt) => {
out: 'build3',
platform: 'darwin',
arch: 'all',
icon: 'resources/darwin/icon.icns'
icon: 'resources/osx/icon.icns'
}
},
win32: {
'win32-ia32': {
options: {
name: 'mycard',
dir: 'build2',
dir: 'build2/win32-ia32',
out: 'build3',
platform: 'win32',
arch: 'all',
icon: 'resources/win32/icon.ico'
arch: 'ia32',
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) => {
outputDirectory: 'build4/win32-ia32',
authors: 'MyCard',
exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico',
setupIcon: 'resources/win/icon.ico',
noMsi: true,
loadingGif: 'resources/win32/setup.gif'
loadingGif: 'resources/win/setup.gif'
},
x64: {
appDirectory: 'build3/mycard-win32-x64',
outputDirectory: 'build4/win32-x64',
authors: 'MyCard',
exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico',
setupIcon: 'resources/win/icon.ico',
noMsi: true,
loadingGif: 'resources/win32/setup.gif'
loadingGif: 'resources/win/setup.gif'
},
'bundle-ia32': {
appDirectory: 'build3/mycard-win32-ia32',
outputDirectory: 'build4-bundle/win32-ia32',
authors: 'MyCard',
exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico',
setupIcon: 'resources/win/icon.ico',
noMsi: true,
loadingGif: 'resources/win32/setup.gif'
loadingGif: 'resources/win/setup.gif'
},
'bundle-x64':{
appDirectory: 'build3/mycard-win32-x64',
outputDirectory: 'build4-bundle/win32-x64',
authors: 'MyCard',
exe: 'mycard.exe',
setupIcon: 'resources/win32/icon.ico',
setupIcon: 'resources/win/icon.ico',
noMsi: true,
loadingGif: 'resources/win32/setup.gif'
loadingGif: 'resources/win/setup.gif'
}
},
appdmg: {
options: {
title: 'MyCard',
icon: 'resources/darwin/icon.icns',
background: 'resources/darwin/TestBkg.png',
icon: 'resources/osx/icon.icns',
background: 'resources/osx/TestBkg.png',
'icon-size': 80,
contents: [
{
......@@ -144,7 +171,7 @@ module.exports = (grunt) => {
grunt.loadNpmTasks('grunt-contrib-copy');
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('default', ['release']);
};
\ No newline at end of file
## Build
### Windows
```bash
npm install --prefix build1 --production glob ini mkdirp ws winreg windows-shortcuts
robocopy resources\win32 build1\bin\ *.exe *.dll
del /s /q build1
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
```
### OSX
```bash
npm install --prefix build1 --production glob ini mkdirp ws
npm install --prefix build1 --production glob ini mkdirp ws aria2
grunt
```
\ No newline at end of file
......@@ -3,11 +3,14 @@
const fs = require('fs');
const path = require('path');
const child_process = require('child_process');
const querystring = require('querystring');
const ini = require('ini');
const glob = require("glob");
const mkdirp = require('mkdirp');
const Aria2 = require('aria2');
const EventEmitter = require('events');
const eventemitter = new EventEmitter();
......@@ -44,7 +47,6 @@ function save_db() {
}
eventemitter.on('install', (app, options) => {
console.log(app, options);
if (db.local[app.id]) return;
db.apps[app.id] = app;
......@@ -61,19 +63,18 @@ eventemitter.on('install', (app, options) => {
eventemitter.emit('update', app, local, 'install-started');
mkdirp(local.path, ()=> {
let tar;
let options = {
stdio: 'inherit',
cwd: __dirname
};
if (db.platform == 'win32') {
tar = child_process.spawn(path.join(__dirname, 'bin', 'tar.exe'), ['fx', '-'], {
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'});
options.env = {PATH: path.join(__dirname, 'bin')}
}
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) => {
console.log(code)
if (code == 0) {
load(app, local, ()=> {
......@@ -90,6 +91,7 @@ eventemitter.on('install', (app, options) => {
})
});
let running = [];
eventemitter.on('action', function (app_id, action, options) {
let local = db.local[app_id];
Object.assign(local.files['system.conf'].content, options);
......@@ -105,15 +107,17 @@ eventemitter.on('action', function (app_id, action, options) {
} else {
main = 'ygopro_vs.exe'
}
console.log(main, [args], {cwd: local.path});
let child = child_process.spawn(main, [args], {cwd: local.path, stdio: 'inherit'});
running.push(child);
child.on('exit', ()=> {
for (let window of BrowserWindow.getAllWindows()) {
window.restore()
running.splice(running.indexOf(child), 1);
if (running.length == 0) {
for (let window of BrowserWindow.getAllWindows()) {
window.restore()
}
}
})
})
});
......@@ -148,11 +152,14 @@ for (let app_id in db.local) {
delete db.local[app_id];
eventemitter.emit('install', db.apps[app_id], options);
} else {
db.local[app_id].status = 'ready';
pending++;
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();
function done() {
......@@ -208,11 +215,13 @@ function start_server() {
save_db();
});
const platform = {win32: 'win'}[process.platform] + {
ia32: '32',
x64: '64'
}[process.arch];
if (process.platform == 'win32' && db.local['ygopro'] && db.local['ygopro'].status == 'ready') {
autoUpdater.setFeedURL('https://mycard.moe/update/' + {win32: 'win'}[process.platform] + {
ia32: '32',
x64: '64'
}[process.arch]);
autoUpdater.setFeedURL('https://mycard.moe/update/' + platform);
if (process.argv[1] == '--squirrel-firstrun') {
setTimeout(()=> {
autoUpdater.checkForUpdates();
......@@ -229,10 +238,104 @@ function start_server() {
});
autoUpdater.on('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.quitAndInstall()
})
......@@ -260,7 +363,7 @@ function load(app, local, callback) {
//console.log('ini pending');
fs.readFile(path.join(local.path, file), 'utf8', (error, content)=> {
if (error)return done();
local.files[file] = {content: ini.parse(content)};
local.files[file] = {content: ini.parse(content)} || {};
if (file == 'system.conf') {
pending += 2;
//console.log('fonts pending + 2');
......@@ -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')]
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) {
local.files[file].content.textfont = path.relative(local.path, textfont) + ' 14';
}
......@@ -312,7 +419,6 @@ function load(app, local, callback) {
if (!watcher[app.id]) {
fs.watch(db.local[app.id].path, {recursive: true}, (event, filename)=> {
console.log(event, filename)
load(db.apps[app.id], db.local[app.id], ()=> {
eventemitter.emit('update', app, local, event)
});
......
{
"name": "mycard",
"description": "a game platform",
"version": "2.0.6",
"version": "2.0.7",
"main": "main.js",
"license": "UNLICENSED",
"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