Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Parser IRC - Parse.hs

Parse.hs

Caricato da: ZioCrocifisso
Scarica il programma completo

  1. module Network.IRC.Parse (
  2.         parse
  3. ) where
  4.  
  5. import Control.Applicative hiding ((<|>), many)
  6.  
  7. import Network.IRC.Message
  8.  
  9. import Text.Parsec.Char
  10. import Text.Parsec.Combinator
  11. import Text.Parsec.Error (ParseError)
  12. import Text.Parsec.Prim hiding (parse)
  13. import Text.Parsec.String
  14.  
  15. parse :: String -> Either ParseError Message
  16. parse = runParser message () "IRC Message"
  17.  
  18. message :: Parser Message
  19. message = Message
  20.                 <$> option Me (try sender)
  21.                 <*> command
  22.                 <*> many (try shortArgument)
  23.                 <*> option Nothing (Just <$> longArgument)
  24.  
  25. sender :: Parser Sender
  26. sender = do
  27.         char ':'
  28.         s <- try user <|> servername
  29.         char ' '
  30.         return s
  31.  
  32. servername :: Parser Sender
  33. servername = ServerName <$> host
  34.  
  35. user :: Parser Sender
  36. user = User
  37.         <$> nick
  38.         <*> (char '!' *> username)
  39.         <*> (char '@' *> host)
  40.  
  41. nick :: Parser String
  42. nick = (:) <$> letter <*> many (letter <|> number <|> oneOf "-[]\\`^{}")
  43.  
  44. number :: Parser Char
  45. number = oneOf "0123456789"
  46.  
  47. username :: Parser String
  48. username = many1 $ noneOf " \0\r\n@"
  49.  
  50. host :: Parser String
  51. host = username
  52.  
  53. nonWhite :: Parser Char
  54. nonWhite = noneOf " \0\r\n"
  55.  
  56. command :: Parser String
  57. command = many1 letter <|> (show <$> many1 number)
  58.  
  59. shortArgument :: Parser String
  60. shortArgument = do
  61.         char ' '
  62.         (:) <$> noneOf ": \0\r\n" <*> many nonWhite
  63.  
  64. longArgument :: Parser String
  65. longArgument = do
  66.         string " :"
  67.         many (noneOf "\0\r\n")