[haskell] Implemented contract
This commit is contained in:
parent
a775330b4f
commit
b3d57cb6ad
6 changed files with 82 additions and 5 deletions
|
@ -9,6 +9,7 @@ import qualified Data.Text as T
|
||||||
import SpaceTraders.APIClient.Agent
|
import SpaceTraders.APIClient.Agent
|
||||||
import SpaceTraders.Database
|
import SpaceTraders.Database
|
||||||
import SpaceTraders.Database.Agents
|
import SpaceTraders.Database.Agents
|
||||||
|
import SpaceTraders.Database.Contracts
|
||||||
import SpaceTraders.Database.Tokens
|
import SpaceTraders.Database.Tokens
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
|
@ -25,6 +26,7 @@ main = do
|
||||||
case r of
|
case r of
|
||||||
Right r' -> do
|
Right r' -> do
|
||||||
setAgent conn $ agent r'
|
setAgent conn $ agent r'
|
||||||
|
addContract conn $ contract r'
|
||||||
let t = token r'
|
let t = token r'
|
||||||
setToken conn $ t
|
setToken conn $ t
|
||||||
return t
|
return t
|
||||||
|
|
|
@ -23,6 +23,7 @@ dependencies:
|
||||||
- http-types
|
- http-types
|
||||||
- sqlite-simple
|
- sqlite-simple
|
||||||
- text
|
- text
|
||||||
|
- time
|
||||||
- raw-strings-qq
|
- raw-strings-qq
|
||||||
|
|
||||||
ghc-options:
|
ghc-options:
|
||||||
|
|
|
@ -15,16 +15,18 @@ import Network.HTTP.Simple
|
||||||
|
|
||||||
import SpaceTraders.APIClient.Client
|
import SpaceTraders.APIClient.Client
|
||||||
import SpaceTraders.Model.Agent
|
import SpaceTraders.Model.Agent
|
||||||
|
import SpaceTraders.Model.Contract
|
||||||
|
|
||||||
myAgent :: T.Text -> IO (Either APIError Agent)
|
myAgent :: T.Text -> IO (Either APIError Agent)
|
||||||
myAgent t = send $ setRequestPath "/v2/my/agent"
|
myAgent t = send $ setRequestPath "/v2/my/agent"
|
||||||
$ tokenReq t
|
$ tokenReq t
|
||||||
|
|
||||||
data RegisterRequest = RegisterRequest { symbol :: T.Text
|
data RegisterRequest = RegisterRequest { faction :: T.Text
|
||||||
, faction :: T.Text
|
, symbol :: T.Text
|
||||||
} deriving (ToJSON, Generic, Show)
|
} deriving (ToJSON, Generic, Show)
|
||||||
data RegisterMessage = RegisterMessage { token :: T.Text
|
data RegisterMessage = RegisterMessage { agent :: Agent
|
||||||
, agent :: Agent
|
, contract :: Contract
|
||||||
|
, token :: T.Text
|
||||||
} deriving (FromJSON, Generic, Show)
|
} deriving (FromJSON, Generic, Show)
|
||||||
|
|
||||||
register :: T.Text -> T.Text -> IO (Either APIError RegisterMessage)
|
register :: T.Text -> T.Text -> IO (Either APIError RegisterMessage)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
|
||||||
|
|
||||||
module SpaceTraders.Database.Agents
|
module SpaceTraders.Database.Agents
|
||||||
( setAgent
|
( setAgent
|
||||||
|
|
13
haskell/src/SpaceTraders/Database/Contracts.hs
Normal file
13
haskell/src/SpaceTraders/Database/Contracts.hs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module SpaceTraders.Database.Contracts
|
||||||
|
( addContract
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.Aeson
|
||||||
|
import qualified Database.SQLite.Simple as S
|
||||||
|
|
||||||
|
import SpaceTraders.Model.Contract
|
||||||
|
|
||||||
|
addContract :: S.Connection -> Contract -> IO ()
|
||||||
|
addContract conn contract = S.execute conn "INSERT INTO contracts(data) VALUES (json(?));" (S.Only (encode contract))
|
60
haskell/src/SpaceTraders/Model/Contract.hs
Normal file
60
haskell/src/SpaceTraders/Model/Contract.hs
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
{-# LANGUAGE DeriveAnyClass #-}
|
||||||
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module SpaceTraders.Model.Contract
|
||||||
|
( Contract(..)
|
||||||
|
, Delivery(..)
|
||||||
|
, Payment(..)
|
||||||
|
, Terms(..)
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
import Data.Aeson
|
||||||
|
import Data.Time
|
||||||
|
import GHC.Generics
|
||||||
|
import qualified Data.Text as T
|
||||||
|
|
||||||
|
data Contract = Contract { accepted :: Bool
|
||||||
|
, contractId :: T.Text
|
||||||
|
, contractType :: T.Text
|
||||||
|
, expiration :: UTCTime
|
||||||
|
, deadlineToAccept :: UTCTime
|
||||||
|
, factionSymbol :: T.Text
|
||||||
|
, fulfilled :: Bool
|
||||||
|
, terms :: Terms
|
||||||
|
} deriving (Generic, Show)
|
||||||
|
instance FromJSON Contract where
|
||||||
|
parseJSON (Object o) = Contract <$> o .: "accepted"
|
||||||
|
<*> o .: "id"
|
||||||
|
<*> o .: "type"
|
||||||
|
<*> o .: "expiration"
|
||||||
|
<*> o .: "deadlineToAccept"
|
||||||
|
<*> o .: "factionSymbol"
|
||||||
|
<*> o .: "fulfilled"
|
||||||
|
<*> o .: "terms"
|
||||||
|
parseJSON _ = mzero
|
||||||
|
instance ToJSON Contract where
|
||||||
|
toEncoding (Contract a i ty e d fa fu te) = pairs ( "accepted" .= a
|
||||||
|
<> "id" .= i
|
||||||
|
<> "type" .= ty
|
||||||
|
<> "expiration" .= e
|
||||||
|
<> "deadlineToAccept" .= d
|
||||||
|
<> "factionSymbol" .= fa
|
||||||
|
<> "fulfilled" .= fu
|
||||||
|
<> "terms" .= te )
|
||||||
|
|
||||||
|
data Delivery = Delivery { destinationSymbol :: T.Text
|
||||||
|
, tradeSymbol :: T.Text
|
||||||
|
, unitsFulfilled :: Int
|
||||||
|
, unitsRequired :: Int
|
||||||
|
} deriving (FromJSON, Generic, Show, ToJSON)
|
||||||
|
|
||||||
|
data Payment = Payment { onAccepted :: Int
|
||||||
|
, onFulfilled :: Int
|
||||||
|
} deriving (FromJSON, Generic, Show, ToJSON)
|
||||||
|
|
||||||
|
data Terms = Terms { deadline :: UTCTime
|
||||||
|
, deliver :: [Delivery]
|
||||||
|
, payment :: Payment
|
||||||
|
} deriving (FromJSON, Generic, Show, ToJSON)
|
Loading…
Add table
Reference in a new issue