Skip to content

Commit f9e900f

Browse files
committed
finished downloading multiple mods from save
1 parent 66fb795 commit f9e900f

File tree

3 files changed

+145
-13
lines changed

3 files changed

+145
-13
lines changed

src/mods_handler.go

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,27 @@ import (
1313
"os"
1414
"path/filepath"
1515
"factorioSave"
16+
"time"
1617
)
1718

19+
type ModPortalStruct struct {
20+
DownloadsCount int `json:"downloads_count"`
21+
Name string `json:"name"`
22+
Owner string `json:"owner"`
23+
Releases []struct {
24+
DownloadURL string `json:"download_url"`
25+
FileName string `json:"file_name"`
26+
InfoJSON struct {
27+
FactorioVersion string `json:"factorio_version"`
28+
} `json:"info_json"`
29+
ReleasedAt time.Time `json:"released_at"`
30+
Sha1 string `json:"sha1"`
31+
Version string `json:"version"`
32+
} `json:"releases"`
33+
Summary string `json:"summary"`
34+
Title string `json:"title"`
35+
}
36+
1837
// Returns JSON response of all mods installed in factorio/mods
1938
func listInstalledModsHandler(w http.ResponseWriter, r *http.Request) {
2039
var err error
@@ -212,7 +231,7 @@ func ModPortalInstallHandler(w http.ResponseWriter, r *http.Request) {
212231
}
213232

214233
if err != nil {
215-
w.WriteHeader(500)
234+
w.WriteHeader(http.StatusInternalServerError)
216235
resp.Data = fmt.Sprintf("Error in installMod: %s", err)
217236
if err := json.NewEncoder(w).Encode(resp); err != nil {
218237
log.Printf("Error in installMod: %s", err)
@@ -228,6 +247,90 @@ func ModPortalInstallHandler(w http.ResponseWriter, r *http.Request) {
228247
}
229248
}
230249

250+
func ModPortalInstallMultipleHandler(w http.ResponseWriter, r *http.Request) {
251+
var err error
252+
resp := JSONResponse{
253+
Success: false,
254+
}
255+
256+
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
257+
r.ParseForm()
258+
259+
modsList := make([]string, 0)
260+
versionsList := make([]string, 0)
261+
262+
//Parse incoming data
263+
for key, values := range r.PostForm {
264+
if key == "mod_name" {
265+
for _, v := range values {
266+
modsList = append(modsList, v)
267+
}
268+
} else if key == "mod_version" {
269+
for _, v := range values {
270+
versionsList = append(versionsList, v)
271+
}
272+
}
273+
}
274+
275+
mods, err := newMods(config.FactorioModsDir)
276+
if err != nil {
277+
log.Printf("error creating mods: %s", err)
278+
279+
w.WriteHeader(http.StatusInternalServerError)
280+
resp.Data = fmt.Sprintf("Error in searchModPortal: %s", err)
281+
if err := json.NewEncoder(w).Encode(resp); err != nil {
282+
log.Printf("Error in searchModPortal: %s", err)
283+
}
284+
return
285+
}
286+
287+
for modIndex, mod := range modsList {
288+
var err error
289+
290+
//get details of mod
291+
modDetails, err, statusCode := getModDetails(mod)
292+
if err != nil {
293+
w.WriteHeader(statusCode)
294+
resp.Data = fmt.Sprintf("Error in searchModPortal: %s", err)
295+
if err := json.NewEncoder(w).Encode(resp); err != nil {
296+
log.Printf("Error in searchModPortal: %s", err)
297+
}
298+
return
299+
}
300+
301+
modDetailsArray := []byte(modDetails)
302+
var modDetailsStruct ModPortalStruct
303+
304+
//read mod-data into Struct
305+
err = json.Unmarshal(modDetailsArray, &modDetailsStruct)
306+
if err != nil {
307+
log.Printf("error reading modPortalDetails: %s", err)
308+
309+
w.WriteHeader(http.StatusInternalServerError)
310+
resp.Data = fmt.Sprintf("Error in searchModPortal: %s", err)
311+
if err := json.NewEncoder(w).Encode(resp); err != nil {
312+
log.Printf("Error in searchModPortal: %s", err)
313+
}
314+
return
315+
}
316+
317+
//find correct mod-version
318+
for _, release := range modDetailsStruct.Releases {
319+
if release.Version == versionsList[modIndex] {
320+
mods.downloadMod(release.DownloadURL, release.FileName, modDetailsStruct.Name)
321+
break
322+
}
323+
}
324+
}
325+
326+
resp.Data = mods.listInstalledMods()
327+
328+
resp.Success = true
329+
if err := json.NewEncoder(w).Encode(resp); err != nil {
330+
log.Printf("Error in ToggleModHandler: %s", err)
331+
}
332+
}
333+
231334
func ToggleModHandler(w http.ResponseWriter, r *http.Request) {
232335
var err error
233336
resp := JSONResponse{
@@ -245,7 +348,7 @@ func ToggleModHandler(w http.ResponseWriter, r *http.Request) {
245348
}
246349

247350
if err != nil {
248-
w.WriteHeader(500)
351+
w.WriteHeader(http.StatusInternalServerError)
249352
resp.Data = fmt.Sprintf("Error in listInstalledModsByFolder: %s", err)
250353
if err := json.NewEncoder(w).Encode(resp); err != nil {
251354
log.Printf("Error in listInstalledModsByFolder: %s", err)
@@ -277,7 +380,7 @@ func DeleteModHandler(w http.ResponseWriter, r *http.Request) {
277380
}
278381

279382
if err != nil {
280-
w.WriteHeader(500)
383+
w.WriteHeader(http.StatusInternalServerError)
281384
resp.Data = fmt.Sprintf("Error in deleteMod: %s", err)
282385
if err := json.NewEncoder(w).Encode(resp); err != nil {
283386
log.Printf("Error in DeleteModHandler: %s", err)

src/routes.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ var apiRoutes = Routes{
183183
"POST",
184184
"/mods/install",
185185
ModPortalInstallHandler,
186+
}, {
187+
"ModPortalInstallMultiple",
188+
"POST",
189+
"/mods/install/multiple",
190+
ModPortalInstallMultipleHandler,
186191
}, {
187192
"ToggleMod",
188193
"POST",

ui/App/components/Mods/ModLoadSave.jsx

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import ReactDOMServer from 'react-dom/server';
3+
import {instanceOfModsContent} from "./ModsPropTypes";
34

45
class ModLoadSave extends React.Component {
56
constructor(props) {
@@ -17,8 +18,6 @@ class ModLoadSave extends React.Component {
1718
loadMods(e) {
1819
e.preventDefault();
1920

20-
// let save = $(e.target).find("select").val();
21-
2221
$.ajax({
2322
url: "/api/mods/save/load",
2423
method: "POST",
@@ -28,14 +27,17 @@ class ModLoadSave extends React.Component {
2827
let checkboxes = [];
2928

3029
data.data.mods.forEach((mod) => {
30+
if(mod.name == "base") return;
31+
32+
let modVersion = mod.version.major + "." + mod.version.minor + "." + mod.version.build;
3133
let singleCheckbox = <tr key={mod.name}>
3234
<td>
3335
{mod.name}
34-
<input type="hidden" name="mod_name[]" value={mod.name}/>
36+
<input type="hidden" name="mod_name" value={mod.name}/>
3537
</td>
3638
<td>
37-
{mod.version.major + "." + mod.version.minor + "." + mod.version.build}
38-
<input type="hidden" name="mod_version[]"/>
39+
{modVersion}
40+
<input type="hidden" name="mod_version" value={modVersion}/>
3941
</td>
4042
</tr>
4143

@@ -82,22 +84,40 @@ class ModLoadSave extends React.Component {
8284

8385
swal({
8486
title: json_data.detail,
85-
type: "error"
87+
type: "error",
8688
});
8789
}
8890
});
8991
}
9092

9193
loadModsSwalHandler() {
9294
$.ajax({
93-
url: "/api/mods/install/multiple"
95+
url: "/api/mods/install/multiple",
96+
method: "POST",
97+
dataType: "JSON",
98+
data: $("#swalForm").serialize(),
99+
success: (data) => {
100+
swal({
101+
title: "All Mods installed successfully!",
102+
type: "success"
103+
});
104+
105+
this.props.modContentClass.setState({
106+
installedMods: data.data.mods
107+
});
108+
},
109+
error: (jqXHR) => {
110+
let json_data = JSON.parse(jqXHR.responseJSON.data);
111+
112+
swal({
113+
title: json_data.detail,
114+
type: "error",
115+
});
116+
}
94117
})
95-
console.log($("#swalForm").serialize());
96118
}
97119

98120
render() {
99-
console.log(this.props.saves);
100-
101121
let saves = [];
102122
this.props.saves.forEach((value, index) => {
103123
if(index != this.props.saves.length - 1) {
@@ -126,4 +146,8 @@ class ModLoadSave extends React.Component {
126146
}
127147
}
128148

149+
ModLoadSave.propTypes = {
150+
modContentClass: instanceOfModsContent.isRequired,
151+
}
152+
129153
export default ModLoadSave;

0 commit comments

Comments
 (0)