Skip to content

Commit a4ea3e1

Browse files
committed
Added channel.ad_break.begin
1 parent f491ba8 commit a4ea3e1

File tree

4 files changed

+233
-0
lines changed

4 files changed

+233
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package ad_break
4+
5+
import (
6+
"encoding/json"
7+
"strings"
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.TransportWebhook: true,
17+
models.TransportWebSocket: true,
18+
}
19+
var triggers = []string{"ad-begin"}
20+
21+
var triggerMapping = map[string]map[string]string{
22+
models.TransportWebhook: {
23+
"ad-begin": "channel.ad_break.begin",
24+
},
25+
models.TransportWebSocket: {
26+
"ad-begin": "channel.ad_break.begin",
27+
},
28+
}
29+
30+
type Event struct{}
31+
32+
func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) {
33+
var event []byte
34+
var err error
35+
36+
switch params.Transport {
37+
case models.TransportWebhook, models.TransportWebSocket:
38+
body := models.EventsubResponse{
39+
Subscription: models.EventsubSubscription{
40+
ID: params.ID,
41+
Status: params.SubscriptionStatus,
42+
Type: triggerMapping[params.Transport][params.Trigger],
43+
Version: e.SubscriptionVersion(),
44+
Condition: models.EventsubCondition{
45+
BroadcasterUserID: params.ToUserID,
46+
},
47+
Transport: models.EventsubTransport{
48+
Method: "webhook",
49+
Callback: "null",
50+
},
51+
Cost: 0,
52+
CreatedAt: params.Timestamp,
53+
},
54+
Event: models.AdBreakBeginEventSubEvent{
55+
RequesterUserID: params.FromUserID,
56+
RequesterUserLogin: params.FromUserName,
57+
RequesterUserName: params.FromUserName,
58+
BroadcasterUserID: params.ToUserID,
59+
BroadcasterUserLogin: params.ToUserName,
60+
BroadcasterUserName: params.ToUserName,
61+
Duration: 60,
62+
IsAutomatic: false,
63+
StartedAt: util.GetTimestamp().Format(time.RFC3339Nano),
64+
},
65+
}
66+
67+
event, err = json.Marshal(body)
68+
if err != nil {
69+
return events.MockEventResponse{}, err
70+
}
71+
72+
// Delete event info if Subscription.Status is not set to "enabled"
73+
if !strings.EqualFold(params.SubscriptionStatus, "enabled") {
74+
var i interface{}
75+
if err := json.Unmarshal([]byte(event), &i); err != nil {
76+
return events.MockEventResponse{}, err
77+
}
78+
if m, ok := i.(map[string]interface{}); ok {
79+
delete(m, "event") // Matches JSON key defined in body variable above
80+
}
81+
82+
event, err = json.Marshal(i)
83+
if err != nil {
84+
return events.MockEventResponse{}, err
85+
}
86+
}
87+
default:
88+
return events.MockEventResponse{}, nil
89+
}
90+
91+
return events.MockEventResponse{
92+
ID: params.ID,
93+
JSON: event,
94+
FromUser: params.FromUserID,
95+
ToUser: params.ToUserID,
96+
}, nil
97+
}
98+
99+
func (e Event) ValidTransport(transport string) bool {
100+
return transportsSupported[transport]
101+
}
102+
103+
func (e Event) ValidTrigger(trigger string) bool {
104+
for _, t := range triggers {
105+
if t == trigger {
106+
return true
107+
}
108+
}
109+
return false
110+
}
111+
func (e Event) GetTopic(transport string, trigger string) string {
112+
return triggerMapping[transport][trigger]
113+
}
114+
func (e Event) GetAllTopicsByTransport(transport string) []string {
115+
allTopics := []string{}
116+
for _, topic := range triggerMapping[transport] {
117+
allTopics = append(allTopics, topic)
118+
}
119+
return allTopics
120+
}
121+
func (e Event) GetEventSubAlias(t string) string {
122+
// check for aliases
123+
for trigger, topic := range triggerMapping[models.TransportWebhook] {
124+
if topic == t {
125+
return trigger
126+
}
127+
}
128+
return ""
129+
}
130+
131+
func (e Event) SubscriptionVersion() string {
132+
return "1"
133+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package ad_break
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.TransportWebhook,
24+
Trigger: "subscribe",
25+
SubscriptionStatus: "enabled",
26+
}
27+
28+
r, err := Event{}.GenerateEvent(params)
29+
a.Nil(err)
30+
31+
var body models.SubEventSubResponse
32+
err = json.Unmarshal(r.JSON, &body)
33+
a.Nil(err)
34+
35+
a.Equal(toUser, body.Event.BroadcasterUserID, "Expected to user %v, got %v", toUser, body.Event.BroadcasterUserID)
36+
a.Equal(fromUser, body.Event.UserID, "Expected from user %v, got %v", r.ToUser, body.Event.UserID)
37+
}
38+
39+
func TestFakeTransport(t *testing.T) {
40+
a := test_setup.SetupTestEnv(t)
41+
42+
params := events.MockEventParameters{
43+
FromUserID: fromUser,
44+
ToUserID: toUser,
45+
Transport: "fake_transport",
46+
Trigger: triggers[0],
47+
SubscriptionStatus: "enabled",
48+
}
49+
50+
r, err := Event{}.GenerateEvent(params)
51+
a.Nil(err)
52+
a.Empty(r)
53+
}
54+
func TestValidTrigger(t *testing.T) {
55+
a := test_setup.SetupTestEnv(t)
56+
57+
r := Event{}.ValidTrigger("notreal")
58+
a.Equal(false, r)
59+
60+
r = Event{}.ValidTrigger("follow")
61+
a.Equal(true, r)
62+
}
63+
64+
func TestValidTransport(t *testing.T) {
65+
a := test_setup.SetupTestEnv(t)
66+
67+
r := Event{}.ValidTransport(models.TransportWebhook)
68+
a.Equal(true, r)
69+
70+
r = Event{}.ValidTransport("noteventsub")
71+
a.Equal(false, r)
72+
}
73+
func TestGetTopic(t *testing.T) {
74+
a := test_setup.SetupTestEnv(t)
75+
76+
r := Event{}.GetTopic(models.TransportWebhook, "follow")
77+
a.NotNil(r)
78+
}

internal/events/types/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/twitchdev/twitch-cli/internal/events"
12+
"github.com/twitchdev/twitch-cli/internal/events/types/ad_break"
1213
"github.com/twitchdev/twitch-cli/internal/events/types/authorization_grant"
1314
"github.com/twitchdev/twitch-cli/internal/events/types/authorization_revoke"
1415
"github.com/twitchdev/twitch-cli/internal/events/types/ban"
@@ -41,6 +42,7 @@ import (
4142

4243
func AllEvents() []events.MockEvent {
4344
return []events.MockEvent{
45+
ad_break.Event{},
4446
authorization_grant.Event{},
4547
authorization_revoke.Event{},
4648
ban.Event{},

internal/models/ad_break.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package models
4+
5+
type AdBreakBeginEventSubEvent struct {
6+
BroadcasterUserID string `json:"broadcaster_user_id"`
7+
BroadcasterUserLogin string `json:"broadcaster_user_login"`
8+
BroadcasterUserName string `json:"broadcaster_user_name"`
9+
RequesterUserID string `json:"requester_user_id"`
10+
RequesterUserLogin string `json:"requester_user_login"`
11+
RequesterUserName string `json:"requester_user_name"`
12+
Duration int `json:"duration_seconds"`
13+
IsAutomatic bool `json:"is_automatic"`
14+
StartedAt string `json:"started_at"`
15+
}
16+
17+
type AdBreakBeginEventSubResponse struct {
18+
Subscription EventsubSubscription `json:"subscription"`
19+
Event AdBreakBeginEventSubEvent `json:"event"`
20+
}

0 commit comments

Comments
 (0)