diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6deb9a6 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "main.go" + } + ] +} \ No newline at end of file diff --git a/app/api/api.go b/app/api/api.go index 778f64e..5499b44 100644 --- a/app/api/api.go +++ b/app/api/api.go @@ -1 +1,49 @@ package api + +import ( + "encoding/json" + "io" + "net/http" + "time" + + "github.com/rayaman/bdo-market/app/types" +) + +var items []types.MarketItem +var lastUpdated time.Time = time.Now() + +// GetMarketItems retrieves market items from the API and updates them if necessary. +// +// It returns a slice of MarketItem and an error. +func GetMarketItems() ([]types.MarketItem, error) { + // The api only updates every 30 minutes, so let's only update it every 30 minutes + if len(items) > 0 && time.Since(lastUpdated) < 30*time.Minute { + return items, nil + } + var marketdata []types.MarketItem + + client := &http.Client{} + req, err := http.NewRequest("GET", "https://api.arsha.io/v2/na/market", nil) + + if err != nil { + return marketdata, err + } + + res, err := client.Do(req) + + if err != nil { + return marketdata, err + } + + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + + if err != nil { + return marketdata, err + } + + json.Unmarshal(body, &marketdata) + items = marketdata + return marketdata, nil +} diff --git a/app/data/data.go b/app/data/data.go new file mode 100644 index 0000000..5fba4c9 --- /dev/null +++ b/app/data/data.go @@ -0,0 +1,27 @@ +package data + +import ( + "fmt" + + "github.com/rayaman/bdo-market/app/types" +) + +// Filter filters the items using the provided filter function. +// +// Parameters: +// - items []types.MarketItem +// - filter func(types.MarketItem) bool +// Return type: []types.MarketItem +func Filter(items []types.MarketItem, filter func(types.MarketItem) bool) []types.MarketItem { + var filteredItems []types.MarketItem + for _, item := range items { + if filter(item) { + filteredItems = append(filteredItems, item) + } + } + return filteredItems +} + +func SprintMarketItem(item types.MarketItem) string { + return fmt.Sprintf("Name: %s\n Id: %d\n Current Stock: %d\n Total Trades: %d\n Base Price: %d\n Main Category: %d\n Sub Category: %d\n Market Category: %d", item.Name, item.Id, item.CurrentStock, item.TotalTrades, item.BasePrice, item.MainCategory, item.SubCategory, item.MarketCategory) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6ffc7d7 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/rayaman/bdo-market + +go 1.22.0 diff --git a/main.go b/main.go index ad94284..e578c7b 100644 --- a/main.go +++ b/main.go @@ -1,33 +1,26 @@ package main import ( - "app/types" "fmt" - "json" - "net/http" + + "github.com/rayaman/bdo-market/app/api" + "github.com/rayaman/bdo-market/app/data" + "github.com/rayaman/bdo-market/app/types" ) func main() { - -} - -func GetMarketItems() []types.MarketItem { - var marketdata []types.MarketItem - url := "https://api.arsha.io/v2/na/market" - - client := &http.Client{} - req, err := http.NewRequest("GET", url, nil) - + marketdata, err := api.GetMarketItems() if err != nil { - fmt.Println(err) - return + panic(err) } - res, err := client.Do(req) - if err != nil { - fmt.Println(err) - return + fmt.Printf("Total length: %d\n", len(marketdata)) + + filtered_items := data.Filter(marketdata, func(item types.MarketItem) bool { + return item.CurrentStock > 100000 + }) + + fmt.Printf("Filtered length: %d\n", len(filtered_items)) + for _, item := range filtered_items { + fmt.Println(data.SprintMarketItem(item)) } - defer res.Body.Close() - json.UnMarshal(res.Body, &marketdata) - return marketdata }