import qualified Tracker as T
import qualified Text.ParserCombinators.Parsec as Parsec
import qualified Peer as P
-import qualified Data.Map as M
import Data.Functor
printError :: Parsec.ParseError -> IO ()
main :: IO ()
main = do
- args <- getArgs
- torrentStr <- parse args
- case Benc.decode torrentStr of
- Right d -> case MInfo.mkMetaInfo d of
- Nothing -> putStrLn "parse error"
- Just m -> do
- let length = MInfo.lengthInBytes (MInfo.info m)
- body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId length)
- print (P.getPeers (P.getPeerResponse body))
- Left e -> printError e
- putStrLn "done"
+ args <- getArgs
+ torrentStr <- parse args
+ case Benc.decode torrentStr of
+ Right d ->
+ case MInfo.mkMetaInfo d of
+ Nothing -> putStrLn "parse error"
+ Just m -> do
+ let len = MInfo.lengthInBytes (MInfo.info m)
+ body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId len)
+ print (P.getPeers (P.getPeerResponse body))
+ Left e -> printError e
+ putStrLn "done"
-- "%124Vx%9a%bc%de%f1%23Eg%89%ab%cd%ef%124Vx%9a"
urlEncode :: BC.ByteString -> String
urlEncode bs = concatMap (encode . BC.unpack) (U.splitN 2 bs)
- where encode b@(c1 : c2 : []) = let c = chr (read ("0x" ++ b))
+ where encode b@[c1, c2] = let c = chr (read ("0x" ++ b))
in
escape c c1 c2
encode _ = ""
peerHash = B16.encode . SHA1.hash . BC.pack
prepareRequest :: Benc.BVal -> String -> Integer -> String
-prepareRequest (Benc.Bdict d) peer_id length =
+prepareRequest (Benc.Bdict d) peer_id len =
let p = [("info_hash", urlEncode (infoHash d)),
("peer_id", urlEncode (peerHash peer_id)),
("port", "6881"),
("uploaded", "0"),
("downloaded", "0"),
- ("left", show length),
+ ("left", show len),
("compact", "1"),
("event", "started")]
in