From d883311c04317b255528b32b04218d75af9932ee Mon Sep 17 00:00:00 2001 From: Lucas Leadbetter Date: Fri, 5 Mar 2021 16:39:03 -0800 Subject: [PATCH 01/12] Adding ID to channel points event per #37 --- internal/events/trigger/trigger_event.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/events/trigger/trigger_event.go b/internal/events/trigger/trigger_event.go index 58ce2473..1622e541 100644 --- a/internal/events/trigger/trigger_event.go +++ b/internal/events/trigger/trigger_event.go @@ -60,6 +60,7 @@ func Fire(p TriggerParameters) (string, error) { IsAnonymous: p.IsAnonymous, Cost: p.Cost, Status: p.Status, + ItemID: p.ItemID, } e, err := types.GetByTriggerAndTransport(p.Event, p.Transport) From e4607627f855977a7ab50ff50f5f18395cb20b7e Mon Sep 17 00:00:00 2001 From: Braxton Lancial Date: Tue, 9 Mar 2021 14:11:10 -0800 Subject: [PATCH 02/12] stream_change support addition Adding support for "stream_change" websub and eventsub. --- cmd/events.go | 3 + internal/events/event.go | 1 + internal/events/trigger/trigger_event.go | 2 + .../stream_change/stream_change_event.go | 123 ++++++++++++++++++ .../stream_change/stream_change_event_test.go | 117 +++++++++++++++++ internal/events/types/types.go | 2 + internal/models/stream_change.go | 39 ++++++ 7 files changed, 287 insertions(+) create mode 100644 internal/events/types/stream_change/stream_change_event.go create mode 100644 internal/events/types/stream_change/stream_change_event_test.go create mode 100644 internal/models/stream_change.go diff --git a/cmd/events.go b/cmd/events.go index 09759655..a23a1337 100644 --- a/cmd/events.go +++ b/cmd/events.go @@ -26,6 +26,7 @@ var ( itemID string cost int64 count int + streamTitle string ) var eventCmd = &cobra.Command{ @@ -83,6 +84,7 @@ func init() { triggerCmd.Flags().StringVarP(&status, "status", "S", "", "Status of the event object, currently applies to channel points redemptions.") triggerCmd.Flags().StringVarP(&itemID, "item-id", "i", "", "Manually set the ID of the event payload item (for example the reward ID in redemption events).") triggerCmd.Flags().Int64VarP(&cost, "cost", "C", 0, "Amount of bits or channel points redeemed/used in the event.") + triggerCmd.Flags().StringVarP(&streamTitle, "description", "d", "", "Title the stream should be updated with.") // retrigger flags retriggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.") @@ -125,6 +127,7 @@ func triggerCmdRun(cmd *cobra.Command, args []string) { Status: status, ItemID: itemID, Cost: cost, + StreamTitle: streamTitle, }) if err != nil { diff --git a/internal/events/event.go b/internal/events/event.go index a230b203..8302c682 100644 --- a/internal/events/event.go +++ b/internal/events/event.go @@ -17,6 +17,7 @@ type MockEventParameters struct { Status string ItemID string Cost int64 + StreamTitle string } type MockEventResponse struct { diff --git a/internal/events/trigger/trigger_event.go b/internal/events/trigger/trigger_event.go index 58ce2473..ce10da87 100644 --- a/internal/events/trigger/trigger_event.go +++ b/internal/events/trigger/trigger_event.go @@ -26,6 +26,7 @@ type TriggerParameters struct { Secret string Verbose bool Count int + StreamTitle string } type TriggerResponse struct { @@ -60,6 +61,7 @@ func Fire(p TriggerParameters) (string, error) { IsAnonymous: p.IsAnonymous, Cost: p.Cost, Status: p.Status, + StreamTitle: p.StreamTitle, } e, err := types.GetByTriggerAndTransport(p.Event, p.Transport) diff --git a/internal/events/types/stream_change/stream_change_event.go b/internal/events/types/stream_change/stream_change_event.go new file mode 100644 index 00000000..2b230be1 --- /dev/null +++ b/internal/events/types/stream_change/stream_change_event.go @@ -0,0 +1,123 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package stream_change + +import ( + "encoding/json" + + "github.com/twitchdev/twitch-cli/internal/events" + "github.com/twitchdev/twitch-cli/internal/models" + "github.com/twitchdev/twitch-cli/internal/util" + "time" +) + +var transportsSupported = map[string]bool{ + models.TransportWebSub: true, + models.TransportEventSub: true, +} + +var triggerSupported = []string{"stream_change"} + +var triggerMapping = map[string]map[string]string{ + models.TransportWebSub: { + "stream_change": "streams", + }, + models.TransportEventSub: { + "stream_change": "channel.update", + }, +} + +type Event struct{} + +func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) { + var event []byte + var err error + + if params.StreamTitle == "" { + params.StreamTitle = "Default Title!" + } + + switch params.Transport{ + case models.TransportEventSub: + body := &models.EventsubResponse{ + // make the eventsub response (if supported) + Subscription: models.EventsubSubscription{ + ID: params.ID, + Status: "enabled", + Type: "channel.update", + Version: "1", + Condition: models.EventsubCondition{ + BroadcasterUserID: params.ToUserID, + }, + Transport: models.EventsubTransport{ + Method: "webhook", + Callback: "null", + }, + CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano), + }, + Event: models.ChannelUpdateEventSubEvent{ + BroadcasterUserID: params.ToUserID, + BroadcasterUserLogin: params.ToUserID, + BroadcasterUserName: params.ToUserName, + StreamTitle: params.StreamTitle, + StreamLanguage: "en", + StreamCategoryID: "509658", + StreamCategoryName: "Just Chatting", + IsMature: "true", + }, + } + event, err = json.Marshal(body) + if err != nil { + return events.MockEventResponse{}, err + } + case models.TransportWebSub: + body := models.StreamChangeWebSubResponse{ + Data: []models.StreamChangeWebSubResponseData{ + { + WebsubID: params.FromUserID, + BroadcasterUserID: params.ToUserID, + BroadcasterUserLogin: params.ToUserID, + BroadcasterUserName: params.ToUserName, + StreamCategoryID: "509658", + StreamCategoryName: "Just Chatting", + StreamType: "live", + StreamTitle: params.StreamTitle, + StreamViewerCount: 9848, + StreamStartedAt: util.GetTimestamp().Format(time.RFC3339), + StreamLanguage: "en", + StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_user_lirik-{width}x{height}.jpg", + }, + }, + } + event, err = json.Marshal(body) + if err != nil { + return events.MockEventResponse{}, err + } + default: + return events.MockEventResponse{}, nil + } + + return events.MockEventResponse{ + ID: params.ID, + JSON: event, + FromUser: params.FromUserID, + ToUser: params.ToUserID, + }, nil +} + +func (e Event) ValidTransport(t string) bool { + return transportsSupported[t] +} + +func (e Event) ValidTrigger(t string) bool { + for _, ts := range triggerSupported { + if ts == t { + return true + } + } + return false +} + +func (e Event) GetTopic(transport string, trigger string) string { + return triggerMapping[transport][trigger] +} diff --git a/internal/events/types/stream_change/stream_change_event_test.go b/internal/events/types/stream_change/stream_change_event_test.go new file mode 100644 index 00000000..e15c64c2 --- /dev/null +++ b/internal/events/types/stream_change/stream_change_event_test.go @@ -0,0 +1,117 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package stream_change + +import ( + "encoding/json" + "testing" + + "github.com/twitchdev/twitch-cli/internal/events" + "github.com/twitchdev/twitch-cli/internal/models" + "github.com/twitchdev/twitch-cli/internal/util" +) + +var fromUser = "1234" +var toUser = "4567" + +func TestEventSub(t *testing.T) { + a := util.SetupTestEnv(t) + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportEventSub, + Trigger: "stream_change", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + + var body models.ChannelUpdateEventSubResponse + err = json.Unmarshal(r.JSON, &body) + a.Nil(err, "Error unmarshalling JSON") + + // write actual tests here (making sure you set appropriate values and the like) for eventsub + a.Equal(toUser, body.Event.BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Event.BroadcasterUserID) + + // test for changing a title + params = events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportEventSub, + Trigger: "stream_change", + } + + r, err = Event{}.GenerateEvent(params) + a.Nil(err) + + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + a.Equal(toUser, body.Event.BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Event.BroadcasterUserID) + a.Equal("Default Title!", body.Event.StreamTitle, "Expected new stream title, got %v", body.Event.StreamTitle) +} + +func TestWebSubStreamChange(t *testing.T) { + a := util.SetupTestEnv(t) + + newStreamTitle := "Awesome new title!" + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "stream_change", + StreamTitle: newStreamTitle, + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + + var body models.StreamChangeWebSubResponse + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + // write tests here for websub + a.Equal(toUser, body.Data[0].BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Data[0].BroadcasterUserID) + a.Equal(newStreamTitle, body.Data[0].StreamTitle, "Expected new stream title, got %v", body.Data[0].StreamTitle) +} +func TestFakeTransport(t *testing.T) { + a := util.SetupTestEnv(t) + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: "fake_transport", + Trigger: "stream_change", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + a.Empty(r) +} +func TestValidTrigger(t *testing.T) { + a := util.SetupTestEnv(t) + + r := Event{}.ValidTrigger("stream_change") + a.Equal(true, r) + + r = Event{}.ValidTrigger("not_trigger_keyword") + a.Equal(false, r) +} + +func TestValidTransport(t *testing.T) { + a := util.SetupTestEnv(t) + + r := Event{}.ValidTransport(models.TransportEventSub) + a.Equal(true, r) + + r = Event{}.ValidTransport("noteventsub") + a.Equal(false, r) +} +func TestGetTopic(t *testing.T) { + a := util.SetupTestEnv(t) + + r := Event{}.GetTopic(models.TransportEventSub, "stream_change") + a.NotNil(r) +} \ No newline at end of file diff --git a/internal/events/types/types.go b/internal/events/types/types.go index 0867ad79..9b96decd 100644 --- a/internal/events/types/types.go +++ b/internal/events/types/types.go @@ -14,6 +14,7 @@ import ( "github.com/twitchdev/twitch-cli/internal/events/types/follow" "github.com/twitchdev/twitch-cli/internal/events/types/moderator_change" "github.com/twitchdev/twitch-cli/internal/events/types/raid" + "github.com/twitchdev/twitch-cli/internal/events/types/stream_change" "github.com/twitchdev/twitch-cli/internal/events/types/streamdown" "github.com/twitchdev/twitch-cli/internal/events/types/streamup" "github.com/twitchdev/twitch-cli/internal/events/types/subscribe" @@ -29,6 +30,7 @@ func All() []events.MockEvent { follow.Event{}, raid.Event{}, subscribe.Event{}, + stream_change.Event{}, streamup.Event{}, streamdown.Event{}, moderator_change.Event{}, diff --git a/internal/models/stream_change.go b/internal/models/stream_change.go new file mode 100644 index 00000000..ab8d5f31 --- /dev/null +++ b/internal/models/stream_change.go @@ -0,0 +1,39 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package models + +type ChannelUpdateEventSubEvent struct { + BroadcasterUserID string `json:"broadcaster_user_id"` + BroadcasterUserLogin string `json:"broadcaster_user_login"` + BroadcasterUserName string `json:"broadcaster_user_name"` + StreamTitle string `json:"title"` + StreamLanguage string `json:"language"` + StreamCategoryID string `json:"category_id"` + StreamCategoryName string `json:"category_name"` + IsMature string `json:"is_mature"` +} + +type StreamChangeWebSubResponse struct { + Data []StreamChangeWebSubResponseData `json:"data"` +} + +type StreamChangeWebSubResponseData struct { + WebsubID string `json:"id"` + BroadcasterUserID string `json:"user_id"` + BroadcasterUserLogin string `json:"user_login"` + BroadcasterUserName string `json:"user_name"` + StreamCategoryID string `json:"game_id"` + StreamCategoryName string `json:"game_name"` + StreamType string `json:"type"` + StreamTitle string `json:"title"` + StreamViewerCount int `json:"viewer_count"` + StreamStartedAt string `json:"started_at"` + StreamLanguage string `json:"language"` + StreamThumbnailURL string `json:"thumbnail_url"` + TagIDs []string `json:"tag_ids"` +} + +type ChannelUpdateEventSubResponse struct { + Subscription EventsubSubscription `json:"subscription"` + Event ChannelUpdateEventSubEvent `json:"event"` +} From 314a883e84ee8495a34b2055ea52c4f1e07a400a Mon Sep 17 00:00:00 2001 From: Braxton Lancial Date: Tue, 9 Mar 2021 14:27:22 -0800 Subject: [PATCH 03/12] Added stream_change documentation --- docs/event.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/event.md b/docs/event.md index c1236285..e173b656 100644 --- a/docs/event.md +++ b/docs/event.md @@ -30,6 +30,7 @@ Used to either create or send mock events for use with local webhooks testing. | `update-redemption` | Channel Points EventSub event for a redemption being updated. | | `raid` | Channel Raid event with a random viewer count. | | `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. | +| `stream_change` | Stream Changed event. | | `streamup` | Only usable with the `eventsub` transport, a stream online event. | | `streamdown` | Only usable with the `eventsub` transport, a stream offline event. | | `add-moderator` | Channel moderator add event. | @@ -50,6 +51,7 @@ Used to either create or send mock events for use with local webhooks testing. | `--status` | `-S` | Status of the event object, currently applies to channel points redemptions. | `-S fulfilled` | N | | `--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 | | `--cost` | `-C` | Amount of bits or channel points redeemed/used in the event. | `-C 250` | N | +| `--description` | `-d` | Title the stream should be updated with. | `-d Awesome new title!` | N | **Examples** @@ -113,6 +115,7 @@ Allows you to test if your webserver responds to subscription requests properly. | `update-redemption` | Channel Points EventSub event for a redemption being updated. | | `raid` | Channel Raid event with a random viewer count. | | `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. | +| `stream_change` | Stream changed event. | | `streamup` | Only usable with the `eventsub` transport, a stream online event. | | `streamdown` | Only usable with the `eventsub` transport, a stream offline event. | | `add-moderator` | Channel moderator add event. | From 328c90ccf3fcf2bf57c96f7df0688de0579df60d Mon Sep 17 00:00:00 2001 From: lleadbet Date: Tue, 9 Mar 2021 16:08:55 -0800 Subject: [PATCH 04/12] linting files --- .../stream_change/stream_change_event.go | 41 ++++++++++--------- .../stream_change/stream_change_event_test.go | 18 ++++---- internal/models/stream_change.go | 38 ++++++++--------- 3 files changed, 49 insertions(+), 48 deletions(-) diff --git a/internal/events/types/stream_change/stream_change_event.go b/internal/events/types/stream_change/stream_change_event.go index 2b230be1..2066d159 100644 --- a/internal/events/types/stream_change/stream_change_event.go +++ b/internal/events/types/stream_change/stream_change_event.go @@ -5,10 +5,11 @@ package stream_change import ( "encoding/json" + "time" + "github.com/twitchdev/twitch-cli/internal/events" "github.com/twitchdev/twitch-cli/internal/models" "github.com/twitchdev/twitch-cli/internal/util" - "time" ) var transportsSupported = map[string]bool{ @@ -37,7 +38,7 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven params.StreamTitle = "Default Title!" } - switch params.Transport{ + switch params.Transport { case models.TransportEventSub: body := &models.EventsubResponse{ // make the eventsub response (if supported) @@ -56,14 +57,14 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano), }, Event: models.ChannelUpdateEventSubEvent{ - BroadcasterUserID: params.ToUserID, - BroadcasterUserLogin: params.ToUserID, - BroadcasterUserName: params.ToUserName, - StreamTitle: params.StreamTitle, - StreamLanguage: "en", - StreamCategoryID: "509658", - StreamCategoryName: "Just Chatting", - IsMature: "true", + BroadcasterUserID: params.ToUserID, + BroadcasterUserLogin: params.ToUserID, + BroadcasterUserName: params.ToUserName, + StreamTitle: params.StreamTitle, + StreamLanguage: "en", + StreamCategoryID: "509658", + StreamCategoryName: "Just Chatting", + IsMature: "true", }, } event, err = json.Marshal(body) @@ -74,18 +75,18 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven body := models.StreamChangeWebSubResponse{ Data: []models.StreamChangeWebSubResponseData{ { - WebsubID: params.FromUserID, - BroadcasterUserID: params.ToUserID, - BroadcasterUserLogin: params.ToUserID, - BroadcasterUserName: params.ToUserName, - StreamCategoryID: "509658", + WebsubID: params.FromUserID, + BroadcasterUserID: params.ToUserID, + BroadcasterUserLogin: params.ToUserID, + BroadcasterUserName: params.ToUserName, + StreamCategoryID: "509658", StreamCategoryName: "Just Chatting", - StreamType: "live", - StreamTitle: params.StreamTitle, - StreamViewerCount: 9848, - StreamStartedAt: util.GetTimestamp().Format(time.RFC3339), + StreamType: "live", + StreamTitle: params.StreamTitle, + StreamViewerCount: 9848, + StreamStartedAt: util.GetTimestamp().Format(time.RFC3339), StreamLanguage: "en", - StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_user_lirik-{width}x{height}.jpg", + StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_user_lirik-{width}x{height}.jpg", }, }, } diff --git a/internal/events/types/stream_change/stream_change_event_test.go b/internal/events/types/stream_change/stream_change_event_test.go index e15c64c2..a7e80bb0 100644 --- a/internal/events/types/stream_change/stream_change_event_test.go +++ b/internal/events/types/stream_change/stream_change_event_test.go @@ -36,10 +36,10 @@ func TestEventSub(t *testing.T) { // test for changing a title params = events.MockEventParameters{ - FromUserID: fromUser, - ToUserID: toUser, - Transport: models.TransportEventSub, - Trigger: "stream_change", + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportEventSub, + Trigger: "stream_change", } r, err = Event{}.GenerateEvent(params) @@ -58,10 +58,10 @@ func TestWebSubStreamChange(t *testing.T) { newStreamTitle := "Awesome new title!" params := *&events.MockEventParameters{ - FromUserID: fromUser, - ToUserID: toUser, - Transport: models.TransportWebSub, - Trigger: "stream_change", + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "stream_change", StreamTitle: newStreamTitle, } @@ -114,4 +114,4 @@ func TestGetTopic(t *testing.T) { r := Event{}.GetTopic(models.TransportEventSub, "stream_change") a.NotNil(r) -} \ No newline at end of file +} diff --git a/internal/models/stream_change.go b/internal/models/stream_change.go index ab8d5f31..721a32af 100644 --- a/internal/models/stream_change.go +++ b/internal/models/stream_change.go @@ -6,34 +6,34 @@ type ChannelUpdateEventSubEvent struct { BroadcasterUserID string `json:"broadcaster_user_id"` BroadcasterUserLogin string `json:"broadcaster_user_login"` BroadcasterUserName string `json:"broadcaster_user_name"` - StreamTitle string `json:"title"` - StreamLanguage string `json:"language"` + StreamTitle string `json:"title"` + StreamLanguage string `json:"language"` StreamCategoryID string `json:"category_id"` StreamCategoryName string `json:"category_name"` - IsMature string `json:"is_mature"` + IsMature string `json:"is_mature"` } type StreamChangeWebSubResponse struct { - Data []StreamChangeWebSubResponseData `json:"data"` + Data []StreamChangeWebSubResponseData `json:"data"` } type StreamChangeWebSubResponseData struct { - WebsubID string `json:"id"` - BroadcasterUserID string `json:"user_id"` - BroadcasterUserLogin string `json:"user_login"` - BroadcasterUserName string `json:"user_name"` - StreamCategoryID string `json:"game_id"` - StreamCategoryName string `json:"game_name"` - StreamType string `json:"type"` - StreamTitle string `json:"title"` - StreamViewerCount int `json:"viewer_count"` - StreamStartedAt string `json:"started_at"` - StreamLanguage string `json:"language"` - StreamThumbnailURL string `json:"thumbnail_url"` - TagIDs []string `json:"tag_ids"` + WebsubID string `json:"id"` + BroadcasterUserID string `json:"user_id"` + BroadcasterUserLogin string `json:"user_login"` + BroadcasterUserName string `json:"user_name"` + StreamCategoryID string `json:"game_id"` + StreamCategoryName string `json:"game_name"` + StreamType string `json:"type"` + StreamTitle string `json:"title"` + StreamViewerCount int `json:"viewer_count"` + StreamStartedAt string `json:"started_at"` + StreamLanguage string `json:"language"` + StreamThumbnailURL string `json:"thumbnail_url"` + TagIDs []string `json:"tag_ids"` } type ChannelUpdateEventSubResponse struct { - Subscription EventsubSubscription `json:"subscription"` - Event ChannelUpdateEventSubEvent `json:"event"` + Subscription EventsubSubscription `json:"subscription"` + Event ChannelUpdateEventSubEvent `json:"event"` } From b289e53424a176902559362ca58764388b446457 Mon Sep 17 00:00:00 2001 From: lleadbet Date: Tue, 9 Mar 2021 16:11:02 -0800 Subject: [PATCH 05/12] linting agian --- internal/events/trigger/trigger_event.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/events/trigger/trigger_event.go b/internal/events/trigger/trigger_event.go index ce10da87..630da29e 100644 --- a/internal/events/trigger/trigger_event.go +++ b/internal/events/trigger/trigger_event.go @@ -26,7 +26,7 @@ type TriggerParameters struct { Secret string Verbose bool Count int - StreamTitle string + StreamTitle string } type TriggerResponse struct { From 4ab598edc02268d43ffa63d8aaec659f143d18f7 Mon Sep 17 00:00:00 2001 From: Braxton Lancial Date: Tue, 9 Mar 2021 18:01:42 -0800 Subject: [PATCH 06/12] Addressing first comments Addressing first comments by editing "stream_change" to "stream-change" as the trigger. Adding "TagIDs". --- docs/event.md | 2 +- .../types/stream_change/stream_change_event.go | 7 ++++--- .../stream_change/stream_change_event_test.go | 14 +++++++------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/event.md b/docs/event.md index e173b656..47510b13 100644 --- a/docs/event.md +++ b/docs/event.md @@ -30,7 +30,7 @@ Used to either create or send mock events for use with local webhooks testing. | `update-redemption` | Channel Points EventSub event for a redemption being updated. | | `raid` | Channel Raid event with a random viewer count. | | `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. | -| `stream_change` | Stream Changed event. | +| `stream-change` | Stream Changed event. | | `streamup` | Only usable with the `eventsub` transport, a stream online event. | | `streamdown` | Only usable with the `eventsub` transport, a stream offline event. | | `add-moderator` | Channel moderator add event. | diff --git a/internal/events/types/stream_change/stream_change_event.go b/internal/events/types/stream_change/stream_change_event.go index 2066d159..900c7ac7 100644 --- a/internal/events/types/stream_change/stream_change_event.go +++ b/internal/events/types/stream_change/stream_change_event.go @@ -17,7 +17,7 @@ var transportsSupported = map[string]bool{ models.TransportEventSub: true, } -var triggerSupported = []string{"stream_change"} +var triggerSupported = []string{"stream-change"} var triggerMapping = map[string]map[string]string{ models.TransportWebSub: { @@ -35,7 +35,7 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven var err error if params.StreamTitle == "" { - params.StreamTitle = "Default Title!" + params.StreamTitle = "Example title from the CLI!" } switch params.Transport { @@ -86,7 +86,8 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven StreamViewerCount: 9848, StreamStartedAt: util.GetTimestamp().Format(time.RFC3339), StreamLanguage: "en", - StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_user_lirik-{width}x{height}.jpg", + StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_twitch_user-{width}x{height}.jpg", + TagIDs: make([]string, 0), }, }, } diff --git a/internal/events/types/stream_change/stream_change_event_test.go b/internal/events/types/stream_change/stream_change_event_test.go index a7e80bb0..b3256212 100644 --- a/internal/events/types/stream_change/stream_change_event_test.go +++ b/internal/events/types/stream_change/stream_change_event_test.go @@ -21,7 +21,7 @@ func TestEventSub(t *testing.T) { FromUserID: fromUser, ToUserID: toUser, Transport: models.TransportEventSub, - Trigger: "stream_change", + Trigger: "stream-change", } r, err := Event{}.GenerateEvent(params) @@ -49,19 +49,19 @@ func TestEventSub(t *testing.T) { a.Nil(err) a.Equal(toUser, body.Event.BroadcasterUserID, "Expected Stream Channel %v, got %v", toUser, body.Event.BroadcasterUserID) - a.Equal("Default Title!", body.Event.StreamTitle, "Expected new stream title, got %v", body.Event.StreamTitle) + a.Equal("Example title from the CLI!", body.Event.StreamTitle, "Expected new stream title, got %v", body.Event.StreamTitle) } func TestWebSubStreamChange(t *testing.T) { a := util.SetupTestEnv(t) - newStreamTitle := "Awesome new title!" + newStreamTitle := "Awesome new title from the CLI!" params := *&events.MockEventParameters{ FromUserID: fromUser, ToUserID: toUser, Transport: models.TransportWebSub, - Trigger: "stream_change", + Trigger: "stream-change", StreamTitle: newStreamTitle, } @@ -83,7 +83,7 @@ func TestFakeTransport(t *testing.T) { FromUserID: fromUser, ToUserID: toUser, Transport: "fake_transport", - Trigger: "stream_change", + Trigger: "stream-change", } r, err := Event{}.GenerateEvent(params) @@ -93,7 +93,7 @@ func TestFakeTransport(t *testing.T) { func TestValidTrigger(t *testing.T) { a := util.SetupTestEnv(t) - r := Event{}.ValidTrigger("stream_change") + r := Event{}.ValidTrigger("stream-change") a.Equal(true, r) r = Event{}.ValidTrigger("not_trigger_keyword") @@ -112,6 +112,6 @@ func TestValidTransport(t *testing.T) { func TestGetTopic(t *testing.T) { a := util.SetupTestEnv(t) - r := Event{}.GetTopic(models.TransportEventSub, "stream_change") + r := Event{}.GetTopic(models.TransportEventSub, "stream-change") a.NotNil(r) } From d8de19b237ad60f17a7d620655a4251965f249a0 Mon Sep 17 00:00:00 2001 From: Garza Date: Tue, 9 Mar 2021 19:15:31 -0800 Subject: [PATCH 07/12] Add websub support on streamdown event --- internal/events/types/streamdown/streamdown.go | 11 ++++++++++- internal/models/streamdown.go | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/internal/events/types/streamdown/streamdown.go b/internal/events/types/streamdown/streamdown.go index f4f1b3c5..3c28c9c0 100644 --- a/internal/events/types/streamdown/streamdown.go +++ b/internal/events/types/streamdown/streamdown.go @@ -12,7 +12,7 @@ import ( ) var transportsSupported = map[string]bool{ - models.TransportWebSub: false, + models.TransportWebSub: true, models.TransportEventSub: true, } @@ -56,6 +56,15 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven BroadcasterUserName: params.ToUserName, }, } + event, err = json.Marshal(body) + if err != nil { + return events.MockEventResponse{}, err + } + case models.TransportWebSub: + body := *&models.StreamDownWebSubResponse{ + Data: []models.StreamDownWebSubResponseData{ + }} + event, err = json.Marshal(body) if err != nil { return events.MockEventResponse{}, err diff --git a/internal/models/streamdown.go b/internal/models/streamdown.go index 6d6dbe28..a1116b39 100644 --- a/internal/models/streamdown.go +++ b/internal/models/streamdown.go @@ -12,3 +12,10 @@ type StreamDownEventSubEvent struct { BroadcasterUserLogin string `json:"broadcaster_user_login"` BroadcasterUserName string `json:"broadcaster_user_name"` } + +type StreamDownWebSubResponse struct { + Data []StreamDownWebSubResponseData `json:"data"` +} + +type StreamDownWebSubResponseData struct { +} \ No newline at end of file From 7215694bbf7bd57baa4cf5e075b471b79220c8f9 Mon Sep 17 00:00:00 2001 From: lleadbet Date: Wed, 10 Mar 2021 11:05:32 -0800 Subject: [PATCH 08/12] quick fixes --- .../events/types/stream_change/stream_change_event.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/events/types/stream_change/stream_change_event.go b/internal/events/types/stream_change/stream_change_event.go index 900c7ac7..5db8b58a 100644 --- a/internal/events/types/stream_change/stream_change_event.go +++ b/internal/events/types/stream_change/stream_change_event.go @@ -58,7 +58,7 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven }, Event: models.ChannelUpdateEventSubEvent{ BroadcasterUserID: params.ToUserID, - BroadcasterUserLogin: params.ToUserID, + BroadcasterUserLogin: params.ToUserName, BroadcasterUserName: params.ToUserName, StreamTitle: params.StreamTitle, StreamLanguage: "en", @@ -75,9 +75,9 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven body := models.StreamChangeWebSubResponse{ Data: []models.StreamChangeWebSubResponseData{ { - WebsubID: params.FromUserID, + WebsubID: params.ID, BroadcasterUserID: params.ToUserID, - BroadcasterUserLogin: params.ToUserID, + BroadcasterUserLogin: params.ToUserName, BroadcasterUserName: params.ToUserName, StreamCategoryID: "509658", StreamCategoryName: "Just Chatting", @@ -87,7 +87,7 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven StreamStartedAt: util.GetTimestamp().Format(time.RFC3339), StreamLanguage: "en", StreamThumbnailURL: "https://static-cdn.jtvnw.net/previews-ttv/live_twitch_user-{width}x{height}.jpg", - TagIDs: make([]string, 0), + TagIDs: make([]string, 0), }, }, } From 0b5cc90bbcbda6dfe30f192dfe83d5d1e1163bfa Mon Sep 17 00:00:00 2001 From: Garza Date: Wed, 10 Mar 2021 15:38:02 -0800 Subject: [PATCH 09/12] Add websub support on streamup event --- internal/events/types/streamup/streamup.go | 29 +++++++++++++++++++++- internal/models/streamup.go | 18 ++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/internal/events/types/streamup/streamup.go b/internal/events/types/streamup/streamup.go index d8a2196e..f0238943 100644 --- a/internal/events/types/streamup/streamup.go +++ b/internal/events/types/streamup/streamup.go @@ -12,7 +12,7 @@ import ( ) var transportsSupported = map[string]bool{ - models.TransportWebSub: false, + models.TransportWebSub: true, models.TransportEventSub: true, } @@ -33,6 +33,10 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven var event []byte var err error + if params.StreamTitle == "" { + params.StreamTitle = "Example title from the CLI!" + } + switch params.Transport { case models.TransportEventSub: body := &models.EventsubResponse{ @@ -59,6 +63,29 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven StartedAt: util.GetTimestamp().Format(time.RFC3339Nano), }, } + event, err = json.Marshal(body) + if err != nil { + return events.MockEventResponse{}, err + } + case models.TransportWebSub: + body := models.StreamUpWebSubResponse{ + Data: []models.StreamUpWebSubResponseData{ + { + ID: params.ID, + UserID: params.ToUserID, + UserName: params.ToUserName, + GameID: "509658", + CommunityIDs: make([]string, 0), + Type: "live", + Title: params.StreamTitle, + ViewerCount: 1337, + StartedAt: util.GetTimestamp().Format(time.RFC3339), + Language: "en", + ThumbnailURL: "https://static-cdn.jtvnw.net/ttv-static/404_preview-440x248.jpg", + }, + }, + } + event, err = json.Marshal(body) if err != nil { return events.MockEventResponse{}, err diff --git a/internal/models/streamup.go b/internal/models/streamup.go index 42d490de..0802c6be 100644 --- a/internal/models/streamup.go +++ b/internal/models/streamup.go @@ -15,3 +15,21 @@ type StreamUpEventSubEvent struct { Type string `json:"type"` StartedAt string `json:"started_at"` } + +type StreamUpWebSubResponse struct { + Data []StreamUpWebSubResponseData `json:"data"` +} + +type StreamUpWebSubResponseData struct { + ID string `json:"id"` + UserID string `json:"user_id"` + UserName string `json:"user_name"` + GameID string `json:"game_id"` + CommunityIDs []string `json:"community_ids"` + Type string `json:"type"` + Title string `json:"title"` + ViewerCount int64 `json:"viewer_count"` + StartedAt string `json:"started_at"` + Language string `json:language` + ThumbnailURL string `json:thumbnail_url` +} \ No newline at end of file From 182eee1db11d3348c88c07001d13a3a0d88543e7 Mon Sep 17 00:00:00 2001 From: Garza Date: Wed, 10 Mar 2021 15:45:17 -0800 Subject: [PATCH 10/12] Modify docs to reflect websub support on stream up/down --- docs/event.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/event.md b/docs/event.md index 47510b13..40e33e30 100644 --- a/docs/event.md +++ b/docs/event.md @@ -31,8 +31,8 @@ Used to either create or send mock events for use with local webhooks testing. | `raid` | Channel Raid event with a random viewer count. | | `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. | | `stream-change` | Stream Changed event. | -| `streamup` | Only usable with the `eventsub` transport, a stream online event. | -| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. | +| `streamup` | Stream online event. | +| `streamdown` | Sstream offline event. | | `add-moderator` | Channel moderator add event. | | `remove-moderator` | Channel moderator removal event. | @@ -51,7 +51,7 @@ Used to either create or send mock events for use with local webhooks testing. | `--status` | `-S` | Status of the event object, currently applies to channel points redemptions. | `-S fulfilled` | N | | `--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 | | `--cost` | `-C` | Amount of bits or channel points redeemed/used in the event. | `-C 250` | N | -| `--description` | `-d` | Title the stream should be updated with. | `-d Awesome new title!` | N | +| `--description` | `-d` | Title the stream should be updated/started with. | `-d Awesome new title!` | N | **Examples** @@ -116,8 +116,8 @@ Allows you to test if your webserver responds to subscription requests properly. | `raid` | Channel Raid event with a random viewer count. | | `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. | | `stream_change` | Stream changed event. | -| `streamup` | Only usable with the `eventsub` transport, a stream online event. | -| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. | +| `streamup` | Stream online event. | +| `streamdown` | Stream offline event. | | `add-moderator` | Channel moderator add event. | | `remove-moderator` | Channel moderator removal event. | From 342a17aa7cffed9229381d3d27442b8a611c84ee Mon Sep 17 00:00:00 2001 From: Garza Date: Wed, 10 Mar 2021 16:06:07 -0800 Subject: [PATCH 11/12] Include TestWebSub method on stream up/down test files --- .../types/streamdown/streamdown_test.go | 20 +++++++++++++++++++ .../events/types/streamup/streamup_test.go | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/internal/events/types/streamdown/streamdown_test.go b/internal/events/types/streamdown/streamdown_test.go index aaf0cd30..f4adb9a0 100644 --- a/internal/events/types/streamdown/streamdown_test.go +++ b/internal/events/types/streamdown/streamdown_test.go @@ -34,6 +34,26 @@ func TestEventSub(t *testing.T) { // write actual tests here (making sure you set appropriate values and the like) for eventsub } +func TestWebSub(t *testing.T) { + a := util.SetupTestEnv(t) + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "streamdown", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + + var body models.StreamDownWebSubResponse + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + // write tests here for websub +} + func TestFakeTransport(t *testing.T) { a := util.SetupTestEnv(t) diff --git a/internal/events/types/streamup/streamup_test.go b/internal/events/types/streamup/streamup_test.go index e7e33148..7e18ce63 100644 --- a/internal/events/types/streamup/streamup_test.go +++ b/internal/events/types/streamup/streamup_test.go @@ -34,6 +34,26 @@ func TestEventSub(t *testing.T) { // write actual tests here (making sure you set appropriate values and the like) for eventsub } +func TestWebSub(t *testing.T) { + a := util.SetupTestEnv(t) + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "unsubscribe", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + + var body models.StreamUpWebSubResponse + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + // write tests here for websub +} + func TestFakeTransport(t *testing.T) { a := util.SetupTestEnv(t) From c0938e2b2eac327c0ed2b865be995bf7daea105c Mon Sep 17 00:00:00 2001 From: Garza Date: Thu, 11 Mar 2021 15:18:45 -0800 Subject: [PATCH 12/12] Change streamup model and data to match proper API docs --- internal/events/types/streamup/streamup.go | 3 ++- internal/models/streamup.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/events/types/streamup/streamup.go b/internal/events/types/streamup/streamup.go index f0238943..84d6a3ec 100644 --- a/internal/events/types/streamup/streamup.go +++ b/internal/events/types/streamup/streamup.go @@ -73,15 +73,16 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven { ID: params.ID, UserID: params.ToUserID, + UserLogin: params.ToUserName, UserName: params.ToUserName, GameID: "509658", - CommunityIDs: make([]string, 0), Type: "live", Title: params.StreamTitle, ViewerCount: 1337, StartedAt: util.GetTimestamp().Format(time.RFC3339), Language: "en", ThumbnailURL: "https://static-cdn.jtvnw.net/ttv-static/404_preview-440x248.jpg", + TagIDs: make([]string, 0), }, }, } diff --git a/internal/models/streamup.go b/internal/models/streamup.go index 0802c6be..5741f322 100644 --- a/internal/models/streamup.go +++ b/internal/models/streamup.go @@ -23,13 +23,14 @@ type StreamUpWebSubResponse struct { type StreamUpWebSubResponseData struct { ID string `json:"id"` UserID string `json:"user_id"` + UserLogin string `json:"user_login"` UserName string `json:"user_name"` GameID string `json:"game_id"` - CommunityIDs []string `json:"community_ids"` Type string `json:"type"` Title string `json:"title"` ViewerCount int64 `json:"viewer_count"` StartedAt string `json:"started_at"` Language string `json:language` ThumbnailURL string `json:thumbnail_url` + TagIDs []string `json:"tag_ids"` } \ No newline at end of file