Adds more message types.
This commit is contained in:
parent
188d9780e3
commit
fbac64d78a
@ -1,8 +1,15 @@
|
|||||||
module Link.Protocol where
|
module Link.Protocol where
|
||||||
|
|
||||||
|
import Text.Printf (printf)
|
||||||
|
|
||||||
import Link.Types
|
import Link.Types
|
||||||
|
|
||||||
parseCommand :: String -> Maybe Message
|
parseCommand :: String -> Maybe Message
|
||||||
parseCommand command = case words command of
|
parseCommand command = case words command of
|
||||||
"PRIVMSG" : userName : msg -> Just $ PrivMsg (User userName) (unwords msg)
|
"PRIVMSG" : userName : msg -> Just $ PrivMsg (User userName) (unwords msg)
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
|
||||||
|
formatMessage :: Message -> String
|
||||||
|
formatMessage (PrivMsg user msg) = printf "PRIVMSG %s %s" (userName user) msg
|
||||||
|
formatMessage (NameInUse name) = printf "NAMEINUSE %s" name
|
||||||
|
formatMessage (Connected name) = printf "CONNECTED %s" name
|
||||||
|
@ -26,6 +26,9 @@ runServer port = withSocketsDo $ do
|
|||||||
printf "Accepted connection from %s: %s\n" host (show port')
|
printf "Accepted connection from %s: %s\n" host (show port')
|
||||||
forkFinally (connectClient server handle) (\_ -> hClose handle)
|
forkFinally (connectClient server handle) (\_ -> hClose handle)
|
||||||
|
|
||||||
|
printToHandle :: Handle -> String -> IO ()
|
||||||
|
printToHandle handle str = hPrintf handle "%s\n" str
|
||||||
|
|
||||||
connectClient :: Server -> Handle -> IO ()
|
connectClient :: Server -> Handle -> IO ()
|
||||||
connectClient server handle = do
|
connectClient server handle = do
|
||||||
hSetNewlineMode handle universalNewlineMode
|
hSetNewlineMode handle universalNewlineMode
|
||||||
@ -41,10 +44,10 @@ connectClient server handle = do
|
|||||||
ok <- checkAddClient server user handle
|
ok <- checkAddClient server user handle
|
||||||
case ok of
|
case ok of
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
hPrintf handle
|
printToHandle handle $ formatMessage (NameInUse name)
|
||||||
"The name %s is in use, please choose another\n" name
|
|
||||||
readName
|
readName
|
||||||
Just client ->
|
Just client -> do
|
||||||
|
printToHandle handle $ formatMessage (Connected name)
|
||||||
runClient server client `finally` removeClient server user
|
runClient server client `finally` removeClient server user
|
||||||
|
|
||||||
checkAddClient :: Server -> User -> Handle -> IO (Maybe Client)
|
checkAddClient :: Server -> User -> Handle -> IO (Maybe Client)
|
||||||
@ -97,8 +100,7 @@ runClient Server {..} Client {..} = forever $ do
|
|||||||
Nothing -> printf "No such user: %s\n" (userName user)
|
Nothing -> printf "No such user: %s\n" (userName user)
|
||||||
Just client -> sendMessage (PrivMsg clientUser msg) client
|
Just client -> sendMessage (PrivMsg clientUser msg) client
|
||||||
|
|
||||||
handleMessage (PrivMsg user msg) =
|
handleMessage = printToHandle clientHandle . formatMessage
|
||||||
hPrintf clientHandle "PRIVMSG %s %s\n" (userName user) msg
|
|
||||||
|
|
||||||
removeClient :: Server -> User -> IO ()
|
removeClient :: Server -> User -> IO ()
|
||||||
removeClient Server {..} user =
|
removeClient Server {..} user =
|
||||||
|
@ -4,7 +4,9 @@ import System.IO (Handle)
|
|||||||
import Control.Concurrent (MVar, Chan)
|
import Control.Concurrent (MVar, Chan)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|
||||||
data User = User { userName :: !String }
|
type UserName = String
|
||||||
|
|
||||||
|
data User = User { userName :: !UserName }
|
||||||
deriving (Show, Eq, Ord)
|
deriving (Show, Eq, Ord)
|
||||||
|
|
||||||
data Client = Client {
|
data Client = Client {
|
||||||
@ -17,5 +19,7 @@ data Server = Server {
|
|||||||
serverUsers :: MVar (Map.Map User Client)
|
serverUsers :: MVar (Map.Map User Client)
|
||||||
}
|
}
|
||||||
|
|
||||||
data Message = PrivMsg User String
|
data Message = NameInUse UserName
|
||||||
|
| Connected UserName
|
||||||
|
| PrivMsg User String
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
Loading…
Reference in New Issue
Block a user