forked from Henry-Sarabia/igdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
achievement.go
158 lines (130 loc) · 4.74 KB
/
achievement.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package igdb
import (
"strconv"
"github.com/Henry-Sarabia/sliceconv"
"github.com/pkg/errors"
)
//go:generate gomodifytags -file $GOFILE -struct Achievement -add-tags json -w
// Achievement data for specific games for specific platforms
// (currently limited to achievements from Steam, Playstation, and XBox).
// For more information visit: https://api-docs.igdb.com/#achievement
type Achievement struct {
ID int `json:"id"`
AchievementIcon int `json:"achievement_icon"`
Category AchievementCategory `json:"category"`
CreatedAt int `json:"created_at"`
Description string `json:"description"`
ExternalID string `json:"external_id"`
Game int `json:"game"`
Language AchievementLanguage `json:"language"`
Name string `json:"name"`
OwnersPercentage float64 `json:"owners_percentage"`
Rank AchievementRank `json:"rank"`
Slug string `json:"slug"`
Tags []Tag `json:"tags"`
UpdatedAt int `json:"updated_at"`
}
// AchievementRank specifies an achievement's rank ranging
// from bronze to platinum.
type AchievementRank int
//go:generate stringer -type=AchievementRank,AchievementCategory,AchievementLanguage
// Expected AchievementRank enums from the IGDB.
const (
RankBronze AchievementRank = iota + 1
RankSilver
RankGold
RankPlatinum
)
// AchievementCategory specifies an achievement's native platform.
type AchievementCategory int
// Expected AchievementCategory enums from the IGDB.
const (
AchievementPlaystation AchievementCategory = iota + 1
AchievementXbox
AchievementSteam
)
// AchievementLanguage specifies an achievement's language.
type AchievementLanguage int
// Expected AchievementLanguage enums from the IGDB.
const (
LanguageEurope AchievementLanguage = iota + 1
LanguageNorthAmerica
LanguageAustralia
LanguageNewZealand
LanguageJapan
LanguageChina
LanguageAsia
LanguageWorldwide
LanguageHongKong
LanguageSouthKorea
)
// AchievementService handles all the API calls for the IGDB
// Achievement endpoint.
// This endpoint is only available for the IGDB Pro tier or above.
type AchievementService service
// Get returns a single Achievement identified by the provided IGDB ID. Provide
// the SetFields functional option if you need to specify which fields to
// retrieve. If the ID does not match any Achievements, an error is returned.
func (as *AchievementService) Get(id int, opts ...Option) (*Achievement, error) {
if id < 0 {
return nil, ErrNegativeID
}
var ach []*Achievement
opts = append(opts, SetFilter("id", OpEquals, strconv.Itoa(id)))
err := as.client.get(as.end, &ach, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Achievement with ID %v", id)
}
return ach[0], nil
}
// List returns a list of Achievements identified by the provided list of IGDB IDs.
// Provide functional options to sort, filter, and paginate the results.
// Any ID that does not match a Achievement is ignored. If none of the IDs
// match a Achievement, an error is returned.
func (as *AchievementService) List(ids []int, opts ...Option) ([]*Achievement, error) {
for len(ids) < 1 {
return nil, ErrEmptyIDs
}
for _, id := range ids {
if id < 0 {
return nil, ErrNegativeID
}
}
var ach []*Achievement
opts = append(opts, SetFilter("id", OpContainsAtLeast, sliceconv.Itoa(ids)...))
err := as.client.get(as.end, &ach, opts...)
if err != nil {
return nil, errors.Wrapf(err, "cannot get Achievements with IDs %v", ids)
}
return ach, nil
}
// Index returns an index of Achievements based solely on the provided functional
// options used to sort, filter, and paginate the results. If no Achievements can
// be found using the provided options, an error is returned.
func (as *AchievementService) Index(opts ...Option) ([]*Achievement, error) {
var ach []*Achievement
err := as.client.get(as.end, &ach, opts...)
if err != nil {
return nil, errors.Wrap(err, "cannot get index of Achievements")
}
return ach, nil
}
// Count returns the number of Achievements available in the IGDB.
// Provide the SetFilter functional option if you need to filter
// which Achievements to count.
func (as *AchievementService) Count(opts ...Option) (int, error) {
ct, err := as.client.getCount(as.end, opts...)
if err != nil {
return 0, errors.Wrap(err, "cannot count Achievements")
}
return ct, nil
}
// Fields returns the up-to-date list of fields in an
// IGDB Achievement object.
func (as *AchievementService) Fields() ([]string, error) {
f, err := as.client.getFields(as.end)
if err != nil {
return nil, errors.Wrap(err, "cannot get Achievement fields")
}
return f, nil
}