From 2027b99f7a12986c6c0cb9d3205e0893fba17c9a Mon Sep 17 00:00:00 2001 From: Sam Truzjan Date: Fri, 13 Dec 2013 14:05:00 +0400 Subject: Update client example --- src/Network/BitTorrent/Client/Swarm.hs | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/Network/BitTorrent/Client/Swarm.hs (limited to 'src/Network/BitTorrent/Client') diff --git a/src/Network/BitTorrent/Client/Swarm.hs b/src/Network/BitTorrent/Client/Swarm.hs new file mode 100644 index 00000000..a9dca048 --- /dev/null +++ b/src/Network/BitTorrent/Client/Swarm.hs @@ -0,0 +1,49 @@ +module Network.BitTorrent.Client.Swarm + ( Swarm + , newLeecher + , askPeers + ) where + +import Data.Default +import Network + +import Data.Torrent +import Data.Torrent.InfoHash +import Network.BitTorrent.Core +import Network.BitTorrent.Tracker.Message +import Network.BitTorrent.Tracker.RPC as RPC + + +data Swarm = Swarm + { swarmTopic :: InfoHash + , thisPeerId :: PeerId + , listenerPort :: PortNumber + , trackerConn :: Tracker +-- , infoDict :: + } + +newLeecher :: PeerId -> PortNumber -> Torrent -> IO Swarm +newLeecher pid port Torrent {..} = do + tracker <- connect tAnnounce + return Swarm + { swarmTopic = idInfoHash tInfoDict + , thisPeerId = pid + , listenerPort = port + , trackerConn = tracker + } + +getAnnounceQuery :: Swarm -> AnnounceQuery +getAnnounceQuery Swarm {..} = AnnounceQuery + { reqInfoHash = swarmTopic + , reqPeerId = thisPeerId + , reqPort = listenerPort + , reqProgress = def + , reqIP = Nothing + , reqNumWant = Nothing + , reqEvent = Nothing + } + +askPeers :: Swarm -> IO [PeerAddr] +askPeers s @ Swarm {..} = do + AnnounceInfo {..} <- RPC.announce (getAnnounceQuery s) trackerConn + return (getPeerList respPeers) -- cgit v1.2.3