summaryrefslogtreecommitdiff
path: root/examples/dhtd.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2017-02-01 15:27:34 -0500
committerjoe <joe@jerkface.net>2017-02-01 15:27:34 -0500
commit713cee07450697e40811e74059739da02dd604c7 (patch)
treec30014b323d207f2b9aaf07ca819dc1ad7e31f30 /examples/dhtd.hs
parent38c23ccf93a7715babc2f99b2b98acd695159aca (diff)
Show peers as soon as they're found.
Diffstat (limited to 'examples/dhtd.hs')
-rw-r--r--examples/dhtd.hs24
1 files changed, 20 insertions, 4 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 1b02a37a..68074e2b 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -33,6 +33,7 @@ import System.Mem
33import Data.Torrent (InfoHash) 33import Data.Torrent (InfoHash)
34import Network.BitTorrent.Address 34import Network.BitTorrent.Address
35import Network.BitTorrent.DHT 35import Network.BitTorrent.DHT
36import Network.BitTorrent.DHT.Search
36import Network.BitTorrent.DHT.Query 37import Network.BitTorrent.DHT.Query
37import Network.BitTorrent.DHT.Message (FindNode(..),NodeFound(..),GetPeers(..),GotPeers(..)) 38import Network.BitTorrent.DHT.Message (FindNode(..),NodeFound(..),GetPeers(..),GotPeers(..))
38import Network.KRPC.Manager (QueryFailure(..)) 39import Network.KRPC.Manager (QueryFailure(..))
@@ -49,6 +50,7 @@ import Data.Time.Clock
49#else 50#else
50import Control.Concurrent 51import Control.Concurrent
51#endif 52#endif
53import Control.Concurrent.STM
52import System.Environment 54import System.Environment
53 55
54mkNodeAddr :: SockAddr -> NodeAddr IPv4 56mkNodeAddr :: SockAddr -> NodeAddr IPv4
@@ -130,7 +132,10 @@ marshalForClient :: String -> String
130marshalForClient s = show (length s) ++ ":" ++ s 132marshalForClient s = show (length s) ++ ":" ++ s
131 133
132hPutClient :: Handle -> String -> IO () 134hPutClient :: Handle -> String -> IO ()
133hPutClient h s = hPutStr h (marshalForClient s) 135hPutClient h s = hPutStr h ('.' : marshalForClient s)
136
137hPutClientChunk :: Handle -> String -> IO ()
138hPutClientChunk h s = hPutStr h (' ' : marshalForClient s)
134 139
135clientSession :: Node IPv4 -> MVar () -> RestrictedSocket -> Int -> Handle -> IO () 140clientSession :: Node IPv4 -> MVar () -> RestrictedSocket -> Int -> Handle -> IO ()
136clientSession st signalQuit sock n h = do 141clientSession st signalQuit sock n h = do
@@ -280,9 +285,20 @@ clientSession st signalQuit sock n h = do
280 ("search-peers", s) -> cmd $ do 285 ("search-peers", s) -> cmd $ do
281 case readEither s of 286 case readEither s of
282 Right ih -> do 287 Right ih -> do
283 ps <- Set.toList <$> isearch ioGetPeers ih 288 (tid, s) <- isearch ioGetPeers ih
284 return $ do 289 flip fix Set.empty $ \again shown -> do
285 hPutClient h $ unlines $ map (show . pPrint) ps 290 (chk,fin) <- liftIO . atomically $ do
291 r <- (Set.\\ shown) <$> readTVar (searchResults s)
292 if not $ Set.null r
293 then (,) r <$> searchIsFinished s
294 else searchIsFinished s >>= check >> return (Set.empty,True)
295 let ps = case Set.toList chk of
296 [] -> ""
297 _ -> unlines $ map (show . pPrint) $ Set.toList chk
298 if fin then return $ hPutClient h ps
299 else do
300 liftIO $ hPutClientChunk h ps
301 again (shown `Set.union` chk)
286 Left er -> return $ hPutClient h er 302 Left er -> return $ hPutClient h er
287 303
288 _ -> cmd0 $ hPutClient h "error." 304 _ -> cmd0 $ hPutClient h "error."