3 import qualified Utils as U
4 import qualified Bencode as Benc
5 import qualified Data.Map as M
6 import qualified Data.ByteString.Char8 as BC
7 import qualified Data.ByteString.Base16 as B16
8 import qualified Data.List as L
10 data Peer = Peer { ip :: String
14 data PeerResp = PeerResponse { interval :: Maybe Integer
16 , complete :: Maybe Integer
17 , incomplete :: Maybe Integer
20 toInt :: String -> Integer
23 getPeers :: PeerResp -> [Peer]
26 getPeerResponse :: BC.ByteString -> PeerResp
27 getPeerResponse body = case Benc.decode body of
28 Right (Benc.Bdict peerM) ->
29 let (Just (Benc.Bint i)) = M.lookup (Benc.Bstr (BC.pack "lookup")) peerM
30 (Benc.Bstr peersBS) = peerM M.! Benc.Bstr (BC.pack "peers")
31 pl = map (\peer -> let (ip', port') = BC.splitAt 4 peer
32 in Peer { ip = toIPNum ip'
33 , port = toPortNum port'
36 in PeerResponse { interval = Just i
39 , incomplete = Nothing
41 where toPortNum = read . ("0x" ++) . BC.unpack . B16.encode
42 toIPNum = L.intercalate "." .
43 map (show . toInt . ("0x" ++) . BC.unpack) .
44 U.splitN 2 . B16.encode
45 _ -> PeerResponse { interval = Nothing
48 , incomplete = Nothing