Skip to content

Commit d124583

Browse files
author
Val Polouchkine
committed
moderator change websub events
1 parent 3a8ae64 commit d124583

File tree

7 files changed

+207
-0
lines changed

7 files changed

+207
-0
lines changed

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` | Broadcaster add a moderator to their channel. |
36+
| `remove-moderator` | Broadcaster removes a moderator from their channel. |
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` | Broadcaster add a moderator to their channel. |
119+
| `remove-moderator` | Broadcaster removes a moderator from their channel. |
116120

117121
**Flags**
118122

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.14
44

55
require (
66
github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2
7+
github.com/davecgh/go-spew v1.1.1
78
github.com/fatih/color v1.10.0
89
github.com/hokaccha/go-prettyjson v0.0.0-20201222001619-a42f9ac2ec8e // indirect
910
github.com/karalabe/xgo v0.0.0-20191115072854-c5ccff8648a7 // indirect

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,87 @@
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+
"errors"
9+
"time"
10+
11+
"github.com/twitchdev/twitch-cli/internal/events"
12+
"github.com/twitchdev/twitch-cli/internal/models"
13+
"github.com/twitchdev/twitch-cli/internal/util"
14+
)
15+
16+
var transportsSupported = map[string]bool{
17+
models.TransportWebSub: true,
18+
models.TransportEventSub: false,
19+
}
20+
21+
var triggerSupported = []string{"add-moderator", "remove-moderator"}
22+
23+
var triggerMapping = map[string]map[string]string{
24+
models.TransportWebSub: {
25+
"add-moderator": "moderation.moderator.add",
26+
"remove-moderator": "moderation.moderator.remove",
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.TransportEventSub:
38+
return events.MockEventResponse{}, errors.New("Moderator change events are currently in beta on EventSub")
39+
case models.TransportWebSub:
40+
body := *&models.ModeratorChangeWebSubResponse{
41+
Data: []models.ModeratorChangeWebSubEvent{
42+
{
43+
ID: params.ID,
44+
EventType: triggerMapping[params.Transport][params.Trigger],
45+
EventTimestamp: util.GetTimestamp().Format(time.RFC3339),
46+
Version: "v1",
47+
EventData: models.ModeratorChangeEventData{
48+
BroadcasterID: params.ToUserID,
49+
BroadcasterName: params.ToUserName,
50+
UserID: params.FromUserID,
51+
UserName: params.FromUserName,
52+
},
53+
},
54+
},
55+
}
56+
event, err = json.Marshal(body)
57+
if err != nil {
58+
return events.MockEventResponse{}, err
59+
}
60+
61+
default:
62+
return events.MockEventResponse{}, nil
63+
}
64+
65+
return events.MockEventResponse{
66+
ID: params.ID,
67+
JSON: event,
68+
FromUser: params.FromUserID,
69+
ToUser: params.ToUserID,
70+
}, nil
71+
}
72+
73+
func (e Event) ValidTransport(t string) bool {
74+
return transportsSupported[t]
75+
}
76+
77+
func (e Event) ValidTrigger(t string) bool {
78+
for _, ts := range triggerSupported {
79+
if ts == t {
80+
return true
81+
}
82+
}
83+
return false
84+
}
85+
func (e Event) GetTopic(transport string, trigger string) string {
86+
return triggerMapping[transport][trigger]
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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 TestWebSub(t *testing.T) {
18+
a := util.SetupTestEnv(t)
19+
20+
params := *&events.MockEventParameters{
21+
FromUserID: fromUser,
22+
ToUserID: toUser,
23+
Transport: models.TransportWebSub,
24+
Trigger: "add-moderator",
25+
}
26+
27+
r, err := Event{}.GenerateEvent(params)
28+
a.Nil(err)
29+
30+
var body models.ModeratorChangeWebSubResponse
31+
err = json.Unmarshal(r.JSON, &body)
32+
a.Nil(err)
33+
34+
a.Equal("moderation.moderator.add", body.Data[0].EventType, "Expected event type %v, got %v", "moderation.moderator.add", body.Data[0].EventType)
35+
a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID)
36+
a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID)
37+
38+
params = *&events.MockEventParameters{
39+
FromUserID: fromUser,
40+
ToUserID: toUser,
41+
Transport: models.TransportWebSub,
42+
}
43+
}
44+
func TestFakeTransport(t *testing.T) {
45+
a := util.SetupTestEnv(t)
46+
47+
params := *&events.MockEventParameters{
48+
FromUserID: fromUser,
49+
ToUserID: toUser,
50+
Transport: "fake_transport",
51+
Trigger: "add-moderator",
52+
}
53+
54+
r, err := Event{}.GenerateEvent(params)
55+
a.Nil(err)
56+
a.Empty(r)
57+
}
58+
func TestValidTrigger(t *testing.T) {
59+
a := util.SetupTestEnv(t)
60+
61+
r := Event{}.ValidTrigger("add-moderator")
62+
a.Equal(true, r)
63+
64+
r = Event{}.ValidTrigger("remove-moderator")
65+
a.Equal(true, r)
66+
67+
r = Event{}.ValidTrigger("update-moderator")
68+
a.Equal(false, r)
69+
}
70+
71+
func TestValidTransport(t *testing.T) {
72+
a := util.SetupTestEnv(t)
73+
74+
r := Event{}.ValidTransport(models.TransportWebSub)
75+
a.Equal(true, r)
76+
77+
r = Event{}.ValidTransport(models.TransportEventSub)
78+
a.Equal(false, r)
79+
}
80+
81+
func TestGetTopic(t *testing.T) {
82+
a := util.SetupTestEnv(t)
83+
84+
r := Event{}.GetTopic(models.TransportWebSub, "add-moderator")
85+
a.Equal("moderation.moderator.add", r, "Expected %v, got %v", "moderation.moderator.add", r)
86+
87+
r = Event{}.GetTopic(models.TransportWebSub, "remove-moderator")
88+
a.Equal("moderation.moderator.remove", r, "Expected %v, got %v", "moderation.moderator.remove", r)
89+
}

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

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
}

0 commit comments

Comments
 (0)