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
This commit is contained in:
edmand46
2026-08-13 08:47:14 +03:00
parent d602a95baf
commit ae74fb22d3
12 changed files with 221 additions and 22 deletions
+4
View File
@@ -20,6 +20,8 @@ type Client struct {
Leaderboards *LeaderboardsService Leaderboards *LeaderboardsService
Wallet *WalletService Wallet *WalletService
Ugc *UgcService Ugc *UgcService
Inventory *InventoryService
Storage *StorageService
ProjectStorage *ProjectStorageService ProjectStorage *ProjectStorageService
} }
@@ -51,6 +53,8 @@ func New(config Config) (*Client, error) {
Leaderboards: &LeaderboardsService{transport: transport}, Leaderboards: &LeaderboardsService{transport: transport},
Wallet: &WalletService{transport: transport}, Wallet: &WalletService{transport: transport},
Ugc: &UgcService{transport: transport}, Ugc: &UgcService{transport: transport},
Inventory: &InventoryService{transport: transport},
Storage: &StorageService{transport: transport},
ProjectStorage: &ProjectStorageService{transport: transport}, ProjectStorage: &ProjectStorageService{transport: transport},
}, nil }, nil
+35
View File
@@ -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
}
@@ -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"`
}
+1
View File
@@ -5,6 +5,7 @@ package models
type AdjustPlayerWalletRequest struct { type AdjustPlayerWalletRequest struct {
Amount int64 `json:"amount,omitempty"` Amount int64 `json:"amount,omitempty"`
CurrencyCode string `json:"currencyCode,omitempty"` CurrencyCode string `json:"currencyCode,omitempty"`
IdempotencyKey string `json:"idempotencyKey,omitempty"`
PlayerID string `json:"playerId,omitempty"` PlayerID string `json:"playerId,omitempty"`
Reason string `json:"reason,omitempty"` Reason string `json:"reason,omitempty"`
} }
+4
View File
@@ -5,8 +5,12 @@ package models
import "encoding/json" import "encoding/json"
type AdminPlayer struct { type AdminPlayer struct {
BanReason string `json:"banReason,omitempty"`
BannedAt string `json:"bannedAt,omitempty"`
BannedUntil string `json:"bannedUntil,omitempty"`
CreatedAt string `json:"createdAt,omitempty"` CreatedAt string `json:"createdAt,omitempty"`
Data json.RawMessage `json:"data,omitempty"` Data json.RawMessage `json:"data,omitempty"`
DeletedAt string `json:"deletedAt,omitempty"`
ID string `json:"id,omitempty"` ID string `json:"id,omitempty"`
Language string `json:"language,omitempty"` Language string `json:"language,omitempty"`
LastSeen string `json:"lastSeen,omitempty"` LastSeen string `json:"lastSeen,omitempty"`
+9
View File
@@ -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"`
}
+7
View File
@@ -0,0 +1,7 @@
// Code generated by apigen. DO NOT EDIT.
package models
type DeletePlayerRequest struct {
IdempotencyKey string `json:"idempotencyKey,omitempty"`
}
+10
View File
@@ -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"`
}
+8
View File
@@ -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"`
}
+63
View File
@@ -2,9 +2,11 @@ package rudder
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
"time"
"hub.rudder.build/rudder/rudder-go-sdk/models" "hub.rudder.build/rudder/rudder-go-sdk/models"
) )
@@ -16,6 +18,7 @@ type PlayersService struct {
type ListPlayersParameters struct { type ListPlayersParameters struct {
Limit int Limit int
Offset int Offset int
Search string
} }
func (s *PlayersService) List(ctx context.Context, parameters ListPlayersParameters) (*models.ListPlayersResponse, error) { 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 { if parameters.Offset > 0 {
query.Set("offset", strconv.Itoa(parameters.Offset)) query.Set("offset", strconv.Itoa(parameters.Offset))
} }
if parameters.Search != "" {
query.Set("search", parameters.Search)
}
var response models.ListPlayersResponse var response models.ListPlayersResponse
if err := s.transport.do(ctx, http.MethodGet, "/players/list", query, nil, &response); err != nil { 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 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)
}
+46
View File
@@ -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)
}
+2
View File
@@ -16,6 +16,7 @@ type AdjustWalletParameters struct {
CurrencyCode string CurrencyCode string
Amount int64 Amount int64
Reason string Reason string
IdempotencyKey string
} }
func (s *WalletService) Adjust(ctx context.Context, playerID string, parameters AdjustWalletParameters) (*models.WalletDetails, error) { func (s *WalletService) Adjust(ctx context.Context, playerID string, parameters AdjustWalletParameters) (*models.WalletDetails, error) {
@@ -24,6 +25,7 @@ func (s *WalletService) Adjust(ctx context.Context, playerID string, parameters
CurrencyCode: parameters.CurrencyCode, CurrencyCode: parameters.CurrencyCode,
Amount: parameters.Amount, Amount: parameters.Amount,
Reason: parameters.Reason, Reason: parameters.Reason,
IdempotencyKey: parameters.IdempotencyKey,
} }
var response models.WalletDetails var response models.WalletDetails