-- |
-- Module:     Network.FastIRC.Users
-- Copyright:  (c) 2010 Ertugrul Soeylemez
-- License:    BSD3
-- Maintainer: Ertugrul Soeylemez
-- Stability:  experimental
--
-- This module includes parsers for IRC users.

module Network.FastIRC.Users
  ( UserSpec(..),
    userParser )
  where

import qualified Data.ByteString.Char8 as B
import Control.Applicative
import Control.Monad
import Data.Attoparsec.Char8 as P
import Network.FastIRC.ServerSet
import Network.FastIRC.Utils


-- | IRC user or server.

data UserSpec
  -- | Nickname.
  = Nick B.ByteString
  -- | Nickname, username and hostname.
  | User B.ByteString B.ByteString B.ByteString
  -- | IRC server.
  | Server B.ByteString
  deriving (Eq, Read, Show)


-- | A 'Parser' for IRC users and servers.

userParser :: ServerSet -> Parser UserSpec
userParser servers =
  try server <|> try full <|> nickOnly

  where
    server :: Parser UserSpec
    server = do
      srv <- P.takeWhile1 isIRCTokChar
      guard $ srv `isServer` servers
      return (Server srv)

    full :: Parser UserSpec
    full =
      User <$> P.takeWhile1 isNickChar <* char '!'
           <*> P.takeWhile1 isUserChar <* char '@'
           <*> P.takeWhile1 isHostChar

    nickOnly :: Parser UserSpec
    nickOnly = Nick <$> P.takeWhile1 isNickChar