Adds a login command.

pull/1/head
Abhinav Sarkar 2015-09-10 18:41:56 +05:30
parent e8065147df
commit 469b600aa2
3 changed files with 23 additions and 21 deletions

View File

@ -9,6 +9,7 @@ import Link.Types
parseCommand :: String -> Maybe Message
parseCommand command = case words command of
["PONG"] -> Just Pong
"LOGIN" : userName -> Just $ Login (unwords userName)
"MSG" : userName : msg -> Just $ Msg (User userName) (unwords msg)
"TELL" : channelName : msg -> Just $ Tell channelName (unwords msg)
["QUIT"] -> Just Quit
@ -20,7 +21,7 @@ parseCommand command = case words command of
formatMessage :: Message -> String
formatMessage (MsgReply user msg) = printf "MSG %s %s" (userName user) msg
formatMessage (NameInUse name) = printf "NAMEINUSE %s" name
formatMessage (Connected name) = printf "CONNECTED %s" name
formatMessage (LoggedIn name) = printf "LOGGEDIN %s" name
formatMessage Ping = "PING"
formatMessage (NoSuchUser name) = printf "NOSUCHUSER %s" name
formatMessage (Joined channelName user) = printf "JOINED %s %s" channelName (userName user)

View File

@ -1,12 +1,12 @@
module Link.Server where
import Control.Concurrent
import Control.Exception hiding (handle)
import Control.Monad (forever)
import Network (withSocketsDo, listenOn, accept, PortID(..))
import System.IO (hClose, hSetNewlineMode, hSetBuffering, BufferMode(..),
universalNewlineMode, hGetLine, Handle, stdout)
import Text.Printf (printf)
import Control.Exception hiding (handle)
import Control.Monad (forever)
import Network (withSocketsDo, listenOn, accept, PortID(..))
import System.IO (hClose, hSetNewlineMode, hSetBuffering, BufferMode(..),
universalNewlineMode, hGetLine, Handle, stdout)
import Text.Printf (printf)
import qualified Data.Map.Strict as Map
@ -32,19 +32,19 @@ connectClient server handle = do
readName
where
readName = do
name <- hGetLine handle
if null name
then readName
else do
let user = User name
ok <- checkAddClient server user handle
case ok of
Nothing -> do
printToHandle handle . formatMessage $ NameInUse name
readName
Just client -> do
printToHandle handle . formatMessage $ Connected name
runClient server client `finally` removeClient server user
command <- fmap parseCommand $ hGetLine handle
case command of
Just (Login name) -> do
let user = User name
ok <- checkAddClient server user handle
case ok of
Nothing -> do
printToHandle handle . formatMessage $ NameInUse name
readName
Just client -> do
printToHandle handle . formatMessage $ LoggedIn name
runClient server client `finally` removeClient server user
_ -> readName
checkAddClient :: Server -> User -> Handle -> IO (Maybe Client)
checkAddClient Server {..} user@User {..} handle =

View File

@ -54,7 +54,7 @@ newServer = do
return $ Server serverUsers serverChannels
data Message = NameInUse UserName
| Connected UserName
| LoggedIn UserName
| Ping
| MsgReply User String
| TellReply ChannelName User String
@ -63,6 +63,7 @@ data Message = NameInUse UserName
| Leaved ChannelName User
| NamesReply ChannelName (Set.Set User)
| Pong
| Login UserName
| Msg User String
| Tell ChannelName String
| Join ChannelName