module Facebook.OpenGraph
( createAction
, Action(..)
, (#=)
, SimpleType(..)
) where
import Control.Arrow (first)
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Function (on)
import Data.List (intersperse)
import Data.Text (Text)
import Data.Int (Int8, Int16, Int32)
import Data.Word (Word8, Word16, Word32, Word)
import Data.String (IsString(..))
import Network.HTTP.Types (Ascii)
import System.Locale (defaultTimeLocale)
import qualified Data.ByteString.Char8 as B
import qualified Data.Conduit as C
import qualified Data.Text.Encoding as TE
import qualified Data.Time as TI
import Facebook.Types
import Facebook.Monad
import Facebook.Graph
createAction :: (C.MonadResource m, MonadBaseControl IO m) =>
Action
-> [Argument]
-> Maybe AppAccessToken
-> UserAccessToken
-> FacebookT Auth m Id
createAction (Action action) query mapptoken usertoken = do
creds <- getCreds
let post :: (C.MonadResource m, MonadBaseControl IO m) => Ascii -> AccessToken anyKind -> FacebookT Auth m Id
post prepath = postObject (prepath <> appName creds <> ":" <> action) query
case mapptoken of
Nothing -> post "/me/" usertoken
Just apptoken -> post ("/" <> accessTokenUserId usertoken <> "/") apptoken
newtype Action = Action { unAction :: Ascii }
instance Show Action where
show = show . unAction
instance Eq Action where
(==) = (==) `on` unAction
(/=) = (/=) `on` unAction
instance Ord Action where
compare = compare `on` unAction
(<=) = (<=) `on` unAction
(<) = (<) `on` unAction
(>=) = (>=) `on` unAction
(>) = (>) `on` unAction
instance Read Action where
readsPrec = (fmap (first Action) .) . readsPrec
instance IsString Action where
fromString = Action . fromString
(#=) :: SimpleType a => Ascii -> a -> Argument
p #= v = (p, encodeFbParam v)
class SimpleType a where
encodeFbParam :: a -> B.ByteString
instance SimpleType Bool where
encodeFbParam b = if b then "1" else "0"
instance SimpleType TI.Day where
encodeFbParam = B.pack . TI.formatTime defaultTimeLocale "%Y-%m-%d"
instance SimpleType TI.UTCTime where
encodeFbParam = B.pack . TI.formatTime defaultTimeLocale "%Y%m%dT%H%MZ"
instance SimpleType TI.ZonedTime where
encodeFbParam = encodeFbParam . TI.zonedTimeToUTC
instance SimpleType Float where
encodeFbParam = showBS
instance SimpleType Double where
encodeFbParam = showBS
instance SimpleType Int where
encodeFbParam = showBS
instance SimpleType Word where
encodeFbParam = showBS
instance SimpleType Int8 where
encodeFbParam = showBS
instance SimpleType Word8 where
encodeFbParam = showBS
instance SimpleType Int16 where
encodeFbParam = showBS
instance SimpleType Word16 where
encodeFbParam = showBS
instance SimpleType Int32 where
encodeFbParam = showBS
instance SimpleType Word32 where
encodeFbParam = showBS
instance SimpleType Text where
encodeFbParam = TE.encodeUtf8
instance SimpleType Id where
encodeFbParam = idCode
instance SimpleType a => SimpleType [a] where
encodeFbParam = B.concat . intersperse "," . map encodeFbParam
showBS :: Show a => a -> B.ByteString
showBS = B.pack . show