packages feed

hoauth2-0.5.3.1: example/StackExchange/test.hs

{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Github API: http://developer.github.com/v3/oauth/

module Main where

import           Control.Applicative
import           Control.Monad        (mzero)
import           Data.Aeson
import           Data.Aeson.TH                 (defaultOptions, deriveJSON)
import qualified Data.ByteString      as BS
import qualified Data.ByteString.Lazy.Char8    as BSL
import           Data.Text            (Text)
import qualified Data.Text            as T
import qualified Data.Text.Encoding   as T
import           Network.HTTP.Conduit

import           Network.OAuth.OAuth2

import           Keys

data SiteInfo = SiteInfo { items   :: [SiteItem]
                         , has_more :: Bool
                         , quota_max :: Integer
                         , quota_remaining :: Integer
                         } deriving (Show, Eq)

data SiteItem = SiteItem { new_active_users :: Integer
                           , total_users :: Integer
                           , badges_per_minute :: Double
                           , total_badges :: Integer
                           , total_votes :: Integer
                           , total_comments :: Integer
                           , answers_per_minute :: Double
                           , questions_per_minute :: Double
                           , total_answers :: Integer
                           , total_accepted :: Integer
                           , total_unanswered :: Integer
                           , total_questions :: Integer
                           , api_revision :: Text
                         } deriving (Show, Eq)

$(deriveJSON defaultOptions ''SiteInfo)
$(deriveJSON defaultOptions ''SiteItem)


main :: IO ()
main = do
    print $ authorizationUrl stackexchangeKey
    putStrLn "visit the url and paste code here: "
    code <- getLine
    mgr <- newManager tlsManagerSettings
    let (url, body) = accessTokenUrl stackexchangeKey (sToBS code)
    token <- doSimplePostRequest mgr stackexchangeKey url (body)
    print (token :: OAuth2Result BSL.ByteString)
    case token of
      Right at  -> siteInfo mgr (getAccessToken at) >>= print
      Left _    -> putStrLn "no access token found yet"



-- stackexchange access token api does not respond json but an string
-- https://api.stackexchange.com/docs/authentication
getAccessToken :: BSL.ByteString -> AccessToken
getAccessToken str = let xs = BSL.split '&' str
                         ys = BSL.split '=' (xs !! 0)
                     in
                       AccessToken { accessToken = BSL.toStrict (ys !! 1)
                                   , refreshToken = Nothing
                                   , expiresIn = Nothing
                                   , tokenType = Nothing
                                   }

-- | Test API: info
siteInfo :: Manager -> AccessToken -> IO (OAuth2Result SiteInfo)
siteInfo mgr token = authGetJSON mgr token "https://api.stackexchange.com/2.2/info?site=stackoverflow"

sToBS :: String -> BS.ByteString
sToBS = T.encodeUtf8 . T.pack