-mkArgs :: PortNumber -> String -> Metainfo -> [(String, ByteString)]
-mkArgs port peer_id m = [("info_hash", pack . urlEncodeHash . B16.encode . infoHash $ m),
- ("peer_id", pack . urlEncode $ peer_id),
- ("port", pack $ show port),
- ("uploaded", "0"),
- ("downloaded", "0"),
- ("left", pack . show . lengthInBytes $ info m),
- ("compact", "1"),
- ("event", "started")]
-
+mkArgs :: PortNumber -> String -> Integer -> Integer -> Metainfo -> [(String, ByteString)]
+mkArgs port peer_id up down m =
+ let fileSize = lengthInBytes $ info m
+ bytesLeft = fileSize - down
+ in
+ [("info_hash", pack . urlEncodeHash . B16.encode . infoHash $ m),
+ ("peer_id", pack . urlEncode $ peer_id),
+ ("port", pack $ show port),
+ ("uploaded", pack $ show up),
+ ("downloaded", pack $ show down),
+ ("left", pack $ show bytesLeft),
+ ("compact", "1"),
+ ("event", "started")]
+
+trackerLoop :: PortNumber -> String -> Metainfo -> TState -> IO ByteString
+trackerLoop port peerId m st = do
+ up <- liftIO $ readMVar $ uploaded st
+ down <- liftIO $ readMVar $ downloaded st
+ resp <- liftIO $ httpget (head . announceList $ m) $ mkArgs port peerId up down m
+ case decode resp of
+ Left e -> return $ pack (show e)
+ Right trackerInfo ->
+ case mkTrackerResponse trackerInfo of
+ Left e -> return e
+ Right tresp -> do
+ _ <- threadDelay $ fromIntegral (interval tresp)
+ _ <- putMVar (connectedPeers st) (peers tresp)
+ trackerLoop port peerId m st