Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 2.2.2.0 (2025-09-15)
* [#153](https://github.com/MercuryTechnologies/slack-web/pull/153)
Implement `channel_shared` and `channel_unshared` events.

# 2.2.1.0 (2025-09-15)
* [#151](https://github.com/MercuryTechnologies/slack-web/151)
* [#151](https://github.com/MercuryTechnologies/slack-web/pull/151)
Implement `conversations.member` API method.

# 2.2.0.0 (2025-03-21)
Expand Down
2 changes: 1 addition & 1 deletion slack-web.cabal
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cabal-version: 3.0
name: slack-web
version: 2.2.1.0
version: 2.2.2.0

build-type: Simple

Expand Down
29 changes: 29 additions & 0 deletions src/Web/Slack/Experimental/Events/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,31 @@ data ChannelLeftEvent = ChannelLeftEvent

$(deriveFromJSON snakeCaseOptions ''ChannelLeftEvent)

-- | A channel has been shared with an external workspace.
--
-- <https://docs.slack.dev/reference/events/channel_shared/>
data ChannelSharedEvent = ChannelSharedEvent
{ connectedTeamId :: TeamId
, channel :: ConversationId
, eventTs :: Text
}
deriving stock (Show)

$(deriveFromJSON snakeCaseOptions ''ChannelSharedEvent)

-- | A channel has been unshared with an external workspace.
--
-- <https://docs.slack.dev/reference/events/channel_unshared/>
data ChannelUnsharedEvent = ChannelUnsharedEvent
{ previouslyConnectedTeamId :: TeamId
, channel :: ConversationId
, isExtShared :: Bool
, eventTs :: Text
}
deriving stock (Show)

$(deriveFromJSON snakeCaseOptions ''ChannelUnsharedEvent)

-- | <https://api.slack.com/events/url_verification>
data UrlVerificationPayload = UrlVerificationPayload
{ challenge :: Text
Expand Down Expand Up @@ -347,6 +372,8 @@ data Event
EventChannelJoinMessage
| EventChannelCreated ChannelCreatedEvent
| EventChannelLeft ChannelLeftEvent
| EventChannelShared ChannelSharedEvent
| EventChannelUnshared ChannelUnsharedEvent
| -- | @since 2.1.0.0
EventAppHomeOpened AppHomeOpenedEvent
| EventUnknown Value
Expand All @@ -366,6 +393,8 @@ instance FromJSON Event where
("message", Just "file_share") -> EventMessage <$> parseJSON @MessageEvent (Object obj)
("channel_created", Nothing) -> EventChannelCreated <$> parseJSON (Object obj)
("channel_left", Nothing) -> EventChannelLeft <$> parseJSON (Object obj)
("channel_shared", Nothing) -> EventChannelShared <$> parseJSON (Object obj)
("channel_unshared", Nothing) -> EventChannelUnshared <$> parseJSON (Object obj)
("app_home_opened", Nothing) -> EventAppHomeOpened <$> parseJSON (Object obj)
_ -> pure $ EventUnknown (Object obj)

Expand Down
2 changes: 2 additions & 0 deletions tests/Web/Slack/Experimental/Events/TypesSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ spec = describe "Types for Slack events" do
, "messageIm"
, "slackbotIm"
, "channel_left"
, "channel_shared"
, "channel_unshared"
, "share_without_message"
, "share_with_message"
, "circleci"
Expand Down
21 changes: 21 additions & 0 deletions tests/golden/SlackWebhookEvent/channel_shared.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
EventEventCallback
( EventCallback
{ eventId = EventId
{ unEventId = "Ev044RKJHB8W" }
, teamId = TeamId
{ unTeamId = "T043DB835ML" }
, eventTime = MkSystemTime
{ systemSeconds = 1664827321
, systemNanoseconds = 0
}
, event = EventChannelShared
( ChannelSharedEvent
{ connectedTeamId = TeamId
{ unTeamId = "E163Q94DX" }
, channel = ConversationId
{ unConversationId = "C123ABC456" }
, eventTs = "1561064063.001100"
}
)
}
)
24 changes: 24 additions & 0 deletions tests/golden/SlackWebhookEvent/channel_shared.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"token": "aaaa",
"team_id": "T043DB835ML",
"api_app_id": "A0442TUPHGR",
"event": {
"type": "channel_shared",
"connected_team_id": "E163Q94DX",
"channel": "C123ABC456",
"event_ts": "1561064063.001100"
},
"type": "event_callback",
"event_id": "Ev044RKJHB8W",
"event_time": 1664827321,
"authorizations": [
{
"enterprise_id": null,
"team_id": "T043DB835ML",
"user_id": "U0442US8QGH",
"is_bot": false,
"is_enterprise_install": false
}
],
"is_ext_shared_channel": true
}
22 changes: 22 additions & 0 deletions tests/golden/SlackWebhookEvent/channel_unshared.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
EventEventCallback
( EventCallback
{ eventId = EventId
{ unEventId = "Ev044RKJHB8W" }
, teamId = TeamId
{ unTeamId = "T043DB835ML" }
, eventTime = MkSystemTime
{ systemSeconds = 1664827321
, systemNanoseconds = 0
}
, event = EventChannelUnshared
( ChannelUnsharedEvent
{ previouslyConnectedTeamId = TeamId
{ unTeamId = "E163Q94DX" }
, channel = ConversationId
{ unConversationId = "C123ABC456" }
, isExtShared = False
, eventTs = "1561064063.001100"
}
)
}
)
25 changes: 25 additions & 0 deletions tests/golden/SlackWebhookEvent/channel_unshared.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"token": "aaaa",
"team_id": "T043DB835ML",
"api_app_id": "A0442TUPHGR",
"event": {
"type": "channel_unshared",
"previously_connected_team_id": "E163Q94DX",
"channel": "C123ABC456",
"is_ext_shared": false,
"event_ts": "1561064063.001100"
},
"type": "event_callback",
"event_id": "Ev044RKJHB8W",
"event_time": 1664827321,
"authorizations": [
{
"enterprise_id": null,
"team_id": "T043DB835ML",
"user_id": "U0442US8QGH",
"is_bot": false,
"is_enterprise_install": false
}
],
"is_ext_shared_channel": false
}
Loading