diff options
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.swp Binary files differnew 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" + |