summaryrefslogtreecommitdiffstats
path: root/Hirc
diff options
context:
space:
mode:
Diffstat (limited to 'Hirc')
-rw-r--r--Hirc/Parser.hs23
-rw-r--r--Hirc/Types.hs26
2 files changed, 49 insertions, 0 deletions
diff --git a/Hirc/Parser.hs b/Hirc/Parser.hs
new file mode 100644
index 0000000..2cb2451
--- /dev/null
+++ b/Hirc/Parser.hs
@@ -0,0 +1,23 @@
+module Hirc.Parser where
+
+import Data.Char
+import Hirc.Types
+import Text.Parsec
+import Text.Parsec.String
+
+message :: Parser Message
+message =
+ Message <$> optionMaybe (char ':' *> prefix) <* spaces1 <*> command <*> params
+ where
+ spaces1 = skipMany1 space
+ prefix = Prefix <$> nick
+ <*> optionMaybe (char '!' *> user)
+ <*> optionMaybe (char '@' *> host)
+ nick = many1 (noneOf " !@")
+ user = many1 (noneOf " !@")
+ host = many1 (noneOf " !@")
+ command = UnknownCommand <$> many1 nonspace
+ params = many1 (spaces1 *> (trailing <|> middle))
+ trailing = char ':' *> many1 anyChar
+ middle = many1 nonspace
+ nonspace = satisfy (not . isSpace)
diff --git a/Hirc/Types.hs b/Hirc/Types.hs
new file mode 100644
index 0000000..1bb258c
--- /dev/null
+++ b/Hirc/Types.hs
@@ -0,0 +1,26 @@
+module Hirc.Types where
+
+data Message =
+ Message {
+ m_prefix :: Maybe Prefix,
+ m_command :: Command,
+ m_params :: [Param]
+ }
+ deriving Show
+
+type Param = String
+
+data Prefix =
+ Prefix {
+ p_name :: String,
+ p_user :: Maybe String,
+ p_host :: Maybe String
+ }
+ deriving Show
+
+data Command =
+ PRIVMSG Receiver [Receiver] String |
+ UnknownCommand String
+ deriving Show
+
+type Receiver = String