{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, StandaloneDeriving, TemplateHaskell, TypeFamilies, UndecidableInstances #-} {-# OPTIONS_GHC -F -pgmFtrhsx #-} module Main where import Control.Applicative((<$>)) import Control.Monad(MonadPlus, mzero, msum) import Control.Monad.Reader (ask) import Control.Monad.State (get,put) import Control.Monad.Trans(MonadIO(..)) import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set) import qualified Data.Set as Set import Data.Text (Text) import qualified Data.Text as Text import qualified Data.Text.Encoding as Text import Data.Generics (Typeable) import Data.Maybe (catMaybes) import Happstack.Facebook.Connect as Connect (FacebookConnectData, withFacebookConnect, withSessionSP) import Happstack.Facebook.Common (HasUser(askUser), HasSessionKey, HasFacebookConfig(askFacebookConfig), FbXML(FbXML),FacebookStateU, FacebookStateS, FacebookConfig(apiKey, connectURL), HasFacebookData, User(uid), callMethod) import Happstack.Facebook.FacebookT (FacebookT(..)) import qualified Happstack.Facebook.Friends as Friends import Happstack.Facebook.XdReceiver import Happstack.Server (ServerMonad, WebMonad, FilterMonad, ServerPartT, Response, Conf(port), dir, nullConf, simpleHTTP, toResponse) import qualified Happstack.Server as Happstack import Happstack.Data (Default, Version(..), deriveAll, deriveNewData) import Happstack.State import Happstack.State.ClockTime (ClockTime) import FacebookConfig (facebookConfig) import HSP import Network.URI import qualified HSX.XMLGenerator as HSX import System.Environment (getProgName) import System.FilePath ((>)) import System.IO (stdout) import System.Log.Logger (Priority(DEBUG, INFO), rootLoggerName, setHandlers, setLevel, updateGlobalLogger) import System.Log.Handler.Simple (fileHandler, streamHandler) import System.Time -- TODO: handle expired session key main :: IO () main = do progName <- getProgName setupLogger progName "." Development simpleHTTP nullConf { port = maybe 80 (read . drop 1 . uriPort) $ uriAuthority (connectURL facebookConfig) } (impl facebookConfig) impl :: FacebookConfig -> ServerPartT IO Response impl fbConfig = msum [ withFacebookConnect fbConfig (msum [ xdReceiverPart , dir "members" $ requireSession (toResponse . FbXML <$> members) , toResponse . FbXML <$> homepage ]) ] homepage :: ( MonadIO m , MonadPlus m , HasFacebookData d (FacebookT (s d) m) , HasFacebookData FacebookConnectData (FacebookT (FacebookStateU d) m) , HasFacebookData FacebookConnectData (FacebookT (s d) m) , HasFacebookConfig (FacebookT (s d) m) ) => FacebookT (s d) m (HSX.XML (FacebookT (s d) m)) homepage = msum [ withSessionSP $ do u <- askUser pageTemplate "Facebook Connect Demo" ()
, pageTemplate "Facebook Connect Demo" ()You are not yet connected.
To enjoy this awesome site you must first Connect with Facebook Connect.
This demo page is pretty wacky. Sorry about that.
Here are ten of your friends.
<% mapM (\friend ->Are you friendly with your friend?
<% show friendly %>Here are some of your friends who also use this app
<% show appUsers %>
Here are your friend lists
<% show lists %>