summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Data/Torrent.hs20
-rw-r--r--src/Data/Torrent/InfoHash.hs10
-rw-r--r--src/Data/Torrent/JSON.hs56
-rw-r--r--src/Data/Torrent/Layout.hs10
-rw-r--r--src/Data/Torrent/Piece.hs16
-rw-r--r--src/Data/Torrent/Progress.hs4
-rw-r--r--src/Network/BitTorrent/Core/NodeInfo.hs9
-rw-r--r--src/Network/BitTorrent/Core/PeerAddr.hs8
-rw-r--r--src/Network/BitTorrent/Core/PeerId.hs4
-rw-r--r--src/Network/BitTorrent/Exchange/Block.hs4
-rw-r--r--src/Network/BitTorrent/Exchange/Connection/Status.hs4
-rw-r--r--src/Network/BitTorrent/Internal/Cache.hs25
-rw-r--r--src/Network/BitTorrent/Tracker/Message.hs8
-rw-r--r--src/Network/BitTorrent/Tracker/Session.hs12
14 files changed, 2 insertions, 188 deletions
diff --git a/src/Data/Torrent.hs b/src/Data/Torrent.hs
index ccd5e666..b233937b 100644
--- a/src/Data/Torrent.hs
+++ b/src/Data/Torrent.hs
@@ -71,8 +71,6 @@ import qualified Crypto.Hash.SHA1 as C
71import Control.DeepSeq 71import Control.DeepSeq
72import Control.Exception 72import Control.Exception
73import Control.Lens 73import Control.Lens
74import Data.Aeson.Types (ToJSON(..), FromJSON(..), Value(..), withText)
75import Data.Aeson.TH
76import Data.BEncode as BE 74import Data.BEncode as BE
77import Data.BEncode.Types as BE 75import Data.BEncode.Types as BE
78import Data.ByteString as BS 76import Data.ByteString as BS
@@ -93,7 +91,6 @@ import Text.PrettyPrint.Class
93import System.FilePath 91import System.FilePath
94 92
95import Data.Torrent.InfoHash as IH 93import Data.Torrent.InfoHash as IH
96import Data.Torrent.JSON
97import Data.Torrent.Layout 94import Data.Torrent.Layout
98import Data.Torrent.Piece 95import Data.Torrent.Piece
99import Network.BitTorrent.Core.NodeInfo 96import Network.BitTorrent.Core.NodeInfo
@@ -125,8 +122,6 @@ data InfoDict = InfoDict
125 -- BEP 27: <http://www.bittorrent.org/beps/bep_0027.html> 122 -- BEP 27: <http://www.bittorrent.org/beps/bep_0027.html>
126 } deriving (Show, Read, Eq, Typeable) 123 } deriving (Show, Read, Eq, Typeable)
127 124
128$(deriveJSON omitRecordPrefix ''InfoDict)
129
130makeLensesFor 125makeLensesFor
131 [ ("idInfoHash" , "infohash" ) 126 [ ("idInfoHash" , "infohash" )
132 , ("idLayoutInfo", "layoutInfo") 127 , ("idLayoutInfo", "layoutInfo")
@@ -242,21 +237,6 @@ data Torrent = Torrent
242 -- encrypted SHA-1 hash of the info dictionary). 237 -- encrypted SHA-1 hash of the info dictionary).
243 } deriving (Show, Eq, Typeable) 238 } deriving (Show, Eq, Typeable)
244 239
245instance FromJSON URI where
246 parseJSON = withText "URI" $
247 maybe (fail "could not parse URI") pure . parseURI . T.unpack
248
249instance ToJSON URI where
250 toJSON = String . T.pack . show
251
252instance ToJSON NominalDiffTime where
253 toJSON = toJSON . posixSecondsToUTCTime
254
255instance FromJSON NominalDiffTime where
256 parseJSON v = utcTimeToPOSIXSeconds <$> parseJSON v
257
258$(deriveJSON omitRecordPrefix ''Torrent)
259
260makeLensesFor 240makeLensesFor
261 [ ("tAnnounce" , "announce" ) 241 [ ("tAnnounce" , "announce" )
262 , ("tAnnounceList", "announceList") 242 , ("tAnnounceList", "announceList")
diff --git a/src/Data/Torrent/InfoHash.hs b/src/Data/Torrent/InfoHash.hs
index 9eec631c..f322ac6f 100644
--- a/src/Data/Torrent/InfoHash.hs
+++ b/src/Data/Torrent/InfoHash.hs
@@ -24,7 +24,6 @@ module Data.Torrent.InfoHash
24 24
25import Control.Applicative 25import Control.Applicative
26import Control.Monad 26import Control.Monad
27import Data.Aeson
28import Data.BEncode 27import Data.BEncode
29import Data.ByteString as BS 28import Data.ByteString as BS
30import Data.ByteString.Char8 as BC 29import Data.ByteString.Char8 as BC
@@ -146,15 +145,6 @@ instance Convertible Text InfoHash where
146instance IsString InfoHash where 145instance IsString InfoHash where
147 fromString = either (error . prettyConvertError) id . safeConvert . T.pack 146 fromString = either (error . prettyConvertError) id . safeConvert . T.pack
148 147
149-- | Convert to base16 encoded JSON string.
150instance ToJSON InfoHash where
151 toJSON (InfoHash ih) = String $ T.decodeUtf8 $ Base16.encode ih
152
153-- | Convert from base16\/base32\/base64 encoded JSON string.
154instance FromJSON InfoHash where
155 parseJSON = withText "InfoHash" $
156 either (fail . prettyConvertError) pure . safeConvert
157
158ignoreErrorMsg :: Either a b -> Maybe b 148ignoreErrorMsg :: Either a b -> Maybe b
159ignoreErrorMsg = either (const Nothing) Just 149ignoreErrorMsg = either (const Nothing) Just
160 150
diff --git a/src/Data/Torrent/JSON.hs b/src/Data/Torrent/JSON.hs
deleted file mode 100644
index 845b288a..00000000
--- a/src/Data/Torrent/JSON.hs
+++ /dev/null
@@ -1,56 +0,0 @@
1{-# OPTIONS_GHC -fno-warn-orphans #-}
2module Data.Torrent.JSON
3 ( omitLensPrefix
4 , omitRecordPrefix
5 ) where
6
7import Control.Applicative
8import Data.Aeson.TH
9import Data.Aeson.Types
10import Data.ByteString as BS
11import Data.ByteString.Base16 as Base16
12import Data.Char
13import Data.IP
14import Data.List as L
15import Data.Text.Encoding as T
16
17
18-- | Ignore '_' prefix.
19omitLensPrefix :: Options
20omitLensPrefix = defaultOptions
21 { fieldLabelModifier = L.dropWhile (== '_')
22 , constructorTagModifier = id
23 , allNullaryToStringTag = True
24 , omitNothingFields = True
25 }
26
27mapWhile :: (a -> Bool) -> (a -> a) -> [a] -> [a]
28mapWhile p f = go
29 where
30 go [] = []
31 go (x : xs)
32 | p x = f x : go xs
33 | otherwise = x : xs
34
35omitRecordPrefix :: Options
36omitRecordPrefix = omitLensPrefix
37 { fieldLabelModifier = mapWhile isUpper toLower . L.dropWhile isLower
38 }
39
40instance ToJSON ByteString where
41 toJSON = String . T.decodeUtf8 . Base16.encode
42
43instance FromJSON ByteString where
44 parseJSON v = do
45 (ok, bad) <- (Base16.decode . T.encodeUtf8) <$> parseJSON v
46 if BS.null bad
47 then return ok
48 else fail "parseJSON: unable to decode ByteString"
49
50instance ToJSON IP where
51 toJSON = toJSON . show
52
53instance FromJSON IP where
54 parseJSON v = do
55 str <- parseJSON v
56 return $ read str
diff --git a/src/Data/Torrent/Layout.hs b/src/Data/Torrent/Layout.hs
index ef8d45eb..cc529840 100644
--- a/src/Data/Torrent/Layout.hs
+++ b/src/Data/Torrent/Layout.hs
@@ -64,8 +64,6 @@ module Data.Torrent.Layout
64import Control.Applicative 64import Control.Applicative
65import Control.DeepSeq 65import Control.DeepSeq
66import Control.Lens 66import Control.Lens
67import Data.Aeson.TH
68import Data.Aeson.Types (FromJSON, ToJSON)
69import Data.BEncode 67import Data.BEncode
70import Data.BEncode.Types 68import Data.BEncode.Types
71import Data.ByteString as BS 69import Data.ByteString as BS
@@ -82,8 +80,6 @@ import Text.PrettyPrint.Class
82import System.FilePath 80import System.FilePath
83import System.Posix.Types 81import System.Posix.Types
84 82
85import Data.Torrent.JSON
86
87{----------------------------------------------------------------------- 83{-----------------------------------------------------------------------
88-- File attribytes 84-- File attribytes
89-----------------------------------------------------------------------} 85-----------------------------------------------------------------------}
@@ -91,8 +87,6 @@ import Data.Torrent.JSON
91-- | Size of a file in bytes. 87-- | Size of a file in bytes.
92type FileSize = FileOffset 88type FileSize = FileOffset
93 89
94deriving instance FromJSON FileOffset
95deriving instance ToJSON FileOffset
96deriving instance BEncode FileOffset 90deriving instance BEncode FileOffset
97 91
98{----------------------------------------------------------------------- 92{-----------------------------------------------------------------------
@@ -125,8 +119,6 @@ data FileInfo a = FileInfo {
125 , Functor, Foldable 119 , Functor, Foldable
126 ) 120 )
127 121
128$(deriveJSON omitRecordPrefix ''FileInfo)
129
130makeLensesFor 122makeLensesFor
131 [ ("fiLength", "fileLength") 123 [ ("fiLength", "fileLength")
132 , ("fiMD5Sum", "fileMD5Sum") 124 , ("fiMD5Sum", "fileMD5Sum")
@@ -210,8 +202,6 @@ data LayoutInfo
210 , liDirName :: !ByteString 202 , liDirName :: !ByteString
211 } deriving (Show, Read, Eq, Typeable) 203 } deriving (Show, Read, Eq, Typeable)
212 204
213$(deriveJSON omitRecordPrefix ''LayoutInfo)
214
215makeLensesFor 205makeLensesFor
216 [ ("liFile" , "singleFile" ) 206 [ ("liFile" , "singleFile" )
217 , ("liFiles" , "multiFile" ) 207 , ("liFiles" , "multiFile" )
diff --git a/src/Data/Torrent/Piece.hs b/src/Data/Torrent/Piece.hs
index 03335819..d4b2c399 100644
--- a/src/Data/Torrent/Piece.hs
+++ b/src/Data/Torrent/Piece.hs
@@ -47,8 +47,6 @@ module Data.Torrent.Piece
47import Control.DeepSeq 47import Control.DeepSeq
48import Control.Lens 48import Control.Lens
49import qualified Crypto.Hash.SHA1 as SHA1 49import qualified Crypto.Hash.SHA1 as SHA1
50import Data.Aeson (ToJSON(..), FromJSON(..), Value(..), withText)
51import Data.Aeson.TH
52import Data.BEncode 50import Data.BEncode
53import Data.BEncode.Types 51import Data.BEncode.Types
54import Data.Bits 52import Data.Bits
@@ -63,8 +61,6 @@ import Data.Typeable
63import Text.PrettyPrint 61import Text.PrettyPrint
64import Text.PrettyPrint.Class 62import Text.PrettyPrint.Class
65 63
66import Data.Torrent.JSON
67
68 64
69-- TODO add torrent file validation 65-- TODO add torrent file validation
70class Lint a where 66class Lint a where
@@ -139,8 +135,6 @@ data Piece a = Piece
139 , pieceData :: !a 135 , pieceData :: !a
140 } deriving (Show, Read, Eq, Functor, Typeable) 136 } deriving (Show, Read, Eq, Functor, Typeable)
141 137
142$(deriveJSON omitRecordPrefix ''Piece)
143
144instance NFData (Piece a) 138instance NFData (Piece a)
145 139
146-- | Payload bytes are omitted. 140-- | Payload bytes are omitted.
@@ -163,14 +157,6 @@ hashPiece Piece {..} = SHA1.hashlazy pieceData
163newtype HashList = HashList { unHashList :: ByteString } 157newtype HashList = HashList { unHashList :: ByteString }
164 deriving (Show, Read, Eq, BEncode, Typeable) 158 deriving (Show, Read, Eq, BEncode, Typeable)
165 159
166-- | Represented as base64 encoded JSON string.
167instance ToJSON HashList where
168 toJSON (HashList bs) = String $ T.decodeUtf8 $ Base64.encode bs
169
170instance FromJSON HashList where
171 parseJSON = withText "HashArray" $
172 either fail (return . HashList) . Base64.decode . T.encodeUtf8
173
174-- | Empty hash list. 160-- | Empty hash list.
175instance Default HashList where 161instance Default HashList where
176 def = HashList "" 162 def = HashList ""
@@ -184,8 +170,6 @@ data PieceInfo = PieceInfo
184 -- ^ Concatenation of all 20-byte SHA1 hash values. 170 -- ^ Concatenation of all 20-byte SHA1 hash values.
185 } deriving (Show, Read, Eq, Typeable) 171 } deriving (Show, Read, Eq, Typeable)
186 172
187$(deriveJSON omitRecordPrefix ''PieceInfo)
188
189-- | Number of bytes in each piece. 173-- | Number of bytes in each piece.
190makeLensesFor [("piPieceLength", "pieceLength")] ''PieceInfo 174makeLensesFor [("piPieceLength", "pieceLength")] ''PieceInfo
191 175
diff --git a/src/Data/Torrent/Progress.hs b/src/Data/Torrent/Progress.hs
index ffcbf2aa..4719020a 100644
--- a/src/Data/Torrent/Progress.hs
+++ b/src/Data/Torrent/Progress.hs
@@ -36,7 +36,6 @@ module Data.Torrent.Progress
36 36
37import Control.Applicative 37import Control.Applicative
38import Control.Lens hiding ((%=)) 38import Control.Lens hiding ((%=))
39import Data.Aeson.TH
40import Data.ByteString.Lazy.Builder as BS 39import Data.ByteString.Lazy.Builder as BS
41import Data.ByteString.Lazy.Builder.ASCII as BS 40import Data.ByteString.Lazy.Builder.ASCII as BS
42import Data.Default 41import Data.Default
@@ -49,8 +48,6 @@ import Network.HTTP.Types.QueryLike
49import Text.PrettyPrint as PP 48import Text.PrettyPrint as PP
50import Text.PrettyPrint.Class 49import Text.PrettyPrint.Class
51 50
52import Data.Torrent.JSON
53
54 51
55-- | Progress data is considered as dynamic within one client 52-- | Progress data is considered as dynamic within one client
56-- session. This data also should be shared across client application 53-- session. This data also should be shared across client application
@@ -64,7 +61,6 @@ data Progress = Progress
64 } deriving (Show, Read, Eq) 61 } deriving (Show, Read, Eq)
65 62
66$(makeLenses ''Progress) 63$(makeLenses ''Progress)
67$(deriveJSON omitLensPrefix ''Progress)
68 64
69-- | UDP tracker compatible encoding. 65-- | UDP tracker compatible encoding.
70instance Serialize Progress where 66instance Serialize Progress where
diff --git a/src/Network/BitTorrent/Core/NodeInfo.hs b/src/Network/BitTorrent/Core/NodeInfo.hs
index fa20caf5..fe17c097 100644
--- a/src/Network/BitTorrent/Core/NodeInfo.hs
+++ b/src/Network/BitTorrent/Core/NodeInfo.hs
@@ -39,8 +39,6 @@ module Network.BitTorrent.Core.NodeInfo
39 ) where 39 ) where
40 40
41import Control.Applicative 41import Control.Applicative
42import Data.Aeson (ToJSON, FromJSON)
43import Data.Aeson.TH
44import Data.Bits 42import Data.Bits
45import Data.ByteString as BS 43import Data.ByteString as BS
46import Data.ByteString.Char8 as BC 44import Data.ByteString.Char8 as BC
@@ -62,7 +60,6 @@ import System.Entropy
62import Text.PrettyPrint as PP hiding ((<>)) 60import Text.PrettyPrint as PP hiding ((<>))
63import Text.PrettyPrint.Class 61import Text.PrettyPrint.Class
64 62
65import Data.Torrent.JSON
66import Network.BitTorrent.Core.PeerAddr (PeerAddr (..)) 63import Network.BitTorrent.Core.PeerAddr (PeerAddr (..))
67 64
68{----------------------------------------------------------------------- 65{-----------------------------------------------------------------------
@@ -76,7 +73,7 @@ import Network.BitTorrent.Core.PeerAddr (PeerAddr (..))
76-- Normally, /this/ node id should be saved between invocations 73-- Normally, /this/ node id should be saved between invocations
77-- of the client software. 74-- of the client software.
78newtype NodeId = NodeId ByteString 75newtype NodeId = NodeId ByteString
79 deriving (Show, Eq, Ord, BEncode, FromJSON, ToJSON, Typeable) 76 deriving (Show, Eq, Ord, BEncode, Typeable)
80 77
81nodeIdSize :: Int 78nodeIdSize :: Int
82nodeIdSize = 20 79nodeIdSize = 20
@@ -146,8 +143,6 @@ data NodeAddr a = NodeAddr
146 , nodePort :: {-# UNPACK #-} !PortNumber 143 , nodePort :: {-# UNPACK #-} !PortNumber
147 } deriving (Eq, Typeable, Functor) 144 } deriving (Eq, Typeable, Functor)
148 145
149$(deriveJSON omitRecordPrefix ''NodeAddr)
150
151instance Show a => Show (NodeAddr a) where 146instance Show a => Show (NodeAddr a) where
152 showsPrec i NodeAddr {..} 147 showsPrec i NodeAddr {..}
153 = showsPrec i nodeHost <> showString ":" <> showsPrec i nodePort 148 = showsPrec i nodeHost <> showString ":" <> showsPrec i nodePort
@@ -202,8 +197,6 @@ data NodeInfo a = NodeInfo
202 , nodeAddr :: !(NodeAddr a) 197 , nodeAddr :: !(NodeAddr a)
203 } deriving (Show, Eq, Functor) 198 } deriving (Show, Eq, Functor)
204 199
205$(deriveJSON omitRecordPrefix ''NodeInfo)
206
207instance Eq a => Ord (NodeInfo a) where 200instance Eq a => Ord (NodeInfo a) where
208 compare = comparing nodeId 201 compare = comparing nodeId
209 202
diff --git a/src/Network/BitTorrent/Core/PeerAddr.hs b/src/Network/BitTorrent/Core/PeerAddr.hs
index adf64c7f..92fb83a7 100644
--- a/src/Network/BitTorrent/Core/PeerAddr.hs
+++ b/src/Network/BitTorrent/Core/PeerAddr.hs
@@ -33,8 +33,6 @@ module Network.BitTorrent.Core.PeerAddr
33 33
34import Control.Applicative 34import Control.Applicative
35import Control.Monad 35import Control.Monad
36import Data.Aeson (ToJSON, FromJSON)
37import Data.Aeson.TH
38import Data.BEncode as BS 36import Data.BEncode as BS
39import Data.BEncode.BDict (BKey) 37import Data.BEncode.BDict (BKey)
40import Data.ByteString.Char8 as BS8 38import Data.ByteString.Char8 as BS8
@@ -58,7 +56,6 @@ import Text.Read (readMaybe)
58import qualified Text.ParserCombinators.ReadP as RP 56import qualified Text.ParserCombinators.ReadP as RP
59 57
60import Data.Torrent.InfoHash 58import Data.Torrent.InfoHash
61import Data.Torrent.JSON
62import Network.BitTorrent.Core.PeerId 59import Network.BitTorrent.Core.PeerId
63 60
64 61
@@ -66,9 +63,6 @@ import Network.BitTorrent.Core.PeerId
66-- Port number 63-- Port number
67-----------------------------------------------------------------------} 64-----------------------------------------------------------------------}
68 65
69deriving instance ToJSON PortNumber
70deriving instance FromJSON PortNumber
71
72instance BEncode PortNumber where 66instance BEncode PortNumber where
73 toBEncode = toBEncode . fromEnum 67 toBEncode = toBEncode . fromEnum
74 fromBEncode = fromBEncode >=> portNumber 68 fromBEncode = fromBEncode >=> portNumber
@@ -208,8 +202,6 @@ data PeerAddr a = PeerAddr
208 , peerPort :: {-# UNPACK #-} !PortNumber 202 , peerPort :: {-# UNPACK #-} !PortNumber
209 } deriving (Show, Eq, Ord, Typeable, Functor) 203 } deriving (Show, Eq, Ord, Typeable, Functor)
210 204
211$(deriveJSON omitRecordPrefix ''PeerAddr)
212
213peer_ip_key, peer_id_key, peer_port_key :: BKey 205peer_ip_key, peer_id_key, peer_port_key :: BKey
214peer_ip_key = "ip" 206peer_ip_key = "ip"
215peer_id_key = "peer id" 207peer_id_key = "peer id"
diff --git a/src/Network/BitTorrent/Core/PeerId.hs b/src/Network/BitTorrent/Core/PeerId.hs
index f8d69e8b..a180ff30 100644
--- a/src/Network/BitTorrent/Core/PeerId.hs
+++ b/src/Network/BitTorrent/Core/PeerId.hs
@@ -34,7 +34,6 @@ module Network.BitTorrent.Core.PeerId
34 ) where 34 ) where
35 35
36import Control.Applicative 36import Control.Applicative
37import Data.Aeson
38import Data.BEncode as BE 37import Data.BEncode as BE
39import Data.ByteString as BS 38import Data.ByteString as BS
40import Data.ByteString.Internal as BS 39import Data.ByteString.Internal as BS
@@ -62,14 +61,13 @@ import Text.PrettyPrint hiding ((<>))
62import Text.PrettyPrint.Class 61import Text.PrettyPrint.Class
63import Text.Read (readMaybe) 62import Text.Read (readMaybe)
64 63
65import Data.Torrent.JSON ()
66import Network.BitTorrent.Core.Fingerprint 64import Network.BitTorrent.Core.Fingerprint
67 65
68-- TODO use unpacked Word160 form (length is known statically) 66-- TODO use unpacked Word160 form (length is known statically)
69 67
70-- | Peer identifier is exactly 20 bytes long bytestring. 68-- | Peer identifier is exactly 20 bytes long bytestring.
71newtype PeerId = PeerId { getPeerId :: ByteString } 69newtype PeerId = PeerId { getPeerId :: ByteString }
72 deriving (Show, Eq, Ord, BEncode, ToJSON, FromJSON, Typeable) 70 deriving (Show, Eq, Ord, BEncode, Typeable)
73 71
74peerIdLen :: Int 72peerIdLen :: Int
75peerIdLen = 20 73peerIdLen = 20
diff --git a/src/Network/BitTorrent/Exchange/Block.hs b/src/Network/BitTorrent/Exchange/Block.hs
index 6e5b960a..16c124e9 100644
--- a/src/Network/BitTorrent/Exchange/Block.hs
+++ b/src/Network/BitTorrent/Exchange/Block.hs
@@ -57,7 +57,6 @@ module Network.BitTorrent.Exchange.Block
57 57
58import Prelude hiding (span) 58import Prelude hiding (span)
59import Control.Applicative 59import Control.Applicative
60import Data.Aeson.TH
61import Data.ByteString as BS hiding (span) 60import Data.ByteString as BS hiding (span)
62import Data.ByteString.Lazy as BL hiding (span) 61import Data.ByteString.Lazy as BL hiding (span)
63import Data.ByteString.Lazy.Builder as BS 62import Data.ByteString.Lazy.Builder as BS
@@ -70,7 +69,6 @@ import Numeric
70import Text.PrettyPrint as PP hiding ((<>)) 69import Text.PrettyPrint as PP hiding ((<>))
71import Text.PrettyPrint.Class 70import Text.PrettyPrint.Class
72 71
73import Data.Torrent.JSON
74import Data.Torrent.Piece 72import Data.Torrent.Piece
75 73
76{----------------------------------------------------------------------- 74{-----------------------------------------------------------------------
@@ -114,8 +112,6 @@ data BlockIx = BlockIx {
114 , ixLength :: {-# UNPACK #-} !BlockSize 112 , ixLength :: {-# UNPACK #-} !BlockSize
115 } deriving (Show, Eq, Typeable) 113 } deriving (Show, Eq, Typeable)
116 114
117$(deriveJSON omitRecordPrefix ''BlockIx)
118
119-- | First block in torrent. Useful for debugging. 115-- | First block in torrent. Useful for debugging.
120instance Default BlockIx where 116instance Default BlockIx where
121 def = BlockIx 0 0 defaultTransferSize 117 def = BlockIx 0 0 defaultTransferSize
diff --git a/src/Network/BitTorrent/Exchange/Connection/Status.hs b/src/Network/BitTorrent/Exchange/Connection/Status.hs
index b4b10371..f6abc580 100644
--- a/src/Network/BitTorrent/Exchange/Connection/Status.hs
+++ b/src/Network/BitTorrent/Exchange/Connection/Status.hs
@@ -34,14 +34,12 @@ module Network.BitTorrent.Exchange.Connection.Status
34 ) where 34 ) where
35 35
36import Control.Lens 36import Control.Lens
37import Data.Aeson.TH
38import Data.Default 37import Data.Default
39import Data.Maybe 38import Data.Maybe
40import Data.Monoid 39import Data.Monoid
41import Text.PrettyPrint as PP hiding ((<>)) 40import Text.PrettyPrint as PP hiding ((<>))
42import Text.PrettyPrint.Class 41import Text.PrettyPrint.Class
43 42
44import Data.Torrent.JSON
45import Network.BitTorrent.Exchange.Message 43import Network.BitTorrent.Exchange.Message
46 44
47 45
@@ -61,7 +59,6 @@ data PeerStatus = PeerStatus
61 } deriving (Show, Eq, Ord) 59 } deriving (Show, Eq, Ord)
62 60
63$(makeLenses ''PeerStatus) 61$(makeLenses ''PeerStatus)
64$(deriveJSON omitLensPrefix ''PeerStatus)
65 62
66instance Pretty PeerStatus where 63instance Pretty PeerStatus where
67 pretty PeerStatus {..} = 64 pretty PeerStatus {..} =
@@ -104,7 +101,6 @@ data ConnectionStatus = ConnectionStatus
104 } deriving (Show, Eq) 101 } deriving (Show, Eq)
105 102
106$(makeLenses ''ConnectionStatus) 103$(makeLenses ''ConnectionStatus)
107$(deriveJSON omitRecordPrefix ''ConnectionStatus)
108 104
109instance Pretty ConnectionStatus where 105instance Pretty ConnectionStatus where
110 pretty ConnectionStatus {..} = 106 pretty ConnectionStatus {..} =
diff --git a/src/Network/BitTorrent/Internal/Cache.hs b/src/Network/BitTorrent/Internal/Cache.hs
index 5c3f379b..8c74467a 100644
--- a/src/Network/BitTorrent/Internal/Cache.hs
+++ b/src/Network/BitTorrent/Internal/Cache.hs
@@ -32,7 +32,6 @@ module Network.BitTorrent.Internal.Cache
32 ) where 32 ) where
33 33
34import Control.Applicative 34import Control.Applicative
35import Data.Aeson
36import Data.Monoid 35import Data.Monoid
37import Data.Default 36import Data.Default
38import Data.Time 37import Data.Time
@@ -56,30 +55,6 @@ data Cached a = Cached
56 55
57-- INVARIANT: minUpdateInterval <= updateInterval 56-- INVARIANT: minUpdateInterval <= updateInterval
58 57
59-- | Examples:
60--
61-- { data: "some string",
62-- observed: "2014-03-20T19:49:39.505Z",
63-- expires: "2014-03-20T19:50:10.881Z" }
64--
65-- or:
66--
67-- { expired: "2014-03-20T19:50:10.881Z" }
68--
69instance ToJSON a => ToJSON (Cached a) where
70 toJSON Cached {..}
71 | currentTime < expireTime = object
72 [ "observed" .= posixSecondsToUTCTime lastUpdated
73 , "expires" .= posixSecondsToUTCTime expireTime
74 , "data" .= cachedData
75 ]
76 | otherwise = object
77 [ "expired" .= posixSecondsToUTCTime expireTime
78 ]
79 where
80 expireTime = currentTime + updateInterval
81 currentTime = unsafePerformIO getPOSIXTime
82
83instance Default (Cached a) where 58instance Default (Cached a) where
84 def = mempty 59 def = mempty
85 60
diff --git a/src/Network/BitTorrent/Tracker/Message.hs b/src/Network/BitTorrent/Tracker/Message.hs
index ffe36c82..cdc07af8 100644
--- a/src/Network/BitTorrent/Tracker/Message.hs
+++ b/src/Network/BitTorrent/Tracker/Message.hs
@@ -97,7 +97,6 @@ module Network.BitTorrent.Tracker.Message
97 97
98import Control.Applicative 98import Control.Applicative
99import Control.Monad 99import Control.Monad
100import Data.Aeson.TH
101import Data.BEncode as BE hiding (Result) 100import Data.BEncode as BE hiding (Result)
102import Data.BEncode.BDict as BE 101import Data.BEncode.BDict as BE
103import Data.ByteString as BS 102import Data.ByteString as BS
@@ -126,7 +125,6 @@ import System.Entropy
126import Text.Read (readMaybe) 125import Text.Read (readMaybe)
127 126
128import Data.Torrent.InfoHash 127import Data.Torrent.InfoHash
129import Data.Torrent.JSON
130import Data.Torrent.Progress 128import Data.Torrent.Progress
131import Network.BitTorrent.Core 129import Network.BitTorrent.Core
132 130
@@ -150,8 +148,6 @@ data AnnounceEvent
150 | Completed 148 | Completed
151 deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable) 149 deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
152 150
153$(deriveJSON omitRecordPrefix ''AnnounceEvent)
154
155-- | HTTP tracker protocol compatible encoding. 151-- | HTTP tracker protocol compatible encoding.
156instance QueryValueLike AnnounceEvent where 152instance QueryValueLike AnnounceEvent where
157 toQueryValue e = toQueryValue (Char.toLower x : xs) 153 toQueryValue e = toQueryValue (Char.toLower x : xs)
@@ -224,8 +220,6 @@ data AnnounceQuery = AnnounceQuery
224 , reqEvent :: Maybe AnnounceEvent 220 , reqEvent :: Maybe AnnounceEvent
225 } deriving (Show, Eq, Typeable) 221 } deriving (Show, Eq, Typeable)
226 222
227$(deriveJSON omitRecordPrefix ''AnnounceQuery)
228
229-- | UDP tracker protocol compatible encoding. 223-- | UDP tracker protocol compatible encoding.
230instance Serialize AnnounceQuery where 224instance Serialize AnnounceQuery where
231 put AnnounceQuery {..} = do 225 put AnnounceQuery {..} = do
@@ -636,8 +630,6 @@ data ScrapeEntry = ScrapeEntry {
636 , siName :: !(Maybe Text) 630 , siName :: !(Maybe Text)
637 } deriving (Show, Eq, Typeable) 631 } deriving (Show, Eq, Typeable)
638 632
639$(deriveJSON omitRecordPrefix ''ScrapeEntry)
640
641-- | HTTP tracker protocol compatible encoding. 633-- | HTTP tracker protocol compatible encoding.
642instance BEncode ScrapeEntry where 634instance BEncode ScrapeEntry where
643 toBEncode ScrapeEntry {..} = toDict $ 635 toBEncode ScrapeEntry {..} = toDict $
diff --git a/src/Network/BitTorrent/Tracker/Session.hs b/src/Network/BitTorrent/Tracker/Session.hs
index 5aa9c0eb..560acf84 100644
--- a/src/Network/BitTorrent/Tracker/Session.hs
+++ b/src/Network/BitTorrent/Tracker/Session.hs
@@ -47,8 +47,6 @@ import Control.Exception
47import Control.Concurrent 47import Control.Concurrent
48import Control.Concurrent.Chan.Split as CS 48import Control.Concurrent.Chan.Split as CS
49import Control.Monad 49import Control.Monad
50import Data.Aeson
51import Data.Aeson.TH
52import Data.Default 50import Data.Default
53import Data.Fixed 51import Data.Fixed
54import Data.Foldable as F 52import Data.Foldable as F
@@ -60,7 +58,6 @@ import Data.Traversable
60import Network.URI 58import Network.URI
61 59
62import Data.Torrent.InfoHash 60import Data.Torrent.InfoHash
63import Data.Torrent.JSON
64import Network.BitTorrent.Core 61import Network.BitTorrent.Core
65import Network.BitTorrent.Internal.Cache 62import Network.BitTorrent.Internal.Cache
66import Network.BitTorrent.Internal.Types 63import Network.BitTorrent.Internal.Types
@@ -95,8 +92,6 @@ data LastScrape = LastScrape
95 , scrapeSeeders :: Maybe Int 92 , scrapeSeeders :: Maybe Int
96 } deriving (Show, Eq) 93 } deriving (Show, Eq)
97 94
98$(deriveJSON omitRecordPrefix ''LastScrape)
99
100-- | Single tracker session. 95-- | Single tracker session.
101data TrackerSession = TrackerSession 96data TrackerSession = TrackerSession
102 { -- | Used to notify 'Stopped' and 'Completed' events. 97 { -- | Used to notify 'Stopped' and 'Completed' events.
@@ -109,13 +104,6 @@ data TrackerSession = TrackerSession
109 , trackerScrape :: Cached LastScrape 104 , trackerScrape :: Cached LastScrape
110 } 105 }
111 106
112instance ToJSON (TierEntry TrackerSession) where
113 toJSON (uri, TrackerSession {..}) = object
114 [ "uri" .= uri
115 , "peers" .= trackerPeers
116 , "scrape" .= trackerScrape
117 ]
118
119-- | Not contacted. 107-- | Not contacted.
120instance Default TrackerSession where 108instance Default TrackerSession where
121 def = TrackerSession Nothing def def 109 def = TrackerSession Nothing def def