-
Notifications
You must be signed in to change notification settings - Fork 0
/
jp-amiibo.go
211 lines (179 loc) · 5.38 KB
/
jp-amiibo.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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
package amiibo
import (
"crypto/md5"
"encoding/json"
"fmt"
"reflect"
"time"
"golang.org/x/text/language"
)
var _ Amiibo = (JPNAmiibo{})
// JPNAmiibo is a formatted JPNChartItem and JPNLineupItem.
type JPNAmiibo struct {
Chart bool `json:"chart"`
// ID is the fully qualified ID for the Nintendo Amiibo product given by Nintendo Japan.
ID string `json:"id"`
// Large indicates the whether the Nintendo Amiibo product is considered a large scale item.
Large bool `json:"large"`
// Limited indicates the whether the Nintendo Amiibo product is a limited release.
Limited bool `json:"limited"`
// Name is the official name of the Nintendo Amiibo product.
//
// Name contains Japanese Hiragana.
Name string `json:"name"`
// NameAlternative is the alternative name given to the Nintendo Amiibo product.
//
// NameAlternative contains Japanese Hiragana.
NameAlternative string `json:"name_alternative"`
// New indicates the whether the Nintendo Amiibo product is a new release.
New bool `json:"new"`
// Price is the price of the Nintendo Amiibo product in JPY.
//
// Price can be empty.
Price string `json:"price"`
Priority int64 `json:"priority"`
// ReleaseDate is the formatted timestamp of the Nintendo Amiibo products release date.
ReleaseDate time.Time `json:"release_date"`
// ReleaseDateAlternative is the Japanese formatted Nintendo Amiibo product release date.
ReleaseDateAlternative time.Time `json:"release_data_alternative"`
// Series is the defined series of products that the Nintendo Amiibo product is group or affiliated with.
Series string `json:"series"`
// Software is a collection of Nintendo software products the Nintendo Amiibo is compatible with.
Software JPNAmiiboSoftwareMap `json:"software"`
// URL is the direct URL to the Nintendo Amiibo product page.
URL string `json:"url"`
}
// AddJPNChartItem adds a JPNChartItem to the JPNAmiibo.
func (j *JPNAmiibo) AddJPNChartItem(v *JPNChartItem) (err error) {
j.ID = v.Code
if reflect.ValueOf(j.Software).IsZero() {
j.Software = make(JPNAmiiboSoftwareMap)
}
if reflect.ValueOf(j.Name).IsZero() {
j.Name = v.Name
}
if reflect.ValueOf(j.Series).IsZero() {
j.Series = v.Series
}
for _, JP := range v.Softwares {
var v JPNAmiiboSoftware
v, err = NewJPNAmiiboSoftware(&JP)
if err != nil {
continue
}
j.Software[JP.Code] = v
}
if reflect.ValueOf(j.URL).IsZero() {
j.URL = NintendoURLJPN + "/hardware/amiibo/lineup/" + j.ID
}
return
}
// GetAvailable returns the JPNAmiibo availability.
func (j JPNAmiibo) GetAvailable() bool {
return time.Now().After(j.ReleaseDate)
}
// GetID returns the JPNAmiibo ID.
func (j JPNAmiibo) GetID() string {
return j.ID
}
// GetLanguage returns the JPNAmiibo language.
func (j JPNAmiibo) GetLanguage() language.Tag {
return language.Japanese
}
// GetName returns the JPNAmiibo name.
func (j JPNAmiibo) GetName() string {
return j.Name
}
// GetNameAlternative returns the JPNAmiibo name alternative.
func (j JPNAmiibo) GetNameAlternative() string {
return j.NameAlternative
}
// GetMD5 returns the JPNAmiibo MD5.
func (j JPNAmiibo) GetMD5() (MD5 string, b []byte, err error) {
b, err = marshal(&j, json.Marshal)
if err != nil {
return
}
MD5 = fmt.Sprintf("%x", md5.Sum(b))
return
}
// GetPrice returns the JPNAmiibo price.
func (j JPNAmiibo) GetPrice() string {
return j.Price
}
// GetReleaseDate returns the JPNAmiibo release date.
func (j JPNAmiibo) GetReleaseDate() time.Time {
return j.ReleaseDate
}
// GetSeries returns the JPNAmiibo series.
func (j JPNAmiibo) GetSeries() string {
return j.Series
}
// GetURL returns the JPNAmiibo URL
func (j JPNAmiibo) GetURL() string {
return j.URL
}
// AddJPNLineupItem adds a JPNLineupItem to the JPNAmiibo.
func (j *JPNAmiibo) AddJPNLineupItem(v *JPNLineupItem) (err error) {
j.Chart = v.Chart != 0
if reflect.ValueOf(j.ID).IsZero() {
j.ID = v.Code
}
j.Large = v.BigSize != 0
j.Limited = v.Limited != 0
if reflect.ValueOf(j.Name).IsZero() {
j.Name = v.Name
}
j.NameAlternative = v.NameKana
j.New = v.New != 0
j.Price = v.Price
j.Priority = v.Priority
var releaseDate time.Time
var l = len(v.Date)
var date = fmt.Sprintf("%s-%s-%s", v.Date[:4], v.Date[l-4:l-2], v.Date[l-2:])
releaseDate, err = time.Parse("2006-01-02", date)
if err == nil {
j.ReleaseDate = releaseDate
}
var releaseDateAlternative time.Time
releaseDateAlternative, err = time.Parse("2006-01-02", v.DisplayDate)
if err == nil {
j.ReleaseDateAlternative = releaseDateAlternative
}
err = nil
j.Series = v.Series
if reflect.ValueOf(j.URL).IsZero() {
j.URL = NintendoURLJPN + "/hardware/amiibo/lineup/" + j.ID
}
return
}
// NewJPNAmiibo returns a new NewJPNAmiibo.
func NewJPNAmiibo(JPNChartItem *JPNChartItem, JPNLineupItem *JPNLineupItem) (v JPNAmiibo, err error) {
var ok bool
ok = JPNChartItem.GetID() == JPNLineupItem.GetID()
if !ok {
err = fmt.Errorf("JPNChartItem != JPNLineupItem")
}
if err != nil {
return
}
err = (&v).AddJPNChartItem(JPNChartItem)
if err != nil {
return
}
if err != nil {
return
}
err = (&v).AddJPNLineupItem(JPNLineupItem)
return
}
// ReadJPNAmiibo reads a JPNAmiibo from disc.
func ReadJPNAmiibo(dir string, filename string) (v JPNAmiibo, err error) {
err = readJSONFile(dir, filename, &v)
return v, err
}
// WriteJPNAmiibo writes a JPNAmiibo to disc.
func WriteJPNAmiibo(dir string, filename string, v *JPNAmiibo) (fullpath string, err error) {
fullpath, err = writeJSONFile(dir, filename, v)
return
}