@@ -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
1938func 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+
231334func 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 )
0 commit comments