Economy #

Read more about the Economy system in Hiro here.

Functions #

RewardCreate #

Prepare a new reward configuration to be filled in and used later.

1
rewardConfig := systems.GetEconomySystem().RewardCreate()

RewardConvert #

Transform a wire representation of a reward into an equivalent configuration representation.

1
2
3
4
5
6
7
8
9
contents := &hiro.AvailableRewards{
  Guaranteed:     nil,
  Weighted:       nil,
  MaxRolls:       0,
  TotalWeight:    0,
  MaxRepeatRolls: 0,
}

rewardConfig := systems.GetEconomySystem().RewardConvert(contents)

RewardRoll #

Take a reward configuration and roll an actual reward from it, applying all appropriate rules.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
userId := "userId"
rewardConfig := &hiro.EconomyConfigReward{
  Guaranteed:     nil,
  Weighted:       nil,
  MaxRolls:       0,
  MaxRepeatRolls: 0,
  TotalWeight:    0,
}

reward, err := systems.GetEconomySystem().RewardRoll(ctx, logger, nk, userId, rewardConfig)
if err != nil {
  return err
}

RewardGrant #

Update a user’s economy, inventory, and/or energy models with the contents of a rolled reward.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
userId := "userId"
currencies := map[string]int64{"coins": 10}
items := map[string]int64{"sword": 1}
modifiers := []*hiro.RewardModifier{{}}
walletMetadata := map[string]interface{}{}

updatedWallet, rewardModifiers, timestamp, err := systems.GetEconomySystem().Grant(ctx, logger, nk, userId, currencies, items, modifiers, walletMetadata)
if err != nil {
  return err
}

DonationClaim #

Claim donation rewards for a user for the given donation.

1
2
3
4
5
6
7
userId := "userId"
donationIds := []string{"donationId_001", "donationId_002", "donationId_003"}

donationsList, err := systems.GetEconomySystem().DonationClaim(ctx, logger, nk, userId, donationIds)
if err != nil {
  return err
}

DonationGet #

Get all donations for the given list of users.

1
2
3
4
5
6
userIds := []string{"userId_001", "userId_002", "userId_003"}

donationsList, err := systems.GetEconomySystem().DonationGet(ctx, logger, nk, userIds)
if err != nil {
  return err
}

DonationGive #

Contribute to a particular donation for a user.

1
2
3
4
5
6
7
8
userId := "userId"
donationId := "donationId"
fromUserId := "fromUserId"

updatedWallet, updatedInventory, rewardModifiers, contributorReward, timestamp, err := systems.GetEconomySystem().DonationGive(ctx, logger, nk, userId, donationId, fromUserId)
if err != nil {
  return err
}

DonationRequest #

Create a donation request for a given donation and user.

1
2
3
4
5
6
7
userId := "userId"
donationId := "donationId"

donation, success, err := systems.GetEconomySystem().DonationRequest(ctx, logger, nk, userId, donationId)
if err != nil {
  return err
}

List #

Get the defined store items and placements within the economy system.

1
2
3
4
5
6
userId := "userId"

storeItems, placements, rewardModifiers, timestamp, err := systems.GetEconomySystem().List(ctx, logger, nk, userId)
if err != nil {
  return err
}

Grant #

Add currencies and reward modifiers to a user’s economy.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
userId := "userId"
currencies := map[string]int64{"coins": 10}
items := map[string]int64{"sword": 1}
modifiers := []*hiro.RewardModifier{{}}
walletMetadata := map[string]interface{}{}

updatedWallet, rewardModifiers, timestamp, err := systems.GetEconomySystem().Grant(ctx, logger, nk, userId, currencies, items, modifiers, walletMetadata)
if err != nil {
  return err
}

UnmarshalWallet #

Unmarshal and return an account’s wallet as a map[string]int64.

1
2
3
4
5
6
account := &api.Account{}

wallet, err := systems.GetEconomySystem().UnmarshalWallet(account)
if err != nil {
  return err
}

PurchaseIntent #

Create a purchase intent for a particular store item and user.

1
2
3
4
5
6
7
8
9
userId := "userId"
itemId := "itemId"
store := hiro.EconomyStoreType_ECONOMY_STORE_TYPE_APPLE_APPSTORE
sku := "sku"

err := systems.GetEconomySystem().PurchaseIntent(ctx, logger, nk, userId, itemId, store, sku)
if err != nil {
  return err
}

PurchaseItem #

Validate a purchase and give the user the appropriate rewards.

1
2
3
4
5
6
7
8
9
userId := "userId"
itemId := "itemId"
store := hiro.EconomyStoreType_ECONOMY_STORE_TYPE_APPLE_APPSTORE
receipt := "<receipt>"

updatedWallet, updatedInventory, reward, isSandboxPurchase, err := systems.GetEconomySystem().PurchaseItem(ctx, logger, db, nk, userId, itemId, store, receipt)
if err != nil {
  return err
}

PurchaseRestore #

Process a restore attempt for the given user, based on a set of restore receipts.

1
2
3
4
5
6
7
8
userId := "userId"
store := hiro.EconomyStoreType_ECONOMY_STORE_TYPE_APPLE_APPSTORE
receipts := []string{"<receipt_001>", "<receipt_002>"}

err := systems.GetEconomySystem().PurchaseRestore(ctx, logger, nk, userId, store, receipts)
if err != nil {
  return err
}

PlacementStatus #

Get the status of a specified placement.

1
2
3
4
5
6
7
8
9
userId := "userId"
rewardId := "rewardId"
placementId := "placementId"
retryCount := 3

placementStatus, err := systems.GetEconomySystem().PlacementStatus(ctx, logger, nk, userId, rewardId, placementId, retryCount)
if err != nil {
  return err
}

PlacementStart #

Indicate that a user has begun viewing an ad placement.

1
2
3
4
5
6
7
8
userId := "userId"
placementId := "placementId"
metadata := map[string]string{}

placementStatus, err := systems.GetEconomySystem().PlacementStart(ctx, logger, nk, userId, placementId, metadata)
if err != nil {
  return err
}

PlacementSuccess #

Indicate that a user has successfully viewed an ad placement and provide the appropriate reward.

1
2
3
4
5
6
7
8
userId := "userId"
placementId := "placementId"
rewardId := "rewardId"

reward, placementMetadata, err := systems.GetEconomySystem().PlacementSuccess(ctx, logger, nk, userId, rewardId, placementId)
if err != nil {
  return err
}

PlacementFail #

Indicate that a user has failed to successfully view an ad placement.

1
2
3
4
5
6
7
8
userId := "userId"
placementId := "placementId"
rewardId := "rewardId"

placementMetadata, err := systems.GetEconomySystem().PlacementFail(ctx, logger, nk, userId, rewardId, placementId)
if err != nil {
  return err
}

Hooks #

SetOnDonationClaimReward #

Set a custom reward function which will run after a donation’s reward is rolled.

1
2
3
4
5
6
systems.GetEconomySystem().SetOnDonationClaimReward(DonationClaimReward)

func DonationClaimReward(ctx context.Context, logger runtime.Logger, nk runtime.NakamaModule, userID, sourceID string, source *hiro.EconomyConfigDonation, rewardConfig *hiro.EconomyConfigReward, reward *hiro.Reward) (*hiro.Reward, error) {
	// Modify reward or take additional actions.
	return reward, nil
}

SetOnDonationContributorReward #

Set a custom reward function which will run after a donation’s sender reward is rolled.

1
2
3
4
5
6
systems.GetEconomySystem().SetOnDonationContributorReward(OnDonationContributorReward)

func OnDonationContributorReward(ctx context.Context, logger runtime.Logger, nk runtime.NakamaModule, userID, sourceID string, source *hiro.EconomyConfigDonation, rewardConfig *hiro.EconomyConfigReward, reward *hiro.Reward) (*hiro.Reward, error) {
	// Modify reward or take additional actions.
	return reward, nil
}

SetOnPlacementReward #

Set a custom reward function which will run after a placement’s reward is rolled.

1
2
3
4
5
6
systems.GetEconomySystem().SetOnPlacementReward(OnPlacementReward)

func OnPlacementReward(ctx context.Context, logger runtime.Logger, nk runtime.NakamaModule, userID, sourceID string, source *hiro.EconomyPlacementInfo, rewardConfig *hiro.EconomyConfigReward, reward *hiro.Reward) (*hiro.Reward, error) {
	// Modify reward or take additional actions.
	return reward, nil
}

SetOnStoreItemReward #

Set a custom reward function which will run after store item’s reward is rolled.

1
2
3
4
5
6
systems.GetEconomySystem().SetOnStoreItemReward(OnStoreItemReward)

func OnStoreItemReward(ctx context.Context, logger runtime.Logger, nk runtime.NakamaModule, userID, sourceID string, source *hiro.EconomyConfigStoreItem, rewardConfig *hiro.EconomyConfigReward, reward *hiro.Reward) (*hiro.Reward, error) {
	// Modify reward or take additional actions.
	return reward, nil
}