Skip to content

Commit 4d7f059

Browse files
authored
Merge pull request #78 from twitchdev/feature/eventsub-catchup-july-2021
updating eventsub to match production
2 parents 3388f14 + fa22b7f commit 4d7f059

28 files changed

+1365
-123
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ twitch-cli
1717
*.html
1818

1919
# Editor configs
20-
.vsvode/
20+
.vscode/
2121
.idea/
2222

2323
# junk files

.vscode/settings.json

-5
This file was deleted.

cmd/events.go

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var (
2828
cost int64
2929
count int
3030
description string
31+
gameID string
3132
)
3233

3334
var eventCmd = &cobra.Command{
@@ -90,6 +91,7 @@ func init() {
9091
triggerCmd.Flags().StringVarP(&itemName, "item-name", "n", "", "Manually set the name of the event payload item (for example the reward ID in redemption events). For stream events, this is the game title.")
9192
triggerCmd.Flags().Int64VarP(&cost, "cost", "C", 0, "Amount of bits or channel points redeemed/used in the event.")
9293
triggerCmd.Flags().StringVarP(&description, "description", "d", "", "Title the stream should be updated with.")
94+
triggerCmd.Flags().StringVarP(&gameID, "game-id", "G", "", "Sets the game/category ID for applicable events.")
9395

9496
// retrigger flags
9597
retriggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.")
@@ -134,6 +136,7 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
134136
Cost: cost,
135137
Description: description,
136138
ItemName: itemName,
139+
GameID: gameID,
137140
})
138141

139142
if err != nil {

docs/event.md

+89-63
Large diffs are not rendered by default.

internal/events/event.go

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type MockEventParameters struct {
2020
Cost int64
2121
IsPermanent bool
2222
Description string
23+
GameID string
2324
}
2425

2526
type MockEventResponse struct {

internal/events/trigger/trigger_event.go

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type TriggerParameters struct {
3030
Count int
3131
Description string
3232
ItemName string
33+
GameID string
3334
}
3435

3536
type TriggerResponse struct {
@@ -53,6 +54,9 @@ func Fire(p TriggerParameters) (string, error) {
5354
p.FromUser = util.RandomUserID()
5455
}
5556

57+
if p.GameID == "" {
58+
p.GameID = fmt.Sprint(util.RandomInt(10 * 1000))
59+
}
5660
eventParamaters := events.MockEventParameters{
5761
ID: util.RandomGUID(),
5862
Trigger: p.Event,
@@ -67,6 +71,7 @@ func Fire(p TriggerParameters) (string, error) {
6771
ItemID: p.ItemID,
6872
Description: p.Description,
6973
ItemName: p.ItemName,
74+
GameID: p.GameID,
7075
}
7176

7277
e, err := types.GetByTriggerAndTransport(p.Event, p.Transport)

internal/events/types/authorization_revoke/authorization_revoke.go renamed to internal/events/types/authorization/authorization.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
package authorization_revoke
3+
package authorization
44

55
import (
66
"encoding/json"
7-
"errors"
87
"time"
98

109
"github.com/spf13/viper"
@@ -18,11 +17,12 @@ var transportsSupported = map[string]bool{
1817
models.TransportEventSub: true,
1918
}
2019

21-
var triggerSupported = []string{"revoke"}
20+
var triggerSupported = []string{"revoke", "grant"}
2221

2322
var triggerMapping = map[string]map[string]string{
2423
models.TransportEventSub: {
2524
"revoke": "user.authorization.revoke",
25+
"grant": "user.authorization.grant",
2626
},
2727
}
2828

@@ -66,8 +66,6 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
6666
if err != nil {
6767
return events.MockEventResponse{}, err
6868
}
69-
case models.TransportWebSub:
70-
return events.MockEventResponse{}, errors.New("Websub is unsupported for authorization revoke events")
7169
default:
7270
return events.MockEventResponse{}, nil
7371
}

internal/events/types/authorization_revoke/authorization_revoke_test.go renamed to internal/events/types/authorization/authorization_test.go

+2-17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
package authorization_revoke
3+
package authorization
44

55
import (
66
"encoding/json"
@@ -29,29 +29,14 @@ func TestEventSub(t *testing.T) {
2929
r, err := Event{}.GenerateEvent(params)
3030
a.Nil(err)
3131

32-
var body models.AuthorizationRevokeEventSubResponse // replace with actual value
32+
var body models.AuthorizationRevokeEventSubResponse
3333
err = json.Unmarshal(r.JSON, &body)
3434
a.Nil(err)
3535

3636
a.NotEmpty(body.Event.ClientID)
3737
a.Equal(body.Event.ClientID, body.Subscription.Condition.ClientID)
3838
a.Equal("1234", body.Event.ClientID)
3939
}
40-
func TestWebSub(t *testing.T) {
41-
a := test_setup.SetupTestEnv(t)
42-
43-
params := *&events.MockEventParameters{
44-
FromUserID: fromUser,
45-
ToUserID: toUser,
46-
Transport: models.TransportWebSub,
47-
Trigger: "revoke",
48-
}
49-
50-
_, err := Event{}.GenerateEvent(params)
51-
a.NotNil(err)
52-
53-
// write tests here for websub
54-
}
5540
func TestFakeTransport(t *testing.T) {
5641
a := test_setup.SetupTestEnv(t)
5742

internal/events/types/drop/drop.go

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package drop
4+
5+
import (
6+
"encoding/json"
7+
"fmt"
8+
"time"
9+
10+
"github.com/twitchdev/twitch-cli/internal/events"
11+
"github.com/twitchdev/twitch-cli/internal/models"
12+
"github.com/twitchdev/twitch-cli/internal/util"
13+
)
14+
15+
var transportsSupported = map[string]bool{
16+
models.TransportWebSub: false,
17+
models.TransportEventSub: true,
18+
}
19+
20+
var triggerSupported = []string{"drop"}
21+
22+
var triggerMapping = map[string]map[string]string{
23+
models.TransportEventSub: {
24+
"drop": "drop.entitlement.grant",
25+
},
26+
}
27+
28+
type Event struct{}
29+
30+
func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) {
31+
var event []byte
32+
var err error
33+
34+
if params.ItemID == "" {
35+
params.ItemID = util.RandomGUID()
36+
}
37+
38+
if params.Description == "" {
39+
params.Description = fmt.Sprintf("%v", util.RandomInt(1000))
40+
}
41+
switch params.Transport {
42+
case models.TransportEventSub:
43+
body := &models.DropsEntitlementEventSubResponse{
44+
Subscription: models.EventsubSubscription{
45+
ID: params.ID,
46+
Status: "enabled",
47+
Type: triggerMapping[params.Transport][params.Trigger],
48+
Version: "1",
49+
Condition: models.EventsubCondition{
50+
OrganizationID: params.FromUserID,
51+
},
52+
Transport: models.EventsubTransport{
53+
Method: "webhook",
54+
Callback: "null",
55+
},
56+
Cost: 0,
57+
CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano),
58+
},
59+
Events: []models.DropsEntitlementEventSubEvent{
60+
{
61+
ID: util.RandomGUID(),
62+
Data: models.DropsEntitlementEventSubEventData{
63+
OrganizationID: params.FromUserID,
64+
CategoryID: params.GameID,
65+
CategoryName: "",
66+
CampaignID: util.RandomGUID(),
67+
EntitlementID: util.RandomGUID(),
68+
BenefitID: params.ItemID,
69+
UserID: params.ToUserID,
70+
UserName: params.ToUserName,
71+
UserLogin: params.ToUserName,
72+
CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano),
73+
},
74+
},
75+
},
76+
}
77+
event, err = json.Marshal(body)
78+
if err != nil {
79+
return events.MockEventResponse{}, err
80+
}
81+
default:
82+
return events.MockEventResponse{}, nil
83+
}
84+
85+
return events.MockEventResponse{
86+
ID: params.ID,
87+
JSON: event,
88+
FromUser: params.FromUserID,
89+
ToUser: params.ToUserID,
90+
}, nil
91+
}
92+
93+
func (e Event) ValidTransport(t string) bool {
94+
return transportsSupported[t]
95+
}
96+
97+
func (e Event) ValidTrigger(t string) bool {
98+
for _, ts := range triggerSupported {
99+
if ts == t {
100+
return true
101+
}
102+
}
103+
return false
104+
}
105+
func (e Event) GetTopic(transport string, trigger string) string {
106+
return triggerMapping[transport][trigger]
107+
}
+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package drop
4+
5+
import (
6+
"encoding/json"
7+
"testing"
8+
9+
"github.com/twitchdev/twitch-cli/internal/events"
10+
"github.com/twitchdev/twitch-cli/internal/models"
11+
"github.com/twitchdev/twitch-cli/test_setup"
12+
)
13+
14+
var fromUser = "1234"
15+
var toUser = "4567"
16+
17+
func TestEventSub(t *testing.T) {
18+
a := test_setup.SetupTestEnv(t)
19+
20+
params := *&events.MockEventParameters{
21+
FromUserID: fromUser,
22+
ToUserID: toUser,
23+
Transport: models.TransportEventSub,
24+
Trigger: "drop",
25+
}
26+
27+
r, err := Event{}.GenerateEvent(params)
28+
a.Nil(err)
29+
30+
var body models.DropsEntitlementEventSubResponse
31+
err = json.Unmarshal(r.JSON, &body)
32+
a.Nil(err)
33+
34+
a.Len(body.Events, 1)
35+
}
36+
37+
func TestFakeTransport(t *testing.T) {
38+
a := test_setup.SetupTestEnv(t)
39+
40+
params := *&events.MockEventParameters{
41+
FromUserID: fromUser,
42+
ToUserID: toUser,
43+
Transport: "fake_transport",
44+
Trigger: "drop",
45+
}
46+
47+
r, err := Event{}.GenerateEvent(params)
48+
a.Nil(err)
49+
a.Empty(r)
50+
}
51+
func TestValidTrigger(t *testing.T) {
52+
a := test_setup.SetupTestEnv(t)
53+
54+
r := Event{}.ValidTrigger("drop")
55+
a.Equal(true, r)
56+
57+
r = Event{}.ValidTrigger("notdrop")
58+
a.Equal(false, r)
59+
}
60+
61+
func TestValidTransport(t *testing.T) {
62+
a := test_setup.SetupTestEnv(t)
63+
64+
r := Event{}.ValidTransport(models.TransportEventSub)
65+
a.Equal(true, r)
66+
67+
r = Event{}.ValidTransport("noteventsub")
68+
a.Equal(false, r)
69+
}
70+
func TestGetTopic(t *testing.T) {
71+
a := test_setup.SetupTestEnv(t)
72+
73+
r := Event{}.GetTopic(models.TransportEventSub, "drop")
74+
a.NotNil(r)
75+
}

0 commit comments

Comments
 (0)