Skip to content

Commit

Permalink
switched to foreman, started support for executing maps
Browse files Browse the repository at this point in the history
  • Loading branch information
abrahamYG committed Apr 17, 2019
1 parent ca475be commit 2a5decc
Show file tree
Hide file tree
Showing 10 changed files with 166 additions and 17 deletions.
Empty file added .env
Empty file.
2 changes: 2 additions & 0 deletions PROCFILE
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
electron: npm run electron
webpack: npm run webpack
33 changes: 29 additions & 4 deletions main.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const {app, BrowserWindow} = require('electron');
const execFile = require('child_process').execFile;
const { ipcMain } = require('electron');
const { session } = require('electron');
const path = require('path');
Expand Down Expand Up @@ -110,23 +111,28 @@ ipcMain.on(msg.DOWNLOAD_CAMPAIGN, async (event, campaign) => {
if(sourceFormat === "zip") {sources[mod.source].files.push(mod);}
else{ sources[mod.source].files = mod;}
});
const myPromises = [];
console.log("sources: ",sources)
for(let source in sources){
console.log("current source:", source);
download(source).on('downloadProgress', progress => {
const promise = download(source).on('downloadProgress', progress => {
const dlitem = downloadtracker.downloads.find(dl => source === dl.source)
dlitem.progress = progress.percent;
downloadtracker.totalProgress = downloadtracker.downloads.reduce((total, {progress}) => total + progress,0.0) / downloadtracker.downloads.length;
if((Date.now() - timer) > 1000 || progress.percent >= 1){
console.log("DOWNLOADTRACKER",downloadtracker);
//console.log("DOWNLOADTRACKER",downloadtracker);
mainWindow.setProgressBar(downloadtracker.totalProgress);
event.sender.send(msg.DOWNLOAD_CAMPAIGN_STATUS, {campaignId: campaign.id, progress: downloadtracker.totalProgress})
timer = Date.now();
}
}).then(data =>{
console.log("finished:", source)
if(sources[source].format==="zip"){
const zipBaseDir = installDir;
const zipPath = path.join(zipBaseDir, path.basename(source));
const zipBaseName = path.basename(source)
console.log("zipBaseDir:", zipBaseDir)
console.log("zipBaseName:", zipBaseName)
const zipPath = path.join(zipBaseDir, zipBaseName);
console.log("zip:", zipPath);
fs.writeFileSync(zipPath, data);
yauzl.open(zipPath, {lazyEntries: true}, function(err, zipfile) {
Expand All @@ -143,7 +149,7 @@ ipcMain.on(msg.DOWNLOAD_CAMPAIGN, async (event, campaign) => {
const entryBasePath = os.homedir();
const entryBaseName = entryData.destination;
const entryFullPath = path.join(entryBasePath,entryBaseName);
console.log(entryFullPath)
console.log("entryFullPath",entryFullPath)
fs.ensureDirSync(path.dirname(entryFullPath));
const destStream = fs.createWriteStream(entryFullPath);
zipfile.openReadStream(entry, function(err, readStream) {
Expand All @@ -169,12 +175,31 @@ ipcMain.on(msg.DOWNLOAD_CAMPAIGN, async (event, campaign) => {
else {
const destBaseDir = installDir;
const destBasename = sources[source].files.destination;
console.log("destBaseDir:", destBaseDir)
console.log("zipBaseName:", zipBaseName)
const destPath = path.join(destBaseDir, destBasename);
console.log("nozip: ", destPath);
fs.ensureDirSync(path.dirname(destPath));
fs.writeFileSync(destPath, data);
}
}).catch((reason) =>{
console.log("Rejected promise:", reason)
})
console.log("promise: ", promise)
myPromises.push(promise);
}
console.log("end loop!")
Promise.all(myPromises).then(() => {
console.log("All downloads finished?");
event.sender.send(msg.DOWNLOAD_CAMPAIGN_FINISH, {campaignId: campaign.id, progress: downloadtracker.totalProgress})
});
})

ipcMain.on(msg.PLAY_CAMPAIGN, async (event, campaign) => {
const {command, params} = campaign;
console.log(command, params)
execFile(campaign.command,[params],function(error, stdout, stderr) {
console.log(error)
console.log(stdout);
});
});
54 changes: 54 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
},
"scripts": {
"dev": "webpack --watch",
"start": "concurrently \"npm:webpack\" \"npm:electron\"",
"start": "nf start",
"webpack": "webpack --watch",
"electron": "electron .",
"build": "webpack && electron-builder"
Expand Down Expand Up @@ -43,6 +43,7 @@
"electron": "^4.0.4",
"electron-builder": "^20.39.0",
"font-awesome-loader": "^1.0.2",
"foreman": "^3.0.1",
"react-hot-loader": "^4.7.0",
"sass-loader": "^7.1.0",
"source-map-loader": "^0.2.4",
Expand Down
43 changes: 37 additions & 6 deletions src/classes/Campaign.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {ipcRenderer} from 'electron';
import { useGlobal } from 'reactn';
const path = require('electron').remote.require('path');


import _campaignsources from '../api/campaign-sources';
Expand All @@ -15,6 +16,7 @@ export interface ICampaign {
"description":string,
"progress":number,
"installed":boolean,
"entryPoint":string,
"maps":Array<IMap>,
"mods":Array<IMod>,
"lastUpdated":string,
Expand Down Expand Up @@ -50,31 +52,48 @@ export default class Campaign {
const campaign:Object = await response.json();
return campaign;
}
static getCampaignRunCommand = (campaign:ICampaign):string => {
console.group("getCampaignRunCommand");
const command = path.join(Campaign.getCampaignsInstallDir(),"/Support64/",Config.getRunCommand());
console.log("command", command)
console.groupEnd();
return command;
}
static getCampaignRunParams = (campaign:ICampaign):string => {
console.group("getCampaignRunParams");
const entryPoint = (campaign.entryPoint)?campaign.entryPoint:campaign.maps[0].destination;
const params = Config.getRunParams().replace("{map}",path.join(Campaign.getCampaignsInstallDir(),entryPoint));
console.log("params", params)
console.groupEnd();
return params;
}

static getCampaignsRemote = async () => {
const campaigns:object = await Promise.all(_campaignsources.map((source:string) => Campaign.getCampaignRemote(source)));
return campaigns;
}

static getCampaignsInstallDir = ():string => {
return Config.installDir;
return Config.getInstallDir();
}
static getCampaignsInstalled = (campaigns:Array<ICampaign>) => {
const installedCampaigns:Array<ICampaign> = []
campaigns.map(campaign => {
const installedCampaign = {...campaign}
const installedCampaign = {...campaign }
installedCampaigns.push(installedCampaign)
installedCampaign.installed = Campaign.isCampaignInstalled(installedCampaign);
})
return installedCampaigns;
}
static isCampaignInstalled = (campaign:ICampaign) => {
console.group("isCampaignInstalled")
console.log("campaign",campaign);

let installed = true;
const installDir = Config.installDir;
const installDir = Campaign.getCampaignsInstallDir();
const fs = require('electron').remote.require('fs');
const path = require('electron').remote.require('path');

console.group("isCampaignInstalled")
console.log("campaign",campaign);

const mapsExist = campaign.maps.reduce((existtotal, map) => {
return existtotal && fs.existsSync(path.join(installDir,map.destination))
Expand All @@ -91,6 +110,18 @@ export default class Campaign {

static downloadCampaign = (campaign:ICampaign) => {
console.log("downloadCampaign")
ipcRenderer.send(msg.DOWNLOAD_CAMPAIGN, {...campaign, installDir:Config.installDir});
ipcRenderer.send(msg.DOWNLOAD_CAMPAIGN, {...campaign, installDir:Campaign.getCampaignsInstallDir()});
}
static playCampaign = (campaign:ICampaign) => {
console.group("playCampaign")
const data = {
...campaign,
installDir:Campaign.getCampaignsInstallDir(),
command: Campaign.getCampaignRunCommand(campaign),
params:Campaign.getCampaignRunParams(campaign)
};
console.log("data", data);
ipcRenderer.send(msg.PLAY_CAMPAIGN, data);
console.groupEnd();
}
}
10 changes: 9 additions & 1 deletion src/classes/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,19 @@ export default class Config {
}
static getRunCommand():string {
const commands:any = {
WINDOWS:"SC2Switcher.exe -run {map} -reloadcheck -speed {speed}",
WINDOWS:"SC2Switcher.exe",
MAC:"open {map} -a \"sc2switcher\"",
LINUX:"wine \"C:\\Program Files (x86)\\StarCraft II\\StarCraft II.exe\""
};
return Config.configFileExists()? (Config.loadFromDisk().runCommand):commands[currentPlatform];
}
static getRunParams():string {
const params:any = {
WINDOWS:"-run {map} -reloadcheck -speed {speed}",
MAC:"open {map} -a \"sc2switcher\"",
LINUX:"wine \"C:\\Program Files (x86)\\StarCraft II\\StarCraft II.exe\""
};
return Config.configFileExists()&&Config.loadFromDisk().params? (Config.loadFromDisk().params):params[currentPlatform];
}

}
6 changes: 3 additions & 3 deletions src/components/CampaignDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class CampaignDetails extends Component<any,any> {
selectedCampaignAuthor,
onPlayCampaignClick,
onUpdateCampaignClick,
onDownloadCampaignClick,
onDownloadCampaignClick
} = this.props
const campaign = (selectedCampaign)?selectedCampaign:emptyCampaign
const {
Expand Down Expand Up @@ -89,8 +89,8 @@ class CampaignDetails extends Component<any,any> {
<div className="campaign-content-controls btn-group float-right" role="group">
{(isCampaignInstalled) &&
<React.Fragment>
<button onClick={onPlayCampaignClick} className="btn btn-primary">Play</button>
<button onClick={onUpdateCampaignClick} className="btn btn-outline-primary">Update</button>
<button onClick={() => onPlayCampaignClick(campaign)} className="btn btn-primary">Play</button>
<button onClick={() => onUpdateCampaignClick(campaign)} className="btn btn-outline-primary">Update</button>
</React.Fragment>
}
{(!isCampaignInstalled) &&
Expand Down
3 changes: 2 additions & 1 deletion src/constants/ipcmessages.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module.exports = {
DOWNLOAD_MAP_STATUS: "downloadMapProgress",
DOWNLOAD_CAMPAIGN: "downloadCampaign",
DOWNLOAD_CAMPAIGN_STATUS: "downloadCampaignProgress",
DOWNLOAD_CAMPAIGN_FINISH: "downloadCampaignProgress"
DOWNLOAD_CAMPAIGN_FINISH: "downloadCampaignProgress",
PLAY_CAMPAIGN: "playCampaign",

}
29 changes: 28 additions & 1 deletion src/containers/CampaignPane.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,17 @@ class CampaignPane extends React.Component<any, ICampaignPaneState> {
"selectedCampaign": null,
"selectedCampaignAuthor": null
};
Campaign.getCampaignsRemote().then((campaigns:Array<ICampaign>) =>this.setState({campaigns}))
Campaign.getCampaignsRemote().then((campaigns:Array<ICampaign>) =>{
campaigns.map((campaign, index) =>{
const newcampaign = update(campaign, {
installed: {$set: Campaign.isCampaignInstalled(campaign)}
});
campaigns[index] = newcampaign;
//campaign.
})
this.setState({campaigns})

})
}
handleCampaignItemClick = (campaign:ICampaign) => {
localStorage.setItem('selectedCampaign',campaign.id)
Expand All @@ -43,6 +53,13 @@ class CampaignPane extends React.Component<any, ICampaignPaneState> {
Campaign.downloadCampaign(campaign);
console.groupEnd();
}
handlePlayClick = (campaign:ICampaign) => {
console.group("handlePlayClick")
console.log(campaign)
const {id} = campaign;
Campaign.playCampaign(campaign);
console.groupEnd();
}

componentDidMount(){
const campaigns = [...this.state.campaigns];
Expand All @@ -69,6 +86,15 @@ class CampaignPane extends React.Component<any, ICampaignPaneState> {
campaigns[index] = campaign;
this.setState({campaigns})
});
ipcRenderer.on(msg.DOWNLOAD_CAMPAIGN_FINISH, (event:any, arg:any) => {
const campaigns = [...this.state.campaigns];
const index = campaigns.findIndex(c => c.id === arg.campaignId)
const campaign = campaigns[index];
campaign.installed = Campaign.isCampaignInstalled(campaign);
console.log("DOWNLOAD_CAMPAIGN_FINISH", campaign)
campaigns[index] = campaign;
this.setState({campaigns})
});
}
render(){
const {selectedCampaign, campaigns} = this.state;
Expand All @@ -93,6 +119,7 @@ class CampaignPane extends React.Component<any, ICampaignPaneState> {
selectedCampaign={selectedCampaign}
selectedCampaignAuthor={selectedCampaignAuthor}
onDownloadCampaignClick={this.handleDownloadClick}
onPlayCampaignClick={this.handlePlayClick}
/>
}
{(!selectedCampaign) &&
Expand Down

0 comments on commit 2a5decc

Please sign in to comment.