1
0
Fork 0

[haskell] Implemented contract

This commit is contained in:
Julien Dessaux 2023-07-03 21:29:15 +02:00
parent a775330b4f
commit b3d57cb6ad
Signed by: adyxax
GPG key ID: F92E51B86E07177E
6 changed files with 82 additions and 5 deletions

View file

@ -9,6 +9,7 @@ import qualified Data.Text as T
import SpaceTraders.APIClient.Agent
import SpaceTraders.Database
import SpaceTraders.Database.Agents
import SpaceTraders.Database.Contracts
import SpaceTraders.Database.Tokens
main :: IO ()
@ -25,6 +26,7 @@ main = do
case r of
Right r' -> do
setAgent conn $ agent r'
addContract conn $ contract r'
let t = token r'
setToken conn $ t
return t

View file

@ -23,6 +23,7 @@ dependencies:
- http-types
- sqlite-simple
- text
- time
- raw-strings-qq
ghc-options:

View file

@ -15,16 +15,18 @@ import Network.HTTP.Simple
import SpaceTraders.APIClient.Client
import SpaceTraders.Model.Agent
import SpaceTraders.Model.Contract
myAgent :: T.Text -> IO (Either APIError Agent)
myAgent t = send $ setRequestPath "/v2/my/agent"
$ tokenReq t
data RegisterRequest = RegisterRequest { symbol :: T.Text
, faction :: T.Text
data RegisterRequest = RegisterRequest { faction :: T.Text
, symbol :: T.Text
} deriving (ToJSON, Generic, Show)
data RegisterMessage = RegisterMessage { token :: T.Text
, agent :: Agent
data RegisterMessage = RegisterMessage { agent :: Agent
, contract :: Contract
, token :: T.Text
} deriving (FromJSON, Generic, Show)
register :: T.Text -> T.Text -> IO (Either APIError RegisterMessage)

View file

@ -1,5 +1,4 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module SpaceTraders.Database.Agents
( setAgent

View 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))

View 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)