// UnusedSalvage returns a web handler function that identifies a user's salvage // drops that are unused by any blueprint they own. func UnusedSalvage(localdb db.LocalDB, sde evego.Database, sess server.Sessionizer) web.HandlerFunc { return func(c web.C, w http.ResponseWriter, r *http.Request) { s := sess.GetSession(&c, w, r) myUserID := s.User charID, err := strconv.Atoi(c.URLParams["charID"]) if err != nil { http.Error(w, `{"status": "Error", "error": "Invalid character ID supplied."}`, http.StatusBadRequest) return } salvage, err := localdb.UnusedSalvage(myUserID, charID) if err != nil { http.Error(w, `{"status": "Error", "error": "Unable to access database."}`, http.StatusInternalServerError) log.Printf("Error accessing database with user %v, character %v: %v", myUserID, charID, err) return } stations := make(map[string]*evego.Station) itemInfo := make(map[string]*evego.Item) for i := range salvage { item := &salvage[i] if _, found := stations[strconv.Itoa(item.StationID)]; !found { stn, err := localdb.StationForID(item.StationID) if err == nil { stations[strconv.Itoa(item.StationID)] = stn } else { // This should really not friggin' happen. http.Error(w, `{"status": "Error", "error": "Unable to look up station/outpost."}`, http.StatusInternalServerError) log.Printf("Unable to look up station/outpost ID %v: %v", item.StationID, err) return } } typeIDStr := strconv.Itoa(item.TypeID) if _, found := itemInfo[typeIDStr]; !found { thisItem, err := sde.ItemForID(item.TypeID) if err == nil { itemInfo[typeIDStr] = thisItem } } } response := struct { Items []evego.InventoryItem `json:"items"` Stations map[string]*evego.Station `json:"stations"` ItemInfo map[string]*evego.Item `json:"itemInfo"` }{salvage, stations, itemInfo} salvageJSON, err := json.Marshal(&response) if err != nil { http.Error(w, `{"status": "Error", "error": "Unable to marshal JSON."}`, http.StatusInternalServerError) log.Printf("Error marshalling JSON unused salvage with user %v, character %v: %v", myUserID, charID, err) return } w.Write(salvageJSON) return } }
// BlueprintsHandlers returns web handler functions that provide information on // a toon's bluerpints. func BlueprintsHandlers(localdb db.LocalDB, sde evego.Database, sess server.Sessionizer) (refresh, get web.HandlerFunc) { refresh = func(c web.C, w http.ResponseWriter, r *http.Request) { s := sess.GetSession(&c, w, r) myUserID := s.User charID, _ := strconv.Atoi(c.URLParams["charID"]) apiKeys, err := localdb.APIKeys(myUserID) if err != nil { http.Error(w, `{"status": "Error", "error": "Ouch"}`, http.StatusInternalServerError) return } // Find the key for this character. var myKey *db.XMLAPIKey for _, key := range apiKeys { for _, toon := range key.Characters { if toon.ID == charID { myKey = &key break } } } if myKey == nil { if err != nil { http.Error(w, `{"status": "Error", "error": "Invalid character supplied."}`, http.StatusUnauthorized) return } } err = localdb.GetAssetsBlueprints(*myKey, charID) if err != nil { http.Error(w, `{"status": "Error", "error": "Ouch"}`, http.StatusInternalServerError) return } return } get = func(c web.C, w http.ResponseWriter, r *http.Request) { s := sess.GetSession(&c, w, r) myUserID := s.User charID, err := strconv.Atoi(c.URLParams["charID"]) if err != nil { http.Error(w, `{"status": "Error", "error": "Invalid character ID supplied."}`, http.StatusBadRequest) return } blueprints, err := localdb.CharacterBlueprints(myUserID, charID) if err != nil { http.Error(w, `{"status": "Error", "error": "Unable to access database."}`, http.StatusInternalServerError) log.Printf("Error accessing database with user %v, character %v: %v", myUserID, charID, err) return } stations := make(map[string]*evego.Station) for i := range blueprints { bp := &blueprints[i] if _, found := stations[strconv.Itoa(bp.StationID)]; !found { stn, err := localdb.StationForID(bp.StationID) if err == nil { stations[strconv.Itoa(bp.StationID)] = stn } } } response := struct { Blueprints []evego.BlueprintItem `json:"blueprints"` Stations map[string]*evego.Station `json:"stations"` }{blueprints, stations} blueprintsJSON, err := json.Marshal(&response) if err != nil { http.Error(w, `{"status": "Error", "error": "Unable to marshal JSON."}`, http.StatusInternalServerError) log.Printf("Error marshalling JSON blueprints with user %v, character %v: %v", myUserID, charID, err) return } w.Write(blueprintsJSON) return } return }