Skip to content

Commit 96061ec

Browse files
authored
Merge branch 'main' into channelBan
2 parents 489bdb5 + c152c68 commit 96061ec

14 files changed

+402
-6
lines changed

cmd/events.go

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var (
2626
itemID string
2727
cost int64
2828
count int
29+
streamTitle string
2930
)
3031

3132
var eventCmd = &cobra.Command{
@@ -83,6 +84,7 @@ func init() {
8384
triggerCmd.Flags().StringVarP(&status, "status", "S", "", "Status of the event object, currently applies to channel points redemptions.")
8485
triggerCmd.Flags().StringVarP(&itemID, "item-id", "i", "", "Manually set the ID of the event payload item (for example the reward ID in redemption events).")
8586
triggerCmd.Flags().Int64VarP(&cost, "cost", "C", 0, "Amount of bits or channel points redeemed/used in the event.")
87+
triggerCmd.Flags().StringVarP(&streamTitle, "description", "d", "", "Title the stream should be updated with.")
8688

8789
// retrigger flags
8890
retriggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.")
@@ -125,6 +127,7 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
125127
Status: status,
126128
ItemID: itemID,
127129
Cost: cost,
130+
StreamTitle: streamTitle,
128131
})
129132

130133
if err != nil {

docs/event.md

+7-4
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ Used to either create or send mock events for use with local webhooks testing.
3030
| `update-redemption` | Channel Points EventSub event for a redemption being updated. |
3131
| `raid` | Channel Raid event with a random viewer count. |
3232
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
33-
| `streamup` | Only usable with the `eventsub` transport, a stream online event. |
34-
| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. |
33+
| `stream-change` | Stream Changed event. |
34+
| `streamup` | Stream online event. |
35+
| `streamdown` | Sstream offline event. |
3536
| `add-moderator` | Channel moderator add event. |
3637
| `remove-moderator` | Channel moderator removal event. |
3738
| `ban` | Channel ban event. |
@@ -53,6 +54,7 @@ Used to either create or send mock events for use with local webhooks testing.
5354
| `--status` | `-S` | Status of the event object, currently applies to channel points redemptions. | `-S fulfilled` | N |
5455
| `--item-id` | `-i` | Manually set the ID of the event payload item (for example the reward ID in redemption events). | `-i 032e4a6c-4aef-11eb-a9f5-1f703d1f0b92` | N |
5556
| `--cost` | `-C` | Amount of bits or channel points redeemed/used in the event. | `-C 250` | N |
57+
| `--description` | `-d` | Title the stream should be updated/started with. | `-d Awesome new title!` | N |
5658

5759
**Examples**
5860

@@ -116,8 +118,9 @@ Allows you to test if your webserver responds to subscription requests properly.
116118
| `update-redemption` | Channel Points EventSub event for a redemption being updated. |
117119
| `raid` | Channel Raid event with a random viewer count. |
118120
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
119-
| `streamup` | Only usable with the `eventsub` transport, a stream online event. |
120-
| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. |
121+
| `stream_change` | Stream changed event. |
122+
| `streamup` | Stream online event. |
123+
| `streamdown` | Stream offline event. |
121124
| `add-moderator` | Channel moderator add event. |
122125
| `remove-moderator` | Channel moderator removal event. |
123126
| `ban` | Channel ban event. |

internal/events/event.go

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type MockEventParameters struct {
1818
ItemID string
1919
Cost int64
2020
IsPermanent bool
21+
StreamTitle string
2122
}
2223

2324
type MockEventResponse struct {

internal/events/trigger/trigger_event.go

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type TriggerParameters struct {
2626
Secret string
2727
Verbose bool
2828
Count int
29+
StreamTitle string
2930
}
3031

3132
type TriggerResponse struct {
@@ -60,6 +61,8 @@ func Fire(p TriggerParameters) (string, error) {
6061
IsAnonymous: p.IsAnonymous,
6162
Cost: p.Cost,
6263
Status: p.Status,
64+
ItemID: p.ItemID,
65+
StreamTitle: p.StreamTitle,
6366
}
6467

6568
e, err := types.GetByTriggerAndTransport(p.Event, p.Transport)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package stream_change
4+
5+
import (
6+
"encoding/json"
7+
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: true,
17+
models.TransportEventSub: true,
18+
}
19+
20+
var triggerSupported = []string{"stream-change"}
21+
22+
var triggerMapping = map[string]map[string]string{
23+
models.TransportWebSub: {
24+
"stream_change": "streams",
25+
},
26+
models.TransportEventSub: {
27+
"stream_change": "channel.update",
28+
},
29+
}
30+
31+
type Event struct{}
32+
33+
func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) {
34+
var event []byte
35+
var err error
36+
37+
if params.StreamTitle == "" {
38+
params.StreamTitle = "Example title from the CLI!"
39+
}
40+
41+
switch params.Transport {
42+
case models.TransportEventSub:
43+
body := &models.EventsubResponse{
44+
// make the eventsub response (if supported)
45+
Subscription: models.EventsubSubscription{
46+
ID: params.ID,
47+
Status: "enabled",
48+
Type: "channel.update",
49+
Version: "1",
50+
Condition: models.EventsubCondition{
51+
BroadcasterUserID: params.ToUserID,
52+
},
53+
Transport: models.EventsubTransport{
54+
Method: "webhook",
55+
Callback: "null",
56+
},
57+
CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano),
58+
},
59+
Event: models.ChannelUpdateEventSubEvent{
60+
BroadcasterUserID: params.ToUserID,
61+
BroadcasterUserLogin: params.ToUserName,
62+
BroadcasterUserName: params.ToUserName,
63+
StreamTitle: params.StreamTitle,
64+
StreamLanguage: "en",
65+
StreamCategoryID: "509658",
66+
StreamCategoryName: "Just Chatting",
67+
IsMature: "true",
68+
},
69+
}
70+
event, err = json.Marshal(body)
71+
if err != nil {
72+
return events.MockEventResponse{}, err
73+
}
74+
case models.TransportWebSub:
75+
body := models.StreamChangeWebSubResponse{
76+
Data: []models.StreamChangeWebSubResponseData{
77+
{
78+
WebsubID: params.ID,
79+
BroadcasterUserID: params.ToUserID,
80+
BroadcasterUserLogin: params.ToUserName,
81+
BroadcasterUserName: params.ToUserName,
82+
StreamCategoryID: "509658",
83+
StreamCategoryName: "Just Chatting",
84+
StreamType: "live",
85+
StreamTitle: params.StreamTitle,
86+
StreamViewerCount: 9848,
87+
StreamStartedAt: util.GetTimestamp().Format(time.RFC3339),
88+
StreamLanguage: "en",
89+
StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_twitch_user-{width}x{height}.jpg",
90+
TagIDs: make([]string, 0),
91+
},
92+
},
93+
}
94+
event, err = json.Marshal(body)
95+
if err != nil {
96+
return events.MockEventResponse{}, err
97+
}
98+
default:
99+
return events.MockEventResponse{}, nil
100+
}
101+
102+
return events.MockEventResponse{
103+
ID: params.ID,
104+
JSON: event,
105+
FromUser: params.FromUserID,
106+
ToUser: params.ToUserID,
107+
}, nil
108+
}
109+
110+
func (e Event) ValidTransport(t string) bool {
111+
return transportsSupported[t]
112+
}
113+
114+
func (e Event) ValidTrigger(t string) bool {
115+
for _, ts := range triggerSupported {
116+
if ts == t {
117+
return true
118+
}
119+
}
120+
return false
121+
}
122+
123+
func (e Event) GetTopic(transport string, trigger string) string {
124+
return triggerMapping[transport][trigger]
125+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package stream_change
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/internal/util"
12+
)
13+
14+
var fromUser = "1234"
15+
var toUser = "4567"
16+
17+
func TestEventSub(t *testing.T) {
18+
a := util.SetupTestEnv(t)
19+
20+
params := *&events.MockEventParameters{
21+
FromUserID: fromUser,
22+
ToUserID: toUser,
23+
Transport: models.TransportEventSub,
24+
Trigger: "stream-change",
25+
}
26+
27+
r, err := Event{}.GenerateEvent(params)
28+
a.Nil(err)
29+
30+
var body models.ChannelUpdateEventSubResponse
31+
err = json.Unmarshal(r.JSON, &body)
32+
a.Nil(err, "Error unmarshalling JSON")
33+
34+
// write actual tests here (making sure you set appropriate values and the like) for eventsub
35+
a.Equal(toUser, body.Event.BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Event.BroadcasterUserID)
36+
37+
// test for changing a title
38+
params = events.MockEventParameters{
39+
FromUserID: fromUser,
40+
ToUserID: toUser,
41+
Transport: models.TransportEventSub,
42+
Trigger: "stream_change",
43+
}
44+
45+
r, err = Event{}.GenerateEvent(params)
46+
a.Nil(err)
47+
48+
err = json.Unmarshal(r.JSON, &body)
49+
a.Nil(err)
50+
51+
a.Equal(toUser, body.Event.BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Event.BroadcasterUserID)
52+
a.Equal("Example title from the CLI!", body.Event.StreamTitle, "Expected new stream title, got %v", body.Event.StreamTitle)
53+
}
54+
55+
func TestWebSubStreamChange(t *testing.T) {
56+
a := util.SetupTestEnv(t)
57+
58+
newStreamTitle := "Awesome new title from the CLI!"
59+
60+
params := *&events.MockEventParameters{
61+
FromUserID: fromUser,
62+
ToUserID: toUser,
63+
Transport: models.TransportWebSub,
64+
Trigger: "stream-change",
65+
StreamTitle: newStreamTitle,
66+
}
67+
68+
r, err := Event{}.GenerateEvent(params)
69+
a.Nil(err)
70+
71+
var body models.StreamChangeWebSubResponse
72+
err = json.Unmarshal(r.JSON, &body)
73+
a.Nil(err)
74+
75+
// write tests here for websub
76+
a.Equal(toUser, body.Data[0].BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Data[0].BroadcasterUserID)
77+
a.Equal(newStreamTitle, body.Data[0].StreamTitle, "Expected new stream title, got %v", body.Data[0].StreamTitle)
78+
}
79+
func TestFakeTransport(t *testing.T) {
80+
a := util.SetupTestEnv(t)
81+
82+
params := *&events.MockEventParameters{
83+
FromUserID: fromUser,
84+
ToUserID: toUser,
85+
Transport: "fake_transport",
86+
Trigger: "stream-change",
87+
}
88+
89+
r, err := Event{}.GenerateEvent(params)
90+
a.Nil(err)
91+
a.Empty(r)
92+
}
93+
func TestValidTrigger(t *testing.T) {
94+
a := util.SetupTestEnv(t)
95+
96+
r := Event{}.ValidTrigger("stream-change")
97+
a.Equal(true, r)
98+
99+
r = Event{}.ValidTrigger("not_trigger_keyword")
100+
a.Equal(false, r)
101+
}
102+
103+
func TestValidTransport(t *testing.T) {
104+
a := util.SetupTestEnv(t)
105+
106+
r := Event{}.ValidTransport(models.TransportEventSub)
107+
a.Equal(true, r)
108+
109+
r = Event{}.ValidTransport("noteventsub")
110+
a.Equal(false, r)
111+
}
112+
func TestGetTopic(t *testing.T) {
113+
a := util.SetupTestEnv(t)
114+
115+
r := Event{}.GetTopic(models.TransportEventSub, "stream-change")
116+
a.NotNil(r)
117+
}

internal/events/types/streamdown/streamdown.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
var transportsSupported = map[string]bool{
15-
models.TransportWebSub: false,
15+
models.TransportWebSub: true,
1616
models.TransportEventSub: true,
1717
}
1818

@@ -56,6 +56,15 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
5656
BroadcasterUserName: params.ToUserName,
5757
},
5858
}
59+
event, err = json.Marshal(body)
60+
if err != nil {
61+
return events.MockEventResponse{}, err
62+
}
63+
case models.TransportWebSub:
64+
body := *&models.StreamDownWebSubResponse{
65+
Data: []models.StreamDownWebSubResponseData{
66+
}}
67+
5968
event, err = json.Marshal(body)
6069
if err != nil {
6170
return events.MockEventResponse{}, err

internal/events/types/streamdown/streamdown_test.go

+20
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,26 @@ func TestEventSub(t *testing.T) {
3434
// write actual tests here (making sure you set appropriate values and the like) for eventsub
3535
}
3636

37+
func TestWebSub(t *testing.T) {
38+
a := util.SetupTestEnv(t)
39+
40+
params := *&events.MockEventParameters{
41+
FromUserID: fromUser,
42+
ToUserID: toUser,
43+
Transport: models.TransportWebSub,
44+
Trigger: "streamdown",
45+
}
46+
47+
r, err := Event{}.GenerateEvent(params)
48+
a.Nil(err)
49+
50+
var body models.StreamDownWebSubResponse
51+
err = json.Unmarshal(r.JSON, &body)
52+
a.Nil(err)
53+
54+
// write tests here for websub
55+
}
56+
3757
func TestFakeTransport(t *testing.T) {
3858
a := util.SetupTestEnv(t)
3959

0 commit comments

Comments
 (0)