1 {-# LANGUAGE OverloadedStrings #-}
4 import Prelude hiding (length, readFile, writeFile)
5 import Data.ByteString.Char8 (ByteString, readFile, writeFile, length)
6 import System.Environment (getArgs)
7 import System.Exit (exitSuccess)
8 import System.Directory (doesFileExist)
9 import Text.ParserCombinators.Parsec (ParseError)
11 import FuncTorrent.Bencode (decode, BVal(..))
12 import FuncTorrent.Logger (initLogger, logMessage, logStop)
13 import FuncTorrent.Metainfo (announce, lengthInBytes, mkMetaInfo, info, name)
14 import FuncTorrent.Peer (peers, getPeerResponse, handShakeMsg)
15 import FuncTorrent.Tracker (connect, prepareRequest)
17 logError :: ParseError -> (String -> IO ()) -> IO ()
18 logError e logMsg = logMsg $ "parse error: \n" ++ show e
21 peerId = "-HS0001-*-*-20150215"
27 usage = putStrLn "usage: functorrent torrent-file"
29 parse :: [String] -> IO ByteString
30 parse [] = usage >> exit
32 fileExist <- doesFileExist a
35 else error "file does not exist"
42 let logMsg = logMessage logR
43 logMsg $ "Parsing input file: " ++ concat args
44 torrentStr <- parse args
45 case decode torrentStr of
48 Nothing -> logMsg "parse error"
50 logMsg "Input File OK"
52 let len = lengthInBytes $ info m
55 logMsg "Trying to fetch peers: "
56 body <- connect (announce m) (prepareRequest d' peerId len)
58 -- TODO: Write to ~/.functorrent/caches
59 writeFile (name (info m) ++ ".cache") body
61 let peerResponse = show $ peers $ getPeerResponse body
62 logMsg $ "Peers List : " ++ peerResponse
64 let hsMsgLen = show $ length $ handShakeMsg d' peerId
65 logMsg $ "Hand-shake message length : " ++ hsMsgLen
67 Left e -> logError e logMsg