diff options
-rw-r--r-- | src/Data/Torrent/Client.hs | 1 | ||||
-rw-r--r-- | src/Network/BitTorrent/Core/PeerId.hs | 17 | ||||
-rw-r--r-- | tests/Data/Torrent/ClientSpec.hs | 5 |
3 files changed, 23 insertions, 0 deletions
diff --git a/src/Data/Torrent/Client.hs b/src/Data/Torrent/Client.hs index 1b24105f..7b178d41 100644 --- a/src/Data/Torrent/Client.hs +++ b/src/Data/Torrent/Client.hs | |||
@@ -62,6 +62,7 @@ data ClientImpl = | |||
62 | 62 | ||
63 | -- UPnP(!) Bit Torrent !??? | 63 | -- UPnP(!) Bit Torrent !??? |
64 | -- 'U' - UPnP NAT Bit Torrent | 64 | -- 'U' - UPnP NAT Bit Torrent |
65 | | IBitLord | ||
65 | 66 | ||
66 | | IAres | 67 | | IAres |
67 | | IArctic | 68 | | IArctic |
diff --git a/src/Network/BitTorrent/Core/PeerId.hs b/src/Network/BitTorrent/Core/PeerId.hs index 5962a6e5..b8dd17e2 100644 --- a/src/Network/BitTorrent/Core/PeerId.hs +++ b/src/Network/BitTorrent/Core/PeerId.hs | |||
@@ -287,6 +287,8 @@ clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid) | |||
287 | case leading of | 287 | case leading of |
288 | '-' -> ClientInfo <$> getAzureusImpl <*> getAzureusVersion | 288 | '-' -> ClientInfo <$> getAzureusImpl <*> getAzureusVersion |
289 | 'M' -> ClientInfo <$> pure IMainline <*> getMainlineVersion | 289 | 'M' -> ClientInfo <$> pure IMainline <*> getMainlineVersion |
290 | 'e' -> ClientInfo <$> getBitCometImpl <*> getBitCometVersion | ||
291 | 'F' -> ClientInfo <$> getBitCometImpl <*> getBitCometVersion | ||
290 | c -> ClientInfo <$> pure (getShadowImpl c) <*> getShadowVersion | 292 | c -> ClientInfo <$> pure (getShadowImpl c) <*> getShadowVersion |
291 | 293 | ||
292 | getMainlineVersion = do | 294 | getMainlineVersion = do |
@@ -299,6 +301,21 @@ clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid) | |||
299 | where | 301 | where |
300 | mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] [] | 302 | mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] [] |
301 | 303 | ||
304 | getBitCometImpl = do | ||
305 | bs <- getByteString 3 | ||
306 | lookAhead $ do | ||
307 | _ <- getByteString 2 | ||
308 | lr <- getByteString 4 | ||
309 | return $ | ||
310 | if lr == "LORD" then IBitLord else | ||
311 | if bs == "UTB" then IBitComet else | ||
312 | if bs == "xbc" then IBitComet else def | ||
313 | |||
314 | getBitCometVersion = do | ||
315 | x <- getWord8 | ||
316 | y <- getWord8 | ||
317 | return $ Version [fromIntegral x, fromIntegral y] [] | ||
318 | |||
302 | getShadowImpl 'A' = IABC | 319 | getShadowImpl 'A' = IABC |
303 | getShadowImpl 'O' = IOspreyPermaseed | 320 | getShadowImpl 'O' = IOspreyPermaseed |
304 | getShadowImpl 'Q' = IBTQueue | 321 | getShadowImpl 'Q' = IBTQueue |
diff --git a/tests/Data/Torrent/ClientSpec.hs b/tests/Data/Torrent/ClientSpec.hs index c4c08798..8b3e7342 100644 --- a/tests/Data/Torrent/ClientSpec.hs +++ b/tests/Data/Torrent/ClientSpec.hs | |||
@@ -17,3 +17,8 @@ spec = do | |||
17 | it "decode Shad0w style peer id" $ do | 17 | it "decode Shad0w style peer id" $ do |
18 | clientInfo "S58B-----xxxxxxxxxxx" `shouldBe` "Shadow-5.8.11" | 18 | clientInfo "S58B-----xxxxxxxxxxx" `shouldBe` "Shadow-5.8.11" |
19 | clientInfo "T58B-----xxxxxxxxxxx" `shouldBe` "BitTornado-5.8.11" | 19 | clientInfo "T58B-----xxxxxxxxxxx" `shouldBe` "BitTornado-5.8.11" |
20 | |||
21 | it "decode bitcomet style peer id" $ do | ||
22 | clientInfo "exbc01xxxxxxxxxxxxxx" `shouldBe` "BitComet-48.49" | ||
23 | clientInfo "FUTB01xxxxxxxxxxxxxx" `shouldBe` "BitComet-48.49" | ||
24 | clientInfo "exbc01LORDxxxxxxxxxx" `shouldBe` "BitLord-48.49" \ No newline at end of file | ||