1 {-# LANGUAGE OverloadedStrings #-}
4 import Prelude hiding (log, length, readFile, getContents)
5 import Data.ByteString.Char8 (ByteString, getContents, readFile, unpack)
6 import System.Environment (getArgs)
7 import System.Exit (exitSuccess)
8 import System.Directory (doesFileExist)
10 import FuncTorrent.Logger (initLogger, logMessage, logStop)
11 import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
12 import FuncTorrent.Peer (handlePeerMsgs)
13 import FuncTorrent.Tracker (peers, getTrackerResponse)
15 logError :: String -> (String -> IO ()) -> IO ()
16 logError e logMsg = logMsg $ "parse error: \n" ++ e
19 peerId = "-HS0001-*-*-20150215"
25 usage = putStrLn "usage: functorrent torrent-file"
27 parse :: [String] -> IO ByteString
28 parse [] = getContents
30 fileExist <- doesFileExist a
33 else error "file does not exist"
40 let log = logMessage logR
41 log "Starting up functorrent"
42 log $ "Parsing arguments " ++ concat args
43 torrentStr <- parse args
44 case torrentToMetainfo torrentStr of
45 Left e -> logError e log
48 log $ "Downloading file : " ++ name (info m)
49 log "Trying to fetch peers"
51 log $ "Trackers: " ++ head (announceList m)
52 trackerResp <- getTrackerResponse m peerId
54 Left e -> log $ "Error" ++ unpack e
56 log $ "Peers List : " ++ (show . peers $ peerList)
57 let p1 = head (peers peerList)
58 handlePeerMsgs p1 m peerId log