refactoring
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 16 Feb 2015 11:08:10 +0000 (16:38 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 16 Feb 2015 11:08:10 +0000 (16:38 +0530)
src/Main.hs
src/Peer.hs

index 24bd9a99f88236470f9e17ad5e18267b31194552..fa465de3d1b5261aceddc03c674f7e4af8515a14 100644 (file)
@@ -36,6 +36,6 @@ main = do
                Nothing -> putStrLn "parse error"
                Just m -> do
                  body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId)
-                 putStrLn (show (P.getPeers body))
+                 putStrLn (show (P.getPeers (P.getPeerResponse body)))
    Left e -> printError e
   putStrLn "done"
index 967a2123b1c7b390fcf22a0e3cb0e46d62be9b30..d30f9b0699e71d1fd3de2ae902ee2918bee2a8bb 100644 (file)
@@ -6,6 +6,7 @@ import qualified Data.Map as M
 import qualified Data.ByteString.Char8 as BC
 import qualified Data.ByteString.Base16 as B16
 import qualified Data.List as L
+import Control.Applicative ((<$>))
 
 data Peer = Peer { ip :: String
                  , port :: Integer
@@ -18,20 +19,22 @@ data PeerResp = PeerResponse { interval :: Maybe Integer
 toInt :: String -> Integer
 toInt = read
 
-getPeers :: BC.ByteString -> [Peer]
-getPeers body = case (Benc.decode body) of
-                 Right (Benc.Bdict peerM) -> 
-                   let interval' = M.lookup (Benc.Bstr (BC.pack "lookup")) peerM 
-                       (Benc.Bstr peersBS) = peerM M.! (Benc.Bstr (BC.pack "peers"))
-                   in
-                    map (\peer -> let (ip', port') = BC.splitAt 4 peer
-                                  in
-                                   Peer { ip = toIPNum ip',
-                                          port =  toPortNum port'
-                                        })
-                    (U.splitN 6 peersBS)
-                   where toPortNum = read . ("0x" ++) . BC.unpack . B16.encode
-                         toIPNum = (L.intercalate ".") .
-                                   map (show . toInt . ("0x" ++) . BC.unpack) .
-                                   (U.splitN 2) . B16.encode
-                 Left _ -> []
+getPeers :: PeerResp -> [Peer]
+getPeers = peers
+
+getPeerResponse :: BC.ByteString -> PeerResp
+getPeerResponse body = case (Benc.decode body) of
+                        Right (Benc.Bdict peerM) ->
+                          let (Just (Benc.Bint i)) = M.lookup (Benc.Bstr (BC.pack "lookup")) peerM
+                              (Benc.Bstr peersBS) = peerM M.! (Benc.Bstr (BC.pack "peers"))
+                              pl = map (\peer -> let (ip', port') = BC.splitAt 4 peer
+                                                 in Peer { ip = toIPNum ip',
+                                                           port =  toPortNum port'
+                                                         })
+                                   (U.splitN 6 peersBS)
+                          in PeerResponse { interval = Just i, peers = pl }
+                          where toPortNum = read . ("0x" ++) . BC.unpack . B16.encode
+                                toIPNum = (L.intercalate ".") .
+                                          map (show . toInt . ("0x" ++) . BC.unpack) .
+                                          (U.splitN 2) . B16.encode
+                        Left _ -> PeerResponse { interval = Nothing, peers = [] }