diff --git a/docs/event.md b/docs/event.md index 96b36635..3cd44eab 100644 --- a/docs/event.md +++ b/docs/event.md @@ -16,30 +16,28 @@ Used to either create or send mock events for use with local webhooks testing. **Args** -| Argument | Description | -| ---------------------- | ---------------------------------------------------------------------------------------------------------- | -| `subscribe` | A standard subscription event. Triggers a basic tier 1 sub. | -| `unsubscribe` | A standard unsubscribe event. Triggers a basic tier 1 sub. | -| `gift` | A gifted subscription event. Triggers a basic tier 1 sub. | -| `cheer` | Only usable with the `eventsub` transport, shows Cheers from chat. | -| `transaction` | Bits in Extensions transactions events. | -| `add-reward` | Channel Points EventSub event for a Custom Reward being added. | -| `update-reward` | Channel Points EventSub event for a Custom Reward being updated. | -| `remove-reward` | Channel Points EventSub event for a Custom Reward being removed. | -| `add-redemption` | Channel Points EventSub event for a redemption being performed. | -| `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. | -| `remove-moderator` | Channel moderator removal event. | -| `ban` | Channel ban event. | -| `unban` | Channel unban event. | -| `hype-train-begin` | Hype Train begins event. | -| `hype-train-progress` | Hype Train progress event. | -| `hype-train-end` | Hype Train ends event. | +| Argument | Description | +|---------------------|------------------------------------------------------------------------------------------------------------| +| `subscribe` | A standard subscription event. Triggers a basic tier 1 sub. | +| `unsubscribe` | A standard unsubscribe event. Triggers a basic tier 1 sub. | +| `gift` | A gifted subscription event. Triggers a basic tier 1 sub. | +| `cheer` | Only usable with the `eventsub` transport, shows Cheers from chat. | +| `transaction` | Bits in Extensions transactions events. | +| `add-reward` | Channel Points EventSub event for a Custom Reward being added. | +| `update-reward` | Channel Points EventSub event for a Custom Reward being updated. | +| `remove-reward` | Channel Points EventSub event for a Custom Reward being removed. | +| `add-redemption` | Channel Points EventSub event for a redemption being performed. | +| `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` | Stream online event. | +| `streamdown` | Sstream offline event. | +| `add-moderator` | Channel moderator add event. | +| `remove-moderator` | Channel moderator removal event. | +| `ban` | Channel ban event. | +| `unban` | Channel unban event. | + **Flags** @@ -56,7 +54,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** @@ -107,29 +105,26 @@ Allows you to test if your webserver responds to subscription requests properly. **Args** | Argument | Description | -| ---------------------- | ---------------------------------------------------------------------------------------------------------- | -| `subscribe` | A standard subscription event. Triggers a basic tier 1 sub. | -| `unsubscribe` | A standard unsubscribe event. Triggers a basic tier 1 sub. | -| `gift` | A gifted subscription event. Triggers a basic tier 1 sub. | -| `cheer` | Only usable with the `eventsub` transport, shows Cheers from chat. | -| `transaction` | Bits in Extensions transactions events. | -| `add-reward` | Channel Points EventSub event for a Custom Reward being added. | -| `update-reward` | Channel Points EventSub event for a Custom Reward being updated. | -| `remove-reward` | Channel Points EventSub event for a Custom Reward being removed. | -| `add-redemption` | Channel Points EventSub event for a redemption being performed. | -| `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. | -| `remove-moderator` | Channel moderator removal event. | -| `ban` | Channel ban event. | -| `unban` | Channel unban event. | -| `hype-train-begin` | Hype Train begins event. | -| `hype-train-progress` | Hype Train progress event. | -| `hype-train-end` | Hype Train ends event. | +|---------------------|------------------------------------------------------------------------------------------------------------| +| `subscribe` | A standard subscription event. Triggers a basic tier 1 sub. | +| `unsubscribe` | A standard unsubscribe event. Triggers a basic tier 1 sub. | +| `gift` | A gifted subscription event. Triggers a basic tier 1 sub. | +| `cheer` | Only usable with the `eventsub` transport, shows Cheers from chat. | +| `transaction` | Bits in Extensions transactions events. | +| `add-reward` | Channel Points EventSub event for a Custom Reward being added. | +| `update-reward` | Channel Points EventSub event for a Custom Reward being updated. | +| `remove-reward` | Channel Points EventSub event for a Custom Reward being removed. | +| `add-redemption` | Channel Points EventSub event for a redemption being performed. | +| `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` | Stream online event. | +| `streamdown` | Sstream offline event. | +| `add-moderator` | Channel moderator add event. | +| `remove-moderator` | Channel moderator removal event. | +| `ban` | Channel ban event. | +| `unban` | Channel unban event. | **Flags** diff --git a/internal/events/event.go b/internal/events/event.go index 8302c682..6b6dd4f9 100644 --- a/internal/events/event.go +++ b/internal/events/event.go @@ -17,6 +17,7 @@ type MockEventParameters struct { Status string ItemID string Cost int64 + IsPermanent bool StreamTitle string } diff --git a/internal/events/models.go b/internal/events/models.go index 53c3ad67..e2ee9d32 100644 --- a/internal/events/models.go +++ b/internal/events/models.go @@ -3,24 +3,21 @@ package events var triggerSupported = map[string]bool{ - "subscribe": true, - "unsubscribe": true, - "gift": true, - "cheer": true, - "transaction": true, - "follow": true, - "add-redemption": true, - "update-redemption": true, - "add-reward": true, - "update-reward": true, - "remove-reward": true, - "add-moderator": true, - "remove-moderator": true, - "ban": true, - "unban": true, - "hype-train-begin": true, - "hype-train-progress": true, - "hype-train-end": true, + "subscribe": true, + "unsubscribe": true, + "gift": true, + "cheer": true, + "transaction": true, + "follow": true, + "add-redemption": true, + "update-redemption": true, + "add-reward": true, + "update-reward": true, + "remove-reward": true, + "add-moderator": true, + "remove-moderator": true, + "ban": true, + "unban": true, } var transportSupported = map[string]bool{ diff --git a/internal/events/trigger/trigger_event.go b/internal/events/trigger/trigger_event.go index 630da29e..f5b12bbd 100644 --- a/internal/events/trigger/trigger_event.go +++ b/internal/events/trigger/trigger_event.go @@ -61,6 +61,7 @@ func Fire(p TriggerParameters) (string, error) { IsAnonymous: p.IsAnonymous, Cost: p.Cost, Status: p.Status, + ItemID: p.ItemID, StreamTitle: p.StreamTitle, } diff --git a/internal/events/types/ban/ban.go b/internal/events/types/ban/ban.go new file mode 100644 index 00000000..83db53e7 --- /dev/null +++ b/internal/events/types/ban/ban.go @@ -0,0 +1,127 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package ban + +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" +) + +var transportsSupported = map[string]bool{ + models.TransportWebSub: true, + models.TransportEventSub: true, +} + +var triggerSupported = []string{"ban", "unban"} + +var triggerMapping = map[string]map[string]string{ + models.TransportWebSub: { + "ban": "moderation.user.ban", + "unban": "moderation.user.unban", + }, + models.TransportEventSub: { + "ban": "channel.ban", + "unban": "channel.unban", + }, +} + +type Event struct{} + +func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) { + var event []byte + var err error + + switch params.Transport { + case models.TransportEventSub: + body := *&models.EventsubResponse{ + Subscription: models.EventsubSubscription{ + ID: params.ID, + Status: "enabled", + Type: triggerMapping[params.Transport][params.Trigger], + Version: "1", + Condition: models.EventsubCondition{ + BroadcasterUserID: params.ToUserID, + }, + Transport: models.EventsubTransport{ + Method: "webhook", + Callback: "null", + }, + CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano), + }, + Event: models.BanEventSubEvent{ + UserID: params.FromUserID, + UserLogin: params.FromUserName, + UserName: params.FromUserName, + BroadcasterUserID: params.ToUserID, + BroadcasterUserLogin: params.ToUserName, + BroadcasterUserName: params.ToUserName, + ModeratorUserId: util.RandomUserID(), + ModeratorUserLogin: "CLIModerator", + ModeratorUserName: "CLIModerator", + Reason: "This is a test event", + EndsAt: util.GetTimestamp().Format(time.RFC3339Nano), + IsPermanent: params.IsPermanent, + }, + } + + event, err = json.Marshal(body) + if err != nil { + return events.MockEventResponse{}, err + } + + case models.TransportWebSub: + body := *&models.BanWebSubResponse{ + Data: []models.BanWebSubResponseData{ + { + ID: params.ID, + EventType: triggerMapping[params.Transport][params.Trigger], + EventTimestamp: util.GetTimestamp().Format(time.RFC3339), + Version: "v1", + EventData: models.BanWebSubEventData{ + BroadcasterID: params.ToUserID, + BroadcasterUserLogin: params.ToUserName, + BroadcasterName: params.ToUserName, + UserID: params.FromUserID, + UserLogin: params.FromUserName, + UserName: params.FromUserName, + ExpiresAt: util.GetTimestamp().Add(1 * time.Hour).Format(time.RFC3339), + }, + }, + }} + + 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/ban/ban_test.go b/internal/events/types/ban/ban_test.go new file mode 100644 index 00000000..e370b350 --- /dev/null +++ b/internal/events/types/ban/ban_test.go @@ -0,0 +1,136 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package ban + +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 TestEventSubBan(t *testing.T) { + a := util.SetupTestEnv(t) + params := events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportEventSub, + Trigger: "ban", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err, "Error generating body.") + + var body models.BanEventSubResponse + + err = json.Unmarshal(r.JSON, &body) + a.Nil(err, "Error unmarshalling JSON") + + a.Equal(toUser, body.Event.BroadcasterUserID, "Expected to user %v, got %v", toUser, body.Event.BroadcasterUserID) + a.Equal(fromUser, body.Event.UserID, "Expected from user %v, got %v", r.ToUser, body.Event.UserID) + + // test for unban + params = events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportEventSub, + Trigger: "unban", + } + + r, err = Event{}.GenerateEvent(params) + a.Nil(err) + + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + a.Equal(toUser, body.Event.BroadcasterUserID, "Expected to user %v, got %v", toUser, body.Event.BroadcasterUserID) + a.Equal(fromUser, body.Event.UserID, "Expected from user %v, got %v", fromUser, body.Event.UserID) +} + +func TestWebSubBan(t *testing.T) { + a := util.SetupTestEnv(t) + + params := *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "ban", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + + var body models.BanWebSubResponse + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID) + a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID) + + params = *&events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: models.TransportWebSub, + Trigger: "unban", + } + + r, err = Event{}.GenerateEvent(params) + a.Nil(err) + + err = json.Unmarshal(r.JSON, &body) + a.Nil(err) + + a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID) + a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID) + +} + +func TestFakeTransport(t *testing.T) { + a := util.SetupTestEnv(t) + + params := events.MockEventParameters{ + FromUserID: fromUser, + ToUserID: toUser, + Transport: "fake_transport", + Trigger: "unban", + } + + r, err := Event{}.GenerateEvent(params) + a.Nil(err) + a.Empty(r) +} + +func TestValidTrigger(t *testing.T) { + a := util.SetupTestEnv(t) + + r := Event{}.ValidTrigger("ban") + a.Equal(true, r) + + r = Event{}.ValidTrigger("unban") + a.Equal(true, r) + + r = Event{}.ValidTrigger("notban") + 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, "ban") + a.NotNil(r) +} 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/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.go b/internal/events/types/streamup/streamup.go index d8a2196e..84d6a3ec 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,30 @@ 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, + UserLogin: params.ToUserName, + UserName: params.ToUserName, + GameID: "509658", + 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), + }, + }, + } + event, err = json.Marshal(body) if err != nil { return events.MockEventResponse{}, err 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) diff --git a/internal/events/types/types.go b/internal/events/types/types.go index d2d065e1..4549244a 100644 --- a/internal/events/types/types.go +++ b/internal/events/types/types.go @@ -12,15 +12,13 @@ import ( "github.com/twitchdev/twitch-cli/internal/events/types/cheer" "github.com/twitchdev/twitch-cli/internal/events/types/extension_transaction" "github.com/twitchdev/twitch-cli/internal/events/types/follow" - "github.com/twitchdev/twitch-cli/internal/events/types/hype_train_begin" - "github.com/twitchdev/twitch-cli/internal/events/types/hype_train_end" - "github.com/twitchdev/twitch-cli/internal/events/types/hype_train_progress" "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" + "github.com/twitchdev/twitch-cli/internal/events/types/ban" ) func All() []events.MockEvent { @@ -38,9 +36,6 @@ func All() []events.MockEvent { streamdown.Event{}, moderator_change.Event{}, ban.Event{}, - hype_train_begin.Event{}, - hype_train_end.Event{}, - hype_train_progress.Event{}, } } diff --git a/internal/models/ban.go b/internal/models/ban.go new file mode 100644 index 00000000..0ade7f7e --- /dev/null +++ b/internal/models/ban.go @@ -0,0 +1,45 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package models + +type BanEventSubEvent struct { + UserID string `json:"user_id"` + UserLogin string `json:"user_login"` + UserName string `json:"user_name"` + BroadcasterUserID string `json:"broadcaster_user_id"` + BroadcasterUserLogin string `json:"broadcaster_user_login"` + BroadcasterUserName string `json:"broadcaster_user_name"` + ModeratorUserId string `json:"moderator_user_id"` + ModeratorUserLogin string `json:"moderator_user_login"` + ModeratorUserName string `json:"moderator_user_name"` + Reason string `json:"reason"` + EndsAt string `json:"ends_at"` + IsPermanent bool `json:"is_permanent"` +} + +type BanEventSubResponse struct { + Subscription EventsubSubscription `json:"ban"` + Event BanEventSubEvent `json:"event"` +} + +type BanWebSubResponse struct { + Data []BanWebSubResponseData `json:"data"` +} + +type BanWebSubResponseData struct { + ID string `json:"id"` + EventType string `json:"event_type"` + EventTimestamp string `json:"event_timestamp"` + Version string `json:"version"` + EventData BanWebSubEventData `json:"event_data"` +} + +type BanWebSubEventData struct { + BroadcasterID string `json:"broadcaster_id"` + BroadcasterUserLogin string `json:"broadcaster_login"` + BroadcasterName string `json:"broadcaster_name"` + UserID string `json:"user_id"` + UserLogin string `json:"user_login"` + UserName string `json:"user_name"` + ExpiresAt string `json:"expires_at"` +} 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 diff --git a/internal/models/streamup.go b/internal/models/streamup.go index 42d490de..5741f322 100644 --- a/internal/models/streamup.go +++ b/internal/models/streamup.go @@ -15,3 +15,22 @@ 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"` + UserLogin string `json:"user_login"` + UserName string `json:"user_name"` + GameID string `json:"game_id"` + 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