{- This file is part of funbot. - - Written in 2015 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} {-# LANGUAGE OverloadedStrings #-} module FunBot.Sources.WebListener.Client ( dispatchClient ) where import Control.Applicative import Control.Monad (mzero) import Data.Aeson import Data.Aeson.Types (Parser) import qualified Data.ByteString.Lazy as B import qualified Data.Text as T import FunBot.Types import Network.HTTP (Request (..)) instance FromJSON Branch where parseJSON (Object o) = Branch <$> o .: "name" <*> o .: "repo" <*> o .: "user" parseJSON _ = mzero instance ToJSON Branch where toJSON (Branch name repo owner) = object [ "name" .= name , "repo" .= repo , "user" .= owner ] instance FromJSON Commit where parseJSON (Object o) = Commit <$> o .: "author" <*> o .: "title" <*> o .: "url" parseJSON _ = mzero instance ToJSON Commit where toJSON (Commit author title url) = object [ "author" .= author , "title" .= title , "url" .= url ] instance FromJSON Push where parseJSON (Object o) = Push <$> o .: "branch" <*> o .: "commits" parseJSON _ = mzero instance ToJSON Push where toJSON (Push branch commits) = object [ "branch" .= branch , "commits" .= commits ] instance FromJSON Tag where parseJSON (Object o) = Tag <$> o .: "author" <*> o .: "ref" <*> o .: "repo" <*> o .: "user" parseJSON _ = mzero instance ToJSON Tag where toJSON tag = object [ "author" .= tagAuthor tag , "ref" .= tagRef tag , "repo" .= tagRepo tag , "user" .= tagRepoOwner tag ] instance FromJSON MR where parseJSON (Object o) = MR <$> o .: "author" <*> o .: "id" <*> o .: "repo" <*> o .: "user" <*> o .: "title" <*> o .: "url" <*> o .: "action" parseJSON _ = mzero instance ToJSON MR where toJSON mr = object [ "author" .= mrAuthor mr , "id" .= mrId mr , "repo" .= mrRepo mr , "user" .= mrRepoOwner mr , "title" .= mrTitle mr , "url" .= mrUrl mr , "action" .= mrAction mr ] instance FromJSON FeedItem where parseJSON (Object o) = FeedItem <$> o .: "feed-label" <*> o .: "feed-title" <*> o .: "title" <*> o .: "author" <*> o .: "url" parseJSON _ = mzero instance ToJSON FeedItem where toJSON (FeedItem fLabel fTitle title author url) = object [ "feed-label" .= fLabel , "feed-title" .= fTitle , "title" .= title , "author" .= author , "url" .= url ] text :: Parser T.Text -> T.Text -> Parser T.Text text parser expected = do got <- parser if got == expected then return got else mzero instance FromJSON ExtEvent where parseJSON (Object o) = let kind = text $ o .: "type" in kind "push" *> (GitPush <$> o .: "data") <|> kind "tag" *> (GitTag <$> o .: "data") <|> kind "mr" *> (MergeRequest <$> o .: "data") <|> kind "news" *> (NewsItem <$> o .: "data") parseJSON _ = mzero instance ToJSON ExtEvent where toJSON (GitPush commits) = object [ "type" .= ("push" :: T.Text) , "data" .= commits ] toJSON (GitTag tag) = object [ "type" .= ("tag" :: T.Text) , "data" .= tag ] toJSON (MergeRequest mr) = object [ "type" .= ("mr" :: T.Text) , "data" .= mr ] toJSON (NewsItem item) = object [ "type" .= ("news" :: T.Text) , "data" .= item ] parse :: B.ByteString -> Either String ExtEvent parse = eitherDecode dispatchClient push _pushMany request = case parse $ rqBody request of Left e -> do putStrLn $ "Web listener source: Client: " ++ show e ++ ":" print $ rqBody request Right event -> push event