module Facebook.OpenGraph
( createAction
, Action(..)
, (#=)
, SimpleType(..)
) where
import Control.Arrow (first)
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.Conduit as C
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.Time as TI
import Facebook.Types
import Facebook.Monad
import Facebook.Graph
createAction :: C.ResourceIO m =>
Action
-> [Argument]
-> Maybe AppAccessToken
-> UserAccessToken
-> FacebookT Auth m Id
createAction (Action action) query mapptoken usertoken = do
creds <- getCreds
let post :: C.ResourceIO 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, TE.encodeUtf8 (encodeFbParam v))
class SimpleType a where
encodeFbParam :: a -> Text
instance SimpleType Bool where
encodeFbParam b = if b then "1" else "0"
instance SimpleType TI.Day where
encodeFbParam = T.pack . TI.formatTime defaultTimeLocale "%Y-%m-%d"
instance SimpleType TI.UTCTime where
encodeFbParam = T.pack . TI.formatTime defaultTimeLocale "%Y%m%dT%H%MZ"
instance SimpleType TI.ZonedTime where
encodeFbParam = encodeFbParam . TI.zonedTimeToUTC
instance SimpleType Float where
encodeFbParam = showT
instance SimpleType Double where
encodeFbParam = showT
instance SimpleType Int where
encodeFbParam = showT
instance SimpleType Word where
encodeFbParam = showT
instance SimpleType Int8 where
encodeFbParam = showT
instance SimpleType Word8 where
encodeFbParam = showT
instance SimpleType Int16 where
encodeFbParam = showT
instance SimpleType Word16 where
encodeFbParam = showT
instance SimpleType Int32 where
encodeFbParam = showT
instance SimpleType Word32 where
encodeFbParam = showT
instance SimpleType Text where
encodeFbParam = id
instance SimpleType a => SimpleType [a] where
encodeFbParam = T.concat . intersperse "," . map encodeFbParam
showT :: Show a => a -> Text
showT = T.pack . show