+
+clean :: String -> String
+clean = drop 1 . dropWhile (/= ':') . drop 1
+
+isPing :: String -> Bool
+isPing x = "PING :" `isPrefixOf` x
+
+pong :: Handle -> String -> IO ()
+pong h x = write h "PONG" (':' : drop 6 x)
+
+-- Dispatch a command
+eval :: Handle -> String -> IO ()
+eval h "!quit" = write h "QUIT" ":Exiting" >> exitSuccess
+eval h x | "!id " `isPrefixOf` x = privmsg h (drop 4 x)
+eval _ _ = return () -- ignore everything else
+
+-- Send a privmsg to a channel
+privmsg :: Handle -> String -> IO ()
+privmsg h s = write h "PRIVMSG" ("#nais-testing" ++ " :" ++ s)
+
+-- Register with the server
+register :: Handle -> Nick -> Realname -> IO ()
+register h nick realname = do
+ sendNICK h nick
+ sendUSER h nick realname
+
+-- Send NICK command
+sendNICK :: Handle -> Nick -> IO ()
+sendNICK h nick = write h "NICK" nick
+
+-- Send USER command
+sendUSER :: Handle -> Nick -> Realname -> IO ()
+sendUSER h nick realname = write h "USER" (nick ++ " 0 * :" ++ realname)