3 import Prelude hiding (length, readFile)
5 import Bencode (decode, BVal(..))
6 import Data.ByteString.Char8 as BC (ByteString, pack, length, readFile, length)
7 import Data.Functor ((<$>))
8 import Metainfo (announce, lengthInBytes, mkMetaInfo, info)
9 import Peer (getPeers, getPeerResponse, handShakeMsg)
10 import System.Environment (getArgs)
11 import System.Exit (exitSuccess)
12 import Tracker (connect, prepareRequest)
13 import Text.ParserCombinators.Parsec (ParseError)
16 logError :: ParseError -> (String -> IO ()) -> IO ()
17 logError e logMsg = logMsg $ "parse error: \n" ++ show e
20 peerId = "-HS0001-*-*-20150215"
26 usage = putStrLn "usage: functorrent torrent-file"
28 parse :: [String] -> IO ByteString
29 parse [] = usage >> exit
30 parse [a] = readFile a
37 let logMsg = logMessage logR
38 logMsg $ "Parsing input file: " ++ concat args
39 torrentStr <- parse args
40 case decode torrentStr of
43 Nothing -> logMsg "parse error"
45 logMsg "Input File OK"
47 let len = lengthInBytes $ info m
50 logMsg "Trying to fetch peers: "
52 body <- pack <$> connect (announce m) (prepareRequest d' peerId len)
54 let peerResponse = show $ getPeers $ getPeerResponse body
55 logMsg $ "Peers List : " ++ peerResponse
57 let hsMsgLen = show $ length $ handShakeMsg d' peerId
58 logMsg $ "Hand-shake message length : " ++ hsMsgLen
60 Left e -> logError e logMsg