Adds comments.
parent
43ca446e33
commit
5a826db986
|
@ -92,31 +92,49 @@ runClient Server {..} client@Client {..} = do
|
||||||
handleMessage Quit clientAlive = killClient clientAlive
|
handleMessage Quit clientAlive = killClient clientAlive
|
||||||
|
|
||||||
handleMessage (Join channelName) _ = atomically $ do
|
handleMessage (Join channelName) _ = atomically $ do
|
||||||
|
-- get user's channels
|
||||||
clientChannelMap <- readTVar clientChannelChans
|
clientChannelMap <- readTVar clientChannelChans
|
||||||
|
-- if user has not already joined the channel
|
||||||
unless (Map.member channelName clientChannelMap) $ do
|
unless (Map.member channelName clientChannelMap) $ do
|
||||||
channelMap <- readTVar serverChannels
|
-- get server channels
|
||||||
|
channelMap <- readTVar serverChannels
|
||||||
channel@Channel {channelChan} <- case Map.lookup channelName channelMap of
|
channel@Channel {channelChan} <- case Map.lookup channelName channelMap of
|
||||||
Just (channel@Channel {channelUsers}) -> do
|
Just (channel@Channel {channelUsers}) -> do
|
||||||
|
-- if the channel already exists on the server, add user to it
|
||||||
modifyTVar' channelUsers $ Set.insert clientUser
|
modifyTVar' channelUsers $ Set.insert clientUser
|
||||||
return channel
|
return channel
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
|
-- else create a new channel with this user in it
|
||||||
channel <- newChannel channelName $ Set.singleton clientUser
|
channel <- newChannel channelName $ Set.singleton clientUser
|
||||||
|
-- and add it to the server
|
||||||
modifyTVar' serverChannels $ Map.insert channelName channel
|
modifyTVar' serverChannels $ Map.insert channelName channel
|
||||||
return channel
|
return channel
|
||||||
|
-- duplicate channel TChan for this user
|
||||||
clientChannelChan <- dupTChan channelChan
|
clientChannelChan <- dupTChan channelChan
|
||||||
|
-- and add it to the users's channels
|
||||||
modifyTVar' clientChannelChans $ Map.insert channelName clientChannelChan
|
modifyTVar' clientChannelChans $ Map.insert channelName clientChannelChan
|
||||||
|
-- send a JOINED message to the channel for this user
|
||||||
tellMessage channel $ Joined channelName clientUser
|
tellMessage channel $ Joined channelName clientUser
|
||||||
|
|
||||||
handleMessage (Leave channelName) _ = atomically $ do
|
handleMessage (Leave channelName) _ = atomically $ do
|
||||||
|
-- get server channels
|
||||||
channelMap <- readTVar serverChannels
|
channelMap <- readTVar serverChannels
|
||||||
case Map.lookup channelName channelMap of
|
case Map.lookup channelName channelMap of
|
||||||
|
-- if channel exists on the server
|
||||||
Just (channel@Channel {channelUsers}) -> do
|
Just (channel@Channel {channelUsers}) -> do
|
||||||
|
-- remove this user from the channel
|
||||||
modifyTVar' channelUsers $ Set.delete clientUser
|
modifyTVar' channelUsers $ Set.delete clientUser
|
||||||
|
-- get users in the channel
|
||||||
users <- readTVar channelUsers
|
users <- readTVar channelUsers
|
||||||
|
-- if there are no users in the channel
|
||||||
when (Set.null users) $
|
when (Set.null users) $
|
||||||
|
-- remove the channel from the server
|
||||||
modifyTVar' serverChannels $ Map.delete channelName
|
modifyTVar' serverChannels $ Map.delete channelName
|
||||||
|
-- remove the channel from the user's channels
|
||||||
modifyTVar' clientChannelChans $ Map.delete channelName
|
modifyTVar' clientChannelChans $ Map.delete channelName
|
||||||
|
-- send a LEFT message to the channel for this user
|
||||||
tellMessage channel $ Leaved channelName clientUser
|
tellMessage channel $ Leaved channelName clientUser
|
||||||
|
-- nothing to do if the channel does not exist
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
|
|
||||||
handleMessage (Names channelName) _ = atomically $ do
|
handleMessage (Names channelName) _ = atomically $ do
|
||||||
|
|
Loading…
Reference in New Issue