-- pastepipe.hs
--
-- A CLI for Hpaste.org.
--
-- Authored by Rogan Creswick (creswick_at_googles_mail_service.)
--
-- Pastepipe reads from stdin, posting to hpaste, and prints out the
-- resulting url (the last line of output). Parameters control various
-- hpaste form fields:
--
-- -u username (defaults to $USER)
-- -l language (defaults to haskell, of course)
-- -t title (defaults to the empty string)
--
-- It will auto-detect your local username, but -u overrides this detection.
--
-- compile with:
-- ghci --make -package HTTP pastepipe.hs -o pastepipe
module Main where
--import Data.Char (intToDigit)
--import Network.HTTP
import Network.HTTP.Base
import Network.URI
import Network.Browser
import Data.Maybe
import System.Environment (getArgs, getEnv)
--import System.IO ()
-- The hpaste API help can be found here:
-- http://hpaste.org/fastcgi/hpaste.fcgi/help
-- | The "root" uri for hpaste.org
coreUri :: String
coreUri = "http://hpaste.org/fastcgi/hpaste.fcgi/"
-- | The URI for posting new pastes to hpaste.
-- This isn't guaranteed to trigger a failure on all execution paths, as-is.
saveUri :: URI
saveUri = buildURI "save"
-- | composes the core uri and a string to create a usable URI
buildURI :: String -> URI
buildURI str = fromJust $ parseURI $ coreUri ++ str
-- | Posts the given content to hpaste.org, returning the new uri.
post :: String -> String -> String -> String -> IO URI
post usr lang title str = do
(uri, _) <- Network.Browser.browse $ do
setAllowRedirects True -- handle HTTP redirects
request $ buildRequest usr lang title str
return uri
-- | Creates the request to post a chunk of content.
buildRequest :: String -> String -> String -> String -> Request String
buildRequest usr lang title str = formToRequest $ Form POST saveUri
[ ("title", title)
, ("author", usr)
, ("content", str)
, ("language", lang)
, ("channel", "")]
fakePost :: String -> String -> String -> String -> IO URI
fakePost usr lang title str = do
putStrLn $ "user: "++usr
putStrLn $ "lang: "++lang
putStrLn $ "title: "++title
putStrLn $ "content: "++str
return saveUri
main :: IO ()
main = do
args <- getArgs
content <- getContents
realUser <- getEnv "USER"
let usr = getArgVal "-u" realUser args
lang = getLang args
title = getTitle args
uri <- post usr lang title content
putStrLn $ show uri
-- | Determines the language from the list of arguments.
getLang :: [String] -> String
getLang = getArgVal "-l" "haskell"
getTitle :: [String] -> String
getTitle = getArgVal "-t" ""
-- | given a flag and a default value, returns the first
-- argument following the first instance fo flag, or the default
-- if no argument matches.
getArgVal :: String -> String -> [String] -> String
getArgVal _ def [] = def
getArgVal _ def (_:[]) = def
getArgVal flag def (x:xs) | flag == x = head xs
| otherwise = getArgVal flag def xs