diff options
Diffstat (limited to 'src/Network/BitTorrent/Tracker/RPC/Message.hs')
-rw-r--r-- | src/Network/BitTorrent/Tracker/RPC/Message.hs | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/src/Network/BitTorrent/Tracker/RPC/Message.hs b/src/Network/BitTorrent/Tracker/RPC/Message.hs index a0691f37..74a3842f 100644 --- a/src/Network/BitTorrent/Tracker/RPC/Message.hs +++ b/src/Network/BitTorrent/Tracker/RPC/Message.hs | |||
@@ -40,8 +40,8 @@ module Network.BitTorrent.Tracker.RPC.Message | |||
40 | 40 | ||
41 | -- * Scrape | 41 | -- * Scrape |
42 | , ScrapeQuery | 42 | , ScrapeQuery |
43 | , ScrapeInfo(..) | 43 | , ScrapeEntry (..) |
44 | , Scrape | 44 | , ScrapeInfo |
45 | ) | 45 | ) |
46 | where | 46 | where |
47 | 47 | ||
@@ -56,7 +56,6 @@ import Data.ByteString.Char8 as BC | |||
56 | import Data.Char as Char | 56 | import Data.Char as Char |
57 | import Data.Convertible | 57 | import Data.Convertible |
58 | import Data.List as L | 58 | import Data.List as L |
59 | import Data.Map as M | ||
60 | import Data.Maybe | 59 | import Data.Maybe |
61 | import Data.Serialize as S hiding (Result) | 60 | import Data.Serialize as S hiding (Result) |
62 | import Data.Text (Text) | 61 | import Data.Text (Text) |
@@ -482,9 +481,8 @@ parseFailureStatus = mkStatus <$> parseFailureCode <*> parseFailureMessage | |||
482 | 481 | ||
483 | type ScrapeQuery = [InfoHash] | 482 | type ScrapeQuery = [InfoHash] |
484 | 483 | ||
485 | -- TODO rename to ScrapeEntry | ||
486 | -- | Overall information about particular torrent. | 484 | -- | Overall information about particular torrent. |
487 | data ScrapeInfo = ScrapeInfo { | 485 | data ScrapeEntry = ScrapeEntry { |
488 | -- | Number of seeders - peers with the entire file. | 486 | -- | Number of seeders - peers with the entire file. |
489 | siComplete :: {-# UNPACK #-} !Int | 487 | siComplete :: {-# UNPACK #-} !Int |
490 | 488 | ||
@@ -499,43 +497,35 @@ data ScrapeInfo = ScrapeInfo { | |||
499 | , siName :: !(Maybe Text) | 497 | , siName :: !(Maybe Text) |
500 | } deriving (Show, Eq, Typeable) | 498 | } deriving (Show, Eq, Typeable) |
501 | 499 | ||
502 | $(deriveJSON (L.map toLower . L.dropWhile isLower) ''ScrapeInfo) | 500 | $(deriveJSON (L.map toLower . L.dropWhile isLower) ''ScrapeEntry) |
503 | |||
504 | -- TODO hash map | ||
505 | -- TODO rename to ScrapeInfo | ||
506 | -- | Scrape info about a set of torrents. | ||
507 | type Scrape = Map InfoHash ScrapeInfo | ||
508 | 501 | ||
509 | -- | HTTP tracker protocol compatible encoding. | 502 | -- | HTTP tracker protocol compatible encoding. |
510 | instance BEncode ScrapeInfo where | 503 | instance BEncode ScrapeEntry where |
511 | toBEncode ScrapeInfo {..} = toDict $ | 504 | toBEncode ScrapeEntry {..} = toDict $ |
512 | "complete" .=! siComplete | 505 | "complete" .=! siComplete |
513 | .: "downloaded" .=! siDownloaded | 506 | .: "downloaded" .=! siDownloaded |
514 | .: "incomplete" .=! siIncomplete | 507 | .: "incomplete" .=! siIncomplete |
515 | .: "name" .=? siName | 508 | .: "name" .=? siName |
516 | .: endDict | 509 | .: endDict |
517 | 510 | ||
518 | fromBEncode = fromDict $ do | 511 | fromBEncode = fromDict $ ScrapeEntry |
519 | ScrapeInfo <$>! "complete" | 512 | <$>! "complete" |
520 | <*>! "downloaded" | 513 | <*>! "downloaded" |
521 | <*>! "incomplete" | 514 | <*>! "incomplete" |
522 | <*>? "name" | 515 | <*>? "name" |
523 | 516 | ||
524 | -- | UDP tracker protocol compatible encoding. | 517 | -- | UDP tracker protocol compatible encoding. |
525 | instance Serialize ScrapeInfo where | 518 | instance Serialize ScrapeEntry where |
526 | put ScrapeInfo {..} = do | 519 | put ScrapeEntry {..} = do |
527 | putWord32be $ fromIntegral siComplete | 520 | putWord32be $ fromIntegral siComplete |
528 | putWord32be $ fromIntegral siDownloaded | 521 | putWord32be $ fromIntegral siDownloaded |
529 | putWord32be $ fromIntegral siIncomplete | 522 | putWord32be $ fromIntegral siIncomplete |
530 | 523 | ||
531 | get = do | 524 | get = ScrapeEntry |
532 | seeders <- getWord32be | 525 | <$> (fromIntegral <$> getWord32be) |
533 | downTimes <- getWord32be | 526 | <*> (fromIntegral <$> getWord32be) |
534 | leechers <- getWord32be | 527 | <*> (fromIntegral <$> getWord32be) |
535 | 528 | <*> pure Nothing | |
536 | return $ ScrapeInfo { | 529 | |
537 | siComplete = fromIntegral seeders | 530 | -- | Scrape info about a set of torrents. |
538 | , siDownloaded = fromIntegral downTimes | 531 | type ScrapeInfo = [(InfoHash, ScrapeEntry)] |
539 | , siIncomplete = fromIntegral leechers | ||
540 | , siName = Nothing | ||
541 | } | ||