From 1188f4bcfccf578ab9bec286108ad3c4e8296b13 Mon Sep 17 00:00:00 2001 From: Sam Truzjan Date: Sat, 30 Nov 2013 17:10:06 +0400 Subject: Implement ScrapeQuery parsing --- src/Network/BitTorrent/Tracker/RPC/Message.hs | 37 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/Network/BitTorrent') diff --git a/src/Network/BitTorrent/Tracker/RPC/Message.hs b/src/Network/BitTorrent/Tracker/RPC/Message.hs index 26868ead..cec68169 100644 --- a/src/Network/BitTorrent/Tracker/RPC/Message.hs +++ b/src/Network/BitTorrent/Tracker/RPC/Message.hs @@ -223,16 +223,15 @@ instance QueryLike AnnounceQuery where , ("event" , toQueryValue reqEvent) ] +filterMaybes :: [(a, Maybe b)] -> [(a, b)] +filterMaybes = catMaybes . L.map f + where + f (_, Nothing) = Nothing + f (a, Just b ) = Just (a, b) -- | Encode announce query and add it to the base tracker URL. renderAnnounceQuery :: AnnounceQuery -> SimpleQuery renderAnnounceQuery = filterMaybes . toQuery - where - filterMaybes :: [(a, Maybe b)] -> [(a, b)] - filterMaybes = catMaybes . L.map f - where - f (_, Nothing) = Nothing - f (a, Just b ) = Just (a, b) data QueryParam = ParamInfoHash @@ -481,11 +480,33 @@ parseFailureStatus = mkStatus <$> parseFailureCode <*> parseFailureMessage type ScrapeQuery = [InfoHash] +-- TODO +-- data ScrapeQuery +-- = ScrapeAll +-- | ScrapeSingle InfoHash +-- | ScrapeMulti (HashSet InfoHash) +-- deriving (Show) +-- +-- data ScrapeInfo +-- = ScrapeAll (HashMap InfoHash ScrapeEntry) +-- | ScrapeSingle InfoHash ScrapeEntry +-- | ScrapeMulti (HashMap InfoHash ScrapeEntry) +-- + +scrapeParam :: BS.ByteString +scrapeParam = "info_hash" + +isScrapeParam :: BS.ByteString -> Bool +isScrapeParam = (==) scrapeParam + renderScrapeQuery :: ScrapeQuery -> SimpleQuery -renderScrapeQuery = undefined +renderScrapeQuery = filterMaybes . L.map mkPair + where + mkPair ih = (scrapeParam, toQueryValue ih) parseScrapeQuery :: SimpleQuery -> ScrapeQuery -parseScrapeQuery = undefined +parseScrapeQuery + = catMaybes . L.map (fromParam . snd) . L.filter (isScrapeParam . fst) -- | Overall information about particular torrent. data ScrapeEntry = ScrapeEntry { -- cgit v1.2.3