Skip to content

Commit 1f3fdda

Browse files
authored
Merge pull request #218 from twitchdev/chat-badge-endpoints-update
Chat badge endpoints update
2 parents b53c296 + 73cd305 commit 1f3fdda

File tree

5 files changed

+139
-30
lines changed

5 files changed

+139
-30
lines changed

cmd/api.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ var prettyPrint bool
2121
var autoPaginate int = 0
2222
var port int
2323

24+
var generateCount int
25+
2426
var apiCmd = &cobra.Command{
2527
Use: "api",
2628
Short: "Used to interface with the Twitch API",
@@ -100,7 +102,7 @@ func init() {
100102

101103
startCmd.Flags().IntVarP(&port, "port", "p", 8080, "Defines the port that the mock API will run on.")
102104

103-
generateCmd.Flags().IntVarP(&count, "count", "c", 10, "Defines the number of fake users to generate.")
105+
generateCmd.Flags().IntVarP(&generateCount, "count", "c", 25, "Defines the number of fake users to generate.")
104106
}
105107

106108
func cmdRun(cmd *cobra.Command, args []string) {
@@ -142,5 +144,5 @@ func mockStartRun(cmd *cobra.Command, args []string) {
142144
}
143145

144146
func generateMockRun(cmd *cobra.Command, args []string) {
145-
generate.Generate(count)
147+
generate.Generate(generateCount)
146148
}

internal/mock_api/endpoints/chat/channel_badges.go

+31-12
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"net/http"
99

1010
"github.com/twitchdev/twitch-cli/internal/database"
11-
"github.com/twitchdev/twitch-cli/internal/mock_api/authentication"
1211
"github.com/twitchdev/twitch-cli/internal/mock_api/mock_errors"
1312
"github.com/twitchdev/twitch-cli/internal/models"
1413
"github.com/twitchdev/twitch-cli/internal/util"
@@ -34,7 +33,23 @@ type ChannelBadges struct{}
3433

3534
func (e ChannelBadges) Path() string { return "/chat/badges" }
3635

37-
var defaultChannelBadgeVersions = []string{"0", "12", "2", "3", "6", "9"}
36+
var defaultChannelSubscriberBadgeVersions = [][]string{
37+
{"0", "Subscriber"}, // Tier 1
38+
{"3", "3-Month Subscriber"}, // Tier 1 - 3 months
39+
{"6", "6-Month Subscriber"}, // Tier 1 - 6 months
40+
{"9", "9-Month Subscriber"}, // Tier 1 - 9 months
41+
{"12", "1-Year Subscriber"}, // Tier 1 - 12 months
42+
{"2000", "Subscriber"}, // Tier 2
43+
{"2003", "3-Month Subscriber"}, // Tier 2 - 3 months
44+
{"2006", "6-Month Subscriber"}, // Tier 2 - 6 months
45+
{"2009", "9-Month Subscriber"}, // Tier 2 - 9 months
46+
{"2012", "1-Year Subscriber"}, // Tier 2 - 12 months
47+
{"3000", "Subscriber"}, // Tier 3
48+
{"3003", "3-Month Subscriber"}, // Tier 3 - 3 months
49+
{"3006", "6-Month Subscriber"}, // Tier 3 - 6 months
50+
{"3009", "9-Month Subscriber"}, // Tier 3 - 9 months
51+
{"3012", "1-Year Subscriber"}, // Tier 3 - 12 months
52+
}
3853

3954
func (e ChannelBadges) GetRequiredScopes(method string) []string {
4055
return channelBadgesScopesByMethod[method]
@@ -56,26 +71,30 @@ func (e ChannelBadges) ServeHTTP(w http.ResponseWriter, r *http.Request) {
5671
}
5772
}
5873
func getChannelBadges(w http.ResponseWriter, r *http.Request) {
59-
badges := []BadgesResponse{}
60-
userCtx := r.Context().Value("auth").(authentication.UserAuthentication)
61-
62-
if !userCtx.MatchesBroadcasterIDParam(r) {
63-
mock_errors.WriteUnauthorized(w, "Broadcaster ID does not match token.")
74+
broadcasterID := r.URL.Query().Get("broadcaster_id")
75+
if broadcasterID == "" {
76+
mock_errors.WriteBadRequest(w, "Missing required parameter broadcaster_id")
6477
return
6578
}
6679

80+
badges := []BadgesResponse{}
81+
6782
b := BadgesResponse{
6883
SetID: "subscriber",
6984
Versions: []BadgesVersion{},
7085
}
7186

72-
for _, v := range defaultChannelBadgeVersions {
87+
for _, v := range defaultChannelSubscriberBadgeVersions {
7388
id := util.RandomGUID()
7489
b.Versions = append(b.Versions, BadgesVersion{
75-
ID: v,
76-
ImageURL1X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/1", id),
77-
ImageURL2X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/2", id),
78-
ImageURL4X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/3", id),
90+
ID: v[0],
91+
ImageURL1X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/1", id),
92+
ImageURL2X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/2", id),
93+
ImageURL4X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/3", id),
94+
Title: v[1],
95+
Description: v[1],
96+
ClickAction: ptr("subscribe_to_channel"),
97+
ClickURL: nil,
7998
})
8099
}
81100
badges = append(badges, b)

internal/mock_api/endpoints/chat/chat_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func TestChannelBadges(t *testing.T) {
3535
req.URL.RawQuery = q.Encode()
3636
resp, err := http.DefaultClient.Do(req)
3737
a.Nil(err)
38-
a.Equal(401, resp.StatusCode)
38+
a.Equal(400, resp.StatusCode)
3939

4040
q.Set("broadcaster_id", "1")
4141
req.URL.RawQuery = q.Encode()

internal/mock_api/endpoints/chat/global_badges.go

+91-11
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,87 @@ var globalBadgesScopesByMethod = map[string][]string{
3030

3131
type GlobalBadges struct{}
3232

33-
var defaultGlobalSets = []string{"clip-champ", "extension", "hype-train", "moderator", "premium", "vip"}
33+
var defaultGlobalSets = []BadgesResponse{
34+
{
35+
SetID: "clip-champ",
36+
Versions: []BadgesVersion{
37+
{
38+
ID: "1",
39+
Title: "Power Clipper",
40+
Description: "Power Clipper",
41+
ClickAction: ptr("visit_url"),
42+
ClickURL: ptr("https://help.twitch.tv/customer/portal/articles/2918323-clip-champs-guide"),
43+
},
44+
},
45+
},
46+
{
47+
SetID: "extension",
48+
Versions: []BadgesVersion{
49+
{
50+
ID: "1",
51+
Title: "Extension",
52+
Description: "Extension",
53+
ClickAction: nil,
54+
ClickURL: nil,
55+
},
56+
},
57+
},
58+
{
59+
SetID: "hype-train",
60+
Versions: []BadgesVersion{
61+
{
62+
ID: "1",
63+
Title: "Current Hype Train Conductor",
64+
Description: "Top supporter during the most recent hype train",
65+
ClickAction: ptr("visit_url"),
66+
ClickURL: ptr("https://help.twitch.tv/s/article/hype-train-guide"),
67+
},
68+
{
69+
ID: "2",
70+
Title: "Former Hype Train Conductor",
71+
Description: "Top supporter during prior hype trains",
72+
ClickAction: ptr("visit_url"),
73+
ClickURL: ptr("https://help.twitch.tv/s/article/hype-train-guide"),
74+
},
75+
},
76+
},
77+
{
78+
SetID: "moderator",
79+
Versions: []BadgesVersion{
80+
{
81+
ID: "1",
82+
Title: "Moderator",
83+
Description: "Moderator",
84+
ClickAction: nil,
85+
ClickURL: nil,
86+
},
87+
},
88+
},
89+
{
90+
SetID: "premium",
91+
Versions: []BadgesVersion{
92+
{
93+
ID: "1",
94+
Title: "Prime Gaming",
95+
Description: "Prime Gaming",
96+
ClickAction: ptr("visit_url"),
97+
ClickURL: ptr("https://gaming.amazon.com"),
98+
},
99+
},
100+
},
101+
{
102+
SetID: "vip",
103+
Versions: []BadgesVersion{
104+
{
105+
ID: "1",
106+
Title: "VIP",
107+
Description: "VIP",
108+
ClickAction: ptr("visit_url"),
109+
ClickURL: ptr("https://help.twitch.tv/customer/en/portal/articles/659115-twitch-chat-badges-guide"),
110+
},
111+
},
112+
},
113+
}
34114

35115
func (e GlobalBadges) Path() string { return "/chat/badges/global" }
36116

@@ -58,17 +138,17 @@ func getGlobalBadges(w http.ResponseWriter, r *http.Request) {
58138
badges := []BadgesResponse{}
59139

60140
for _, set := range defaultGlobalSets {
61-
id := util.RandomGUID()
141+
versions := set.Versions
142+
for i := range versions {
143+
uuid := util.RandomGUID()
144+
versions[i].ImageURL1X = fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/1", uuid)
145+
versions[i].ImageURL2X = fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/2", uuid)
146+
versions[i].ImageURL4X = fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/3", uuid)
147+
}
148+
62149
badges = append(badges, BadgesResponse{
63-
SetID: set,
64-
Versions: []BadgesVersion{
65-
{
66-
ID: "1",
67-
ImageURL1X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/1", id),
68-
ImageURL2X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/2", id),
69-
ImageURL4X: fmt.Sprintf("https://static-cdn.jtvnw.net/badges/v1/%v/3", id),
70-
},
71-
},
150+
SetID: set.SetID,
151+
Versions: versions,
72152
})
73153
}
74154

internal/mock_api/endpoints/chat/shared.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ type BadgesResponse struct {
1515
}
1616

1717
type BadgesVersion struct {
18-
ID string `json:"id"`
19-
ImageURL1X string `json:"image_url_1x"`
20-
ImageURL2X string `json:"image_url_2x"`
21-
ImageURL4X string `json:"image_url_4x"`
18+
ID string `json:"id"`
19+
ImageURL1X string `json:"image_url_1x"`
20+
ImageURL2X string `json:"image_url_2x"`
21+
ImageURL4X string `json:"image_url_4x"`
22+
Title string `json:"title"`
23+
Description string `json:"description"`
24+
ClickAction *string `json:"click_action"`
25+
ClickURL *string `json:"click_url"`
2226
}
2327

2428
type EmotesResponse struct {
@@ -39,3 +43,7 @@ type EmotesImages struct {
3943
ImageURL2X string `json:"url_2x"`
4044
ImageURL4X string `json:"url_4x"`
4145
}
46+
47+
func ptr(str string) *string {
48+
return &str
49+
}

0 commit comments

Comments
 (0)