diff options
| author | Jacques Comeaux <jacquesrcomeaux@gmail.com> | 2022-05-27 21:07:43 -0500 | 
|---|---|---|
| committer | Jacques Comeaux <jacquesrcomeaux@gmail.com> | 2022-05-27 21:07:43 -0500 | 
| commit | 3d3163a1028e99e5073fd39adc9aee5d76a5e5a2 (patch) | |
| tree | d1cff9ed00418183d3ed8de412d0fdccd7666eaf /src/Tomato | |
Initial Commit
Diffstat (limited to 'src/Tomato')
| -rw-r--r-- | src/Tomato/.Post.hs.swp | bin | 0 -> 12288 bytes | |||
| -rw-r--r-- | src/Tomato/Post.hs | 65 | ||||
| -rw-r--r-- | src/Tomato/Validate.hs | 16 | 
3 files changed, 81 insertions, 0 deletions
| diff --git a/src/Tomato/.Post.hs.swp b/src/Tomato/.Post.hs.swpBinary files differ new file mode 100644 index 0000000..f823f90 --- /dev/null +++ b/src/Tomato/.Post.hs.swp diff --git a/src/Tomato/Post.hs b/src/Tomato/Post.hs new file mode 100644 index 0000000..1e97782 --- /dev/null +++ b/src/Tomato/Post.hs @@ -0,0 +1,65 @@ +module Tomato.Post +    ( postTomato +    , uploadTomato +    , postMessage +    ) where + +import RIO + +import Network.HTTP.Req +    ( jsonResponse +    , ignoreResponse +    , req +    , ReqBodyFile (..) +    , ReqBodyJson (..) +    , (/:) +    , POST (..) +    , Req +    , https +    , header +    , responseBody +    ) + +import Data.Message (GMIUrl (..), OutMessage (..)) + +import qualified Data.Aeson as Ae +import qualified Data.Aeson.KeyMap as Ae + +-- TODO global config reader monad +tomatoFile :: FilePath +tomatoFile = "tomato.png" + +accessToken :: ByteString +accessToken = "nj8X8tB3TC0MoZdMLhIUA4G89r9IlQfVej97Mhg3" + +botId :: Text +botId = "713bcb4a4604006c944804552c" + +-- | Post the current tomato +postTomato :: Req () +postTomato = do +    url <- uploadTomato +    postMessage $ OutMessage url + +-- | Upload the current tomato to the GroupMe image server +uploadTomato :: Req GMIUrl +uploadTomato = do +    let url = https "image.groupme.com" /: "pictures" +    js <- req POST url (ReqBodyFile tomatoFile) jsonResponse $ +        header "X-Access-Token" accessToken <> +        header "Content-Type" "image/png" +    gmURL <- case Ae.fromJSON (responseBody js) of +        Ae.Success r -> pure r +        Ae.Error _s  -> error "deal with this later" -- TODO error monad +    return gmURL + +-- | Post a message to the group with image as attachment +postMessage :: OutMessage -> Req () +postMessage outMes = do +    let url = https "api.groupme.com" /: "v3" /: "bots" /: "post" +        outMes' = case Ae.toJSON outMes of +            Ae.Object o -> Ae.Object $ Ae.insert "bot_id" (Ae.toJSON botId) o +            _           -> error "exceptional" +    req POST url (ReqBodyJson outMes') ignoreResponse $ +        header "X-Access-Token" accessToken +    return () diff --git a/src/Tomato/Validate.hs b/src/Tomato/Validate.hs new file mode 100644 index 0000000..a3dd328 --- /dev/null +++ b/src/Tomato/Validate.hs @@ -0,0 +1,16 @@ +module Tomato.Validate +    ( isTomato +    ) where + +import RIO + +import Data.Message (InMessage (..)) + + +isTomato :: InMessage -> Bool +isTomato m = +    not (hasAttach m) && +    groupId m == 87220147 &&  +    isUser m && +    text m == "tomato" + | 
