module Client.Image.UserList where
import Client.ChannelState
import Client.ConnectionState
import Client.Image.Message
import Client.State
import Control.Lens
import qualified Data.HashMap.Strict as HashMap
import Data.List
import Data.Ord
import qualified Data.Text as Text
import Graphics.Vty.Image
import Irc.Identifier
import Irc.UserInfo
userListImages ::
NetworkName ->
Identifier ->
ClientState -> [Image]
userListImages network channel st =
[horizCat (intersperse gap (map renderUser usersList))]
where
matcher = clientMatcher st
renderUser (ident, sigils) =
string (withForeColor defAttr cyan) sigils <|>
coloredIdentifier ident
gap = char defAttr ' '
matcher' (ident,sigils) = matcher (Text.pack sigils `Text.append` idText ident)
usersList = sortBy (comparing fst)
$ filter matcher'
$ HashMap.toList usersHashMap
usersHashMap =
view ( clientConnection network
. csChannels . ix channel
. chanUsers ) st
userInfoImages ::
NetworkName ->
Identifier ->
ClientState -> [Image]
userInfoImages network channel st = renderEntry <$> usersList
where
matcher = clientMatcher st
renderEntry (info, sigils) =
string (withForeColor defAttr cyan) sigils <|>
coloredUserInfo DetailedRender info
matcher' (info,sigils) =
matcher (Text.pack sigils `Text.append` renderUserInfo info)
userInfos = view (clientConnection network . csUsers) st
toInfo nick =
case view (at nick . non (Nothing,Nothing)) userInfos of
(n,h) -> UserInfo nick n h
usersList = sortBy (flip (comparing (userNick . fst)))
$ filter matcher'
$ map (over _1 toInfo)
$ HashMap.toList usersHashMap
usersHashMap =
view ( clientConnection network
. csChannels . ix channel
. chanUsers ) st