Skip to content

Commit 5209302

Browse files
committed
Added unban requests events
1 parent 3c1437c commit 5209302

File tree

4 files changed

+286
-0
lines changed

4 files changed

+286
-0
lines changed

internal/events/types/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/twitchdev/twitch-cli/internal/events/types/subscribe"
3737
"github.com/twitchdev/twitch-cli/internal/events/types/subscription_message"
3838
"github.com/twitchdev/twitch-cli/internal/events/types/unban"
39+
"github.com/twitchdev/twitch-cli/internal/events/types/unban_requests"
3940
user_update "github.com/twitchdev/twitch-cli/internal/events/types/user"
4041
"github.com/twitchdev/twitch-cli/internal/models"
4142
)
@@ -69,6 +70,7 @@ func AllEvents() []events.MockEvent {
6970
subscribe.Event{},
7071
subscription_message.Event{},
7172
unban.Event{},
73+
unban_requests.Event{},
7274
user_update.Event{},
7375
}
7476
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package unban_requests
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{"unban-request-create", "unban-request-resolve"}
20+
21+
var triggerMapping = map[string]map[string]string{
22+
models.TransportWebhook: {
23+
"unban-request-create": "channel.unban_request.create",
24+
"unban-request-resolve": "channel.unban_request.resolve",
25+
},
26+
models.TransportWebSocket: {
27+
"unban-request-create": "channel.unban_request.create",
28+
"unban-request-resolve": "channel.unban_request.resolve",
29+
},
30+
}
31+
32+
type Event struct{}
33+
34+
func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEventResponse, error) {
35+
var event []byte
36+
var err error
37+
38+
var unbanRequestEvent interface{}
39+
40+
if params.Trigger == "unban-request-create" {
41+
unbanRequestEvent = models.UnbanRequestCreateEventSubEvent{
42+
BroadcasterUserID: params.ToUserID,
43+
BroadcasterUserName: params.ToUserName,
44+
BroadcasterUserLogin: strings.ToLower(params.ToUserName),
45+
UserID: params.FromUserID,
46+
UserName: params.FromUserName,
47+
UserLogin: strings.ToLower(params.FromUserName),
48+
Text: "Please unban me!",
49+
CreatedAt: util.GetTimestamp().Add(-30 * time.Minute).Format(time.RFC3339Nano),
50+
}
51+
}
52+
53+
if params.Trigger == "unban-request-resolve" {
54+
mod_user := util.RandomUserID()
55+
mod_user_lower := strings.ToLower(mod_user)
56+
mod_user_id := util.RandomUserID()
57+
58+
unbanRequestEvent = models.UnbanRequestResolveEventSubEvent{
59+
ID: util.RandomGUID(),
60+
BroadcasterUserID: params.ToUserID,
61+
BroadcasterUserName: params.ToUserName,
62+
BroadcasterUserLogin: strings.ToLower(params.ToUserName),
63+
ModeratorUserID: &mod_user_id,
64+
ModeratorUserName: &mod_user,
65+
ModeratorUserLogin: &mod_user_lower,
66+
UserID: params.FromUserID,
67+
UserName: params.FromUserName,
68+
UserLogin: strings.ToLower(params.FromUserName),
69+
ResolutionText: "We forgive you",
70+
Status: "approved",
71+
}
72+
}
73+
74+
switch params.Transport {
75+
case models.TransportWebhook, models.TransportWebSocket:
76+
body := models.EventsubResponse{
77+
Subscription: models.EventsubSubscription{
78+
ID: params.ID,
79+
Type: triggerMapping[params.Transport][params.Trigger],
80+
Version: e.SubscriptionVersion(),
81+
Status: params.SubscriptionStatus,
82+
Cost: 0,
83+
Condition: models.EventsubCondition{
84+
BroadcasterUserID: params.ToUserID,
85+
ModeratorUserID: params.FromUserID,
86+
},
87+
Transport: models.EventsubTransport{
88+
Method: "webhook",
89+
Callback: "null",
90+
},
91+
CreatedAt: params.Timestamp,
92+
},
93+
Event: unbanRequestEvent,
94+
}
95+
96+
event, err = json.Marshal(body)
97+
if err != nil {
98+
return events.MockEventResponse{}, err
99+
}
100+
101+
// Delete event info if Subscription.Status is not set to "enabled"
102+
if !strings.EqualFold(params.SubscriptionStatus, "enabled") {
103+
var i interface{}
104+
if err := json.Unmarshal([]byte(event), &i); err != nil {
105+
return events.MockEventResponse{}, err
106+
}
107+
if m, ok := i.(map[string]interface{}); ok {
108+
delete(m, "event") // Matches JSON key defined in body variable above
109+
}
110+
111+
event, err = json.Marshal(i)
112+
if err != nil {
113+
return events.MockEventResponse{}, err
114+
}
115+
}
116+
default:
117+
return events.MockEventResponse{}, nil
118+
}
119+
120+
return events.MockEventResponse{
121+
ID: params.ID,
122+
JSON: event,
123+
ToUser: params.ToUserID,
124+
}, nil
125+
}
126+
127+
func (e Event) ValidTransport(transport string) bool {
128+
return transportsSupported[transport]
129+
}
130+
131+
func (e Event) ValidTrigger(trigger string) bool {
132+
for _, t := range triggers {
133+
if t == trigger {
134+
return true
135+
}
136+
}
137+
return false
138+
}
139+
func (e Event) GetTopic(transport string, trigger string) string {
140+
return triggerMapping[transport][trigger]
141+
}
142+
func (e Event) GetAllTopicsByTransport(transport string) []string {
143+
allTopics := []string{}
144+
for _, topic := range triggerMapping[transport] {
145+
allTopics = append(allTopics, topic)
146+
}
147+
return allTopics
148+
}
149+
func (e Event) GetEventSubAlias(t string) string {
150+
// check for aliases
151+
for trigger, topic := range triggerMapping[models.TransportWebhook] {
152+
if topic == t {
153+
return trigger
154+
}
155+
}
156+
return ""
157+
}
158+
159+
func (e Event) SubscriptionVersion() string {
160+
return "1"
161+
}
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 unban_requests
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 TestEventSubUnbanRequests(t *testing.T) {
18+
testEventSubUnbanRequests(t, "unban-request-create")
19+
testEventSubUnbanRequests(t, "unban-request-resolve")
20+
}
21+
22+
func testEventSubUnbanRequests(t *testing.T, trigger string) {
23+
a := test_setup.SetupTestEnv(t)
24+
params := events.MockEventParameters{
25+
FromUserID: fromUser,
26+
ToUserID: toUser,
27+
Transport: models.TransportWebhook,
28+
Trigger: trigger,
29+
SubscriptionStatus: "enabled",
30+
}
31+
32+
r, err := Event{}.GenerateEvent(params)
33+
a.Nil(err, "Error generating body.")
34+
35+
var body models.UnbanRequestCreateEventSubResponse
36+
37+
err = json.Unmarshal(r.JSON, &body)
38+
a.Nil(err, "Error unmarshalling JSON")
39+
40+
a.Equal(toUser, body.Event.BroadcasterUserID, "Expected to user %v, got %v", toUser, body.Event.BroadcasterUserID)
41+
if trigger == "unban-request-create" {
42+
a.Equal(fromUser, body.Event.UserID, "Expected from user %v, got %v", r.ToUser, body.Event.UserID)
43+
}
44+
}
45+
46+
func TestFakeTransport(t *testing.T) {
47+
a := test_setup.SetupTestEnv(t)
48+
49+
params := events.MockEventParameters{
50+
FromUserID: fromUser,
51+
ToUserID: toUser,
52+
Transport: "fake_transport",
53+
Trigger: "unban-request-create",
54+
}
55+
56+
r, err := Event{}.GenerateEvent(params)
57+
a.Nil(err)
58+
a.Empty(r)
59+
}
60+
61+
func TestValidTrigger(t *testing.T) {
62+
a := test_setup.SetupTestEnv(t)
63+
64+
r := Event{}.ValidTrigger("unban-request-create")
65+
a.Equal(true, r)
66+
67+
r = Event{}.ValidTrigger("unban-request-resolve")
68+
a.Equal(true, r)
69+
}
70+
71+
func TestValidTransport(t *testing.T) {
72+
a := test_setup.SetupTestEnv(t)
73+
74+
r := Event{}.ValidTransport(models.TransportWebhook)
75+
a.Equal(true, r)
76+
77+
r = Event{}.ValidTransport("noteventsub")
78+
a.Equal(false, r)
79+
}
80+
81+
func TestGetTopic(t *testing.T) {
82+
a := test_setup.SetupTestEnv(t)
83+
84+
r := Event{}.GetTopic(models.TransportWebhook, "unban-request-create")
85+
a.NotNil(r)
86+
87+
r = Event{}.GetTopic(models.TransportWebhook, "unban-request-resolve")
88+
a.NotNil(r)
89+
}

internal/models/unban_requests.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package models
4+
5+
type UnbanRequestCreateEventSubEvent struct {
6+
BroadcasterUserID string `json:"broadcaster_user_id"`
7+
BroadcasterUserLogin string `json:"broadcaster_user_login"`
8+
BroadcasterUserName string `json:"broadcaster_user_name"`
9+
UserID string `json:"user_id"`
10+
UserLogin string `json:"user_login"`
11+
UserName string `json:"user_name"`
12+
Text string `json:"text"`
13+
CreatedAt string `json:"created_at"`
14+
}
15+
16+
type UnbanRequestCreateEventSubResponse struct {
17+
Subscription EventsubSubscription `json:"subscription"`
18+
Event TransactionEventSubEvent `json:"event"`
19+
}
20+
21+
type UnbanRequestResolveEventSubEvent struct {
22+
ID string `json:"id"`
23+
BroadcasterUserID string `json:"broadcaster_user_id"`
24+
BroadcasterUserLogin string `json:"broadcaster_user_login"`
25+
BroadcasterUserName string `json:"broadcaster_user_name"`
26+
ModeratorUserID *string `json:"moderator_user_id"`
27+
ModeratorUserLogin *string `json:"moderator_user_login"`
28+
ModeratorUserName *string `json:"moderator_user_name"`
29+
UserID string `json:"user_id"`
30+
UserLogin string `json:"user_login"`
31+
UserName string `json:"user_name"`
32+
ResolutionText string `json:"resolution_text"`
33+
Status string `json:"status"`
34+
}

0 commit comments

Comments
 (0)