-{-# LANGUAGE OverloadedStrings #-}
-module Main where
-
-import Prelude hiding (log, length, readFile, getContents)
-import Data.ByteString.Char8 (ByteString, getContents, readFile, unpack)
-import System.Environment (getArgs)
-import System.Exit (exitSuccess)
-import System.Directory (doesFileExist)
-
-import FuncTorrent.Logger (initLogger, logMessage, logStop)
-import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
-import FuncTorrent.Peer (handlePeerMsgs)
-import FuncTorrent.Tracker (peers, getTrackerResponse)
-
-logError :: String -> (String -> IO ()) -> IO ()
-logError e logMsg = logMsg $ "parse error: \n" ++ e
-
-peerId :: String
-peerId = "-HS0001-*-*-20150215"
-
-exit :: IO ByteString
-exit = exitSuccess
-
-usage :: IO ()
-usage = putStrLn "usage: functorrent torrent-file"
-
-parse :: [String] -> IO ByteString
-parse [] = getContents
-parse [a] = do
- fileExist <- doesFileExist a
- if fileExist
- then readFile a
- else error "file does not exist"
-parse _ = exit
-
-main :: IO ()
-main = do
- args <- getArgs
- logR <- initLogger
- let log = logMessage logR
- log "Starting up functorrent"
- log $ "Parsing arguments " ++ concat args
- torrentStr <- parse args
- case torrentToMetainfo torrentStr of
- Left e -> logError e log
- Right m -> do
- log "Input File OK"
- log $ "Downloading file : " ++ name (info m)
- log "Trying to fetch peers"
-
- log $ "Trackers: " ++ head (announceList m)
- trackerResp <- getTrackerResponse m peerId
- case trackerResp of
- Left e -> log $ "Error" ++ unpack e
- Right peerList -> do
- log $ "Peers List : " ++ (show . peers $ peerList)
- let p1 = head (peers peerList)
- handlePeerMsgs p1 m peerId
- logStop logR