aboutsummaryrefslogtreecommitdiff
path: root/src/Tomato
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@gmail.com>2022-05-27 21:07:43 -0500
committerJacques Comeaux <jacquesrcomeaux@gmail.com>2022-05-27 21:07:43 -0500
commit3d3163a1028e99e5073fd39adc9aee5d76a5e5a2 (patch)
treed1cff9ed00418183d3ed8de412d0fdccd7666eaf /src/Tomato
Initial Commit
Diffstat (limited to 'src/Tomato')
-rw-r--r--src/Tomato/.Post.hs.swpbin0 -> 12288 bytes
-rw-r--r--src/Tomato/Post.hs65
-rw-r--r--src/Tomato/Validate.hs16
3 files changed, 81 insertions, 0 deletions
diff --git a/src/Tomato/.Post.hs.swp b/src/Tomato/.Post.hs.swp
new file mode 100644
index 0000000..f823f90
--- /dev/null
+++ b/src/Tomato/.Post.hs.swp
Binary files differ
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"
+