1 {-# LANGUAGE OverloadedStrings #-}
4 import Prelude hiding (log, length, readFile, getContents)
6 import Control.Monad.Reader(runReaderT)
7 import Data.ByteString.Char8 (ByteString, getContents, readFile, unpack)
8 import System.Environment (getArgs)
9 import System.Exit (exitSuccess)
10 import System.Directory (doesFileExist)
12 import FuncTorrent.Logger (initLogger, logMessage, logStop)
13 import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
14 import FuncTorrent.Peer (handlePeerMsgs)
15 import FuncTorrent.Tracker (peers, getTrackerResponse)
17 logError :: String -> (String -> IO ()) -> IO ()
18 logError e logMsg = logMsg $ "parse error: \n" ++ e
21 peerId = "-HS0001-*-*-20150215"
27 usage = putStrLn "usage: functorrent torrent-file"
29 parse :: [String] -> IO ByteString
30 parse [] = getContents
32 fileExist <- doesFileExist a
35 else error "file does not exist"
42 let log = logMessage logR
43 log "Starting up functorrent"
44 log $ "Parsing arguments " ++ concat args
45 torrentStr <- parse args
46 case torrentToMetainfo torrentStr of
47 Left e -> logError e log
50 log $ "Downloading file : " ++ name (info m)
51 log "Trying to fetch peers"
53 log $ "Trackers: " ++ head (announceList m)
54 trackerResp <- runReaderT (getTrackerResponse peerId) m
56 Left e -> log $ "Error" ++ unpack e
58 log $ "Peers List : " ++ (show . peers $ peerList)
59 let p1 = head (peers peerList)
60 handlePeerMsgs p1 peerId m