diff --git a/README.md b/README.md index c85ad07..7fc033e 100644 --- a/README.md +++ b/README.md @@ -39,15 +39,162 @@ if err != nil { } players, err := client.Players.List(ctx, rudder.ListPlayersParameters{Limit: 100}) -entries, err := client.Leaderboards.ListEntries(ctx, "weekly") -wallet, err := client.Wallet.Adjust(ctx, playerID, rudder.AdjustWalletParameters{ - CurrencyCode: "coins", - Amount: 100, - Reason: "compensation", -}) metrics, err := client.Metrics.Get(ctx) ``` +## Handles + +`client.Player(id)` и `client.Leaderboard(slug)` создают handle без +HTTP-запроса. Handles — сахар над batch-методами сервисов: каждая операция +отправляет batch из одного элемента с подставленным playerID/slug. + +```go +player := client.Player("p1") + +wallet, err := player.Wallet().Adjust(ctx, rudder.AdjustPlayerWalletParameters{ + IdempotencyKey: "grant-001", + CurrencyCode: "coins", + Amount: 100, + Reason: "compensation", +}) +history, err := player.Wallet().History(ctx, rudder.WalletHistoryParameters{Limit: 50}) + +item, err := player.Inventory().Adjust(ctx, rudder.AdjustPlayerInventoryParameters{ + Slug: "sword", + Amount: 1, + Reason: "quest reward", +}) +inventory, err := player.Inventory().List(ctx, rudder.ListInventoryParameters{Limit: 50}) + +storage, err := player.Storage().Get(ctx, "settings") +updated, err := player.Storage().Upsert(ctx, rudder.UpsertPlayerStorageParameters{ + Type: "settings", + Data: `{"lang":"ru"}`, +}) +err = player.Storage().Delete(ctx, rudder.DeletePlayerStorageParameters{Type: "settings"}) + +quests, err := player.Quests().List(ctx) +err = player.Quests().Reset(ctx, rudder.PlayerQuestParameters{QuestID: "daily-1"}) +// ForceComplete и ForceClaim — аналогично + +updatedPlayer, err := player.Update(ctx, rudder.UpdatePlayerParameters{Nickname: "Neo"}) +banned, err := player.Ban(ctx, rudder.BanPlayerParameters{ + Reason: "cheating", + BannedUntil: "2030-01-01T00:00:00Z", +}) +unbanned, err := player.Unban(ctx, "") +err = player.Delete(ctx, "") + +board := client.Leaderboard("weekly") + +entries, err := board.List(ctx, rudder.ListLeaderboardEntriesParameters{Limit: 100}) +// entries.Entries []models.RankEntry, entries.NextCursor + +entry, err := board.Get(ctx, "p1") // *models.RankEntry с rank +around, err := board.GetAround(ctx, "p1", 10) // []models.RankEntry вокруг игрока + +err = board.Submit(ctx, []models.BatchLeaderboardEntry{{PlayerID: "p1", Score: 1500}}) +err = board.Update(ctx, []models.BatchLeaderboardEntry{{PlayerID: "p1", Score: 1600}}) +err = board.Delete(ctx, []string{"p1", "p2"}) +``` + +## Batch-first API + +Все мутирующие операции верхнего уровня — batch-only: тело +`{idempotencyKey?, items:[...]}` (`playerId` внутри элементов), до 100 +элементов, all-or-nothing в одной транзакции, один idempotency key на батч. + +```go +wallets, err := client.Wallet.Adjust(ctx, rudder.AdjustWalletParameters{ + IdempotencyKey: "grant-001", + Items: []models.BatchAdjustPlayerWalletsItem{ + {PlayerID: "p1", CurrencyCode: "coins", Amount: 100, Reason: "compensation"}, + {PlayerID: "p2", CurrencyCode: "coins", Amount: 100, Reason: "compensation"}, + }, +}) + +items, err := client.Inventory.Adjust(ctx, rudder.AdjustInventoryParameters{ + Items: []models.BatchAdjustPlayerInventoryItemsItem{ + {PlayerID: "p1", Slug: "sword", Amount: 1, Reason: "quest reward"}, + }, +}) + +updated, err := client.Players.Update(ctx, rudder.UpdatePlayersParameters{ + Items: []models.BatchUpdatePlayersItem{ + {PlayerID: "p1", Nickname: "Neo"}, + }, +}) + +banned, err := client.Players.Ban(ctx, rudder.BanPlayersParameters{ + Items: []models.BatchBanPlayersItem{ + {PlayerID: "p2", Reason: "cheating", BannedUntil: "2030-01-01T00:00:00Z"}, + }, +}) + +unbanned, err := client.Players.Unban(ctx, rudder.UnbanPlayersParameters{ + Items: []models.BatchPlayerItem{{PlayerID: "p2"}}, +}) + +err = client.Players.Delete(ctx, rudder.DeletePlayersParameters{ + Items: []models.BatchPlayerItem{{PlayerID: "p3"}}, +}) + +err = client.Quests.Reset(ctx, rudder.ResetPlayerQuestsParameters{ + Items: []models.BatchPlayerQuestsItem{ + {PlayerID: "p1", QuestID: "daily-1"}, + }, +}) +// ForceComplete и ForceClaim — аналогично + +err = client.Leaderboards.Submit(ctx, "weekly", []models.BatchLeaderboardEntry{ + {PlayerID: "p1", Score: 1500}, +}) +// Update и Delete — аналогично + +err = client.Storage.Upsert(ctx, rudder.UpsertStorageParameters{ + Items: []models.AdminProjectStorageItem{ + {Type: "config", Data: `{"event":"x2"}`}, + }, +}) + +err = client.Storage.Delete(ctx, rudder.DeleteStorageParameters{ + Types: []string{"config"}, +}) +``` + +## Каталоги и read-операции + +Курсорная пагинация: передавайте `Limit`/`Cursor`, следующую страницу +запрашивайте по `NextCursor` из ответа. + +```go +boards, err := client.Leaderboards.List(ctx, rudder.ListLeaderboardsParameters{Limit: 100}) +// boards.Items []models.LeaderboardDefinition, boards.NextCursor + +quests, err := client.Quests.List(ctx, rudder.ListQuestsParameters{ + Status: &status, // "active" или "archived", optional + Limit: 100, +}) +// quests.Items []models.QuestDefinition, quests.NextCursor + +history, err := client.Wallet.History(ctx, playerID, rudder.WalletHistoryParameters{ + Currency: ¤cy, // optional + Limit: 50, +}) +// history.Entries []models.WalletAudit, history.NextCursor + +inventory, err := client.Inventory.List(ctx, playerID, rudder.ListInventoryParameters{ + Limit: 50, +}) +// inventory.Items []models.InventoryItem, inventory.NextCursor + +storage, err := client.Storage.List(ctx, rudder.ListStorageParameters{ + Limit: 100, + Search: "config", // optional +}) +item, err := client.Storage.Get(ctx, "config") +``` + ## Ошибки ```go diff --git a/client.go b/client.go index d0318aa..4ed356d 100644 --- a/client.go +++ b/client.go @@ -16,14 +16,14 @@ type Config struct { type Client struct { Players *PlayersService - Metrics *MetricsService Leaderboards *LeaderboardsService Wallet *WalletService Inventory *InventoryService - Storage *StorageService Quests *QuestsService + Storage *StorageService + Metrics *MetricsService - ProjectStorage *ProjectStorageService + transport *transport } func New(config Config) (*Client, error) { @@ -49,13 +49,32 @@ func New(config Config) (*Client, error) { return &Client{ Players: &PlayersService{transport: transport}, - Metrics: &MetricsService{transport: transport}, Leaderboards: &LeaderboardsService{transport: transport}, Wallet: &WalletService{transport: transport}, Inventory: &InventoryService{transport: transport}, - Storage: &StorageService{transport: transport}, Quests: &QuestsService{transport: transport}, + Storage: &StorageService{transport: transport}, + Metrics: &MetricsService{transport: transport}, - ProjectStorage: &ProjectStorageService{transport: transport}, + transport: transport, }, nil } + +func (c *Client) Player(playerID string) *PlayerHandle { + return &PlayerHandle{ + playerID: playerID, + transport: c.transport, + players: c.Players, + wallet: c.Wallet, + inventory: c.Inventory, + quests: c.Quests, + } +} + +func (c *Client) Leaderboard(slug string) *LeaderboardHandle { + return &LeaderboardHandle{ + slug: slug, + transport: c.transport, + leaderboards: c.Leaderboards, + } +} diff --git a/inventory.go b/inventory.go index 2846a1d..7cd363b 100644 --- a/inventory.go +++ b/inventory.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "net/url" + "strconv" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -13,22 +14,39 @@ type InventoryService struct { } type AdjustInventoryParameters struct { - Slug string - Amount int64 - Reason string IdempotencyKey string + Items []models.BatchAdjustPlayerInventoryItemsItem } -func (s *InventoryService) Adjust(ctx context.Context, playerID string, parameters AdjustInventoryParameters) (*models.InventoryItem, error) { - body := models.AdjustPlayerInventoryItemRequest{ - Slug: parameters.Slug, - Amount: parameters.Amount, - Reason: parameters.Reason, +func (s *InventoryService) Adjust(ctx context.Context, parameters AdjustInventoryParameters) ([]models.InventoryItem, error) { + body := models.BatchAdjustPlayerInventoryItemsRequest{ IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, } - var response models.InventoryItem - if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/inventory/adjust", nil, body, &response); err != nil { + var response models.BatchAdjustPlayerInventoryItemsResponse + if err := s.transport.do(ctx, http.MethodPost, "/players/inventory/adjust", nil, body, &response); err != nil { + return nil, err + } + return response.Items, nil +} + +type ListInventoryParameters struct { + Limit int + Cursor *string +} + +func (s *InventoryService) List(ctx context.Context, playerID string, parameters ListInventoryParameters) (*models.GetPlayerInventoryResponse, error) { + query := url.Values{} + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != nil { + query.Set("cursor", *parameters.Cursor) + } + + var response models.GetPlayerInventoryResponse + if err := s.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(playerID)+"/inventory", query, nil, &response); err != nil { return nil, err } return &response, nil diff --git a/leaderboard.go b/leaderboard.go new file mode 100644 index 0000000..5d9d417 --- /dev/null +++ b/leaderboard.go @@ -0,0 +1,70 @@ +package rudder + +import ( + "context" + "net/http" + "net/url" + "strconv" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type LeaderboardHandle struct { + slug string + transport *transport + leaderboards *LeaderboardsService +} + +type ListLeaderboardEntriesParameters struct { + Limit int + Cursor *string +} + +func (h *LeaderboardHandle) List(ctx context.Context, parameters ListLeaderboardEntriesParameters) (*models.ListLeaderboardEntriesResponse, error) { + query := url.Values{} + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != nil { + query.Set("cursor", *parameters.Cursor) + } + + var response models.ListLeaderboardEntriesResponse + if err := h.transport.do(ctx, http.MethodGet, "/leaderboards/"+url.PathEscape(h.slug)+"/entries", query, nil, &response); err != nil { + return nil, err + } + return &response, nil +} + +func (h *LeaderboardHandle) Get(ctx context.Context, playerID string) (*models.RankEntry, error) { + var response models.RankEntry + if err := h.transport.do(ctx, http.MethodGet, "/leaderboards/"+url.PathEscape(h.slug)+"/entries/"+url.PathEscape(playerID), nil, nil, &response); err != nil { + return nil, err + } + return &response, nil +} + +func (h *LeaderboardHandle) GetAround(ctx context.Context, playerID string, limit int) ([]models.RankEntry, error) { + query := url.Values{} + if limit > 0 { + query.Set("limit", strconv.Itoa(limit)) + } + + var response models.GetLeaderboardEntryAroundResponse + if err := h.transport.do(ctx, http.MethodGet, "/leaderboards/"+url.PathEscape(h.slug)+"/entries/"+url.PathEscape(playerID)+"/around", query, nil, &response); err != nil { + return nil, err + } + return response.Entries, nil +} + +func (h *LeaderboardHandle) Submit(ctx context.Context, items []models.BatchLeaderboardEntry) error { + return h.leaderboards.Submit(ctx, h.slug, items) +} + +func (h *LeaderboardHandle) Update(ctx context.Context, items []models.BatchLeaderboardEntry) error { + return h.leaderboards.Update(ctx, h.slug, items) +} + +func (h *LeaderboardHandle) Delete(ctx context.Context, playerIDs []string) error { + return h.leaderboards.Delete(ctx, h.slug, playerIDs) +} diff --git a/leaderboards.go b/leaderboards.go index 09776ff..bfaa233 100644 --- a/leaderboards.go +++ b/leaderboards.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "net/url" + "strconv" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -12,31 +13,44 @@ type LeaderboardsService struct { transport *transport } -func (s *LeaderboardsService) ListEntries(ctx context.Context, slug string) ([]models.RankEntry, error) { - var response models.ListLeaderboardEntriesResponse +type ListLeaderboardsParameters struct { + Limit int + Cursor *string +} - if err := s.transport.do(ctx, http.MethodGet, "/leaderboards/"+url.PathEscape(slug)+"/entries", nil, nil, &response); err != nil { +func (s *LeaderboardsService) List(ctx context.Context, parameters ListLeaderboardsParameters) (*models.ListLeaderboardsResponse, error) { + query := url.Values{} + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != nil { + query.Set("cursor", *parameters.Cursor) + } + + var response models.ListLeaderboardsResponse + if err := s.transport.do(ctx, http.MethodGet, "/leaderboards", query, nil, &response); err != nil { return nil, err } - - return response.Entries, nil + return &response, nil } -func (s *LeaderboardsService) DeleteEntry(ctx context.Context, slug string, entryID string) error { - return s.transport.do(ctx, http.MethodDelete, "/leaderboards/"+url.PathEscape(slug)+"/entries/"+url.PathEscape(entryID), nil, nil, nil) -} - -func (s *LeaderboardsService) UpdateEntry(ctx context.Context, slug string, entry *models.RankEntry) error { - body := models.UpdateLeaderboardEntryRequest{ - Score: entry.Score, - } - return s.transport.do(ctx, http.MethodPatch, "/leaderboards/"+url.PathEscape(slug)+"/entries/"+url.PathEscape(entry.PlayerID), nil, body, nil) -} - -func (s *LeaderboardsService) SubmitEntry(ctx context.Context, slug string, entry *models.RankEntry) error { - body := models.SubmitLeaderboardEntryRequest{ - PlayerID: entry.PlayerID, - Score: entry.Score, +func (s *LeaderboardsService) Submit(ctx context.Context, slug string, items []models.BatchLeaderboardEntry) error { + body := models.BatchSubmitLeaderboardEntriesRequest{ + Items: items, } return s.transport.do(ctx, http.MethodPost, "/leaderboards/"+url.PathEscape(slug)+"/entries", nil, body, nil) } + +func (s *LeaderboardsService) Update(ctx context.Context, slug string, items []models.BatchLeaderboardEntry) error { + body := models.BatchUpdateLeaderboardEntriesRequest{ + Items: items, + } + return s.transport.do(ctx, http.MethodPatch, "/leaderboards/"+url.PathEscape(slug)+"/entries", nil, body, nil) +} + +func (s *LeaderboardsService) Delete(ctx context.Context, slug string, playerIDs []string) error { + body := models.BatchDeleteLeaderboardEntriesRequest{ + PlayerIds: playerIDs, + } + return s.transport.do(ctx, http.MethodDelete, "/leaderboards/"+url.PathEscape(slug)+"/entries", nil, body, nil) +} diff --git a/models/adjustplayerinventoryitemrequest.go b/models/adjustplayerinventoryitemrequest.go deleted file mode 100644 index ba7ed4b..0000000 --- a/models/adjustplayerinventoryitemrequest.go +++ /dev/null @@ -1,10 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type AdjustPlayerInventoryItemRequest struct { - Amount int64 `json:"amount,omitempty"` - IdempotencyKey string `json:"idempotencyKey,omitempty"` - Reason string `json:"reason,omitempty"` - Slug string `json:"slug,omitempty"` -} diff --git a/models/adjustplayerwalletrequest.go b/models/adjustplayerwalletrequest.go deleted file mode 100644 index b891a34..0000000 --- a/models/adjustplayerwalletrequest.go +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type AdjustPlayerWalletRequest struct { - Amount int64 `json:"amount,omitempty"` - CurrencyCode string `json:"currencyCode,omitempty"` - IdempotencyKey string `json:"idempotencyKey,omitempty"` - PlayerID string `json:"playerId,omitempty"` - Reason string `json:"reason,omitempty"` -} diff --git a/models/adminlistquestsresponse.go b/models/adminlistquestsresponse.go new file mode 100644 index 0000000..8daa28b --- /dev/null +++ b/models/adminlistquestsresponse.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type AdminListQuestsResponse struct { + Items []QuestDefinition `json:"items,omitempty"` + NextCursor string `json:"nextCursor,omitempty"` +} diff --git a/models/adminplayerquestrequest.go b/models/adminplayerquestrequest.go deleted file mode 100644 index d1dbbd7..0000000 --- a/models/adminplayerquestrequest.go +++ /dev/null @@ -1,7 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type AdminPlayerQuestRequest struct { - QuestID string `json:"questId,omitempty"` -} diff --git a/models/banplayerrequest.go b/models/banplayerrequest.go deleted file mode 100644 index e0ef12c..0000000 --- a/models/banplayerrequest.go +++ /dev/null @@ -1,9 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type BanPlayerRequest struct { - BannedUntil string `json:"bannedUntil,omitempty"` - IdempotencyKey string `json:"idempotencyKey,omitempty"` - Reason string `json:"reason,omitempty"` -} diff --git a/models/batchadjustplayerinventoryitemsitem.go b/models/batchadjustplayerinventoryitemsitem.go new file mode 100644 index 0000000..84eaccf --- /dev/null +++ b/models/batchadjustplayerinventoryitemsitem.go @@ -0,0 +1,10 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerInventoryItemsItem struct { + Amount int64 `json:"amount,omitempty"` + PlayerID string `json:"playerId,omitempty"` + Reason string `json:"reason,omitempty"` + Slug string `json:"slug,omitempty"` +} diff --git a/models/batchadjustplayerinventoryitemsrequest.go b/models/batchadjustplayerinventoryitemsrequest.go new file mode 100644 index 0000000..cdc8b30 --- /dev/null +++ b/models/batchadjustplayerinventoryitemsrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerInventoryItemsRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchAdjustPlayerInventoryItemsItem `json:"items,omitempty"` +} diff --git a/models/batchadjustplayerinventoryitemsresponse.go b/models/batchadjustplayerinventoryitemsresponse.go new file mode 100644 index 0000000..d235f0a --- /dev/null +++ b/models/batchadjustplayerinventoryitemsresponse.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerInventoryItemsResponse struct { + Items []InventoryItem `json:"items,omitempty"` +} diff --git a/models/batchadjustplayerwalletsitem.go b/models/batchadjustplayerwalletsitem.go new file mode 100644 index 0000000..2ee942c --- /dev/null +++ b/models/batchadjustplayerwalletsitem.go @@ -0,0 +1,10 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerWalletsItem struct { + Amount int64 `json:"amount,omitempty"` + CurrencyCode string `json:"currencyCode,omitempty"` + PlayerID string `json:"playerId,omitempty"` + Reason string `json:"reason,omitempty"` +} diff --git a/models/batchadjustplayerwalletsrequest.go b/models/batchadjustplayerwalletsrequest.go new file mode 100644 index 0000000..6c8ec96 --- /dev/null +++ b/models/batchadjustplayerwalletsrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerWalletsRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchAdjustPlayerWalletsItem `json:"items,omitempty"` +} diff --git a/models/batchadjustplayerwalletsresponse.go b/models/batchadjustplayerwalletsresponse.go new file mode 100644 index 0000000..48d13ad --- /dev/null +++ b/models/batchadjustplayerwalletsresponse.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchAdjustPlayerWalletsResponse struct { + Wallets []WalletDetails `json:"wallets,omitempty"` +} diff --git a/models/batchbanplayersitem.go b/models/batchbanplayersitem.go new file mode 100644 index 0000000..e944df8 --- /dev/null +++ b/models/batchbanplayersitem.go @@ -0,0 +1,9 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchBanPlayersItem struct { + BannedUntil string `json:"bannedUntil,omitempty"` + PlayerID string `json:"playerId,omitempty"` + Reason string `json:"reason,omitempty"` +} diff --git a/models/batchbanplayersrequest.go b/models/batchbanplayersrequest.go new file mode 100644 index 0000000..9f4b7f3 --- /dev/null +++ b/models/batchbanplayersrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchBanPlayersRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchBanPlayersItem `json:"items,omitempty"` +} diff --git a/models/batchdeleteleaderboardentriesrequest.go b/models/batchdeleteleaderboardentriesrequest.go new file mode 100644 index 0000000..15943c1 --- /dev/null +++ b/models/batchdeleteleaderboardentriesrequest.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchDeleteLeaderboardEntriesRequest struct { + PlayerIds []string `json:"playerIds,omitempty"` +} diff --git a/models/batchdeleteplayersrequest.go b/models/batchdeleteplayersrequest.go new file mode 100644 index 0000000..edaf70f --- /dev/null +++ b/models/batchdeleteplayersrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchDeletePlayersRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchPlayerItem `json:"items,omitempty"` +} diff --git a/models/batchdeleteplayerstoragesitem.go b/models/batchdeleteplayerstoragesitem.go new file mode 100644 index 0000000..5b0138c --- /dev/null +++ b/models/batchdeleteplayerstoragesitem.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchDeletePlayerStoragesItem struct { + PlayerID string `json:"playerId,omitempty"` + Type string `json:"type,omitempty"` +} diff --git a/models/batchdeleteplayerstoragesrequest.go b/models/batchdeleteplayerstoragesrequest.go new file mode 100644 index 0000000..9bdd892 --- /dev/null +++ b/models/batchdeleteplayerstoragesrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchDeletePlayerStoragesRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchDeletePlayerStoragesItem `json:"items,omitempty"` +} diff --git a/models/batchdeleteprojectstoragerequest.go b/models/batchdeleteprojectstoragerequest.go new file mode 100644 index 0000000..721de1c --- /dev/null +++ b/models/batchdeleteprojectstoragerequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchDeleteProjectStorageRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Types []string `json:"types,omitempty"` +} diff --git a/models/submitleaderboardentryrequest.go b/models/batchleaderboardentry.go similarity index 77% rename from models/submitleaderboardentryrequest.go rename to models/batchleaderboardentry.go index c0960ce..3ff124f 100644 --- a/models/submitleaderboardentryrequest.go +++ b/models/batchleaderboardentry.go @@ -2,7 +2,7 @@ package models -type SubmitLeaderboardEntryRequest struct { +type BatchLeaderboardEntry struct { PlayerID string `json:"playerId,omitempty"` Score float64 `json:"score,omitempty"` } diff --git a/models/batchplayeritem.go b/models/batchplayeritem.go new file mode 100644 index 0000000..35fd1d1 --- /dev/null +++ b/models/batchplayeritem.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchPlayerItem struct { + PlayerID string `json:"playerId,omitempty"` +} diff --git a/models/batchplayerquestsitem.go b/models/batchplayerquestsitem.go new file mode 100644 index 0000000..3a480ae --- /dev/null +++ b/models/batchplayerquestsitem.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchPlayerQuestsItem struct { + PlayerID string `json:"playerId,omitempty"` + QuestID string `json:"questId,omitempty"` +} diff --git a/models/batchplayerquestsrequest.go b/models/batchplayerquestsrequest.go new file mode 100644 index 0000000..a630bf0 --- /dev/null +++ b/models/batchplayerquestsrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchPlayerQuestsRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchPlayerQuestsItem `json:"items,omitempty"` +} diff --git a/models/batchplayersresponse.go b/models/batchplayersresponse.go new file mode 100644 index 0000000..1ce89d8 --- /dev/null +++ b/models/batchplayersresponse.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchPlayersResponse struct { + Players []AdminPlayer `json:"players,omitempty"` +} diff --git a/models/batchsubmitleaderboardentriesrequest.go b/models/batchsubmitleaderboardentriesrequest.go new file mode 100644 index 0000000..d31e39b --- /dev/null +++ b/models/batchsubmitleaderboardentriesrequest.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchSubmitLeaderboardEntriesRequest struct { + Items []BatchLeaderboardEntry `json:"items,omitempty"` +} diff --git a/models/batchunbanplayersrequest.go b/models/batchunbanplayersrequest.go new file mode 100644 index 0000000..94dead6 --- /dev/null +++ b/models/batchunbanplayersrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUnbanPlayersRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchPlayerItem `json:"items,omitempty"` +} diff --git a/models/batchupdateleaderboardentriesrequest.go b/models/batchupdateleaderboardentriesrequest.go new file mode 100644 index 0000000..7761eae --- /dev/null +++ b/models/batchupdateleaderboardentriesrequest.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUpdateLeaderboardEntriesRequest struct { + Items []BatchLeaderboardEntry `json:"items,omitempty"` +} diff --git a/models/updateplayerrequest.go b/models/batchupdateplayersitem.go similarity index 67% rename from models/updateplayerrequest.go rename to models/batchupdateplayersitem.go index 46c94f2..fed3453 100644 --- a/models/updateplayerrequest.go +++ b/models/batchupdateplayersitem.go @@ -4,7 +4,8 @@ package models import "encoding/json" -type UpdatePlayerRequest struct { +type BatchUpdatePlayersItem struct { Data json.RawMessage `json:"data,omitempty"` Nickname string `json:"nickname,omitempty"` + PlayerID string `json:"playerId,omitempty"` } diff --git a/models/batchupdateplayersrequest.go b/models/batchupdateplayersrequest.go new file mode 100644 index 0000000..9f235fb --- /dev/null +++ b/models/batchupdateplayersrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUpdatePlayersRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchUpdatePlayersItem `json:"items,omitempty"` +} diff --git a/models/upsertplayerstoragerequest.go b/models/batchupsertplayerstoragesitem.go similarity index 53% rename from models/upsertplayerstoragerequest.go rename to models/batchupsertplayerstoragesitem.go index fcc71d3..f68c5f6 100644 --- a/models/upsertplayerstoragerequest.go +++ b/models/batchupsertplayerstoragesitem.go @@ -2,7 +2,9 @@ package models -type UpsertPlayerStorageRequest struct { +type BatchUpsertPlayerStoragesItem struct { Data string `json:"data,omitempty"` ExpiresAt string `json:"expiresAt,omitempty"` + PlayerID string `json:"playerId,omitempty"` + Type string `json:"type,omitempty"` } diff --git a/models/batchupsertplayerstoragesrequest.go b/models/batchupsertplayerstoragesrequest.go new file mode 100644 index 0000000..f6f2eb2 --- /dev/null +++ b/models/batchupsertplayerstoragesrequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUpsertPlayerStoragesRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []BatchUpsertPlayerStoragesItem `json:"items,omitempty"` +} diff --git a/models/batchupsertplayerstoragesresponse.go b/models/batchupsertplayerstoragesresponse.go new file mode 100644 index 0000000..73e52be --- /dev/null +++ b/models/batchupsertplayerstoragesresponse.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUpsertPlayerStoragesResponse struct { + Storages []PlayerStorage `json:"storages,omitempty"` +} diff --git a/models/batchupsertprojectstoragerequest.go b/models/batchupsertprojectstoragerequest.go new file mode 100644 index 0000000..77a517a --- /dev/null +++ b/models/batchupsertprojectstoragerequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type BatchUpsertProjectStorageRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` + Items []AdminProjectStorageItem `json:"items,omitempty"` +} diff --git a/models/deleteplayerrequest.go b/models/deleteplayerrequest.go deleted file mode 100644 index 9835847..0000000 --- a/models/deleteplayerrequest.go +++ /dev/null @@ -1,7 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type DeletePlayerRequest struct { - IdempotencyKey string `json:"idempotencyKey,omitempty"` -} diff --git a/models/errorresponse.go b/models/errorresponse.go new file mode 100644 index 0000000..7eea118 --- /dev/null +++ b/models/errorresponse.go @@ -0,0 +1,11 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type ErrorResponse struct { + Code string `json:"code,omitempty"` + Error string `json:"error,omitempty"` + Index int `json:"index,omitempty"` + PlayerID string `json:"playerId,omitempty"` + RequestID string `json:"requestId,omitempty"` +} diff --git a/models/getleaderboardentryaroundresponse.go b/models/getleaderboardentryaroundresponse.go new file mode 100644 index 0000000..65a298e --- /dev/null +++ b/models/getleaderboardentryaroundresponse.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type GetLeaderboardEntryAroundResponse struct { + Entries []RankEntry `json:"entries,omitempty"` +} diff --git a/models/getplayerinventoryresponse.go b/models/getplayerinventoryresponse.go new file mode 100644 index 0000000..4f26fd0 --- /dev/null +++ b/models/getplayerinventoryresponse.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type GetPlayerInventoryResponse struct { + Items []InventoryItem `json:"items,omitempty"` + NextCursor string `json:"nextCursor,omitempty"` +} diff --git a/models/getwallethistoryresponse.go b/models/getwallethistoryresponse.go new file mode 100644 index 0000000..bd616d3 --- /dev/null +++ b/models/getwallethistoryresponse.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type GetWalletHistoryResponse struct { + Entries []WalletAudit `json:"entries,omitempty"` + NextCursor string `json:"nextCursor,omitempty"` +} diff --git a/models/leaderboarddefinition.go b/models/leaderboarddefinition.go new file mode 100644 index 0000000..91e46d2 --- /dev/null +++ b/models/leaderboarddefinition.go @@ -0,0 +1,12 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type LeaderboardDefinition struct { + MaxEntries int64 `json:"maxEntries,omitempty"` + Metric string `json:"metric,omitempty"` + Name string `json:"name,omitempty"` + ResetPeriod string `json:"resetPeriod,omitempty"` + Slug string `json:"slug,omitempty"` + SortingOrder string `json:"sortingOrder,omitempty"` +} diff --git a/models/listleaderboardentriesresponse.go b/models/listleaderboardentriesresponse.go index 823ceda..a81ee7e 100644 --- a/models/listleaderboardentriesresponse.go +++ b/models/listleaderboardentriesresponse.go @@ -3,5 +3,6 @@ package models type ListLeaderboardEntriesResponse struct { - Entries []RankEntry `json:"entries,omitempty"` + Entries []RankEntry `json:"entries,omitempty"` + NextCursor string `json:"nextCursor,omitempty"` } diff --git a/models/listleaderboardsresponse.go b/models/listleaderboardsresponse.go new file mode 100644 index 0000000..c10396c --- /dev/null +++ b/models/listleaderboardsresponse.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type ListLeaderboardsResponse struct { + Items []LeaderboardDefinition `json:"items,omitempty"` + NextCursor string `json:"nextCursor,omitempty"` +} diff --git a/models/questdefinition.go b/models/questdefinition.go new file mode 100644 index 0000000..894db39 --- /dev/null +++ b/models/questdefinition.go @@ -0,0 +1,12 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type QuestDefinition struct { + ID string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + NextQuestID string `json:"nextQuestId,omitempty"` + Objectives []QuestObjective `json:"objectives,omitempty"` + Rewards []QuestRewardDefinition `json:"rewards,omitempty"` + Status string `json:"status,omitempty"` +} diff --git a/models/questobjective.go b/models/questobjective.go new file mode 100644 index 0000000..4c55ea1 --- /dev/null +++ b/models/questobjective.go @@ -0,0 +1,9 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type QuestObjective struct { + ID string `json:"id,omitempty"` + Metric string `json:"metric,omitempty"` + Target int64 `json:"target,omitempty"` +} diff --git a/models/questrewarddefinition.go b/models/questrewarddefinition.go new file mode 100644 index 0000000..ed5ea51 --- /dev/null +++ b/models/questrewarddefinition.go @@ -0,0 +1,9 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type QuestRewardDefinition struct { + Amount int64 `json:"amount,omitempty"` + Currency string `json:"currency,omitempty"` + ItemID string `json:"itemId,omitempty"` +} diff --git a/models/updateleaderboardentryrequest.go b/models/updateleaderboardentryrequest.go deleted file mode 100644 index 9c77517..0000000 --- a/models/updateleaderboardentryrequest.go +++ /dev/null @@ -1,7 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type UpdateLeaderboardEntryRequest struct { - Score float64 `json:"score,omitempty"` -} diff --git a/models/upsertprojectstoragerequest.go b/models/upsertprojectstoragerequest.go deleted file mode 100644 index 86e604f..0000000 --- a/models/upsertprojectstoragerequest.go +++ /dev/null @@ -1,7 +0,0 @@ -// Code generated by apigen. DO NOT EDIT. - -package models - -type UpsertProjectStorageRequest struct { - Items []AdminProjectStorageItem `json:"items,omitempty"` -} diff --git a/player.go b/player.go new file mode 100644 index 0000000..acbd1b5 --- /dev/null +++ b/player.go @@ -0,0 +1,93 @@ +package rudder + +import ( + "context" + "encoding/json" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type PlayerHandle struct { + playerID string + transport *transport + players *PlayersService + wallet *WalletService + inventory *InventoryService + quests *QuestsService +} + +func (h *PlayerHandle) Wallet() *PlayerWalletHandle { + return &PlayerWalletHandle{playerID: h.playerID, wallet: h.wallet} +} + +func (h *PlayerHandle) Inventory() *PlayerInventoryHandle { + return &PlayerInventoryHandle{playerID: h.playerID, inventory: h.inventory} +} + +func (h *PlayerHandle) Storage() *PlayerStorageHandle { + return &PlayerStorageHandle{playerID: h.playerID, transport: h.transport} +} + +func (h *PlayerHandle) Quests() *PlayerQuestsHandle { + return &PlayerQuestsHandle{playerID: h.playerID, transport: h.transport, quests: h.quests} +} + +type UpdatePlayerParameters struct { + IdempotencyKey string + Nickname string + Data json.RawMessage +} + +func (h *PlayerHandle) Update(ctx context.Context, parameters UpdatePlayerParameters) (*models.AdminPlayer, error) { + players, err := h.players.Update(ctx, UpdatePlayersParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchUpdatePlayersItem{{ + PlayerID: h.playerID, + Nickname: parameters.Nickname, + Data: parameters.Data, + }}, + }) + if err != nil { + return nil, err + } + return &players[0], nil +} + +type BanPlayerParameters struct { + IdempotencyKey string + Reason string + BannedUntil string +} + +func (h *PlayerHandle) Ban(ctx context.Context, parameters BanPlayerParameters) (*models.AdminPlayer, error) { + players, err := h.players.Ban(ctx, BanPlayersParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchBanPlayersItem{{ + PlayerID: h.playerID, + Reason: parameters.Reason, + BannedUntil: parameters.BannedUntil, + }}, + }) + if err != nil { + return nil, err + } + return &players[0], nil +} + +func (h *PlayerHandle) Unban(ctx context.Context, idempotencyKey string) (*models.AdminPlayer, error) { + players, err := h.players.Unban(ctx, UnbanPlayersParameters{ + IdempotencyKey: idempotencyKey, + Items: []models.BatchPlayerItem{{PlayerID: h.playerID}}, + }) + if err != nil { + return nil, err + } + return &players[0], nil +} + +func (h *PlayerHandle) Delete(ctx context.Context, idempotencyKey string) error { + return h.players.Delete(ctx, DeletePlayersParameters{ + IdempotencyKey: idempotencyKey, + Items: []models.BatchPlayerItem{{PlayerID: h.playerID}}, + }) +} diff --git a/player_inventory.go b/player_inventory.go new file mode 100644 index 0000000..f0726bf --- /dev/null +++ b/player_inventory.go @@ -0,0 +1,39 @@ +package rudder + +import ( + "context" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type PlayerInventoryHandle struct { + playerID string + inventory *InventoryService +} + +type AdjustPlayerInventoryParameters struct { + IdempotencyKey string + Slug string + Amount int64 + Reason string +} + +func (h *PlayerInventoryHandle) Adjust(ctx context.Context, parameters AdjustPlayerInventoryParameters) (*models.InventoryItem, error) { + items, err := h.inventory.Adjust(ctx, AdjustInventoryParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchAdjustPlayerInventoryItemsItem{{ + PlayerID: h.playerID, + Slug: parameters.Slug, + Amount: parameters.Amount, + Reason: parameters.Reason, + }}, + }) + if err != nil { + return nil, err + } + return &items[0], nil +} + +func (h *PlayerInventoryHandle) List(ctx context.Context, parameters ListInventoryParameters) (*models.GetPlayerInventoryResponse, error) { + return h.inventory.List(ctx, h.playerID, parameters) +} diff --git a/player_quests.go b/player_quests.go new file mode 100644 index 0000000..1028595 --- /dev/null +++ b/player_quests.go @@ -0,0 +1,49 @@ +package rudder + +import ( + "context" + "net/http" + "net/url" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type PlayerQuestsHandle struct { + playerID string + transport *transport + quests *QuestsService +} + +func (h *PlayerQuestsHandle) List(ctx context.Context) ([]models.AdminPlayerQuest, error) { + var response models.ListPlayerQuestsResponse + if err := h.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(h.playerID)+"/quests", nil, nil, &response); err != nil { + return nil, err + } + return response.Quests, nil +} + +type PlayerQuestParameters struct { + IdempotencyKey string + QuestID string +} + +func (h *PlayerQuestsHandle) Reset(ctx context.Context, parameters PlayerQuestParameters) error { + return h.quests.Reset(ctx, ResetPlayerQuestsParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchPlayerQuestsItem{{PlayerID: h.playerID, QuestID: parameters.QuestID}}, + }) +} + +func (h *PlayerQuestsHandle) ForceComplete(ctx context.Context, parameters PlayerQuestParameters) error { + return h.quests.ForceComplete(ctx, ForceCompletePlayerQuestsParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchPlayerQuestsItem{{PlayerID: h.playerID, QuestID: parameters.QuestID}}, + }) +} + +func (h *PlayerQuestsHandle) ForceClaim(ctx context.Context, parameters PlayerQuestParameters) error { + return h.quests.ForceClaim(ctx, ForceClaimPlayerQuestsParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchPlayerQuestsItem{{PlayerID: h.playerID, QuestID: parameters.QuestID}}, + }) +} diff --git a/player_storage.go b/player_storage.go new file mode 100644 index 0000000..5f2a3fd --- /dev/null +++ b/player_storage.go @@ -0,0 +1,63 @@ +package rudder + +import ( + "context" + "net/http" + "net/url" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type PlayerStorageHandle struct { + playerID string + transport *transport +} + +func (h *PlayerStorageHandle) Get(ctx context.Context, storageType string) (*models.PlayerStorage, error) { + var response models.PlayerStorage + if err := h.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(h.playerID)+"/storage/"+url.PathEscape(storageType), nil, nil, &response); err != nil { + return nil, err + } + return &response, nil +} + +type UpsertPlayerStorageParameters struct { + IdempotencyKey string + Type string + Data string + ExpiresAt string +} + +func (h *PlayerStorageHandle) Upsert(ctx context.Context, parameters UpsertPlayerStorageParameters) (*models.PlayerStorage, error) { + body := models.BatchUpsertPlayerStoragesRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchUpsertPlayerStoragesItem{{ + PlayerID: h.playerID, + Type: parameters.Type, + Data: parameters.Data, + ExpiresAt: parameters.ExpiresAt, + }}, + } + + var response models.BatchUpsertPlayerStoragesResponse + if err := h.transport.do(ctx, http.MethodPut, "/players/storage", nil, body, &response); err != nil { + return nil, err + } + return &response.Storages[0], nil +} + +type DeletePlayerStorageParameters struct { + IdempotencyKey string + Type string +} + +func (h *PlayerStorageHandle) Delete(ctx context.Context, parameters DeletePlayerStorageParameters) error { + body := models.BatchDeletePlayerStoragesRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchDeletePlayerStoragesItem{{ + PlayerID: h.playerID, + Type: parameters.Type, + }}, + } + return h.transport.do(ctx, http.MethodDelete, "/players/storage", nil, body, nil) +} diff --git a/player_wallet.go b/player_wallet.go new file mode 100644 index 0000000..4da4bbd --- /dev/null +++ b/player_wallet.go @@ -0,0 +1,39 @@ +package rudder + +import ( + "context" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type PlayerWalletHandle struct { + playerID string + wallet *WalletService +} + +type AdjustPlayerWalletParameters struct { + IdempotencyKey string + CurrencyCode string + Amount int64 + Reason string +} + +func (h *PlayerWalletHandle) Adjust(ctx context.Context, parameters AdjustPlayerWalletParameters) (*models.WalletDetails, error) { + wallets, err := h.wallet.Adjust(ctx, AdjustWalletParameters{ + IdempotencyKey: parameters.IdempotencyKey, + Items: []models.BatchAdjustPlayerWalletsItem{{ + PlayerID: h.playerID, + CurrencyCode: parameters.CurrencyCode, + Amount: parameters.Amount, + Reason: parameters.Reason, + }}, + }) + if err != nil { + return nil, err + } + return &wallets[0], nil +} + +func (h *PlayerWalletHandle) History(ctx context.Context, parameters WalletHistoryParameters) (*models.GetWalletHistoryResponse, error) { + return h.wallet.History(ctx, h.playerID, parameters) +} diff --git a/players.go b/players.go index f544a16..e411f25 100644 --- a/players.go +++ b/players.go @@ -2,11 +2,9 @@ package rudder import ( "context" - "encoding/json" "net/http" "net/url" "strconv" - "time" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -48,59 +46,69 @@ func (s *PlayersService) Get(ctx context.Context, playerID string) (*models.Admi return &response, nil } -type UpdatePlayerParameters struct { - Nickname *string - Data json.RawMessage -} - -func (s *PlayersService) Update(ctx context.Context, playerID string, parameters UpdatePlayerParameters) (*models.AdminPlayer, error) { - body := models.UpdatePlayerRequest{ - Data: parameters.Data, - } - if parameters.Nickname != nil { - body.Nickname = *parameters.Nickname - } - - var response models.AdminPlayer - if err := s.transport.do(ctx, http.MethodPatch, "/players/"+url.PathEscape(playerID), nil, body, &response); err != nil { - return nil, err - } - return &response, nil -} - -type BanPlayerParameters struct { - Reason string - Until *time.Time +type UpdatePlayersParameters struct { IdempotencyKey string + Items []models.BatchUpdatePlayersItem } -func (s *PlayersService) Ban(ctx context.Context, playerID string, parameters BanPlayerParameters) (*models.AdminPlayer, error) { - body := models.BanPlayerRequest{ - Reason: parameters.Reason, +func (s *PlayersService) Update(ctx context.Context, parameters UpdatePlayersParameters) ([]models.AdminPlayer, error) { + body := models.BatchUpdatePlayersRequest{ IdempotencyKey: parameters.IdempotencyKey, - } - if parameters.Until != nil { - body.BannedUntil = parameters.Until.Format(time.RFC3339) + Items: parameters.Items, } - var response models.AdminPlayer - if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/ban", nil, body, &response); err != nil { + var response models.BatchPlayersResponse + if err := s.transport.do(ctx, http.MethodPatch, "/players", nil, body, &response); err != nil { return nil, err } - return &response, nil + return response.Players, nil } -func (s *PlayersService) Unban(ctx context.Context, playerID string) (*models.AdminPlayer, error) { - var response models.AdminPlayer - if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/unban", nil, nil, &response); err != nil { +type BanPlayersParameters struct { + IdempotencyKey string + Items []models.BatchBanPlayersItem +} + +func (s *PlayersService) Ban(ctx context.Context, parameters BanPlayersParameters) ([]models.AdminPlayer, error) { + body := models.BatchBanPlayersRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, + } + + var response models.BatchPlayersResponse + if err := s.transport.do(ctx, http.MethodPost, "/players/ban", nil, body, &response); err != nil { return nil, err } - return &response, nil + return response.Players, nil } -func (s *PlayersService) Delete(ctx context.Context, playerID string, idempotencyKey string) error { - body := models.DeletePlayerRequest{ - IdempotencyKey: idempotencyKey, - } - return s.transport.do(ctx, http.MethodDelete, "/players/"+url.PathEscape(playerID), nil, body, nil) +type UnbanPlayersParameters struct { + IdempotencyKey string + Items []models.BatchPlayerItem +} + +func (s *PlayersService) Unban(ctx context.Context, parameters UnbanPlayersParameters) ([]models.AdminPlayer, error) { + body := models.BatchUnbanPlayersRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, + } + + var response models.BatchPlayersResponse + if err := s.transport.do(ctx, http.MethodPost, "/players/unban", nil, body, &response); err != nil { + return nil, err + } + return response.Players, nil +} + +type DeletePlayersParameters struct { + IdempotencyKey string + Items []models.BatchPlayerItem +} + +func (s *PlayersService) Delete(ctx context.Context, parameters DeletePlayersParameters) error { + body := models.BatchDeletePlayersRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, + } + return s.transport.do(ctx, http.MethodDelete, "/players", nil, body, nil) } diff --git a/projectstorage.go b/projectstorage.go deleted file mode 100644 index 296ea11..0000000 --- a/projectstorage.go +++ /dev/null @@ -1,62 +0,0 @@ -package rudder - -import ( - "context" - "net/http" - "net/url" - "strconv" - - "hub.rudder.build/rudder/rudder-go-sdk/models" -) - -type ProjectStorageService struct { - transport *transport -} - -type ListProjectStorageParameters struct { - Limit int - Cursor string - Search string -} - -func (s *ProjectStorageService) List(ctx context.Context, parameters ListProjectStorageParameters) (*models.GetProjectStorageResponse, error) { - query := url.Values{} - if parameters.Limit > 0 { - query.Set("limit", strconv.Itoa(parameters.Limit)) - } - if parameters.Cursor != "" { - query.Set("cursor", parameters.Cursor) - } - if parameters.Search != "" { - query.Set("search", parameters.Search) - } - - var response models.GetProjectStorageResponse - if err := s.transport.do(ctx, http.MethodGet, "/project-storage", query, nil, &response); err != nil { - return nil, err - } - return &response, nil -} - -func (s *ProjectStorageService) Get(ctx context.Context, itemType string) (*models.ProjectStorageItem, error) { - var response models.AdminGetProjectStorageResponse - if err := s.transport.do(ctx, http.MethodGet, "/project-storage/"+url.PathEscape(itemType), nil, nil, &response); err != nil { - return nil, err - } - return &response.Item, nil -} - -type UpsertProjectStorageParameters struct { - Items []models.AdminProjectStorageItem -} - -func (s *ProjectStorageService) Upsert(ctx context.Context, parameters UpsertProjectStorageParameters) error { - body := models.UpsertProjectStorageRequest{ - Items: parameters.Items, - } - return s.transport.do(ctx, http.MethodPut, "/project-storage", nil, body, nil) -} - -func (s *ProjectStorageService) Delete(ctx context.Context, itemType string) error { - return s.transport.do(ctx, http.MethodDelete, "/project-storage/"+url.PathEscape(itemType), nil, nil, nil) -} diff --git a/quests.go b/quests.go index 22da3fe..a0f6d8f 100644 --- a/quests.go +++ b/quests.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "net/url" + "strconv" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -12,31 +13,66 @@ type QuestsService struct { transport *transport } -func (s *QuestsService) ListPlayerQuests(ctx context.Context, playerID string) ([]models.AdminPlayerQuest, error) { - var response models.ListPlayerQuestsResponse - if err := s.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(playerID)+"/quests", nil, nil, &response); err != nil { +type ListQuestsParameters struct { + Status *string + Limit int + Cursor *string +} + +func (s *QuestsService) List(ctx context.Context, parameters ListQuestsParameters) (*models.AdminListQuestsResponse, error) { + query := url.Values{} + if parameters.Status != nil { + query.Set("status", *parameters.Status) + } + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != nil { + query.Set("cursor", *parameters.Cursor) + } + + var response models.AdminListQuestsResponse + if err := s.transport.do(ctx, http.MethodGet, "/quests", query, nil, &response); err != nil { return nil, err } - return response.Quests, nil + return &response, nil } -func (s *QuestsService) ResetPlayerQuest(ctx context.Context, playerID string, questID string) error { - body := models.AdminPlayerQuestRequest{ - QuestID: questID, - } - return s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/quests/reset", nil, body, nil) +type ResetPlayerQuestsParameters struct { + IdempotencyKey string + Items []models.BatchPlayerQuestsItem } -func (s *QuestsService) ForceCompletePlayerQuest(ctx context.Context, playerID string, questID string) error { - body := models.AdminPlayerQuestRequest{ - QuestID: questID, +func (s *QuestsService) Reset(ctx context.Context, parameters ResetPlayerQuestsParameters) error { + body := models.BatchPlayerQuestsRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, } - return s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/quests/force-complete", nil, body, nil) + return s.transport.do(ctx, http.MethodPost, "/players/quests/reset", nil, body, nil) } -func (s *QuestsService) ForceClaimPlayerQuest(ctx context.Context, playerID string, questID string) error { - body := models.AdminPlayerQuestRequest{ - QuestID: questID, - } - return s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/quests/force-claim", nil, body, nil) +type ForceCompletePlayerQuestsParameters struct { + IdempotencyKey string + Items []models.BatchPlayerQuestsItem +} + +func (s *QuestsService) ForceComplete(ctx context.Context, parameters ForceCompletePlayerQuestsParameters) error { + body := models.BatchPlayerQuestsRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, + } + return s.transport.do(ctx, http.MethodPost, "/players/quests/force-complete", nil, body, nil) +} + +type ForceClaimPlayerQuestsParameters struct { + IdempotencyKey string + Items []models.BatchPlayerQuestsItem +} + +func (s *QuestsService) ForceClaim(ctx context.Context, parameters ForceClaimPlayerQuestsParameters) error { + body := models.BatchPlayerQuestsRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, + } + return s.transport.do(ctx, http.MethodPost, "/players/quests/force-claim", nil, body, nil) } diff --git a/storage.go b/storage.go index d5a6cc0..5a0ce91 100644 --- a/storage.go +++ b/storage.go @@ -4,7 +4,7 @@ import ( "context" "net/http" "net/url" - "time" + "strconv" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -13,34 +13,61 @@ type StorageService struct { transport *transport } -func (s *StorageService) Get(ctx context.Context, playerID string, storageType string) (*models.PlayerStorage, error) { - var response models.PlayerStorage - if err := s.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(playerID)+"/storage/"+url.PathEscape(storageType), nil, nil, &response); err != nil { +type ListStorageParameters struct { + Limit int + Cursor string + Search string +} + +func (s *StorageService) List(ctx context.Context, parameters ListStorageParameters) (*models.GetProjectStorageResponse, error) { + query := url.Values{} + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != "" { + query.Set("cursor", parameters.Cursor) + } + if parameters.Search != "" { + query.Set("search", parameters.Search) + } + + var response models.GetProjectStorageResponse + if err := s.transport.do(ctx, http.MethodGet, "/project-storage", query, nil, &response); err != nil { return nil, err } return &response, nil } +func (s *StorageService) Get(ctx context.Context, itemType string) (*models.ProjectStorageItem, error) { + var response models.AdminGetProjectStorageResponse + if err := s.transport.do(ctx, http.MethodGet, "/project-storage/"+url.PathEscape(itemType), nil, nil, &response); err != nil { + return nil, err + } + return &response.Item, nil +} + type UpsertStorageParameters struct { - Data string - ExpiresAt *time.Time + IdempotencyKey string + Items []models.AdminProjectStorageItem } -func (s *StorageService) Upsert(ctx context.Context, playerID string, storageType string, parameters UpsertStorageParameters) (*models.PlayerStorage, error) { - body := models.UpsertPlayerStorageRequest{ - Data: parameters.Data, +func (s *StorageService) Upsert(ctx context.Context, parameters UpsertStorageParameters) error { + body := models.BatchUpsertProjectStorageRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, } - if parameters.ExpiresAt != nil { - body.ExpiresAt = parameters.ExpiresAt.Format(time.RFC3339) - } - - var response models.PlayerStorage - if err := s.transport.do(ctx, http.MethodPut, "/players/"+url.PathEscape(playerID)+"/storage/"+url.PathEscape(storageType), nil, body, &response); err != nil { - return nil, err - } - return &response, nil + return s.transport.do(ctx, http.MethodPut, "/project-storage", nil, body, nil) } -func (s *StorageService) Delete(ctx context.Context, playerID string, storageType string) error { - return s.transport.do(ctx, http.MethodDelete, "/players/"+url.PathEscape(playerID)+"/storage/"+url.PathEscape(storageType), nil, nil, nil) +type DeleteStorageParameters struct { + IdempotencyKey string + Types []string +} + +func (s *StorageService) Delete(ctx context.Context, parameters DeleteStorageParameters) error { + body := models.BatchDeleteProjectStorageRequest{ + IdempotencyKey: parameters.IdempotencyKey, + Types: parameters.Types, + } + return s.transport.do(ctx, http.MethodDelete, "/project-storage", nil, body, nil) } diff --git a/wallet.go b/wallet.go index 3bb837b..0b266ac 100644 --- a/wallet.go +++ b/wallet.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "net/url" + "strconv" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -13,23 +14,43 @@ type WalletService struct { } type AdjustWalletParameters struct { - CurrencyCode string - Amount int64 - Reason string IdempotencyKey string + Items []models.BatchAdjustPlayerWalletsItem } -func (s *WalletService) Adjust(ctx context.Context, playerID string, parameters AdjustWalletParameters) (*models.WalletDetails, error) { - body := models.AdjustPlayerWalletRequest{ - PlayerID: playerID, - CurrencyCode: parameters.CurrencyCode, - Amount: parameters.Amount, - Reason: parameters.Reason, +func (s *WalletService) Adjust(ctx context.Context, parameters AdjustWalletParameters) ([]models.WalletDetails, error) { + body := models.BatchAdjustPlayerWalletsRequest{ IdempotencyKey: parameters.IdempotencyKey, + Items: parameters.Items, } - var response models.WalletDetails - if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/wallet/adjust", nil, body, &response); err != nil { + var response models.BatchAdjustPlayerWalletsResponse + if err := s.transport.do(ctx, http.MethodPost, "/players/wallet/adjust", nil, body, &response); err != nil { + return nil, err + } + return response.Wallets, nil +} + +type WalletHistoryParameters struct { + Currency *string + Limit int + Cursor *string +} + +func (s *WalletService) History(ctx context.Context, playerID string, parameters WalletHistoryParameters) (*models.GetWalletHistoryResponse, error) { + query := url.Values{} + if parameters.Currency != nil { + query.Set("currency", *parameters.Currency) + } + if parameters.Limit > 0 { + query.Set("limit", strconv.Itoa(parameters.Limit)) + } + if parameters.Cursor != nil { + query.Set("cursor", *parameters.Cursor) + } + + var response models.GetWalletHistoryResponse + if err := s.transport.do(ctx, http.MethodGet, "/players/"+url.PathEscape(playerID)+"/wallet/history", query, nil, &response); err != nil { return nil, err } return &response, nil