{-# LANGUAGE CPP #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
module Matterhorn.Types.Channels
( ClientChannel(..)
, ChannelInfo(..)
, ClientChannels
, chanMap
, NewMessageIndicator(..)
, ccInfo, ccMessageInterface
, cdViewed, cdNewMessageIndicator, cdEditedMessageThreshold, cdUpdated
, cdName, cdDisplayName, cdHeader, cdPurpose, cdType
, cdMentionCount, cdDMUserId, cdChannelId
, cdSidebarShowOverride, cdNotifyProps, cdTeamId, cdFetchPending
, noChannels, addChannel, removeChannel, findChannelById, modifyChannelById
, channelByIdL, maybeChannelByIdL
, allTeamIds
, filteredChannelIds
, filteredChannels
, channelInfoFromChannelWithData
, clearNewMessageIndicator
, clearEditedThreshold
, adjustUpdated
, adjustEditedThreshold
, updateNewMessageIndicator
, notifyPreference
, isMuted
, channelNotifyPropsMarkUnreadL
, channelNotifyPropsIgnoreChannelMentionsL
, channelNotifyPropsDesktopL
, channelNotifyPropsPushL
, canLeaveChannel
, preferredChannelName
, isTownSquare
, channelDeleted
, getDmChannelFor
, allDmChannelMappings
, getChannelNameSet
, emptyChannelMessages
)
where
import Prelude ()
import Matterhorn.Prelude
import qualified Data.HashMap.Strict as HM
import qualified Data.Set as S
import Lens.Micro.Platform ( (%~), (.~), Traversal', Lens'
, makeLenses, ix, at
, to, non )
import Network.Mattermost.Lenses hiding ( Lens' )
import Network.Mattermost.Types ( Channel(..), UserId, ChannelId
, ChannelMember(..)
, Type(..)
, Post
, User(userNotifyProps)
, ChannelNotifyProps
, NotifyOption(..)
, WithDefault(..)
, ServerTime
, TeamId
)
import Matterhorn.Types.Messages ( Messages, noMessages, addMessage
, clientMessageToMessage )
import Matterhorn.Types.Posts ( ClientMessageType(UnknownGapBefore)
, newClientMessage )
import Matterhorn.Types.MessageInterface
import Matterhorn.Types.Core ( Name )
import Matterhorn.Types.Common
data ClientChannel = ClientChannel
{ ClientChannel -> ChannelInfo
_ccInfo :: ChannelInfo
, ClientChannel -> MessageInterface Name ()
_ccMessageInterface :: MessageInterface Name ()
}
preferredChannelName :: Channel -> Text
preferredChannelName :: Channel -> Text
preferredChannelName Channel
ch
| Channel -> Type
channelType Channel
ch Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
Group = UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel -> UserText
channelDisplayName Channel
ch
| Bool
otherwise = UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel -> UserText
channelName Channel
ch
data NewMessageIndicator =
Hide
| NewPostsAfterServerTime ServerTime
| NewPostsStartingAt ServerTime
deriving (NewMessageIndicator -> NewMessageIndicator -> Bool
(NewMessageIndicator -> NewMessageIndicator -> Bool)
-> (NewMessageIndicator -> NewMessageIndicator -> Bool)
-> Eq NewMessageIndicator
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NewMessageIndicator -> NewMessageIndicator -> Bool
$c/= :: NewMessageIndicator -> NewMessageIndicator -> Bool
== :: NewMessageIndicator -> NewMessageIndicator -> Bool
$c== :: NewMessageIndicator -> NewMessageIndicator -> Bool
Eq, Int -> NewMessageIndicator -> ShowS
[NewMessageIndicator] -> ShowS
NewMessageIndicator -> String
(Int -> NewMessageIndicator -> ShowS)
-> (NewMessageIndicator -> String)
-> ([NewMessageIndicator] -> ShowS)
-> Show NewMessageIndicator
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NewMessageIndicator] -> ShowS
$cshowList :: [NewMessageIndicator] -> ShowS
show :: NewMessageIndicator -> String
$cshow :: NewMessageIndicator -> String
showsPrec :: Int -> NewMessageIndicator -> ShowS
$cshowsPrec :: Int -> NewMessageIndicator -> ShowS
Show)
channelInfoFromChannelWithData :: Channel -> ChannelMember -> ChannelInfo -> ChannelInfo
channelInfoFromChannelWithData :: Channel -> ChannelMember -> ChannelInfo -> ChannelInfo
channelInfoFromChannelWithData Channel
chan ChannelMember
chanMember ChannelInfo
ci =
let viewed :: ServerTime
viewed = ChannelMember
chanMember ChannelMember
-> Getting ServerTime ChannelMember ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^. (ChannelMember -> ServerTime)
-> SimpleGetter ChannelMember ServerTime
forall s a. (s -> a) -> SimpleGetter s a
to ChannelMember -> ServerTime
channelMemberLastViewedAt
updated :: ServerTime
updated = Channel
chan Channel -> Getting ServerTime Channel ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^. Getting ServerTime Channel ServerTime
Lens' Channel ServerTime
channelLastPostAtL
in ChannelInfo
ci { _cdViewed :: Maybe ServerTime
_cdViewed = ServerTime -> Maybe ServerTime
forall a. a -> Maybe a
Just ServerTime
viewed
, _cdNewMessageIndicator :: NewMessageIndicator
_cdNewMessageIndicator = case ChannelInfo -> NewMessageIndicator
_cdNewMessageIndicator ChannelInfo
ci of
NewMessageIndicator
Hide -> if ServerTime
updated ServerTime -> ServerTime -> Bool
forall a. Ord a => a -> a -> Bool
> ServerTime
viewed then ServerTime -> NewMessageIndicator
NewPostsAfterServerTime ServerTime
viewed else NewMessageIndicator
Hide
NewMessageIndicator
v -> NewMessageIndicator
v
, _cdUpdated :: ServerTime
_cdUpdated = ServerTime
updated
, _cdName :: Text
_cdName = Channel -> Text
preferredChannelName Channel
chan
, _cdDisplayName :: Text
_cdDisplayName = UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel -> UserText
channelDisplayName Channel
chan
, _cdHeader :: Text
_cdHeader = (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
chanChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelHeaderL)
, _cdPurpose :: Text
_cdPurpose = (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
chanChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelPurposeL)
, _cdType :: Type
_cdType = (Channel
chanChannel -> Getting Type Channel Type -> Type
forall s a. s -> Getting a s a -> a
^.Getting Type Channel Type
Lens' Channel Type
channelTypeL)
, _cdMentionCount :: Int
_cdMentionCount = ChannelMember
chanMemberChannelMember -> Getting Int ChannelMember Int -> Int
forall s a. s -> Getting a s a -> a
^.(ChannelMember -> Int) -> SimpleGetter ChannelMember Int
forall s a. (s -> a) -> SimpleGetter s a
to ChannelMember -> Int
channelMemberMentionCount
, _cdNotifyProps :: ChannelNotifyProps
_cdNotifyProps = ChannelMember
chanMemberChannelMember
-> Getting ChannelNotifyProps ChannelMember ChannelNotifyProps
-> ChannelNotifyProps
forall s a. s -> Getting a s a -> a
^.(ChannelMember -> ChannelNotifyProps)
-> SimpleGetter ChannelMember ChannelNotifyProps
forall s a. (s -> a) -> SimpleGetter s a
to ChannelMember -> ChannelNotifyProps
channelMemberNotifyProps
}
emptyChannelMessages :: MonadIO m => m Messages
emptyChannelMessages :: m Messages
emptyChannelMessages = do
Message
gapMsg <- ClientMessage -> Message
clientMessageToMessage (ClientMessage -> Message) -> m ClientMessage -> m Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ClientMessageType -> Text -> m ClientMessage
forall (m :: * -> *).
MonadIO m =>
ClientMessageType -> Text -> m ClientMessage
newClientMessage ClientMessageType
UnknownGapBefore Text
"--Fetching messages--"
Messages -> m Messages
forall (m :: * -> *) a. Monad m => a -> m a
return (Messages -> m Messages) -> Messages -> m Messages
forall a b. (a -> b) -> a -> b
$ Message -> Messages -> Messages
forall a. MessageOps a => Message -> a -> a
addMessage Message
gapMsg Messages
noMessages
data ChannelInfo = ChannelInfo
{ ChannelInfo -> ChannelId
_cdChannelId :: ChannelId
, ChannelInfo -> Maybe TeamId
_cdTeamId :: Maybe TeamId
, ChannelInfo -> Maybe ServerTime
_cdViewed :: Maybe ServerTime
, ChannelInfo -> NewMessageIndicator
_cdNewMessageIndicator :: NewMessageIndicator
, ChannelInfo -> Maybe ServerTime
_cdEditedMessageThreshold :: Maybe ServerTime
, ChannelInfo -> Int
_cdMentionCount :: Int
, ChannelInfo -> ServerTime
_cdUpdated :: ServerTime
, ChannelInfo -> Text
_cdName :: Text
, ChannelInfo -> Text
_cdDisplayName :: Text
, :: Text
, ChannelInfo -> Text
_cdPurpose :: Text
, ChannelInfo -> Type
_cdType :: Type
, ChannelInfo -> ChannelNotifyProps
_cdNotifyProps :: ChannelNotifyProps
, ChannelInfo -> Maybe UserId
_cdDMUserId :: Maybe UserId
, :: Maybe UTCTime
, ChannelInfo -> Bool
_cdFetchPending :: Bool
}
makeLenses ''ClientChannel
isMuted :: ClientChannel -> Bool
isMuted :: ClientChannel -> Bool
isMuted ClientChannel
cc = ClientChannel
ccClientChannel
-> Getting
(WithDefault NotifyOption) ClientChannel (WithDefault NotifyOption)
-> WithDefault NotifyOption
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ClientChannel -> Const (WithDefault NotifyOption) ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ClientChannel -> Const (WithDefault NotifyOption) ClientChannel)
-> ((WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> Getting
(WithDefault NotifyOption) ClientChannel (WithDefault NotifyOption)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo
Lens' ChannelInfo ChannelNotifyProps
cdNotifyProps((ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ((WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> (WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelInfo
-> Const (WithDefault NotifyOption) ChannelInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps
Lens' ChannelNotifyProps (WithDefault NotifyOption)
channelNotifyPropsMarkUnreadL WithDefault NotifyOption -> WithDefault NotifyOption -> Bool
forall a. Eq a => a -> a -> Bool
==
NotifyOption -> WithDefault NotifyOption
forall a. a -> WithDefault a
IsValue NotifyOption
NotifyOptionMention
notifyPreference :: User -> ClientChannel -> NotifyOption
notifyPreference :: User -> ClientChannel -> NotifyOption
notifyPreference User
u ClientChannel
cc =
if ClientChannel -> Bool
isMuted ClientChannel
cc then NotifyOption
NotifyOptionNone
else case ClientChannel
ccClientChannel
-> Getting
(WithDefault NotifyOption) ClientChannel (WithDefault NotifyOption)
-> WithDefault NotifyOption
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ClientChannel -> Const (WithDefault NotifyOption) ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ClientChannel -> Const (WithDefault NotifyOption) ClientChannel)
-> ((WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> Getting
(WithDefault NotifyOption) ClientChannel (WithDefault NotifyOption)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo
Lens' ChannelInfo ChannelNotifyProps
cdNotifyProps((ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> ChannelInfo -> Const (WithDefault NotifyOption) ChannelInfo)
-> ((WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps)
-> (WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelInfo
-> Const (WithDefault NotifyOption) ChannelInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(WithDefault NotifyOption
-> Const (WithDefault NotifyOption) (WithDefault NotifyOption))
-> ChannelNotifyProps
-> Const (WithDefault NotifyOption) ChannelNotifyProps
Lens' ChannelNotifyProps (WithDefault NotifyOption)
channelNotifyPropsDesktopL of
IsValue NotifyOption
v -> NotifyOption
v
WithDefault NotifyOption
Default -> (User -> UserNotifyProps
userNotifyProps User
u)UserNotifyProps
-> Getting NotifyOption UserNotifyProps NotifyOption
-> NotifyOption
forall s a. s -> Getting a s a -> a
^.Getting NotifyOption UserNotifyProps NotifyOption
Lens' UserNotifyProps NotifyOption
userNotifyPropsDesktopL
canLeaveChannel :: ChannelInfo -> Bool
canLeaveChannel :: ChannelInfo -> Bool
canLeaveChannel ChannelInfo
cInfo = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ ChannelInfo
cInfoChannelInfo -> Getting Type ChannelInfo Type -> Type
forall s a. s -> Getting a s a -> a
^.Getting Type ChannelInfo Type
Lens' ChannelInfo Type
cdType Type -> [Type] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Type
Direct]
data ClientChannels =
ClientChannels { ClientChannels -> HashMap ChannelId ClientChannel
_chanMap :: HashMap ChannelId ClientChannel
, ClientChannels -> HashMap TeamId (Set Text)
_channelNameSet :: HashMap TeamId (S.Set Text)
, ClientChannels -> HashMap UserId ChannelId
_userChannelMap :: HashMap UserId ChannelId
}
makeLenses ''ClientChannels
getChannelNameSet :: TeamId -> ClientChannels -> S.Set Text
getChannelNameSet :: TeamId -> ClientChannels -> Set Text
getChannelNameSet TeamId
tId ClientChannels
cs = case ClientChannels
csClientChannels
-> Getting (Maybe (Set Text)) ClientChannels (Maybe (Set Text))
-> Maybe (Set Text)
forall s a. s -> Getting a s a -> a
^.(HashMap TeamId (Set Text)
-> Const (Maybe (Set Text)) (HashMap TeamId (Set Text)))
-> ClientChannels -> Const (Maybe (Set Text)) ClientChannels
Lens' ClientChannels (HashMap TeamId (Set Text))
channelNameSet((HashMap TeamId (Set Text)
-> Const (Maybe (Set Text)) (HashMap TeamId (Set Text)))
-> ClientChannels -> Const (Maybe (Set Text)) ClientChannels)
-> ((Maybe (Set Text)
-> Const (Maybe (Set Text)) (Maybe (Set Text)))
-> HashMap TeamId (Set Text)
-> Const (Maybe (Set Text)) (HashMap TeamId (Set Text)))
-> Getting (Maybe (Set Text)) ClientChannels (Maybe (Set Text))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Index (HashMap TeamId (Set Text))
-> Lens'
(HashMap TeamId (Set Text))
(Maybe (IxValue (HashMap TeamId (Set Text))))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at TeamId
Index (HashMap TeamId (Set Text))
tId of
Maybe (Set Text)
Nothing -> Set Text
forall a. Monoid a => a
mempty
Just Set Text
s -> Set Text
s
noChannels :: ClientChannels
noChannels :: ClientChannels
noChannels =
ClientChannels :: HashMap ChannelId ClientChannel
-> HashMap TeamId (Set Text)
-> HashMap UserId ChannelId
-> ClientChannels
ClientChannels { _chanMap :: HashMap ChannelId ClientChannel
_chanMap = HashMap ChannelId ClientChannel
forall k v. HashMap k v
HM.empty
, _channelNameSet :: HashMap TeamId (Set Text)
_channelNameSet = HashMap TeamId (Set Text)
forall k v. HashMap k v
HM.empty
, _userChannelMap :: HashMap UserId ChannelId
_userChannelMap = HashMap UserId ChannelId
forall k v. HashMap k v
HM.empty
}
addChannel :: ChannelId -> ClientChannel -> ClientChannels -> ClientChannels
addChannel :: ChannelId -> ClientChannel -> ClientChannels -> ClientChannels
addChannel ChannelId
cId ClientChannel
cinfo =
((HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap ((HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap ChannelId ClientChannel
-> HashMap ChannelId ClientChannel)
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ ChannelId
-> ClientChannel
-> HashMap ChannelId ClientChannel
-> HashMap ChannelId ClientChannel
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
HM.insert ChannelId
cId ClientChannel
cinfo) (ClientChannels -> ClientChannels)
-> (ClientChannels -> ClientChannels)
-> ClientChannels
-> ClientChannels
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(if ClientChannel
cinfoClientChannel -> Getting Type ClientChannel Type -> Type
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const Type ChannelInfo)
-> ClientChannel -> Const Type ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const Type ChannelInfo)
-> ClientChannel -> Const Type ClientChannel)
-> Getting Type ChannelInfo Type -> Getting Type ClientChannel Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Getting Type ChannelInfo Type
Lens' ChannelInfo Type
cdType Type -> [Type] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Type
Direct, Type
Group]
then case ClientChannel
cinfoClientChannel
-> 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 of
Maybe TeamId
Nothing -> ClientChannels -> ClientChannels
forall a. a -> a
id
Just TeamId
tId -> (HashMap TeamId (Set Text) -> Identity (HashMap TeamId (Set Text)))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap TeamId (Set Text))
channelNameSet ((HashMap TeamId (Set Text)
-> Identity (HashMap TeamId (Set Text)))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap TeamId (Set Text) -> HashMap TeamId (Set Text))
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (Set Text -> Set Text -> Set Text)
-> TeamId
-> Set Text
-> HashMap TeamId (Set Text)
-> HashMap TeamId (Set Text)
forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
HM.insertWith Set Text -> Set Text -> Set Text
forall a. Ord a => Set a -> Set a -> Set a
S.union TeamId
tId (Text -> Set Text
forall a. a -> Set a
S.singleton (Text -> Set Text) -> Text -> Set Text
forall a b. (a -> b) -> a -> b
$ ClientChannel
cinfoClientChannel -> Getting Text ClientChannel Text -> Text
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const Text ChannelInfo)
-> ClientChannel -> Const Text ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const Text ChannelInfo)
-> ClientChannel -> Const Text ClientChannel)
-> ((Text -> Const Text Text)
-> ChannelInfo -> Const Text ChannelInfo)
-> Getting Text ClientChannel Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Text -> Const Text Text) -> ChannelInfo -> Const Text ChannelInfo
Lens' ChannelInfo Text
cdName)
else ClientChannels -> ClientChannels
forall a. a -> a
id) (ClientChannels -> ClientChannels)
-> (ClientChannels -> ClientChannels)
-> ClientChannels
-> ClientChannels
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(case ClientChannel
cinfoClientChannel
-> Getting (Maybe UserId) ClientChannel (Maybe UserId)
-> Maybe UserId
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const (Maybe UserId) ChannelInfo)
-> ClientChannel -> Const (Maybe UserId) ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const (Maybe UserId) ChannelInfo)
-> ClientChannel -> Const (Maybe UserId) ClientChannel)
-> ((Maybe UserId -> Const (Maybe UserId) (Maybe UserId))
-> ChannelInfo -> Const (Maybe UserId) ChannelInfo)
-> Getting (Maybe UserId) ClientChannel (Maybe UserId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe UserId -> Const (Maybe UserId) (Maybe UserId))
-> ChannelInfo -> Const (Maybe UserId) ChannelInfo
Lens' ChannelInfo (Maybe UserId)
cdDMUserId of
Maybe UserId
Nothing -> ClientChannels -> ClientChannels
forall a. a -> a
id
Just UserId
uId -> (HashMap UserId ChannelId -> Identity (HashMap UserId ChannelId))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap UserId ChannelId)
userChannelMap ((HashMap UserId ChannelId -> Identity (HashMap UserId ChannelId))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap UserId ChannelId -> HashMap UserId ChannelId)
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ UserId
-> ChannelId
-> HashMap UserId ChannelId
-> HashMap UserId ChannelId
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
HM.insert UserId
uId ChannelId
cId
)
removeChannel :: ChannelId -> ClientChannels -> ClientChannels
removeChannel :: ChannelId -> ClientChannels -> ClientChannels
removeChannel ChannelId
cId ClientChannels
cs =
let mChan :: Maybe ClientChannel
mChan = ChannelId -> ClientChannels -> Maybe ClientChannel
findChannelById ChannelId
cId ClientChannels
cs
removeChannelName :: ClientChannels -> ClientChannels
removeChannelName = case Maybe ClientChannel
mChan of
Maybe ClientChannel
Nothing -> ClientChannels -> ClientChannels
forall a. a -> a
id
Just ClientChannel
ch -> case ClientChannel
chClientChannel
-> 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 of
Maybe TeamId
Nothing -> ClientChannels -> ClientChannels
forall a. a -> a
id
Just TeamId
tId -> (HashMap TeamId (Set Text) -> Identity (HashMap TeamId (Set Text)))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap TeamId (Set Text))
channelNameSet ((HashMap TeamId (Set Text)
-> Identity (HashMap TeamId (Set Text)))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap TeamId (Set Text) -> HashMap TeamId (Set Text))
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (Set Text -> Set Text)
-> TeamId -> HashMap TeamId (Set Text) -> HashMap TeamId (Set Text)
forall k v.
(Eq k, Hashable k) =>
(v -> v) -> k -> HashMap k v -> HashMap k v
HM.adjust (Text -> Set Text -> Set Text
forall a. Ord a => a -> Set a -> Set a
S.delete (ClientChannel
chClientChannel -> Getting Text ClientChannel Text -> Text
forall s a. s -> Getting a s a -> a
^.(ChannelInfo -> Const Text ChannelInfo)
-> ClientChannel -> Const Text ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Const Text ChannelInfo)
-> ClientChannel -> Const Text ClientChannel)
-> ((Text -> Const Text Text)
-> ChannelInfo -> Const Text ChannelInfo)
-> Getting Text ClientChannel Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Text -> Const Text Text) -> ChannelInfo -> Const Text ChannelInfo
Lens' ChannelInfo Text
cdName)) TeamId
tId
in ClientChannels
cs ClientChannels
-> (ClientChannels -> ClientChannels) -> ClientChannels
forall a b. a -> (a -> b) -> b
& (HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap ((HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap ChannelId ClientChannel
-> HashMap ChannelId ClientChannel)
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ ChannelId
-> HashMap ChannelId ClientChannel
-> HashMap ChannelId ClientChannel
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> HashMap k v
HM.delete ChannelId
cId
ClientChannels
-> (ClientChannels -> ClientChannels) -> ClientChannels
forall a b. a -> (a -> b) -> b
& ClientChannels -> ClientChannels
removeChannelName
ClientChannels
-> (ClientChannels -> ClientChannels) -> ClientChannels
forall a b. a -> (a -> b) -> b
& (HashMap UserId ChannelId -> Identity (HashMap UserId ChannelId))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap UserId ChannelId)
userChannelMap ((HashMap UserId ChannelId -> Identity (HashMap UserId ChannelId))
-> ClientChannels -> Identity ClientChannels)
-> (HashMap UserId ChannelId -> HashMap UserId ChannelId)
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (ChannelId -> Bool)
-> HashMap UserId ChannelId -> HashMap UserId ChannelId
forall v k. (v -> Bool) -> HashMap k v -> HashMap k v
HM.filter (ChannelId -> ChannelId -> Bool
forall a. Eq a => a -> a -> Bool
/= ChannelId
cId)
instance Semigroup ClientChannels where
ClientChannels
a <> :: ClientChannels -> ClientChannels -> ClientChannels
<> ClientChannels
b =
let pairs :: [(ChannelId, ClientChannel)]
pairs = HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)]
forall k v. HashMap k v -> [(k, v)]
HM.toList (HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)])
-> HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)]
forall a b. (a -> b) -> a -> b
$ ClientChannels -> HashMap ChannelId ClientChannel
_chanMap ClientChannels
a
in ((ChannelId, ClientChannel) -> ClientChannels -> ClientChannels)
-> ClientChannels -> [(ChannelId, ClientChannel)] -> ClientChannels
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((ChannelId -> ClientChannel -> ClientChannels -> ClientChannels)
-> (ChannelId, ClientChannel) -> ClientChannels -> ClientChannels
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ChannelId -> ClientChannel -> ClientChannels -> ClientChannels
addChannel) ClientChannels
b [(ChannelId, ClientChannel)]
pairs
instance Monoid ClientChannels where
mempty :: ClientChannels
mempty = ClientChannels
noChannels
#if !MIN_VERSION_base(4,11,0)
mappend = (<>)
#endif
getDmChannelFor :: UserId -> ClientChannels -> Maybe ChannelId
getDmChannelFor :: UserId -> ClientChannels -> Maybe ChannelId
getDmChannelFor UserId
uId ClientChannels
cs = ClientChannels
csClientChannels
-> Getting (Maybe ChannelId) ClientChannels (Maybe ChannelId)
-> Maybe ChannelId
forall s a. s -> Getting a s a -> a
^.(HashMap UserId ChannelId
-> Const (Maybe ChannelId) (HashMap UserId ChannelId))
-> ClientChannels -> Const (Maybe ChannelId) ClientChannels
Lens' ClientChannels (HashMap UserId ChannelId)
userChannelMap((HashMap UserId ChannelId
-> Const (Maybe ChannelId) (HashMap UserId ChannelId))
-> ClientChannels -> Const (Maybe ChannelId) ClientChannels)
-> ((Maybe ChannelId -> Const (Maybe ChannelId) (Maybe ChannelId))
-> HashMap UserId ChannelId
-> Const (Maybe ChannelId) (HashMap UserId ChannelId))
-> Getting (Maybe ChannelId) ClientChannels (Maybe ChannelId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Index (HashMap UserId ChannelId)
-> Lens'
(HashMap UserId ChannelId)
(Maybe (IxValue (HashMap UserId ChannelId)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at UserId
Index (HashMap UserId ChannelId)
uId
allDmChannelMappings :: ClientChannels -> [(UserId, ChannelId)]
allDmChannelMappings :: ClientChannels -> [(UserId, ChannelId)]
allDmChannelMappings = HashMap UserId ChannelId -> [(UserId, ChannelId)]
forall k v. HashMap k v -> [(k, v)]
HM.toList (HashMap UserId ChannelId -> [(UserId, ChannelId)])
-> (ClientChannels -> HashMap UserId ChannelId)
-> ClientChannels
-> [(UserId, ChannelId)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientChannels -> HashMap UserId ChannelId
_userChannelMap
findChannelById :: ChannelId -> ClientChannels -> Maybe ClientChannel
findChannelById :: ChannelId -> ClientChannels -> Maybe ClientChannel
findChannelById ChannelId
cId = ChannelId -> HashMap ChannelId ClientChannel -> Maybe ClientChannel
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HM.lookup ChannelId
cId (HashMap ChannelId ClientChannel -> Maybe ClientChannel)
-> (ClientChannels -> HashMap ChannelId ClientChannel)
-> ClientChannels
-> Maybe ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientChannels -> HashMap ChannelId ClientChannel
_chanMap
modifyChannelById :: ChannelId -> (ClientChannel -> ClientChannel)
-> ClientChannels -> ClientChannels
modifyChannelById :: ChannelId
-> (ClientChannel -> ClientChannel)
-> ClientChannels
-> ClientChannels
modifyChannelById ChannelId
cId ClientChannel -> ClientChannel
f = (HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap((HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> ClientChannels -> Identity ClientChannels)
-> ((ClientChannel -> Identity ClientChannel)
-> HashMap ChannelId ClientChannel
-> Identity (HashMap ChannelId ClientChannel))
-> (ClientChannel -> Identity ClientChannel)
-> ClientChannels
-> Identity ClientChannels
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Index (HashMap ChannelId ClientChannel)
-> Traversal'
(HashMap ChannelId ClientChannel)
(IxValue (HashMap ChannelId ClientChannel))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix(ChannelId
Index (HashMap ChannelId ClientChannel)
cId) ((ClientChannel -> Identity ClientChannel)
-> ClientChannels -> Identity ClientChannels)
-> (ClientChannel -> ClientChannel)
-> ClientChannels
-> ClientChannels
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ ClientChannel -> ClientChannel
f
channelByIdL :: ChannelId -> Traversal' ClientChannels ClientChannel
channelByIdL :: ChannelId -> Traversal' ClientChannels ClientChannel
channelByIdL ChannelId
cId = (HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> ClientChannels -> f ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap ((HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> ClientChannels -> f ClientChannels)
-> ((ClientChannel -> f ClientChannel)
-> HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> (ClientChannel -> f ClientChannel)
-> ClientChannels
-> f ClientChannels
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (HashMap ChannelId ClientChannel)
-> Traversal'
(HashMap ChannelId ClientChannel)
(IxValue (HashMap ChannelId ClientChannel))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix ChannelId
Index (HashMap ChannelId ClientChannel)
cId
maybeChannelByIdL :: ChannelId -> Lens' ClientChannels (Maybe ClientChannel)
maybeChannelByIdL :: ChannelId -> Lens' ClientChannels (Maybe ClientChannel)
maybeChannelByIdL ChannelId
cId = (HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> ClientChannels -> f ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap ((HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> ClientChannels -> f ClientChannels)
-> ((Maybe ClientChannel -> f (Maybe ClientChannel))
-> HashMap ChannelId ClientChannel
-> f (HashMap ChannelId ClientChannel))
-> (Maybe ClientChannel -> f (Maybe ClientChannel))
-> ClientChannels
-> f ClientChannels
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (HashMap ChannelId ClientChannel)
-> Lens'
(HashMap ChannelId ClientChannel)
(Maybe (IxValue (HashMap ChannelId ClientChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at ChannelId
Index (HashMap ChannelId ClientChannel)
cId
filteredChannelIds :: (ClientChannel -> Bool) -> ClientChannels -> [ChannelId]
filteredChannelIds :: (ClientChannel -> Bool) -> ClientChannels -> [ChannelId]
filteredChannelIds ClientChannel -> Bool
f ClientChannels
cc = (ChannelId, ClientChannel) -> ChannelId
forall a b. (a, b) -> a
fst ((ChannelId, ClientChannel) -> ChannelId)
-> [(ChannelId, ClientChannel)] -> [ChannelId]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((ChannelId, ClientChannel) -> Bool)
-> [(ChannelId, ClientChannel)] -> [(ChannelId, ClientChannel)]
forall a. (a -> Bool) -> [a] -> [a]
filter (ClientChannel -> Bool
f (ClientChannel -> Bool)
-> ((ChannelId, ClientChannel) -> ClientChannel)
-> (ChannelId, ClientChannel)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ClientChannel) -> ClientChannel
forall a b. (a, b) -> b
snd) (HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)]
forall k v. HashMap k v -> [(k, v)]
HM.toList (ClientChannels
ccClientChannels
-> Getting
(HashMap ChannelId ClientChannel)
ClientChannels
(HashMap ChannelId ClientChannel)
-> HashMap ChannelId ClientChannel
forall s a. s -> Getting a s a -> a
^.Getting
(HashMap ChannelId ClientChannel)
ClientChannels
(HashMap ChannelId ClientChannel)
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap))
allTeamIds :: ClientChannels -> [TeamId]
allTeamIds :: ClientChannels -> [TeamId]
allTeamIds ClientChannels
cc = HashMap TeamId (Set Text) -> [TeamId]
forall k v. HashMap k v -> [k]
HM.keys (HashMap TeamId (Set Text) -> [TeamId])
-> HashMap TeamId (Set Text) -> [TeamId]
forall a b. (a -> b) -> a -> b
$ ClientChannels
ccClientChannels
-> Getting
(HashMap TeamId (Set Text))
ClientChannels
(HashMap TeamId (Set Text))
-> HashMap TeamId (Set Text)
forall s a. s -> Getting a s a -> a
^.Getting
(HashMap TeamId (Set Text))
ClientChannels
(HashMap TeamId (Set Text))
Lens' ClientChannels (HashMap TeamId (Set Text))
channelNameSet
filteredChannels :: ((ChannelId, ClientChannel) -> Bool)
-> ClientChannels -> [(ChannelId, ClientChannel)]
filteredChannels :: ((ChannelId, ClientChannel) -> Bool)
-> ClientChannels -> [(ChannelId, ClientChannel)]
filteredChannels (ChannelId, ClientChannel) -> Bool
f ClientChannels
cc = ((ChannelId, ClientChannel) -> Bool)
-> [(ChannelId, ClientChannel)] -> [(ChannelId, ClientChannel)]
forall a. (a -> Bool) -> [a] -> [a]
filter (ChannelId, ClientChannel) -> Bool
f ([(ChannelId, ClientChannel)] -> [(ChannelId, ClientChannel)])
-> [(ChannelId, ClientChannel)] -> [(ChannelId, ClientChannel)]
forall a b. (a -> b) -> a -> b
$ ClientChannels
ccClientChannels
-> Getting
[(ChannelId, ClientChannel)]
ClientChannels
[(ChannelId, ClientChannel)]
-> [(ChannelId, ClientChannel)]
forall s a. s -> Getting a s a -> a
^.(HashMap ChannelId ClientChannel
-> Const
[(ChannelId, ClientChannel)] (HashMap ChannelId ClientChannel))
-> ClientChannels
-> Const [(ChannelId, ClientChannel)] ClientChannels
Lens' ClientChannels (HashMap ChannelId ClientChannel)
chanMap((HashMap ChannelId ClientChannel
-> Const
[(ChannelId, ClientChannel)] (HashMap ChannelId ClientChannel))
-> ClientChannels
-> Const [(ChannelId, ClientChannel)] ClientChannels)
-> (([(ChannelId, ClientChannel)]
-> Const [(ChannelId, ClientChannel)] [(ChannelId, ClientChannel)])
-> HashMap ChannelId ClientChannel
-> Const
[(ChannelId, ClientChannel)] (HashMap ChannelId ClientChannel))
-> Getting
[(ChannelId, ClientChannel)]
ClientChannels
[(ChannelId, ClientChannel)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)])
-> SimpleGetter
(HashMap ChannelId ClientChannel) [(ChannelId, ClientChannel)]
forall s a. (s -> a) -> SimpleGetter s a
to HashMap ChannelId ClientChannel -> [(ChannelId, ClientChannel)]
forall k v. HashMap k v -> [(k, v)]
HM.toList
clearNewMessageIndicator :: ClientChannel -> ClientChannel
clearNewMessageIndicator :: ClientChannel -> ClientChannel
clearNewMessageIndicator ClientChannel
c = ClientChannel
c ClientChannel -> (ClientChannel -> ClientChannel) -> ClientChannel
forall a b. a -> (a -> b) -> b
& (ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel)
-> ((NewMessageIndicator -> Identity NewMessageIndicator)
-> ChannelInfo -> Identity ChannelInfo)
-> (NewMessageIndicator -> Identity NewMessageIndicator)
-> ClientChannel
-> Identity ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(NewMessageIndicator -> Identity NewMessageIndicator)
-> ChannelInfo -> Identity ChannelInfo
Lens' ChannelInfo NewMessageIndicator
cdNewMessageIndicator ((NewMessageIndicator -> Identity NewMessageIndicator)
-> ClientChannel -> Identity ClientChannel)
-> NewMessageIndicator -> ClientChannel -> ClientChannel
forall s t a b. ASetter s t a b -> b -> s -> t
.~ NewMessageIndicator
Hide
clearEditedThreshold :: ClientChannel -> ClientChannel
clearEditedThreshold :: ClientChannel -> ClientChannel
clearEditedThreshold ClientChannel
c = ClientChannel
c ClientChannel -> (ClientChannel -> ClientChannel) -> ClientChannel
forall a b. a -> (a -> b) -> b
& (ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel)
-> ((Maybe ServerTime -> Identity (Maybe ServerTime))
-> ChannelInfo -> Identity ChannelInfo)
-> (Maybe ServerTime -> Identity (Maybe ServerTime))
-> ClientChannel
-> Identity ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe ServerTime -> Identity (Maybe ServerTime))
-> ChannelInfo -> Identity ChannelInfo
Lens' ChannelInfo (Maybe ServerTime)
cdEditedMessageThreshold ((Maybe ServerTime -> Identity (Maybe ServerTime))
-> ClientChannel -> Identity ClientChannel)
-> Maybe ServerTime -> ClientChannel -> ClientChannel
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe ServerTime
forall a. Maybe a
Nothing
adjustUpdated :: Post -> ClientChannel -> ClientChannel
adjustUpdated :: Post -> ClientChannel -> ClientChannel
adjustUpdated Post
m =
(ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel)
-> ((ServerTime -> Identity ServerTime)
-> ChannelInfo -> Identity ChannelInfo)
-> (ServerTime -> Identity ServerTime)
-> ClientChannel
-> Identity ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ServerTime -> Identity ServerTime)
-> ChannelInfo -> Identity ChannelInfo
Lens' ChannelInfo ServerTime
cdUpdated ((ServerTime -> Identity ServerTime)
-> ClientChannel -> Identity ClientChannel)
-> (ServerTime -> ServerTime) -> ClientChannel -> ClientChannel
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ ServerTime -> ServerTime -> ServerTime
forall a. Ord a => a -> a -> a
max (Post -> ServerTime
maxPostTimestamp Post
m)
adjustEditedThreshold :: Post -> ClientChannel -> ClientChannel
adjustEditedThreshold :: Post -> ClientChannel -> ClientChannel
adjustEditedThreshold Post
m ClientChannel
c =
if Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postUpdateAtL ServerTime -> ServerTime -> Bool
forall a. Ord a => a -> a -> Bool
<= Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL
then ClientChannel
c
else ClientChannel
c ClientChannel -> (ClientChannel -> ClientChannel) -> ClientChannel
forall a b. a -> (a -> b) -> b
& (ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel)
-> ((Maybe ServerTime -> Identity (Maybe ServerTime))
-> ChannelInfo -> Identity ChannelInfo)
-> (Maybe ServerTime -> Identity (Maybe ServerTime))
-> ClientChannel
-> Identity ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe ServerTime -> Identity (Maybe ServerTime))
-> ChannelInfo -> Identity ChannelInfo
Lens' ChannelInfo (Maybe ServerTime)
cdEditedMessageThreshold ((Maybe ServerTime -> Identity (Maybe ServerTime))
-> ClientChannel -> Identity ClientChannel)
-> (Maybe ServerTime -> Maybe ServerTime)
-> ClientChannel
-> ClientChannel
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (\Maybe ServerTime
mt -> case Maybe ServerTime
mt of
Just ServerTime
t -> ServerTime -> Maybe ServerTime
forall a. a -> Maybe a
Just (ServerTime -> Maybe ServerTime) -> ServerTime -> Maybe ServerTime
forall a b. (a -> b) -> a -> b
$ ServerTime -> ServerTime -> ServerTime
forall a. Ord a => a -> a -> a
min (Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postUpdateAtL) ServerTime
t
Maybe ServerTime
Nothing -> ServerTime -> Maybe ServerTime
forall a. a -> Maybe a
Just (ServerTime -> Maybe ServerTime) -> ServerTime -> Maybe ServerTime
forall a b. (a -> b) -> a -> b
$ Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postUpdateAtL
)
maxPostTimestamp :: Post -> ServerTime
maxPostTimestamp :: Post -> ServerTime
maxPostTimestamp Post
m = ServerTime -> ServerTime -> ServerTime
forall a. Ord a => a -> a -> a
max (Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.(Maybe ServerTime -> Const ServerTime (Maybe ServerTime))
-> Post -> Const ServerTime Post
Lens' Post (Maybe ServerTime)
postDeleteAtL ((Maybe ServerTime -> Const ServerTime (Maybe ServerTime))
-> Post -> Const ServerTime Post)
-> ((ServerTime -> Const ServerTime ServerTime)
-> Maybe ServerTime -> Const ServerTime (Maybe ServerTime))
-> Getting ServerTime Post ServerTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ServerTime -> Lens' (Maybe ServerTime) ServerTime
forall a. Eq a => a -> Lens' (Maybe a) a
non (Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postUpdateAtL)) (Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL)
updateNewMessageIndicator :: Post -> ClientChannel -> ClientChannel
updateNewMessageIndicator :: Post -> ClientChannel -> ClientChannel
updateNewMessageIndicator Post
m =
(ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel
Lens' ClientChannel ChannelInfo
ccInfo((ChannelInfo -> Identity ChannelInfo)
-> ClientChannel -> Identity ClientChannel)
-> ((NewMessageIndicator -> Identity NewMessageIndicator)
-> ChannelInfo -> Identity ChannelInfo)
-> (NewMessageIndicator -> Identity NewMessageIndicator)
-> ClientChannel
-> Identity ClientChannel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(NewMessageIndicator -> Identity NewMessageIndicator)
-> ChannelInfo -> Identity ChannelInfo
Lens' ChannelInfo NewMessageIndicator
cdNewMessageIndicator ((NewMessageIndicator -> Identity NewMessageIndicator)
-> ClientChannel -> Identity ClientChannel)
-> (NewMessageIndicator -> NewMessageIndicator)
-> ClientChannel
-> ClientChannel
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~
(\NewMessageIndicator
old ->
case NewMessageIndicator
old of
NewMessageIndicator
Hide ->
ServerTime -> NewMessageIndicator
NewPostsStartingAt (ServerTime -> NewMessageIndicator)
-> ServerTime -> NewMessageIndicator
forall a b. (a -> b) -> a -> b
$ Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL
NewPostsStartingAt ServerTime
ts ->
ServerTime -> NewMessageIndicator
NewPostsStartingAt (ServerTime -> NewMessageIndicator)
-> ServerTime -> NewMessageIndicator
forall a b. (a -> b) -> a -> b
$ ServerTime -> ServerTime -> ServerTime
forall a. Ord a => a -> a -> a
min (Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL) ServerTime
ts
NewPostsAfterServerTime ServerTime
ts ->
if Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL ServerTime -> ServerTime -> Bool
forall a. Ord a => a -> a -> Bool
<= ServerTime
ts
then ServerTime -> NewMessageIndicator
NewPostsStartingAt (ServerTime -> NewMessageIndicator)
-> ServerTime -> NewMessageIndicator
forall a b. (a -> b) -> a -> b
$ Post
mPost -> Getting ServerTime Post ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Post ServerTime
Lens' Post ServerTime
postCreateAtL
else ServerTime -> NewMessageIndicator
NewPostsAfterServerTime ServerTime
ts
)
isTownSquare :: Channel -> Bool
isTownSquare :: Channel -> Bool
isTownSquare Channel
c = (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
cChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelNameL) Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"town-square"
channelDeleted :: Channel -> Bool
channelDeleted :: Channel -> Bool
channelDeleted Channel
c = Channel
cChannel -> Getting ServerTime Channel ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Channel ServerTime
Lens' Channel ServerTime
channelDeleteAtL ServerTime -> ServerTime -> Bool
forall a. Ord a => a -> a -> Bool
> Channel
cChannel -> Getting ServerTime Channel ServerTime -> ServerTime
forall s a. s -> Getting a s a -> a
^.Getting ServerTime Channel ServerTime
Lens' Channel ServerTime
channelCreateAtL