irc-dcc-2.0.0: src/Network/IRC/DCC.hs
{-| DCC command parsing and encoding module.
Use the 'CtcpCommand' type class to convert between 'CTCPByteString's
and typed values.
Try converting a 'CTCPByteString' to a 'DccSend' value:
> fromCtcp ctcpMessage :: Either String DccSend
Encoding a 'DccSend' value to a 'CTCPByteString':
> toCtcp (Send fileName ip port (Just fileSize))
-}
module Network.IRC.DCC (
-- * DCC command parsing and encoding
CtcpCommand(..)
-- * DCC command types
-- ** Messaging commands (DCC CHAT)
, DccChat(..)
, DccClose(..)
-- ** File Transfer commands (DCC SEND)
, DccSend(..)
, DccResume(..)
, DccAccept(..)
, acceptedPosition
, DccSendReverseClient(..)
-- *** Constructors from other commands
, resumeFromSend
-- *** Protocol variant checks
, matchesSend
-- ** Helper Types
, Path(..)
, fromPath
, PathType(..)
, FileOffset
, Token(..)
) where
import Network.IRC.DCC.Internal
-- | Try resuming a file offer
resumeFromSend :: DccSend -> FileOffset -> DccResume
resumeFromSend (Send path' _ port _) pos =
Resume path' port pos
resumeFromSend (SendReverseServer path' _ _ token') pos =
ResumeReverse path' pos token'
-- | Check if a 'DccSend' and a 'DccAccept' command are part of the same negotiation.
matchesSend :: DccAccept -> DccSend -> Bool
matchesSend (Accept pathA portA _) (Send pathS _ portS _) =
pathS == pathA && portS == portA
matchesSend (AcceptReverse pathA _ tokenA) (SendReverseServer pathS _ _ tokenS) =
pathS == pathA && tokenS == tokenA
matchesSend _ _ = False