module Matterhorn.Events.Websocket
( handleWebsocketEvent
, handleWebsocketActionResponse
)
where
import Prelude ()
import Matterhorn.Prelude
import qualified Data.HashMap.Strict as HM
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import qualified Data.Text as T
import Network.Mattermost.Lenses
import Network.Mattermost.Types
import Network.Mattermost.WebSocket
import Matterhorn.State.ChannelList
import Matterhorn.State.Channels
import Matterhorn.State.Common
import Matterhorn.State.Flagging
import Matterhorn.State.Messages
import Matterhorn.State.Reactions
import Matterhorn.State.Teams
import Matterhorn.State.Users
import Matterhorn.Types
import Matterhorn.Types.Common
foreachTeam :: (TeamId -> MH ()) -> MH ()
foreachTeam :: (TeamId -> MH ()) -> MH ()
foreachTeam TeamId -> MH ()
act = do
HashMap TeamId TeamState
ts <- Getting
(HashMap TeamId TeamState) ChatState (HashMap TeamId TeamState)
-> MH (HashMap TeamId TeamState)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting
(HashMap TeamId TeamState) ChatState (HashMap TeamId TeamState)
Lens' ChatState (HashMap TeamId TeamState)
csTeams
let myTIds :: [TeamId]
myTIds = HashMap TeamId TeamState -> [TeamId]
forall k v. HashMap k v -> [k]
HM.keys HashMap TeamId TeamState
ts
(TeamId -> MH ()) -> [TeamId] -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ TeamId -> MH ()
act [TeamId]
myTIds
handleWebsocketEvent :: WebsocketEvent -> MH ()
handleWebsocketEvent :: WebsocketEvent -> MH ()
handleWebsocketEvent WebsocketEvent
we = do
UserId
myId <- (ChatState -> UserId) -> MH UserId
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ChatState -> UserId
myUserId
HashMap TeamId TeamState
ts <- Getting
(HashMap TeamId TeamState) ChatState (HashMap TeamId TeamState)
-> MH (HashMap TeamId TeamState)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting
(HashMap TeamId TeamState) ChatState (HashMap TeamId TeamState)
Lens' ChatState (HashMap TeamId TeamState)
csTeams
let memberOf :: TeamId -> Bool
memberOf TeamId
tId = TeamId -> HashMap TeamId TeamState -> Bool
forall k a. (Eq k, Hashable k) => k -> HashMap k a -> Bool
HM.member TeamId
tId HashMap TeamId TeamState
ts
inMyTeamOrDM :: Maybe TeamId -> Bool
inMyTeamOrDM (Just TeamId
i) = TeamId -> Bool
memberOf TeamId
i
inMyTeamOrDM Maybe TeamId
Nothing = Bool
True
inMyTeam :: Maybe TeamId -> Bool
inMyTeam (Just TeamId
i) = TeamId -> Bool
memberOf TeamId
i
inMyTeam Maybe TeamId
Nothing = Bool
False
case WebsocketEvent -> WebsocketEventType
weEvent WebsocketEvent
we of
WebsocketEventType
WMPosted
| Just Post
p <- WEData -> Maybe Post
wepPost (WebsocketEvent -> WEData
weData WebsocketEvent
we) ->
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe TeamId -> Bool
inMyTeamOrDM (WEData -> Maybe TeamId
wepTeamId (WebsocketEvent -> WEData
weData WebsocketEvent
we))) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$ do
let wasMentioned :: Bool
wasMentioned = Bool -> (Set UserId -> Bool) -> Maybe (Set UserId) -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (UserId -> Set UserId -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member UserId
myId) (Maybe (Set UserId) -> Bool) -> Maybe (Set UserId) -> Bool
forall a b. (a -> b) -> a -> b
$ WEData -> Maybe (Set UserId)
wepMentions (WebsocketEvent -> WEData
weData WebsocketEvent
we)
PostToAdd -> MH ()
addNewPostedMessage (PostToAdd -> MH ()) -> PostToAdd -> MH ()
forall a b. (a -> b) -> a -> b
$ Post -> Bool -> PostToAdd
RecentPost Post
p Bool
wasMentioned
Maybe TeamId
mtId <- Getting (Maybe TeamId) ChatState (Maybe TeamId)
-> MH (Maybe TeamId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe TeamId) ChatState (Maybe TeamId)
SimpleGetter ChatState (Maybe TeamId)
csCurrentTeamId
Maybe ChannelId
cId <- case Maybe TeamId
mtId of
Maybe TeamId
Nothing -> Maybe ChannelId -> MH (Maybe ChannelId)
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ChannelId
forall a. Maybe a
Nothing
Just TeamId
tId -> Getting (Maybe ChannelId) ChatState (Maybe ChannelId)
-> MH (Maybe ChannelId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> SimpleGetter ChatState (Maybe ChannelId)
csCurrentChannelId TeamId
tId)
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelId -> Maybe ChannelId
forall a. a -> Maybe a
Just (Post -> ChannelId
postChannelId Post
p) Maybe ChannelId -> Maybe ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe ChannelId
cId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> Bool -> MH ()
showChannelInSidebar (Post
pPost -> Getting ChannelId Post ChannelId -> ChannelId
forall s a. s -> Getting a s a -> a
^.Getting ChannelId Post ChannelId
Lens' Post ChannelId
postChannelIdL) Bool
False
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPostEdited
| Just Post
p <- WEData -> Maybe Post
wepPost (WebsocketEvent -> WEData
weData WebsocketEvent
we) -> do
Post -> MH ()
editMessage Post
p
Maybe TeamId
currTid <- Getting (Maybe TeamId) ChatState (Maybe TeamId)
-> MH (Maybe TeamId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe TeamId) ChatState (Maybe TeamId)
SimpleGetter ChatState (Maybe TeamId)
csCurrentTeamId
(TeamId -> MH ()) -> MH ()
foreachTeam ((TeamId -> MH ()) -> MH ()) -> (TeamId -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \TeamId
tId -> do
Maybe ChannelId
cId <- Getting (Maybe ChannelId) ChatState (Maybe ChannelId)
-> MH (Maybe ChannelId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> SimpleGetter ChatState (Maybe ChannelId)
csCurrentChannelId TeamId
tId)
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelId -> Maybe ChannelId
forall a. a -> Maybe a
Just (Post -> ChannelId
postChannelId Post
p) Maybe ChannelId -> Maybe ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe ChannelId
cId Bool -> Bool -> Bool
&& TeamId -> Maybe TeamId
forall a. a -> Maybe a
Just TeamId
tId Maybe TeamId -> Maybe TeamId -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe TeamId
currTid) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
Bool -> MH ()
updateViewed Bool
False
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelId -> Maybe ChannelId
forall a. a -> Maybe a
Just (Post -> ChannelId
postChannelId Post
p) Maybe ChannelId -> Maybe ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe ChannelId
cId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> Bool -> MH ()
showChannelInSidebar (Post
pPost -> Getting ChannelId Post ChannelId -> ChannelId
forall s a. s -> Getting a s a -> a
^.Getting ChannelId Post ChannelId
Lens' Post ChannelId
postChannelIdL) Bool
False
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPostDeleted
| Just Post
p <- WEData -> Maybe Post
wepPost (WebsocketEvent -> WEData
weData WebsocketEvent
we) -> do
Post -> MH ()
deleteMessage Post
p
Maybe TeamId
currTid <- Getting (Maybe TeamId) ChatState (Maybe TeamId)
-> MH (Maybe TeamId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe TeamId) ChatState (Maybe TeamId)
SimpleGetter ChatState (Maybe TeamId)
csCurrentTeamId
(TeamId -> MH ()) -> MH ()
foreachTeam ((TeamId -> MH ()) -> MH ()) -> (TeamId -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \TeamId
tId -> do
Maybe ChannelId
cId <- Getting (Maybe ChannelId) ChatState (Maybe ChannelId)
-> MH (Maybe ChannelId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> SimpleGetter ChatState (Maybe ChannelId)
csCurrentChannelId TeamId
tId)
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelId -> Maybe ChannelId
forall a. a -> Maybe a
Just (Post -> ChannelId
postChannelId Post
p) Maybe ChannelId -> Maybe ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe ChannelId
cId Bool -> Bool -> Bool
&& TeamId -> Maybe TeamId
forall a. a -> Maybe a
Just TeamId
tId Maybe TeamId -> Maybe TeamId -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe TeamId
currTid) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
Bool -> MH ()
updateViewed Bool
False
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelId -> Maybe ChannelId
forall a. a -> Maybe a
Just (Post -> ChannelId
postChannelId Post
p) Maybe ChannelId -> Maybe ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe ChannelId
cId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> Bool -> MH ()
showChannelInSidebar (Post
pPost -> Getting ChannelId Post ChannelId -> ChannelId
forall s a. s -> Getting a s a -> a
^.Getting ChannelId Post ChannelId
Lens' Post ChannelId
postChannelIdL) Bool
False
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMStatusChange
| Just Text
status <- WEData -> Maybe Text
wepStatus (WebsocketEvent -> WEData
weData WebsocketEvent
we)
, Just UserId
uId <- WEData -> Maybe UserId
wepUserId (WebsocketEvent -> WEData
weData WebsocketEvent
we) ->
UserId -> Text -> MH ()
setUserStatus UserId
uId Text
status
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMUserAdded
| Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) ->
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (WEData -> Maybe UserId
wepUserId (WebsocketEvent -> WEData
weData WebsocketEvent
we) Maybe UserId -> Maybe UserId -> Bool
forall a. Eq a => a -> a -> Bool
== UserId -> Maybe UserId
forall a. a -> Maybe a
Just UserId
myId Bool -> Bool -> Bool
&&
Maybe TeamId -> Bool
inMyTeam (WEData -> Maybe TeamId
wepTeamId (WebsocketEvent -> WEData
weData WebsocketEvent
we))) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> MH ()
handleChannelInvite ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMNewUser
| Just UserId
uId <- WEData -> Maybe UserId
wepUserId (WEData -> Maybe UserId) -> WEData -> Maybe UserId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we ->
Seq UserId -> MH () -> MH ()
handleNewUsers (UserId -> Seq UserId
forall a. a -> Seq a
Seq.singleton UserId
uId) (() -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMUserRemoved
| Just ChannelId
cId <- WEData -> Maybe ChannelId
wepChannelId (WebsocketEvent -> WEData
weData WebsocketEvent
we) ->
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (WEBroadcast -> Maybe UserId
webUserId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) Maybe UserId -> Maybe UserId -> Bool
forall a. Eq a => a -> a -> Bool
== UserId -> Maybe UserId
forall a. a -> Maybe a
Just UserId
myId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> MH ()
removeChannelFromState ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMTyping
| Just UserId
uId <- WEData -> Maybe UserId
wepUserId (WEData -> Maybe UserId) -> WEData -> Maybe UserId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we
, Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) -> UserId -> ChannelId -> Maybe PostId -> MH ()
handleTypingUser UserId
uId ChannelId
cId (WEData -> Maybe PostId
wepParentId (WEData -> Maybe PostId) -> WEData -> Maybe PostId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we)
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMChannelDeleted
| Just ChannelId
cId <- WEData -> Maybe ChannelId
wepChannelId (WebsocketEvent -> WEData
weData WebsocketEvent
we) ->
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe TeamId -> Bool
inMyTeamOrDM (WEBroadcast -> Maybe TeamId
webTeamId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we))) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> MH ()
removeChannelFromState ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMDirectAdded
| Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) -> ChannelId -> MH ()
handleChannelInvite ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMEphemeralMessage
| Just Post
p <- WEData -> Maybe Post
wepPost (WEData -> Maybe Post) -> WEData -> Maybe Post
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we -> Text -> MH ()
postInfoMessage (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Post
pPost -> Getting UserText Post UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Post UserText
Lens' Post UserText
postMessageL)
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPreferenceChanged
| Just Seq Preference
prefs <- WEData -> Maybe (Seq Preference)
wepPreferences (WebsocketEvent -> WEData
weData WebsocketEvent
we) ->
(Preference -> MH ()) -> Seq Preference -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Preference -> MH ()
applyPreferenceChange Seq Preference
prefs
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPreferenceDeleted
| Just Seq Preference
pref <- WEData -> Maybe (Seq Preference)
wepPreferences (WebsocketEvent -> WEData
weData WebsocketEvent
we)
, Just Seq FlaggedPost
fps <- (Preference -> Maybe FlaggedPost)
-> Seq Preference -> Maybe (Seq FlaggedPost)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Seq a -> m (Seq b)
mapM Preference -> Maybe FlaggedPost
preferenceToFlaggedPost Seq Preference
pref ->
Seq FlaggedPost -> (FlaggedPost -> MH ()) -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ Seq FlaggedPost
fps ((FlaggedPost -> MH ()) -> MH ())
-> (FlaggedPost -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FlaggedPost
f ->
PostId -> Bool -> MH ()
updateMessageFlag (FlaggedPost -> PostId
flaggedPostId FlaggedPost
f) Bool
False
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMReactionAdded
| Just Reaction
r <- WEData -> Maybe Reaction
wepReaction (WebsocketEvent -> WEData
weData WebsocketEvent
we)
, Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) -> ChannelId -> [Reaction] -> MH ()
addReactions ChannelId
cId [Reaction
r]
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMReactionRemoved
| Just Reaction
r <- WEData -> Maybe Reaction
wepReaction (WebsocketEvent -> WEData
weData WebsocketEvent
we)
, Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) -> Reaction -> ChannelId -> MH ()
removeReaction Reaction
r ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMChannelViewed
| Just ChannelId
cId <- WEData -> Maybe ChannelId
wepChannelId (WEData -> Maybe ChannelId) -> WEData -> Maybe ChannelId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we -> LogCategory -> Text -> MH ()
mhLog LogCategory
LogGeneral Text
"WMChannelViewed received" MH () -> MH () -> MH ()
forall a b. MH a -> MH b -> MH b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ChannelId -> MH ()
refreshChannelById ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMMultipleChannelsViewed ->
case WEData -> Maybe (HashMap ChannelId ServerTime)
wepChannelTimes (WEData -> Maybe (HashMap ChannelId ServerTime))
-> WEData -> Maybe (HashMap ChannelId ServerTime)
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we of
Maybe (HashMap ChannelId ServerTime)
Nothing -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just HashMap ChannelId ServerTime
m ->
[ChannelId] -> (ChannelId -> MH ()) -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (HashMap ChannelId ServerTime -> [ChannelId]
forall k v. HashMap k v -> [k]
HM.keys HashMap ChannelId ServerTime
m) ChannelId -> MH ()
refreshChannelById
WebsocketEventType
WMChannelUpdated
| Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WEBroadcast -> Maybe ChannelId) -> WEBroadcast -> Maybe ChannelId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we -> do
Maybe ClientChannel
mChan <- Getting (First ClientChannel) ChatState ClientChannel
-> MH (Maybe ClientChannel)
forall s (m :: * -> *) a.
MonadState s m =>
Getting (First a) s a -> m (Maybe a)
preuse (ChannelId -> Traversal' ChatState ClientChannel
csChannel(ChannelId
cId))
case Maybe ClientChannel
mChan of
Just ClientChannel
chan -> do
ChannelId -> MH ()
refreshChannelById ChannelId
cId
Maybe TeamId -> MH ()
updateSidebar (ClientChannel
chanClientChannel
-> Getting (Maybe TeamId) ClientChannel (Maybe TeamId)
-> Maybe TeamId
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const (Maybe TeamId) ChannelInfo)
-> ClientChannel -> Const (Maybe TeamId) ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const (Maybe TeamId) ChannelInfo)
-> ClientChannel -> Const (Maybe TeamId) ClientChannel)
-> ((Maybe TeamId -> Const (Maybe TeamId) (Maybe TeamId))
-> ChannelInfo -> Const (Maybe TeamId) ChannelInfo)
-> Getting (Maybe TeamId) ClientChannel (Maybe TeamId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe TeamId -> Const (Maybe TeamId) (Maybe TeamId))
-> ChannelInfo -> Const (Maybe TeamId) ChannelInfo
Lens' ChannelInfo (Maybe TeamId)
cdTeamId)
Maybe ClientChannel
Nothing -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMGroupAdded
| Just ChannelId
cId <- WEBroadcast -> Maybe ChannelId
webChannelId (WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we) -> ChannelId -> MH ()
handleChannelInvite ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMChannelMemberUpdated
| Just ChannelMember
channelMember <- WEData -> Maybe ChannelMember
wepChannelMember (WEData -> Maybe ChannelMember) -> WEData -> Maybe ChannelMember
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we ->
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ChannelMember -> UserId
channelMemberUserId ChannelMember
channelMember UserId -> UserId -> Bool
forall a. Eq a => a -> a -> Bool
== UserId
myId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$
ChannelId -> ChannelNotifyProps -> MH ()
updateChannelNotifyProps
(ChannelMember -> ChannelId
channelMemberChannelId ChannelMember
channelMember)
(ChannelMember -> ChannelNotifyProps
channelMemberNotifyProps ChannelMember
channelMember)
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMAddedToTeam
| Just TeamId
tId <- WEData -> Maybe TeamId
wepTeamId (WEData -> Maybe TeamId) -> WEData -> Maybe TeamId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we
, Just UserId
uId <- WEData -> Maybe UserId
wepUserId (WEData -> Maybe UserId) -> WEData -> Maybe UserId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we -> do
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (UserId
uId UserId -> UserId -> Bool
forall a. Eq a => a -> a -> Bool
== UserId
myId Bool -> Bool -> Bool
&& Bool -> Bool
not (TeamId -> Bool
memberOf TeamId
tId)) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$ do
TeamId -> MH ()
handleJoinTeam TeamId
tId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMUpdateTeam
| Just TeamId
tId <- WEBroadcast -> Maybe TeamId
webTeamId (WEBroadcast -> Maybe TeamId) -> WEBroadcast -> Maybe TeamId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEBroadcast
weBroadcast WebsocketEvent
we -> do
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TeamId -> Bool
memberOf TeamId
tId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$ do
TeamId -> MH ()
handleUpdateTeam TeamId
tId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMLeaveTeam
| Just TeamId
tId <- WEData -> Maybe TeamId
wepTeamId (WEData -> Maybe TeamId) -> WEData -> Maybe TeamId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we
, Just UserId
uId <- WEData -> Maybe UserId
wepUserId (WEData -> Maybe UserId) -> WEData -> Maybe UserId
forall a b. (a -> b) -> a -> b
$ WebsocketEvent -> WEData
weData WebsocketEvent
we -> do
Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (UserId
uId UserId -> UserId -> Bool
forall a. Eq a => a -> a -> Bool
== UserId
myId Bool -> Bool -> Bool
&& TeamId -> Bool
memberOf TeamId
tId) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$ do
TeamId -> MH ()
handleLeaveTeam TeamId
tId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMTeamDeleted -> do
LogCategory -> Text -> MH ()
mhLog LogCategory
LogGeneral (Text -> MH ()) -> Text -> MH ()
forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
String
"WMTeamDeleted event: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> WebsocketEvent -> String
forall a. Show a => a -> String
show WebsocketEvent
we
WebsocketEventType
WMUserUpdated
| Just User
user <- WEData -> Maybe User
wepUser (WebsocketEvent -> WEData
weData WebsocketEvent
we) -> do
User -> MH ()
handleUserUpdated User
user
(TeamId -> MH ()) -> MH ()
withCurrentTeam ((TeamId -> MH ()) -> MH ()) -> (TeamId -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \TeamId
tId ->
TeamId -> (ChannelId -> ClientChannel -> MH ()) -> MH ()
withCurrentChannel TeamId
tId ((ChannelId -> ClientChannel -> MH ()) -> MH ())
-> (ChannelId -> ClientChannel -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \ChannelId
cId ClientChannel
_ -> do
ChannelId -> MH ()
refreshChannelById ChannelId
cId
| Bool
otherwise -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMChannelCreated -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMEmojiAdded -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMWebRTC -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMHello -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMAuthenticationChallenge -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMUserRoleUpdated -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPluginStatusesChanged -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPluginEnabled -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WebsocketEventType
WMPluginDisabled -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
WMUnknownEvent {} ->
LogCategory -> Text -> MH ()
mhLog LogCategory
LogWebsocket (Text -> MH ()) -> Text -> MH ()
forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
String
"Websocket event not handled due to unknown event type: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> WebsocketEvent -> String
forall a. Show a => a -> String
show WebsocketEvent
we
handleWebsocketActionResponse :: WebsocketActionResponse -> MH ()
handleWebsocketActionResponse :: WebsocketActionResponse -> MH ()
handleWebsocketActionResponse WebsocketActionResponse
r =
case WebsocketActionResponse -> WebsocketActionStatus
warStatus WebsocketActionResponse
r of
WebsocketActionStatus
WebsocketActionStatusOK -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()