packages feed

imagepaste-0.2.0.0: src/EngineScrin.hs

module EngineScrin (config, handler) where

import Data.Maybe
import Network.HTTP.Headers
import Network.HTTP
import Control.Monad.State (modify, get, put)
import Control.Monad.Reader (ask)
import Control.Monad.IO.Class (liftIO)

import qualified Data.Map as Map
import qualified Data.List as List

import qualified Engine
import qualified Tools
import qualified Processing
import qualified Configuration
import Log (msgDebug, msgInfo)

scrinUploadUrl = "http://scrin.org/"

scrinFields = [
  Engine.TextField "resize_x" "",
  Engine.TextField "resize_y" "",
  Engine.TextField "thumb-sets" "none",
  Engine.TextField "thumb-size-h" "100",
  Engine.TextField "thumb-size-w" "100",
  Engine.TextField "x" "",
  Engine.TextField "y" ""]

config = Engine.PasteContext {
  Engine.pcUploadLink    = scrinUploadUrl,
  Engine.pcFileTagName   = "fileup[]",
  Engine.pcFileName      = "",
  Engine.pcFields        = scrinFields,
  Engine.pcEncodingType  = Engine.MultipartFormData,
  Engine.pcContents      = "",
  Engine.pcResultLink    = Nothing,
  Engine.pcCustomFields  = Map.empty,
  Engine.pcAllowRedirect = False,
  Engine.pcCustomHeaders = []
  }

handler :: Engine.PasteHandler ()
handler = getPostkeyAndCookies >> sendFile

-- | Retrieves Cookies and Postkey from login page
getPostkeyAndCookies :: Engine.PasteHandler ()
getPostkeyAndCookies = do
  -- start login page
  context <- get
  liftIO $ msgDebug "Getting start page..."
  startPage <- liftIO $ Engine.fetch (getRequest scrinUploadUrl) True
  let cookies = Engine.cookiesRemoveSet startPage
  liftIO $ msgDebug $ "cookies: " ++ show cookies
  put $ Engine.addCustomHeaders context [cookies]

  let mPostkey = Processing.extractLink (rspBody startPage) "input" "value" ""
  liftIO $ msgDebug $ "postkey: " ++ show mPostkey

  let postkey = fromMaybe "" mPostkey
      fields = Engine.pcFields context
      newContext = context { Engine.pcFields = Engine.TextField "postkey" postkey : fields }

  put newContext

sendFile :: Engine.PasteHandler ()
sendFile = Engine.uploadAndGrabHtml (Engine.grabExtractLinks "input" "value" Engine.FileExtension)
             >>= (Engine.saveFirstLink . reverse)