macbeth-lib-0.0.12: src/Macbeth/Fics/Parsers/Players.hs
{-# LANGUAGE OverloadedStrings #-}
module Macbeth.Fics.Parsers.Players (
finger,
players,
history,
userHandle,
partnerNotOpen,
partnerOffer,
partnerDeclined,
partnerAccepted,
players',
player'
) where
import Macbeth.Fics.FicsMessage
import Macbeth.Fics.Api.Player
import Macbeth.Fics.Parsers.Api
import qualified Macbeth.Fics.Parsers.RatingParser as RP
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
players :: Parser FicsMessage
players = Players <$> (commandHead 146 *> players')
partnerNotOpen :: Parser FicsMessage
partnerNotOpen = PartnerNotOpen <$> (commandHead 84 *> userHandle <* " is not open for bughouse.")
partnerOffer :: Parser FicsMessage
partnerOffer = PartnerOffer <$> (userHandle <* " offers to be your bughouse partner")
partnerDeclined :: Parser FicsMessage
partnerDeclined = PartnerDeclined <$> (userHandle <* " declines the partnership request.")
partnerAccepted :: Parser FicsMessage
partnerAccepted = PartnerAccepted <$> (userHandle <* " agrees to be your partner.")
finger :: Parser FicsMessage
finger = Finger
<$> (commandHead 37 *> "Finger of " *> userHandle <* ":")
<*> manyTill anyChar "\ETB"
history :: Parser FicsMessage
history = history' <|> emptyHistory
history' :: Parser FicsMessage
history' = History
<$> (commandHead 51 *> "\nHistory for " *> userHandle <* ":")
<*> manyTill anyChar "\ETB"
emptyHistory :: Parser FicsMessage
emptyHistory = do
userHandle <- commandHead 51 *> userHandle <* " has no history games."
return $ History userHandle (name userHandle ++ " has no history games.\n")
players' :: Parser [Player]
players' = concat <$> sepBy (many' (player' <* many " ")) "\n"
player' :: Parser Player
player' = Player
<$> RP.rating
<*> status'
<*> userHandle
status' :: Parser Status
status' =
"^" *> pure InvolvedInAGame <|>
"~" *> pure RunningASimulMatch <|>
":" *> pure NotOpenForMatch <|>
"#" *> pure ExaminingAGame <|>
"." *> pure InactiveOrBusy <|>
" " *> pure NotBusy <|>
"&" *> pure InvolvedInATournament
userHandle :: Parser UserHandle
userHandle = UserHandle
<$> many1' letter_ascii
<*> option [] (many handleType')
handleType' :: Parser HandleType
handleType' =
"(*)" *> pure Admin <|>
"(B)" *> pure Blindfold <|>
"(C)" *> pure Computer <|>
"(D)" *> pure NOT_DOCUMENTED <|>
"(T)" *> pure Team <|>
"(U)" *> pure Unregistered <|>
"(CA)" *> pure ChessAdvisor <|>
"(SR)" *> pure ServiceRepresentative <|>
"(TD)" *> pure ServiceRepresentative <|>
"(TM)" *> pure MamerManager <|>
"(GM)" *> pure GrandMaster <|>
"(IM)" *> pure InternationalMaster <|>
"(FM)" *> pure FideMaster <|>
"(WGM)" *> pure WomenGrandMaster <|>
"(WIM)" *> pure WomenInternationalMaster <|>
"(WFM)" *> pure WomenFideMaster