summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/Client.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/BitTorrent/Client.hs')
-rw-r--r--src/Network/BitTorrent/Client.hs33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/Network/BitTorrent/Client.hs b/src/Network/BitTorrent/Client.hs
index fc2b904a..a6151857 100644
--- a/src/Network/BitTorrent/Client.hs
+++ b/src/Network/BitTorrent/Client.hs
@@ -1,16 +1,21 @@
1module Network.BitTorrent.Client 1module Network.BitTorrent.Client
2 ( Options (..) 2 ( Options (..)
3 , Client (..) 3 , Client
4 , newClient
5 , addTorrent
4 ) where 6 ) where
5 7
8import Control.Concurrent.STM
6import Data.Default 9import Data.Default
7import Data.Function 10import Data.Function
11import Data.HashMap.Strict as HM
8import Data.Ord 12import Data.Ord
9import Data.Text 13import Data.Text
10import Network 14import Network
11 15
12import Data.Torrent 16import Data.Torrent
13import Data.Torrent.InfoHash 17import Data.Torrent.InfoHash
18import Network.BitTorrent.Client.Swarm
14import Network.BitTorrent.Core 19import Network.BitTorrent.Core
15import Network.BitTorrent.Exchange.Message 20import Network.BitTorrent.Exchange.Message
16 21
@@ -19,6 +24,7 @@ data Options = Options
19 { fingerprint :: Fingerprint 24 { fingerprint :: Fingerprint
20 , name :: Text 25 , name :: Text
21 , port :: PortNumber 26 , port :: PortNumber
27 , extensions :: [Extension]
22 } 28 }
23 29
24instance Default Options where 30instance Default Options where
@@ -26,11 +32,14 @@ instance Default Options where
26 { fingerprint = def 32 { fingerprint = def
27 , name = "hs-bittorrent" 33 , name = "hs-bittorrent"
28 , port = 6882 34 , port = 6882
35 , extensions = []
29 } 36 }
30 37
31data Client = Client 38data Client = Client
32 { clientPeerId :: !PeerId 39 { clientPeerId :: !PeerId
33 , allowedExtensions :: !Caps 40 , clientListenerPort :: !PortNumber
41 , allowedExtensions :: !Caps
42 , torrents :: TVar (HashMap InfoHash Swarm)
34 } 43 }
35 44
36instance Eq Client where 45instance Eq Client where
@@ -38,3 +47,21 @@ instance Eq Client where
38 47
39instance Ord Client where 48instance Ord Client where
40 compare = comparing clientPeerId 49 compare = comparing clientPeerId
50
51newClient :: Options -> IO Client
52newClient Options {..} = do
53 pid <- genPeerId
54 ts <- newTVarIO HM.empty
55 return Client
56 { clientPeerId = pid
57 , clientListenerPort = port
58 , allowedExtensions = toCaps extensions
59 , torrents = ts
60 }
61
62addTorrent :: Torrent -> Client -> IO ()
63addTorrent t Client {..} = do
64 leecher <- newLeecher clientPeerId clientListenerPort t
65 let ih = idInfoHash (tInfoDict t)
66 atomically $ modifyTVar' torrents (HM.insert ih leecher)
67 askPeers leecher >>= print \ No newline at end of file