# Achievements

**URL:** https://heroiclabs.com/docs/hiro/server-framework/achievements/
**Keywords:** achievements, hiro
**Categories:** hiro, achievements, server-framework

---


# Achievements

Read more about the Achievements system in Hiro [here](../../concepts/achievements/).

## Functions

### ClaimAchievements

Claim one or more achievements by their IDs whose progress has been completed.

```go
userId := "userId"
achievementIds := []string{"<achievementId1>", "<achievementId2>"}
claimTotal := true

achievements, repeatAchievements, err := systems.GetAchievementsSystem().ClaimAchievements(ctx, logger, nk, userId, achievementIds, claimTotal)
if err != nil {
  return err
}
```

### DeleteAchievements

Delete the achievement storage for one or more achievements by their IDs. Use this to reset a user's achievement progress.

```go
userId := "userId"
achievementIds := []string{"<achievementId1>", "<achievementId2>"}

err := systems.GetAchievementsSystem().DeleteAchievements(ctx, logger, nk, userId, achievementIds)
if err != nil {
  return err
}
```

### GetAchievements

Get all achievements available to the user, and their progress on them.

```go
userId := "userId"

achievements, repeatAchievements, err := systems.GetAchievementsSystem().GetAchievements(ctx, logger, nk, userId)
if err != nil {
  return err
}
```

### UpdateAchievements

Update progress on one or more achievements by their IDs.

```go
userId := "userId"
achievementUpdates := map[string]int64{"<achievementId1>": 5, "<achievementId2>": 10}

achievements, repeatAchievements, err := systems.GetAchievementsSystem().UpdateAchievements(ctx, logger, nk, userId, achievementUpdates)
if err != nil {
  return err
}
```

## Hooks

### SetOnAchievementReward

Set a custom reward function which will run after an achievement's reward is rolled.

```go
systems.GetAchievementsSystem().SetOnAchievementReward(OnAchievementReward)

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

### SetOnSubAchievementReward

Set a custom reward function which will run after a sub-achievement's reward is rolled.

```go
systems.GetAchievementsSystem().SetOnSubAchievementReward(OnSubAchievementReward)

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

### SetOnAchievementTotalReward

Set a custom reward function which will run after an achievement's total reward is rolled.

```go
systems.GetAchievementsSystem().SetOnAchievementTotalReward(OnAchievementTotalReward)

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