Basic functions to work with data

This commit is contained in:
Ryan Ward 2024-03-03 13:57:17 -05:00
parent b0e4215b17
commit 08361c3f93
5 changed files with 108 additions and 22 deletions

15
.vscode/launch.json vendored Normal file
View File

@ -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"
}
]
}

View File

@ -1 +1,49 @@
package api 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
}

27
app/data/data.go Normal file
View File

@ -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)
}

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/rayaman/bdo-market
go 1.22.0

37
main.go
View File

@ -1,33 +1,26 @@
package main package main
import ( import (
"app/types"
"fmt" "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 main() {
marketdata, err := api.GetMarketItems()
}
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)
if err != nil { if err != nil {
fmt.Println(err) panic(err)
return
} }
res, err := client.Do(req) fmt.Printf("Total length: %d\n", len(marketdata))
if err != nil {
fmt.Println(err) filtered_items := data.Filter(marketdata, func(item types.MarketItem) bool {
return 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
} }