Skip to content

Commit

Permalink
Merge pull request #41 from twitchdev/moderator-add-remove
Browse files Browse the repository at this point in the history
Moderator change events on WebSub
  • Loading branch information
vpolouchkine committed Mar 8, 2021
2 parents 3a8ae64 + 7b2053e commit a92cdfe
Show file tree
Hide file tree
Showing 6 changed files with 206 additions and 0 deletions.
4 changes: 4 additions & 0 deletions docs/event.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ Used to either create or send mock events for use with local webhooks testing.
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
| `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. |

**Flags**

Expand Down Expand Up @@ -113,6 +115,8 @@ Allows you to test if your webserver responds to subscription requests properly.
| `revoke` | User authorization revoke event. Uses local Client as set in `twitch configure` or generates one randomly. |
| `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. |

**Flags**

Expand Down
2 changes: 2 additions & 0 deletions internal/events/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ var triggerSupported = map[string]bool{
"add-reward": true,
"update-reward": true,
"remove-reward": true,
"add-moderator": true,
"remove-moderator": true,
}

var transportSupported = map[string]bool{
Expand Down
87 changes: 87 additions & 0 deletions internal/events/types/moderator_change/moderator_change_event.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package moderator_change

import (
"encoding/json"
"errors"
"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: false,
}

var triggerSupported = []string{"add-moderator", "remove-moderator"}

var triggerMapping = map[string]map[string]string{
models.TransportWebSub: {
"add-moderator": "moderation.moderator.add",
"remove-moderator": "moderation.moderator.remove",
},
}

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:
return events.MockEventResponse{}, errors.New("Moderator change events are currently in beta on EventSub")
case models.TransportWebSub:
body := *&models.ModeratorChangeWebSubResponse{
Data: []models.ModeratorChangeWebSubEvent{
{
ID: params.ID,
EventType: triggerMapping[params.Transport][params.Trigger],
EventTimestamp: util.GetTimestamp().Format(time.RFC3339),
Version: "v1",
EventData: models.ModeratorChangeEventData{
BroadcasterID: params.ToUserID,
BroadcasterName: params.ToUserName,
UserID: params.FromUserID,
UserName: params.FromUserName,
},
},
},
}
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]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package moderator_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 TestWebSub(t *testing.T) {
a := util.SetupTestEnv(t)

params := *&events.MockEventParameters{
FromUserID: fromUser,
ToUserID: toUser,
Transport: models.TransportWebSub,
Trigger: "add-moderator",
}

r, err := Event{}.GenerateEvent(params)
a.Nil(err)

var body models.ModeratorChangeWebSubResponse
err = json.Unmarshal(r.JSON, &body)
a.Nil(err)

a.Equal("moderation.moderator.add", body.Data[0].EventType, "Expected event type %v, got %v", "moderation.moderator.add", body.Data[0].EventType)
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,
}
}
func TestFakeTransport(t *testing.T) {
a := util.SetupTestEnv(t)

params := *&events.MockEventParameters{
FromUserID: fromUser,
ToUserID: toUser,
Transport: "fake_transport",
Trigger: "add-moderator",
}

r, err := Event{}.GenerateEvent(params)
a.Nil(err)
a.Empty(r)
}
func TestValidTrigger(t *testing.T) {
a := util.SetupTestEnv(t)

r := Event{}.ValidTrigger("add-moderator")
a.Equal(true, r)

r = Event{}.ValidTrigger("remove-moderator")
a.Equal(true, r)

r = Event{}.ValidTrigger("update-moderator")
a.Equal(false, r)
}

func TestValidTransport(t *testing.T) {
a := util.SetupTestEnv(t)

r := Event{}.ValidTransport(models.TransportWebSub)
a.Equal(true, r)

r = Event{}.ValidTransport(models.TransportEventSub)
a.Equal(false, r)
}

func TestGetTopic(t *testing.T) {
a := util.SetupTestEnv(t)

r := Event{}.GetTopic(models.TransportWebSub, "add-moderator")
a.Equal("moderation.moderator.add", r, "Expected %v, got %v", "moderation.moderator.add", r)

r = Event{}.GetTopic(models.TransportWebSub, "remove-moderator")
a.Equal("moderation.moderator.remove", r, "Expected %v, got %v", "moderation.moderator.remove", r)
}
2 changes: 2 additions & 0 deletions internal/events/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ 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/moderator_change"
"github.com/twitchdev/twitch-cli/internal/events/types/raid"
"github.com/twitchdev/twitch-cli/internal/events/types/streamdown"
"github.com/twitchdev/twitch-cli/internal/events/types/streamup"
Expand All @@ -30,6 +31,7 @@ func All() []events.MockEvent {
subscribe.Event{},
streamup.Event{},
streamdown.Event{},
moderator_change.Event{},
}
}

Expand Down
22 changes: 22 additions & 0 deletions internal/models/moderator_change.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package models

type ModeratorChangeWebSubEvent struct {
ID string `json:"id"`
EventType string `json:"event_type"`
EventTimestamp string `json:"event_timestamp"`
Version string `json:"version"`
EventData ModeratorChangeEventData `json:"event_data"`
}

type ModeratorChangeEventData struct {
BroadcasterID string `json:"broadcaster_id"`
BroadcasterName string `json:"broadcaster_name"`
UserID string `json:"user_id"`
UserName string `json:"user_name"`
}

type ModeratorChangeWebSubResponse struct {
Data []ModeratorChangeWebSubEvent `json:"data"`
}

0 comments on commit a92cdfe

Please sign in to comment.