{-# LANGUAGE OverloadedStrings, FlexibleInstances, MultiParamTypeClasses, TemplateHaskell #-} module Main where import Data.Lens.Common import Data.Lens.Template import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.Text as T import qualified Data.Text.Encoding as T import Text.Blaze.Html5 as H import Text.Blaze.Html5.Attributes as A import Data.Monoid import Control.Applicative import Text.Blaze.Renderer.Utf8 (renderHtml) import Snap import Snap.Snaplet.ReCaptcha data ReCaptchaTest = ReCaptchaTest { _recaptcha :: Snaplet ReCaptcha } $(makeLenses [''ReCaptchaTest]) instance HasReCaptcha ReCaptchaTest where recaptchaLens = subSnaplet recaptcha main :: IO () main = do putStrLn "Please enter your ReCaptcha public key:" puk <- getLine putStrLn "Please enter your ReCaptcha private key:" prk <- T.encodeUtf8 <$> T.pack <$> getLine putStrLn "Now point your browser to localhost:8000!" serveSnaplet defaultConfig (snaplet puk prk) where snaplet puk prk = makeSnaplet "ReCaptchaTest" "" Nothing $ do r <- embedSnaplet "recaptcha" recaptcha $ initReCaptcha prk addRoutes [("", writeLBS $ renderHtml $ template puk) ,("verify", do r <- verifyCaptcha case r of Success -> writeBS "Success." Failure x -> writeBS "Failure: " >> writeLBS x ConnectionError x -> writeBS "ConnectionError: " >> writeText (T.pack $ show x) MissingArguments -> writeBS "MissingArguments" ) ] return (ReCaptchaTest r) template puk = H.docTypeHtml $ do H.head $ do H.script "" ! A.type_ "text/javascript" ! A.src "http://www.google.com/recaptcha/api/js/recaptcha_ajax.js" H.body ! A.onload ( "Recaptcha.create('" `mappend` toValue puk `mappend` "', 'recaptcha');" ) $ do H.form ! A.action "verify" ! A.method "POST" $ do H.div "" ! A.id "recaptcha" H.button "Test"