]> git.rkrishnan.org Git - functorrent.git/blob - src/Main.hs
b8afb0e830a25853d37632e250633055f814cd53
[functorrent.git] / src / Main.hs
1 module Main where
2
3 import Prelude hiding (length, readFile)
4
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)
14 import Logger
15
16 logError :: ParseError -> (String -> IO ()) -> IO ()
17 logError e logMsg = logMsg $ "parse error: \n" ++ show e
18
19 peerId :: String
20 peerId = "-HS0001-*-*-20150215"
21
22 exit :: IO ByteString
23 exit = exitSuccess
24
25 usage :: IO ()
26 usage = putStrLn "usage: functorrent torrent-file"
27
28 parse :: [String] -> IO ByteString
29 parse [] = usage >> exit
30 parse [a] = readFile a
31 parse _ = exit
32
33 main :: IO ()
34 main = do
35     args <- getArgs
36     logR <- initLogger
37     let logMsg = logMessage logR
38     logMsg $ "Parsing input file: " ++ concat args
39     torrentStr <- parse args
40     case decode torrentStr of
41       Right d ->
42           case mkMetaInfo d of
43             Nothing -> logMsg "parse error"
44             Just m -> do
45               logMsg "Input File OK"
46
47               let len = lengthInBytes $ info m
48                   (Bdict d') = d
49               
50               logMsg "Trying to fetch peers: "
51
52               body <- pack <$> connect (announce m) (prepareRequest d' peerId len)
53               
54               let peerResponse = show $ getPeers $ getPeerResponse body
55               logMsg $ "Peers List : " ++ peerResponse
56               
57               let hsMsgLen = show $ length $ handShakeMsg d' peerId
58               logMsg $ "Hand-shake message length : " ++ hsMsgLen
59
60       Left e -> logError e logMsg
61     logStop logR