Skip to content

Commit fc486a3

Browse files
committed
Merge branch 'feature/autopagination' of https://github.com/twitchdev/twitch-cli into feature/autopagination
2 parents 7c056e3 + 12014ab commit fc486a3

File tree

8 files changed

+275
-2
lines changed

8 files changed

+275
-2
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = "0.4.0"
1+
version = "0.5.0"
22

33
release:
44
docker build . -t twitch-cli:latest

docs/event.md

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ Used to either create or send mock events for use with local webhooks testing.
3232
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
3333
| `streamup` | Only usable with the `eventsub` transport, a stream online event. |
3434
| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. |
35+
| `add-moderator` | Channel moderator add event. |
36+
| `remove-moderator` | Channel moderator removal event. |
3537

3638
**Flags**
3739

@@ -113,6 +115,8 @@ Allows you to test if your webserver responds to subscription requests properly.
113115
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
114116
| `streamup` | Only usable with the `eventsub` transport, a stream online event. |
115117
| `streamdown` | Only usable with the `eventsub` transport, a stream offline event. |
118+
| `add-moderator` | Channel moderator add event. |
119+
| `remove-moderator` | Channel moderator removal event. |
116120

117121
**Flags**
118122

internal/events/models.go

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ var triggerSupported = map[string]bool{
1414
"add-reward": true,
1515
"update-reward": true,
1616
"remove-reward": true,
17+
"add-moderator": true,
18+
"remove-moderator": true,
1719
}
1820

1921
var transportSupported = map[string]bool{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package moderator_change
5+
6+
import (
7+
"encoding/json"
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{"add-moderator", "remove-moderator"}
21+
22+
var triggerMapping = map[string]map[string]string{
23+
models.TransportWebSub: {
24+
"add-moderator": "moderation.moderator.add",
25+
"remove-moderator": "moderation.moderator.remove",
26+
},
27+
models.TransportEventSub: {
28+
"add-moderator": "channel.moderator.add",
29+
"remove-moderator": "channel.moderator.remove",
30+
},
31+
}
32+
33+
type Event struct{}
34+
35+
func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) {
36+
var event []byte
37+
var err error
38+
39+
switch params.Transport {
40+
case models.TransportEventSub:
41+
body := *&models.EventsubResponse{
42+
Subscription: models.EventsubSubscription{
43+
ID: params.ID,
44+
Status: "enabled",
45+
Type: triggerMapping[params.Transport][params.Trigger],
46+
Version: "beta",
47+
Condition: models.EventsubCondition{
48+
BroadcasterUserID: params.ToUserID,
49+
},
50+
Transport: models.EventsubTransport{
51+
Method: "webhook",
52+
Callback: "null",
53+
},
54+
CreatedAt: util.GetTimestamp().Format(time.RFC3339Nano),
55+
},
56+
Event: models.ModeratorChangeEventSubEvent{
57+
UserID: params.FromUserID,
58+
UserLogin: params.FromUserName,
59+
UserName: params.FromUserName,
60+
BroadcasterUserID: params.ToUserID,
61+
BroadcasterUserLogin: params.ToUserName,
62+
BroadcasterUserName: params.ToUserName,
63+
},
64+
}
65+
66+
event, err = json.Marshal(body)
67+
if err != nil {
68+
return events.MockEventResponse{}, err
69+
}
70+
case models.TransportWebSub:
71+
body := *&models.ModeratorChangeWebSubResponse{
72+
Data: []models.ModeratorChangeWebSubEvent{
73+
{
74+
ID: params.ID,
75+
EventType: triggerMapping[params.Transport][params.Trigger],
76+
EventTimestamp: util.GetTimestamp().Format(time.RFC3339),
77+
Version: "v1",
78+
EventData: models.ModeratorChangeEventData{
79+
BroadcasterID: params.ToUserID,
80+
BroadcasterName: params.ToUserName,
81+
UserID: params.FromUserID,
82+
UserName: params.FromUserName,
83+
},
84+
},
85+
},
86+
}
87+
event, err = json.Marshal(body)
88+
if err != nil {
89+
return events.MockEventResponse{}, err
90+
}
91+
92+
default:
93+
return events.MockEventResponse{}, nil
94+
}
95+
96+
return events.MockEventResponse{
97+
ID: params.ID,
98+
JSON: event,
99+
FromUser: params.FromUserID,
100+
ToUser: params.ToUserID,
101+
}, nil
102+
}
103+
104+
func (e Event) ValidTransport(t string) bool {
105+
return transportsSupported[t]
106+
}
107+
108+
func (e Event) ValidTrigger(t string) bool {
109+
for _, ts := range triggerSupported {
110+
if ts == t {
111+
return true
112+
}
113+
}
114+
return false
115+
}
116+
func (e Event) GetTopic(transport string, trigger string) string {
117+
return triggerMapping[transport][trigger]
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package moderator_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: "add-moderator",
25+
}
26+
27+
r, err := Event{}.GenerateEvent(params)
28+
a.Nil(err)
29+
30+
var body models.ModeratorChangeEventSubResponse
31+
err = json.Unmarshal(r.JSON, &body)
32+
a.Nil(err)
33+
34+
a.Equal("channel.moderator.add", body.Subscription.Type, "Expected event type %v, got %v", "channel.moderator.add", body.Subscription.Type)
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 TestWebSub(t *testing.T) {
40+
a := util.SetupTestEnv(t)
41+
42+
params := *&events.MockEventParameters{
43+
FromUserID: fromUser,
44+
ToUserID: toUser,
45+
Transport: models.TransportWebSub,
46+
Trigger: "add-moderator",
47+
}
48+
49+
r, err := Event{}.GenerateEvent(params)
50+
a.Nil(err)
51+
52+
var body models.ModeratorChangeWebSubResponse
53+
err = json.Unmarshal(r.JSON, &body)
54+
a.Nil(err)
55+
56+
a.Equal("moderation.moderator.add", body.Data[0].EventType, "Expected event type %v, got %v", "moderation.moderator.add", body.Data[0].EventType)
57+
a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID)
58+
a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID)
59+
60+
params = *&events.MockEventParameters{
61+
FromUserID: fromUser,
62+
ToUserID: toUser,
63+
Transport: models.TransportWebSub,
64+
}
65+
}
66+
func TestFakeTransport(t *testing.T) {
67+
a := util.SetupTestEnv(t)
68+
69+
params := *&events.MockEventParameters{
70+
FromUserID: fromUser,
71+
ToUserID: toUser,
72+
Transport: "fake_transport",
73+
Trigger: "add-moderator",
74+
}
75+
76+
r, err := Event{}.GenerateEvent(params)
77+
a.Nil(err)
78+
a.Empty(r)
79+
}
80+
func TestValidTrigger(t *testing.T) {
81+
a := util.SetupTestEnv(t)
82+
83+
r := Event{}.ValidTrigger("add-moderator")
84+
a.Equal(true, r)
85+
86+
r = Event{}.ValidTrigger("remove-moderator")
87+
a.Equal(true, r)
88+
89+
r = Event{}.ValidTrigger("update-moderator")
90+
a.Equal(false, r)
91+
}
92+
93+
func TestValidTransport(t *testing.T) {
94+
a := util.SetupTestEnv(t)
95+
96+
r := Event{}.ValidTransport(models.TransportWebSub)
97+
a.Equal(true, r)
98+
99+
r = Event{}.ValidTransport(models.TransportEventSub)
100+
a.Equal(true, r)
101+
}
102+
103+
func TestGetTopic(t *testing.T) {
104+
a := util.SetupTestEnv(t)
105+
106+
r := Event{}.GetTopic(models.TransportWebSub, "add-moderator")
107+
a.Equal("moderation.moderator.add", r, "Expected %v, got %v", "moderation.moderator.add", r)
108+
109+
r = Event{}.GetTopic(models.TransportWebSub, "remove-moderator")
110+
a.Equal("moderation.moderator.remove", r, "Expected %v, got %v", "moderation.moderator.remove", r)
111+
}

internal/events/types/subscribe/sub_event.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
7575
UserLogin: params.FromUserName,
7676
UserName: params.FromUserName,
7777
BroadcasterUserID: params.ToUserID,
78-
BroadcasterUserLogin: params.ToUserID,
78+
BroadcasterUserLogin: params.ToUserName,
7979
BroadcasterUserName: params.ToUserName,
8080
Tier: "1000",
8181
IsGift: params.IsGift,

internal/events/types/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/twitchdev/twitch-cli/internal/events/types/cheer"
1313
"github.com/twitchdev/twitch-cli/internal/events/types/extension_transaction"
1414
"github.com/twitchdev/twitch-cli/internal/events/types/follow"
15+
"github.com/twitchdev/twitch-cli/internal/events/types/moderator_change"
1516
"github.com/twitchdev/twitch-cli/internal/events/types/raid"
1617
"github.com/twitchdev/twitch-cli/internal/events/types/streamdown"
1718
"github.com/twitchdev/twitch-cli/internal/events/types/streamup"
@@ -30,6 +31,7 @@ func All() []events.MockEvent {
3031
subscribe.Event{},
3132
streamup.Event{},
3233
streamdown.Event{},
34+
moderator_change.Event{},
3335
}
3436
}
3537

internal/models/moderator_change.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package models
4+
5+
type ModeratorChangeWebSubEvent struct {
6+
ID string `json:"id"`
7+
EventType string `json:"event_type"`
8+
EventTimestamp string `json:"event_timestamp"`
9+
Version string `json:"version"`
10+
EventData ModeratorChangeEventData `json:"event_data"`
11+
}
12+
13+
type ModeratorChangeEventData struct {
14+
BroadcasterID string `json:"broadcaster_id"`
15+
BroadcasterName string `json:"broadcaster_name"`
16+
UserID string `json:"user_id"`
17+
UserName string `json:"user_name"`
18+
}
19+
20+
type ModeratorChangeWebSubResponse struct {
21+
Data []ModeratorChangeWebSubEvent `json:"data"`
22+
}
23+
24+
type ModeratorChangeEventSubResponse struct {
25+
Subscription EventsubSubscription `json:"subscription"`
26+
Event ModeratorChangeEventSubEvent `json:"event"`
27+
}
28+
29+
type ModeratorChangeEventSubEvent struct {
30+
UserID string `json:"user_id"`
31+
UserLogin string `json:"user_login"`
32+
UserName string `json:"user_name"`
33+
BroadcasterUserID string `json:"broadcaster_user_id"`
34+
BroadcasterUserLogin string `json:"broadcaster_user_login"`
35+
BroadcasterUserName string `json:"broadcaster_user_name"`
36+
}

0 commit comments

Comments
 (0)