Adds a login command.
This commit is contained in:
parent
e8065147df
commit
469b600aa2
@ -9,6 +9,7 @@ import Link.Types
|
|||||||
parseCommand :: String -> Maybe Message
|
parseCommand :: String -> Maybe Message
|
||||||
parseCommand command = case words command of
|
parseCommand command = case words command of
|
||||||
["PONG"] -> Just Pong
|
["PONG"] -> Just Pong
|
||||||
|
"LOGIN" : userName -> Just $ Login (unwords userName)
|
||||||
"MSG" : userName : msg -> Just $ Msg (User userName) (unwords msg)
|
"MSG" : userName : msg -> Just $ Msg (User userName) (unwords msg)
|
||||||
"TELL" : channelName : msg -> Just $ Tell channelName (unwords msg)
|
"TELL" : channelName : msg -> Just $ Tell channelName (unwords msg)
|
||||||
["QUIT"] -> Just Quit
|
["QUIT"] -> Just Quit
|
||||||
@ -20,7 +21,7 @@ parseCommand command = case words command of
|
|||||||
formatMessage :: Message -> String
|
formatMessage :: Message -> String
|
||||||
formatMessage (MsgReply user msg) = printf "MSG %s %s" (userName user) msg
|
formatMessage (MsgReply user msg) = printf "MSG %s %s" (userName user) msg
|
||||||
formatMessage (NameInUse name) = printf "NAMEINUSE %s" name
|
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 Ping = "PING"
|
||||||
formatMessage (NoSuchUser name) = printf "NOSUCHUSER %s" name
|
formatMessage (NoSuchUser name) = printf "NOSUCHUSER %s" name
|
||||||
formatMessage (Joined channelName user) = printf "JOINED %s %s" channelName (userName user)
|
formatMessage (Joined channelName user) = printf "JOINED %s %s" channelName (userName user)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
module Link.Server where
|
module Link.Server where
|
||||||
|
|
||||||
import Control.Concurrent
|
import Control.Concurrent
|
||||||
import Control.Exception hiding (handle)
|
import Control.Exception hiding (handle)
|
||||||
import Control.Monad (forever)
|
import Control.Monad (forever)
|
||||||
import Network (withSocketsDo, listenOn, accept, PortID(..))
|
import Network (withSocketsDo, listenOn, accept, PortID(..))
|
||||||
import System.IO (hClose, hSetNewlineMode, hSetBuffering, BufferMode(..),
|
import System.IO (hClose, hSetNewlineMode, hSetBuffering, BufferMode(..),
|
||||||
universalNewlineMode, hGetLine, Handle, stdout)
|
universalNewlineMode, hGetLine, Handle, stdout)
|
||||||
import Text.Printf (printf)
|
import Text.Printf (printf)
|
||||||
|
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
|
|
||||||
@ -32,19 +32,19 @@ connectClient server handle = do
|
|||||||
readName
|
readName
|
||||||
where
|
where
|
||||||
readName = do
|
readName = do
|
||||||
name <- hGetLine handle
|
command <- fmap parseCommand $ hGetLine handle
|
||||||
if null name
|
case command of
|
||||||
then readName
|
Just (Login name) -> do
|
||||||
else do
|
let user = User name
|
||||||
let user = User name
|
ok <- checkAddClient server user handle
|
||||||
ok <- checkAddClient server user handle
|
case ok of
|
||||||
case ok of
|
Nothing -> do
|
||||||
Nothing -> do
|
printToHandle handle . formatMessage $ NameInUse name
|
||||||
printToHandle handle . formatMessage $ NameInUse name
|
readName
|
||||||
readName
|
Just client -> do
|
||||||
Just client -> do
|
printToHandle handle . formatMessage $ LoggedIn name
|
||||||
printToHandle handle . formatMessage $ Connected name
|
runClient server client `finally` removeClient server user
|
||||||
runClient server client `finally` removeClient server user
|
_ -> readName
|
||||||
|
|
||||||
checkAddClient :: Server -> User -> Handle -> IO (Maybe Client)
|
checkAddClient :: Server -> User -> Handle -> IO (Maybe Client)
|
||||||
checkAddClient Server {..} user@User {..} handle =
|
checkAddClient Server {..} user@User {..} handle =
|
||||||
|
@ -54,7 +54,7 @@ newServer = do
|
|||||||
return $ Server serverUsers serverChannels
|
return $ Server serverUsers serverChannels
|
||||||
|
|
||||||
data Message = NameInUse UserName
|
data Message = NameInUse UserName
|
||||||
| Connected UserName
|
| LoggedIn UserName
|
||||||
| Ping
|
| Ping
|
||||||
| MsgReply User String
|
| MsgReply User String
|
||||||
| TellReply ChannelName User String
|
| TellReply ChannelName User String
|
||||||
@ -63,6 +63,7 @@ data Message = NameInUse UserName
|
|||||||
| Leaved ChannelName User
|
| Leaved ChannelName User
|
||||||
| NamesReply ChannelName (Set.Set User)
|
| NamesReply ChannelName (Set.Set User)
|
||||||
| Pong
|
| Pong
|
||||||
|
| Login UserName
|
||||||
| Msg User String
|
| Msg User String
|
||||||
| Tell ChannelName String
|
| Tell ChannelName String
|
||||||
| Join ChannelName
|
| Join ChannelName
|
||||||
|
Loading…
Reference in New Issue
Block a user