From ae74fb22d3838d7199884f2f10af645ce228a354 Mon Sep 17 00:00:00 2001 From: edmand46 Date: Thu, 13 Aug 2026 08:47:14 +0300 Subject: [PATCH] add player data operations: update, ban/unban, delete, inventory adjust, storage Players.Update/Ban/Unban/Delete + List search; new InventoryService.Adjust and StorageService.Get/Upsert/Delete; IdempotencyKey on wallet adjust; models regenerated via apigen --- client.go | 4 ++ inventory.go | 35 ++++++++++++ models/adjustplayerinventoryitemrequest.go | 10 ++++ models/adjustplayerwalletrequest.go | 9 ++-- models/adminplayer.go | 26 +++++---- models/banplayerrequest.go | 9 ++++ models/deleteplayerrequest.go | 7 +++ models/updateplayerrequest.go | 10 ++++ models/upsertplayerstoragerequest.go | 8 +++ players.go | 63 ++++++++++++++++++++++ storage.go | 46 ++++++++++++++++ wallet.go | 16 +++--- 12 files changed, 221 insertions(+), 22 deletions(-) create mode 100644 inventory.go create mode 100644 models/adjustplayerinventoryitemrequest.go create mode 100644 models/banplayerrequest.go create mode 100644 models/deleteplayerrequest.go create mode 100644 models/updateplayerrequest.go create mode 100644 models/upsertplayerstoragerequest.go create mode 100644 storage.go diff --git a/client.go b/client.go index 3dd4108..5e1cc56 100644 --- a/client.go +++ b/client.go @@ -20,6 +20,8 @@ type Client struct { Leaderboards *LeaderboardsService Wallet *WalletService Ugc *UgcService + Inventory *InventoryService + Storage *StorageService ProjectStorage *ProjectStorageService } @@ -51,6 +53,8 @@ func New(config Config) (*Client, error) { Leaderboards: &LeaderboardsService{transport: transport}, Wallet: &WalletService{transport: transport}, Ugc: &UgcService{transport: transport}, + Inventory: &InventoryService{transport: transport}, + Storage: &StorageService{transport: transport}, ProjectStorage: &ProjectStorageService{transport: transport}, }, nil diff --git a/inventory.go b/inventory.go new file mode 100644 index 0000000..2846a1d --- /dev/null +++ b/inventory.go @@ -0,0 +1,35 @@ +package rudder + +import ( + "context" + "net/http" + "net/url" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +type InventoryService struct { + transport *transport +} + +type AdjustInventoryParameters struct { + Slug string + Amount int64 + Reason string + IdempotencyKey string +} + +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, + IdempotencyKey: parameters.IdempotencyKey, + } + + var response models.InventoryItem + if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/inventory/adjust", nil, body, &response); err != nil { + return nil, err + } + return &response, nil +} diff --git a/models/adjustplayerinventoryitemrequest.go b/models/adjustplayerinventoryitemrequest.go new file mode 100644 index 0000000..ba7ed4b --- /dev/null +++ b/models/adjustplayerinventoryitemrequest.go @@ -0,0 +1,10 @@ +// 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 index 58cf3a9..b891a34 100644 --- a/models/adjustplayerwalletrequest.go +++ b/models/adjustplayerwalletrequest.go @@ -3,8 +3,9 @@ package models type AdjustPlayerWalletRequest struct { - Amount int64 `json:"amount,omitempty"` - CurrencyCode string `json:"currencyCode,omitempty"` - PlayerID string `json:"playerId,omitempty"` - Reason string `json:"reason,omitempty"` + 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/adminplayer.go b/models/adminplayer.go index ab8ea22..68a1bfa 100644 --- a/models/adminplayer.go +++ b/models/adminplayer.go @@ -5,15 +5,19 @@ package models import "encoding/json" type AdminPlayer struct { - CreatedAt string `json:"createdAt,omitempty"` - Data json.RawMessage `json:"data,omitempty"` - ID string `json:"id,omitempty"` - Language string `json:"language,omitempty"` - LastSeen string `json:"lastSeen,omitempty"` - Nickname string `json:"nickname,omitempty"` - PayerFlag bool `json:"payerFlag,omitempty"` - ProjectID string `json:"projectId,omitempty"` - Region string `json:"region,omitempty"` - StableID string `json:"stableId,omitempty"` - UpdatedAt string `json:"updatedAt,omitempty"` + BanReason string `json:"banReason,omitempty"` + BannedAt string `json:"bannedAt,omitempty"` + BannedUntil string `json:"bannedUntil,omitempty"` + CreatedAt string `json:"createdAt,omitempty"` + Data json.RawMessage `json:"data,omitempty"` + DeletedAt string `json:"deletedAt,omitempty"` + ID string `json:"id,omitempty"` + Language string `json:"language,omitempty"` + LastSeen string `json:"lastSeen,omitempty"` + Nickname string `json:"nickname,omitempty"` + PayerFlag bool `json:"payerFlag,omitempty"` + ProjectID string `json:"projectId,omitempty"` + Region string `json:"region,omitempty"` + StableID string `json:"stableId,omitempty"` + UpdatedAt string `json:"updatedAt,omitempty"` } diff --git a/models/banplayerrequest.go b/models/banplayerrequest.go new file mode 100644 index 0000000..e0ef12c --- /dev/null +++ b/models/banplayerrequest.go @@ -0,0 +1,9 @@ +// 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/deleteplayerrequest.go b/models/deleteplayerrequest.go new file mode 100644 index 0000000..9835847 --- /dev/null +++ b/models/deleteplayerrequest.go @@ -0,0 +1,7 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type DeletePlayerRequest struct { + IdempotencyKey string `json:"idempotencyKey,omitempty"` +} diff --git a/models/updateplayerrequest.go b/models/updateplayerrequest.go new file mode 100644 index 0000000..46c94f2 --- /dev/null +++ b/models/updateplayerrequest.go @@ -0,0 +1,10 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +import "encoding/json" + +type UpdatePlayerRequest struct { + Data json.RawMessage `json:"data,omitempty"` + Nickname string `json:"nickname,omitempty"` +} diff --git a/models/upsertplayerstoragerequest.go b/models/upsertplayerstoragerequest.go new file mode 100644 index 0000000..fcc71d3 --- /dev/null +++ b/models/upsertplayerstoragerequest.go @@ -0,0 +1,8 @@ +// Code generated by apigen. DO NOT EDIT. + +package models + +type UpsertPlayerStorageRequest struct { + Data string `json:"data,omitempty"` + ExpiresAt string `json:"expiresAt,omitempty"` +} diff --git a/players.go b/players.go index 1d6c73e..f544a16 100644 --- a/players.go +++ b/players.go @@ -2,9 +2,11 @@ package rudder import ( "context" + "encoding/json" "net/http" "net/url" "strconv" + "time" "hub.rudder.build/rudder/rudder-go-sdk/models" ) @@ -16,6 +18,7 @@ type PlayersService struct { type ListPlayersParameters struct { Limit int Offset int + Search string } func (s *PlayersService) List(ctx context.Context, parameters ListPlayersParameters) (*models.ListPlayersResponse, error) { @@ -26,6 +29,9 @@ func (s *PlayersService) List(ctx context.Context, parameters ListPlayersParamet if parameters.Offset > 0 { query.Set("offset", strconv.Itoa(parameters.Offset)) } + if parameters.Search != "" { + query.Set("search", parameters.Search) + } var response models.ListPlayersResponse if err := s.transport.do(ctx, http.MethodGet, "/players/list", query, nil, &response); err != nil { @@ -41,3 +47,60 @@ 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 + IdempotencyKey string +} + +func (s *PlayersService) Ban(ctx context.Context, playerID string, parameters BanPlayerParameters) (*models.AdminPlayer, error) { + body := models.BanPlayerRequest{ + Reason: parameters.Reason, + IdempotencyKey: parameters.IdempotencyKey, + } + if parameters.Until != nil { + body.BannedUntil = parameters.Until.Format(time.RFC3339) + } + + var response models.AdminPlayer + if err := s.transport.do(ctx, http.MethodPost, "/players/"+url.PathEscape(playerID)+"/ban", nil, body, &response); err != nil { + return nil, err + } + return &response, 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 { + return nil, err + } + return &response, 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) +} diff --git a/storage.go b/storage.go new file mode 100644 index 0000000..d5a6cc0 --- /dev/null +++ b/storage.go @@ -0,0 +1,46 @@ +package rudder + +import ( + "context" + "net/http" + "net/url" + "time" + + "hub.rudder.build/rudder/rudder-go-sdk/models" +) + +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 { + return nil, err + } + return &response, nil +} + +type UpsertStorageParameters struct { + Data string + ExpiresAt *time.Time +} + +func (s *StorageService) Upsert(ctx context.Context, playerID string, storageType string, parameters UpsertStorageParameters) (*models.PlayerStorage, error) { + body := models.UpsertPlayerStorageRequest{ + Data: parameters.Data, + } + 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 +} + +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) +} diff --git a/wallet.go b/wallet.go index be911e2..3bb837b 100644 --- a/wallet.go +++ b/wallet.go @@ -13,17 +13,19 @@ type WalletService struct { } type AdjustWalletParameters struct { - CurrencyCode string - Amount int64 - Reason string + CurrencyCode string + Amount int64 + Reason string + IdempotencyKey string } 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, + PlayerID: playerID, + CurrencyCode: parameters.CurrencyCode, + Amount: parameters.Amount, + Reason: parameters.Reason, + IdempotencyKey: parameters.IdempotencyKey, } var response models.WalletDetails