packages feed

hipbot 0.2 → 0.2.1

raw patch · 8 files changed

+31/−43 lines, 8 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- HipBot: APIConsumer :: [APIScope] -> Maybe Text -> APIConsumer
- HipBot: AbsoluteURI :: URI -> AbsoluteURI
- HipBot: AccessToken :: Text -> UTCTime -> AccessToken
- HipBot: AddOn :: Text -> Text -> Text -> Links -> Maybe Capabilities -> Maybe Vendor -> AddOn
- HipBot: AdminGroup :: APIScope
- HipBot: AdminRoom :: APIScope
- HipBot: Capabilities :: Maybe Installable -> Maybe APIConsumer -> Maybe OAuth2Provider -> [Webhook] -> Maybe Configurable -> Capabilities
- HipBot: Configurable :: AbsoluteURI -> Configurable
- HipBot: HipBotAPI :: (Registration -> AccessToken -> m ()) -> (OAuthId -> m ()) -> (OAuthId -> m (Maybe (Registration, AccessToken))) -> (OAuthId -> AccessToken -> m ()) -> HipBotAPI m
- HipBot: HtmlNotification :: Text -> Notification
- HipBot: Installable :: Maybe AbsoluteURI -> Bool -> Bool -> Installable
- HipBot: Links :: AbsoluteURI -> Maybe AbsoluteURI -> Links
- HipBot: ManageRooms :: APIScope
- HipBot: OAuth2Provider :: AbsoluteURI -> AbsoluteURI -> OAuth2Provider
- HipBot: Registration :: OAuthId -> AbsoluteURI -> Maybe RoomId -> Int -> Text -> Registration
- HipBot: RoomEnter :: RoomEvent
- HipBot: RoomExit :: RoomEvent
- HipBot: RoomMessage :: RoomEvent
- HipBot: RoomNotification :: RoomEvent
- HipBot: RoomTopicChange :: RoomEvent
- HipBot: SendMessage :: APIScope
- HipBot: SendNotification :: APIScope
- HipBot: TextNotification :: Text -> Notification
- HipBot: Vendor :: AbsoluteURI -> Text -> Vendor
- HipBot: ViewGroup :: APIScope
- HipBot: ViewMessages :: APIScope
- HipBot: Webhook :: AbsoluteURI -> Maybe Text -> RoomEvent -> Webhook
- HipBot: _accessTokenAccessToken :: AccessToken -> Text
- HipBot: _accessTokenExpires :: AccessToken -> UTCTime
- HipBot: _addOnCapabilities :: AddOn -> Maybe Capabilities
- HipBot: _addOnDescription :: AddOn -> Text
- HipBot: _addOnKey :: AddOn -> Text
- HipBot: _addOnLinks :: AddOn -> Links
- HipBot: _addOnName :: AddOn -> Text
- HipBot: _addOnVendor :: AddOn -> Maybe Vendor
- HipBot: _apiFromName :: APIConsumer -> Maybe Text
- HipBot: _apiScopes :: APIConsumer -> [APIScope]
- HipBot: _capabilitiesConfigurable :: Capabilities -> Maybe Configurable
- HipBot: _capabilitiesHipchatApiConsumer :: Capabilities -> Maybe APIConsumer
- HipBot: _capabilitiesInstallable :: Capabilities -> Maybe Installable
- HipBot: _capabilitiesOauth2Provider :: Capabilities -> Maybe OAuth2Provider
- HipBot: _capabilitiesWebhooks :: Capabilities -> [Webhook]
- HipBot: _configurableUrl :: Configurable -> AbsoluteURI
- HipBot: _installableAllowGlobal :: Installable -> Bool
- HipBot: _installableAllowRoom :: Installable -> Bool
- HipBot: _installableCallbackUrl :: Installable -> Maybe AbsoluteURI
- HipBot: _linksHomepage :: Links -> Maybe AbsoluteURI
- HipBot: _linksSelf :: Links -> AbsoluteURI
- HipBot: _oAuth2ProviderAuthorizationUrl :: OAuth2Provider -> AbsoluteURI
- HipBot: _oAuth2ProviderTokenUrl :: OAuth2Provider -> AbsoluteURI
- HipBot: _registrationCapabilitiesUrl :: Registration -> AbsoluteURI
- HipBot: _registrationGroupId :: Registration -> Int
- HipBot: _registrationOauthId :: Registration -> OAuthId
- HipBot: _registrationOauthSecret :: Registration -> Text
- HipBot: _registrationRoomId :: Registration -> Maybe RoomId
- HipBot: _vendorName :: Vendor -> Text
- HipBot: _vendorUrl :: Vendor -> AbsoluteURI
- HipBot: _webhookEvent :: Webhook -> RoomEvent
- HipBot: _webhookPattern :: Webhook -> Maybe Text
- HipBot: _webhookUrl :: Webhook -> AbsoluteURI
- HipBot: addOn :: Text -> Text -> Text -> Links -> AddOn
- HipBot: apiDeleteRegistration :: HipBotAPI m -> OAuthId -> m ()
- HipBot: apiInsertRegistration :: HipBotAPI m -> Registration -> AccessToken -> m ()
- HipBot: apiLookupRegistration :: HipBotAPI m -> OAuthId -> m (Maybe (Registration, AccessToken))
- HipBot: apiUpdateAccessToken :: HipBotAPI m -> OAuthId -> AccessToken -> m ()
- HipBot.API: HipBotAPI :: (Registration -> AccessToken -> m ()) -> (OAuthId -> m ()) -> (OAuthId -> m (Maybe (Registration, AccessToken))) -> (OAuthId -> AccessToken -> m ()) -> HipBotAPI m
- HipBot.API: apiDeleteRegistration :: HipBotAPI m -> OAuthId -> m ()
- HipBot.API: apiInsertRegistration :: HipBotAPI m -> Registration -> AccessToken -> m ()
- HipBot.API: apiLookupRegistration :: HipBotAPI m -> OAuthId -> m (Maybe (Registration, AccessToken))
- HipBot.API: apiUpdateAccessToken :: HipBotAPI m -> OAuthId -> AccessToken -> m ()
- HipBot.API: class HasHipBotAPI c_aOte m_aOsz | c_aOte -> m_aOsz
- HipBot.API: hipBotAPI :: HasHipBotAPI c_aOte m_aOsz => Lens' c_aOte (HipBotAPI m_aOsz)
- HipBot.API: instance HasHipBotAPI (HipBotAPI m0) m0
+ HipBot: [APIConsumer] :: [APIScope] -> Maybe Text -> APIConsumer
+ HipBot: [AbsoluteURI] :: URI -> AbsoluteURI
+ HipBot: [AccessToken] :: Text -> UTCTime -> AccessToken
+ HipBot: [AddOn] :: Text -> Text -> Text -> Links -> Maybe Capabilities -> Maybe Vendor -> AddOn
+ HipBot: [AdminGroup] :: APIScope
+ HipBot: [AdminRoom] :: APIScope
+ HipBot: [Capabilities] :: Maybe Installable -> Maybe APIConsumer -> Maybe OAuth2Provider -> [Webhook] -> Maybe Configurable -> Capabilities
+ HipBot: [Configurable] :: AbsoluteURI -> Configurable
+ HipBot: [HipBotAPI] :: (Registration -> AccessToken -> m ()) -> (OAuthId -> m ()) -> (OAuthId -> m (Maybe (Registration, AccessToken))) -> (OAuthId -> AccessToken -> m ()) -> HipBotAPI m
+ HipBot: [HtmlNotification] :: Text -> Notification
+ HipBot: [Installable] :: Maybe AbsoluteURI -> Bool -> Bool -> Installable
+ HipBot: [Links] :: AbsoluteURI -> Maybe AbsoluteURI -> Links
+ HipBot: [ManageRooms] :: APIScope
+ HipBot: [OAuth2Provider] :: AbsoluteURI -> AbsoluteURI -> OAuth2Provider
+ HipBot: [Registration] :: OAuthId -> AbsoluteURI -> Maybe RoomId -> Int -> Text -> Registration
+ HipBot: [RoomEnter] :: RoomEvent
+ HipBot: [RoomExit] :: RoomEvent
+ HipBot: [RoomMessage] :: RoomEvent
+ HipBot: [RoomNotification] :: RoomEvent
+ HipBot: [RoomTopicChange] :: RoomEvent
+ HipBot: [SendMessage] :: APIScope
+ HipBot: [SendNotification] :: APIScope
+ HipBot: [TextNotification] :: Text -> Notification
+ HipBot: [Vendor] :: AbsoluteURI -> Text -> Vendor
+ HipBot: [ViewGroup] :: APIScope
+ HipBot: [ViewMessages] :: APIScope
+ HipBot: [Webhook] :: AbsoluteURI -> Maybe Text -> RoomEvent -> Webhook
+ HipBot: [_accessTokenAccessToken] :: AccessToken -> Text
+ HipBot: [_accessTokenExpires] :: AccessToken -> UTCTime
+ HipBot: [_addOnCapabilities] :: AddOn -> Maybe Capabilities
+ HipBot: [_addOnDescription] :: AddOn -> Text
+ HipBot: [_addOnKey] :: AddOn -> Text
+ HipBot: [_addOnLinks] :: AddOn -> Links
+ HipBot: [_addOnName] :: AddOn -> Text
+ HipBot: [_addOnVendor] :: AddOn -> Maybe Vendor
+ HipBot: [_apiFromName] :: APIConsumer -> Maybe Text
+ HipBot: [_apiScopes] :: APIConsumer -> [APIScope]
+ HipBot: [_capabilitiesConfigurable] :: Capabilities -> Maybe Configurable
+ HipBot: [_capabilitiesHipchatApiConsumer] :: Capabilities -> Maybe APIConsumer
+ HipBot: [_capabilitiesInstallable] :: Capabilities -> Maybe Installable
+ HipBot: [_capabilitiesOauth2Provider] :: Capabilities -> Maybe OAuth2Provider
+ HipBot: [_capabilitiesWebhooks] :: Capabilities -> [Webhook]
+ HipBot: [_configurableUrl] :: Configurable -> AbsoluteURI
+ HipBot: [_installableAllowGlobal] :: Installable -> Bool
+ HipBot: [_installableAllowRoom] :: Installable -> Bool
+ HipBot: [_installableCallbackUrl] :: Installable -> Maybe AbsoluteURI
+ HipBot: [_linksHomepage] :: Links -> Maybe AbsoluteURI
+ HipBot: [_linksSelf] :: Links -> AbsoluteURI
+ HipBot: [_oAuth2ProviderAuthorizationUrl] :: OAuth2Provider -> AbsoluteURI
+ HipBot: [_oAuth2ProviderTokenUrl] :: OAuth2Provider -> AbsoluteURI
+ HipBot: [_registrationCapabilitiesUrl] :: Registration -> AbsoluteURI
+ HipBot: [_registrationGroupId] :: Registration -> Int
+ HipBot: [_registrationOauthId] :: Registration -> OAuthId
+ HipBot: [_registrationOauthSecret] :: Registration -> Text
+ HipBot: [_registrationRoomId] :: Registration -> Maybe RoomId
+ HipBot: [_vendorName] :: Vendor -> Text
+ HipBot: [_vendorUrl] :: Vendor -> AbsoluteURI
+ HipBot: [_webhookEvent] :: Webhook -> RoomEvent
+ HipBot: [_webhookPattern] :: Webhook -> Maybe Text
+ HipBot: [_webhookUrl] :: Webhook -> AbsoluteURI
+ HipBot: [apiDeleteRegistration] :: HipBotAPI m -> OAuthId -> m ()
+ HipBot: [apiInsertRegistration] :: HipBotAPI m -> Registration -> AccessToken -> m ()
+ HipBot: [apiLookupRegistration] :: HipBotAPI m -> OAuthId -> m (Maybe (Registration, AccessToken))
+ HipBot: [apiUpdateAccessToken] :: HipBotAPI m -> OAuthId -> AccessToken -> m ()
+ HipBot: defaultAddOn :: Text -> Text -> Text -> Links -> AddOn
+ HipBot.API: [HipBotAPI] :: (Registration -> AccessToken -> m ()) -> (OAuthId -> m ()) -> (OAuthId -> m (Maybe (Registration, AccessToken))) -> (OAuthId -> AccessToken -> m ()) -> HipBotAPI m
+ HipBot.API: [apiDeleteRegistration] :: HipBotAPI m -> OAuthId -> m ()
+ HipBot.API: [apiInsertRegistration] :: HipBotAPI m -> Registration -> AccessToken -> m ()
+ HipBot.API: [apiLookupRegistration] :: HipBotAPI m -> OAuthId -> m (Maybe (Registration, AccessToken))
+ HipBot.API: [apiUpdateAccessToken] :: HipBotAPI m -> OAuthId -> AccessToken -> m ()
- HipBot: newHipBot :: HipBotAPI m -> AddOn -> IO (HipBot m)
+ HipBot: newHipBot :: HipBotAPI m -> AddOn -> OnUninstall m -> IO (HipBot m)

Files

hipbot.cabal view
@@ -1,5 +1,5 @@ name:               hipbot-version:            0.2+version:            0.2.1 license:            BSD3 license-file:       LICENSE author:             Richard Wallace <rwallace@atlassian.com>
pg.sql view
@@ -5,5 +5,5 @@   groupId                  integer NOT NULL,   oauthSecret              char(40) NOT NULL,   accessToken              char(40) NOT NULL,-  accessTokenExpires       timestamp NOT NULL+  accessTokenExpires       timestamptz NOT NULL );
src/HipBot.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}@@ -108,13 +109,6 @@     oid   fetch (reg, tok) = do     now <- liftIO getCurrentTime-    -- TODO get rid of this once confident the check is correct-    liftIO $ print $ mconcat-      [ "OAuthToken: expires="-      , show $ tok ^. expires-      , ", now="-      , show now-      ]     if addUTCTime 300 now < tok ^. expires       then right (reg, tok)       else updatedToken bot reg <&> (reg,)
src/HipBot/API.hs view
@@ -6,7 +6,6 @@  module HipBot.API   ( HipBotAPI(..)-  , HasHipBotAPI(hipBotAPI)   , stmAPI   , pgAPI   ) where@@ -32,8 +31,6 @@   , apiLookupRegistration :: OAuthId -> m (Maybe (Registration, AccessToken))   , apiUpdateAccessToken :: OAuthId -> AccessToken -> m ()   }--makeClassy ''HipBotAPI  stmAPI :: MonadIO m => IO (HipBotAPI m) stmAPI = do
src/HipBot/Internal/HipBot.hs view
@@ -14,22 +14,25 @@ import HipBot.API import HipBot.Internal.Types +type OnUninstall m = OAuthId -> m ()+ data HipBot m = HipBot-  { botAPI :: HipBotAPI m-  , botAddOn :: AddOn-  , botManager :: HTTP.Manager+  { _hipBotHipBotAPI :: HipBotAPI m+  , _hipBotAddOn :: AddOn+  , _hipBotOnUninstall :: OnUninstall m+  , _hipBotManager :: HTTP.Manager   } -makeClassy ''HipBot+makeFields ''HipBot -instance HasHipBotAPI (HipBot m) m where-  hipBotAPI = hipBot . api where-    api f (HipBot a b c) = fmap (\ a' -> HipBot a' b c) (f a)+newHipBot :: HipBotAPI m -> AddOn -> OnUninstall m -> IO (HipBot m)+newHipBot api addon uninstall = HipBot api addon uninstall+  <$> HTTP.newManager tlsManagerSettings -newHipBot :: HipBotAPI m -> AddOn -> IO (HipBot m)-newHipBot api addon = HipBot api addon <$> HTTP.newManager tlsManagerSettings+newHipBot' :: Monad m => HipBotAPI m -> AddOn -> IO (HipBot m)+newHipBot' api addon = newHipBot api addon (const $ return ())  wreqDefaults :: HipBot m -> Wreq.Options wreqDefaults bot = Wreq.defaults-  & Wreq.manager .~ Right (botManager bot)+  & Wreq.manager .~ Right (bot ^. manager) 
src/HipBot/Internal/OAuth.hs view
@@ -125,7 +125,7 @@     [ "grant_type" .= A.String "client_credentials"     , "scope" .= unwords (show <$> capScopes)     ]-  capScopes = botAddOn bot ^. capabilities . folded . hipchatApiConsumer . folded . scopes+  capScopes = bot ^. addOn . capabilities . folded . hipchatApiConsumer . folded . scopes   handleErr =     handle (return . Left . FetchAccessTokenError reg turl) .     handle (return . Left . ParseAccessTokenError reg turl)@@ -141,20 +141,11 @@     <*> o .: "expires_in"  resolveExpiresIn :: HCAccessToken -> IO AccessToken-resolveExpiresIn t = do-  now <- getCurrentTime+resolveExpiresIn t =   let     diff = realToFrac . _hcExpiresIn $ t-    expiring = addUTCTime diff now-  -- TODO get rid of this once confident the timing is right-  print $ mconcat-    [ "OAuthToken: expires_in="-    , show (_hcExpiresIn t)-    , ", now="-    , show now-    , ", expiring="-    , show expiring-    ]-  return $ AccessToken (_hcAccessToken t) expiring+    expiring = addUTCTime diff+  in+    AccessToken (_hcAccessToken t) . expiring <$> getCurrentTime  
src/HipBot/Internal/Resources.hs view
@@ -32,7 +32,7 @@   => HipBot m   -> Dispatcher (WaiResource m) hipBotResources bot = mconcat-  [ root ==> resourceWithJson' (botAddOn bot)+  [ root ==> resourceWithJson' (bot ^. addOn)   , "installations" ==> installationsResource bot   , "installations" </> param ==> installationResource bot   ]@@ -68,7 +68,10 @@   -> WaiResource m installationResource bot oid = resource   { allowedMethods = return [methodDelete]-  , deleteResource = (True <$) . lift . lift . apiDeleteRegistration (bot ^. hipBotAPI) $ oid+  , deleteResource = lift . lift $ do+      bot ^. onUninstall . to ($ oid)+      apiDeleteRegistration (bot ^. hipBotAPI) oid+      return True   }  configResource
src/HipBot/Internal/Types.hs view
@@ -54,7 +54,7 @@  instance IsString AbsoluteURI where   fromString s =-    fromMaybe (error $ "Not an absolute URI: " ++ s) (parseAbsoluteURI s)+    fromMaybe (error $ "Not an absolute URI: " <> s) (parseAbsoluteURI s)  instance A.ToJSON AbsoluteURI where   toJSON = A.toJSON . show@@ -72,13 +72,13 @@   , _addOnVendor :: Maybe Vendor   } deriving (Show, Eq) -addOn+defaultAddOn   :: Text -- ^ key   -> Text -- ^ name   -> Text -- ^ description   -> Links   -> AddOn-addOn k n d ls = AddOn k n d ls Nothing Nothing+defaultAddOn k n d ls = AddOn k n d ls Nothing Nothing  data Links = Links   { _linksSelf :: AbsoluteURI@@ -189,7 +189,7 @@     "send_notification" -> return SendNotification     "view_group" -> return ViewGroup     "view_messages" -> return ViewMessages-    s -> fail $ "unexpected API scope " ++ T.unpack s+    s -> fail $ "unexpected API scope " <> T.unpack s  data Webhook = Webhook   { _webhookUrl :: AbsoluteURI@@ -220,7 +220,7 @@     "room_exit" -> return RoomExit     "room_enter" -> return RoomEnter     "room_topic_change" -> return RoomTopicChange-    s -> fail $ "unexpected room event" ++ T.unpack s+    s -> fail $ "unexpected room event" <> T.unpack s  data Configurable = Configurable   { _configurableUrl :: AbsoluteURI