packages feed

linklater-1.0.0.3: examples/JointPhotographicExpertsGroupTonga.hs

{-# LANGUAGE OverloadedStrings #-}

module JointPhotographicExpertsGroupTonga where

import           Control.Applicative
import           Control.Lens hiding ((.=))
import           Control.Monad
import           Data.Attoparsec.ByteString
import qualified Data.Attoparsec.ByteString as P
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Data.Text.Format as F
import           Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
import           Data.Text.Lazy.Encoding (decodeUtf8)
import           Data.Text.Lazy.IO
import           Data.Word8
import           Network.HTTP.Types (status200)
import           Network.Linklater
import           Network.Wai
import           Network.Wai.Handler.Warp (run)
import           Network.Wreq hiding (params, headers)
import           Prelude hiding (readFile, writeFile, putStrLn)

toText :: B.ByteString -> Text
toText = decodeUtf8 . L.fromChunks . return

token :: Text
token = undefined

urlParser :: Parser B.ByteString
urlParser = p
  where
    p = garbage *> url
    garbage = string "src=\"" <|> (P.take 1 *> garbage)
    url = takeTill (== _quotedbl)

urlFor :: Text -> IO Text
urlFor search = do
  r <- get (T.unpack $ F.format "http://{}.jpg.to/" [search])
  (return . handle . parse urlParser . strictly) (r ^. responseBody)
  where
    strictly = B.concat . L.toChunks
    handle (Fail i ctxs s) = error (show (i, ctxs, s))
    handle (Partial f) = handle (f "")
    handle (Done _ r) = toText r

jpgto :: Maybe Command -> Application
jpgto (Just (Command (User user) channel text)) req respond = do
  url <- urlFor (maybe "spolsky" id text)
  say (Message channel (response url) (EmojiIcon "gift")) config
  (respond . responseLBS status200 headers) ""
  where
    response url = F.format "@{} {}" (user, url)
    config = Config token "trello.slack.com"
    headers = [("Content-Type", "text/plain")]

main :: IO ()
main = do
  let port = 80
  putStrLn (F.format "+ Listening on port {}" [port])
  run port (slash jpgto)
  return ()