From b530ca0d9471366e69aa5a88119ca09752ded63e Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan Date: Tue, 17 Feb 2015 06:05:06 +0530 Subject: [PATCH] incorporate hlint suggestions --- src/Bencode.hs | 7 +++---- src/Main.hs | 10 +++++----- src/Metainfo.hs | 12 ++++++------ src/Peer.hs | 8 ++++---- src/Tracker.hs | 16 ++++++++-------- src/Utils.hs | 2 +- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/Bencode.hs b/src/Bencode.hs index e07799e..75ae077 100644 --- a/src/Bencode.hs +++ b/src/Bencode.hs @@ -61,7 +61,7 @@ bencInt :: ParsecBS.Parser Integer bencInt = do _ <- spaces ds <- between (char 'i') (char 'e') numbers return (read ds) - where numbers = do d' <- (char '-' <|> digit) + where numbers = do d' <- char '-' <|> digit ds' <- many digit parseNumber d' ds' parseNumber '0' [] = return "0" @@ -95,7 +95,7 @@ bencList = do _ <- spaces -- >>> parse bencDict "Bdict" (BC.pack "d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee") -- Right (fromList [("publisher","bob"),("publisher-webpage","www.example.com"),("publisher.location","home")]) bencDict :: ParsecBS.Parser (M.Map BVal BVal) -bencDict = between (char 'd') (char 'e') $ M.fromList <$> (many kvpair) +bencDict = between (char 'd') (char 'e') $ M.fromList <$> many kvpair where kvpair = do k <- bencStr v <- bencVal return (Bstr k, v) @@ -132,7 +132,6 @@ encode (Bstr bs) = let s = BC.unpack bs in show (length s) ++ ":" ++ s encode (Bint i) = "i" ++ show i ++ "e" encode (Blist xs) = "l" ++ encodeList xs ++ "e" - where encodeList [] = "" - encodeList (x:xs') = encode x ++ encodeList xs' + where encodeList = foldr (++ encode x) "" encode (Bdict d) = "d" ++ encodeDict d ++ "e" where encodeDict m = concat [encode k ++ encode (m M.! k) | k <- M.keys m] diff --git a/src/Main.hs b/src/Main.hs index 14656d1..b0f594a 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -17,12 +17,12 @@ genPeerId :: String genPeerId = "-HS0001-20150215" exit :: IO BC.ByteString -exit = exitWith ExitSuccess +exit = exitSuccess usage :: IO () usage = putStrLn "usage: functorrent torrent-file" -parse :: [String] -> IO (BC.ByteString) +parse :: [String] -> IO BC.ByteString parse [] = usage >> exit parse [a] = BC.readFile a parse _ = exit @@ -31,11 +31,11 @@ main :: IO () main = do args <- getArgs torrentStr <- parse args - case (Benc.decode torrentStr) of - Right d -> case (MInfo.mkMetaInfo d) of + case Benc.decode torrentStr of + Right d -> case MInfo.mkMetaInfo d of Nothing -> putStrLn "parse error" Just m -> do body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId) - putStrLn (show (P.getPeers (P.getPeerResponse body))) + print (P.getPeers (P.getPeerResponse body)) Left e -> printError e putStrLn "done" diff --git a/src/Metainfo.hs b/src/Metainfo.hs index 4c614d6..db1c97d 100644 --- a/src/Metainfo.hs +++ b/src/Metainfo.hs @@ -23,11 +23,11 @@ data Metainfo = Metainfo { info :: !Info } deriving (Eq, Show) mkInfo :: Benc.BVal -> Maybe Info -mkInfo (Benc.Bdict m) = let (Benc.Bint pieceLength') = m M.! (Benc.Bstr (BC.pack "piece length")) - (Benc.Bstr pieces') = m M.! (Benc.Bstr (BC.pack "pieces")) +mkInfo (Benc.Bdict m) = let (Benc.Bint pieceLength') = m M.! Benc.Bstr (BC.pack "piece length") + (Benc.Bstr pieces') = m M.! Benc.Bstr (BC.pack "pieces") private' = Nothing - (Benc.Bstr name') = m M.! (Benc.Bstr (BC.pack "name")) - (Benc.Bint length') = m M.! (Benc.Bstr (BC.pack "length")) + (Benc.Bstr name') = m M.! Benc.Bstr (BC.pack "name") + (Benc.Bint length') = m M.! Benc.Bstr (BC.pack "length") md5sum' = Nothing in Just Info { pieceLength = pieceLength' , pieces = pieces' @@ -44,8 +44,8 @@ maybeBstrToString (Just s) = let (Benc.Bstr bs) = s in Just (BC.unpack bs) mkMetaInfo :: Benc.BVal -> Maybe Metainfo -mkMetaInfo (Benc.Bdict m) = let (Just info') = mkInfo (m M.! (Benc.Bstr (BC.pack "info"))) - (Benc.Bstr announce') = m M.! (Benc.Bstr (BC.pack "announce")) +mkMetaInfo (Benc.Bdict m) = let (Just info') = mkInfo (m M.! Benc.Bstr (BC.pack "info")) + (Benc.Bstr announce') = m M.! Benc.Bstr (BC.pack "announce") -- announceList = M.lookup (Benc.Bstr (BC.pack "announce list")) announceList' = Nothing -- creationDate = M.lookup (Benc.Bstr (BC.pack "creation date")) m diff --git a/src/Peer.hs b/src/Peer.hs index c7ebca3..74c89a2 100644 --- a/src/Peer.hs +++ b/src/Peer.hs @@ -24,10 +24,10 @@ getPeers :: PeerResp -> [Peer] getPeers = peers getPeerResponse :: BC.ByteString -> PeerResp -getPeerResponse body = case (Benc.decode body) of +getPeerResponse body = case Benc.decode body of Right (Benc.Bdict peerM) -> let (Just (Benc.Bint i)) = M.lookup (Benc.Bstr (BC.pack "lookup")) peerM - (Benc.Bstr peersBS) = peerM M.! (Benc.Bstr (BC.pack "peers")) + (Benc.Bstr peersBS) = peerM M.! Benc.Bstr (BC.pack "peers") pl = map (\peer -> let (ip', port') = BC.splitAt 4 peer in Peer { ip = toIPNum ip' , port = toPortNum port' @@ -39,9 +39,9 @@ getPeerResponse body = case (Benc.decode body) of , incomplete = Nothing } where toPortNum = read . ("0x" ++) . BC.unpack . B16.encode - toIPNum = (L.intercalate ".") . + toIPNum = L.intercalate "." . map (show . toInt . ("0x" ++) . BC.unpack) . - (U.splitN 2) . B16.encode + U.splitN 2 . B16.encode _ -> PeerResponse { interval = Nothing , peers = [] , complete = Nothing diff --git a/src/Tracker.hs b/src/Tracker.hs index 70e1563..5df314c 100644 --- a/src/Tracker.hs +++ b/src/Tracker.hs @@ -20,23 +20,23 @@ type Url = String -- "%124Vx%9a%bc%de%f1%23Eg%89%ab%cd%ef%124Vx%9a" urlEncode :: BC.ByteString -> String urlEncode bs = concatMap (encode . BC.unpack) (U.splitN 2 bs) - where encode b@(c1 : c2 : []) = let c = chr (read ("0x" ++ b)) - in - escape c c1 c2 + where encode b@[c1 : c2] = let c = chr (read ("0x" ++ b)) + in + escape c c1 c2 encode _ = "" escape i c1 c2 | i `elem` nonSpecialChars = [i] | otherwise = "%" ++ [c1] ++ [c2] where nonSpecialChars = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ - ['-', '_', '.', '~'] + "-_.~" -infoHash :: (M.Map Benc.BVal Benc.BVal) -> BC.ByteString -infoHash m = let info = m M.! (Benc.Bstr (BC.pack "info")) +infoHash :: M.Map Benc.BVal Benc.BVal -> BC.ByteString +infoHash m = let info = m M.! Benc.Bstr (BC.pack "info") in (B16.encode . SHA1.hash . BC.pack . Benc.encode) info peerHash :: String -> BC.ByteString -peerHash = (B16.encode . SHA1.hash . BC.pack) +peerHash = B16.encode . SHA1.hash . BC.pack prepareRequest :: Benc.BVal -> String -> String prepareRequest (Benc.Bdict d) peer_id = let p = [("info_hash", urlEncode (infoHash d)), @@ -50,7 +50,7 @@ prepareRequest (Benc.Bdict d) peer_id = let p = [("info_hash", urlEncode (infoHa in List.intercalate "&" [f ++ "=" ++ s | (f,s) <- p] -connect :: Url -> String -> IO (String) +connect :: Url -> String -> IO String connect baseurl qstr = let url = baseurl ++ "?" ++ qstr in HTTP.simpleHTTP (HTTP.getRequest url) >>= HTTP.getResponseBody diff --git a/src/Utils.hs b/src/Utils.hs index 4a2fc6a..019b06b 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -4,4 +4,4 @@ import qualified Data.ByteString.Char8 as BC splitN :: Int -> BC.ByteString -> [BC.ByteString] splitN n bs | BC.null bs = [] - | otherwise = (BC.take n bs) : splitN n (BC.drop n bs) + | otherwise = BC.take n bs : splitN n (BC.drop n bs) -- 2.45.2