2012-07-31 05:11:32 +00:00
|
|
|
{- git-annex assistant webapp notifications
|
|
|
|
-
|
|
|
|
- Copyright 2012 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
2012-09-24 18:48:47 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2012-07-31 05:11:32 +00:00
|
|
|
-}
|
|
|
|
|
2012-11-18 17:03:00 +00:00
|
|
|
{-# LANGUAGE CPP, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
|
2012-07-31 05:11:32 +00:00
|
|
|
|
2013-02-27 06:39:22 +00:00
|
|
|
#if defined VERSION_yesod_default
|
|
|
|
#if ! MIN_VERSION_yesod_default(1,1,0)
|
|
|
|
#define WITH_OLD_YESOD
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2012-07-31 05:11:32 +00:00
|
|
|
module Assistant.WebApp.Notifications where
|
|
|
|
|
|
|
|
import Assistant.Common
|
|
|
|
import Assistant.WebApp
|
2012-09-02 04:27:48 +00:00
|
|
|
import Assistant.WebApp.Types
|
2012-11-03 01:13:06 +00:00
|
|
|
import Assistant.DaemonStatus
|
|
|
|
import Assistant.Types.Buddies
|
2012-07-31 05:11:32 +00:00
|
|
|
import Utility.NotificationBroadcaster
|
|
|
|
import Utility.Yesod
|
|
|
|
|
|
|
|
import Yesod
|
|
|
|
import Data.Text (Text)
|
|
|
|
import qualified Data.Text as T
|
2012-11-18 17:04:35 +00:00
|
|
|
#ifndef WITH_OLD_YESOD
|
2012-11-18 17:00:35 +00:00
|
|
|
import qualified Data.Aeson.Types as Aeson
|
2012-11-18 17:04:35 +00:00
|
|
|
#endif
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
{- Add to any widget to make it auto-update using long polling.
|
|
|
|
-
|
|
|
|
- The widget should have a html element with an id=ident, which will be
|
|
|
|
- replaced when it's updated.
|
|
|
|
-
|
|
|
|
- The geturl route should return the notifier url to use for polling.
|
|
|
|
-
|
|
|
|
- ms_delay is how long to delay between AJAX updates
|
|
|
|
- ms_startdelay is how long to delay before updating with AJAX at the start
|
|
|
|
-}
|
|
|
|
autoUpdate :: Text -> Route WebApp -> Int -> Int -> Widget
|
2012-11-18 17:00:35 +00:00
|
|
|
autoUpdate tident geturl ms_delay ms_startdelay = do
|
|
|
|
#ifdef WITH_OLD_YESOD
|
|
|
|
let delay = show ms_delay
|
|
|
|
let startdelay = show ms_startdelay
|
2013-01-14 22:35:33 +00:00
|
|
|
let ident = "'" ++ T.unpack tident ++ "'"
|
2012-11-18 17:00:35 +00:00
|
|
|
#else
|
|
|
|
let delay = Aeson.String (T.pack (show ms_delay))
|
|
|
|
let startdelay = Aeson.String (T.pack (show ms_startdelay))
|
|
|
|
let ident = Aeson.String tident
|
|
|
|
#endif
|
2012-07-31 05:11:32 +00:00
|
|
|
addScript $ StaticR longpolling_js
|
2012-07-31 05:24:49 +00:00
|
|
|
$(widgetFile "notifications/longpolling")
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
{- Notifier urls are requested by the javascript, to avoid allocation
|
|
|
|
- of NotificationIds when noscript pages are loaded. This constructs a
|
|
|
|
- notifier url for a given Route and NotificationBroadcaster.
|
|
|
|
-}
|
2012-11-03 01:13:06 +00:00
|
|
|
notifierUrl :: (NotificationId -> Route WebApp) -> Assistant NotificationBroadcaster -> Handler RepPlain
|
|
|
|
notifierUrl route broadcaster = do
|
|
|
|
(urlbits, _params) <- renderRoute . route <$> newNotifier broadcaster
|
2012-07-31 05:11:32 +00:00
|
|
|
webapp <- getYesod
|
|
|
|
return $ RepPlain $ toContent $ T.concat
|
|
|
|
[ "/"
|
|
|
|
, T.intercalate "/" urlbits
|
|
|
|
, "?auth="
|
|
|
|
, secretToken webapp
|
|
|
|
]
|
|
|
|
|
|
|
|
getNotifierTransfersR :: Handler RepPlain
|
2012-11-03 01:13:06 +00:00
|
|
|
getNotifierTransfersR = notifierUrl TransfersR getTransferBroadcaster
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
getNotifierSideBarR :: Handler RepPlain
|
2012-11-03 01:13:06 +00:00
|
|
|
getNotifierSideBarR = notifierUrl SideBarR getAlertBroadcaster
|
|
|
|
|
|
|
|
getNotifierBuddyListR :: Handler RepPlain
|
|
|
|
getNotifierBuddyListR = notifierUrl BuddyListR getBuddyListBroadcaster
|
|
|
|
|
2012-11-13 21:50:54 +00:00
|
|
|
getNotifierRepoListR :: RepoSelector -> Handler RepPlain
|
|
|
|
getNotifierRepoListR reposelector = notifierUrl route getRepoListBroadcaster
|
|
|
|
where
|
|
|
|
route nid = RepoListR $ RepoListNotificationId nid reposelector
|
|
|
|
|
2012-11-03 01:13:06 +00:00
|
|
|
getTransferBroadcaster :: Assistant NotificationBroadcaster
|
|
|
|
getTransferBroadcaster = transferNotifier <$> getDaemonStatus
|
|
|
|
|
|
|
|
getAlertBroadcaster :: Assistant NotificationBroadcaster
|
|
|
|
getAlertBroadcaster = alertNotifier <$> getDaemonStatus
|
|
|
|
|
|
|
|
getBuddyListBroadcaster :: Assistant NotificationBroadcaster
|
|
|
|
getBuddyListBroadcaster = getBuddyBroadcaster <$> getAssistant buddyList
|
2012-11-13 21:50:54 +00:00
|
|
|
|
|
|
|
getRepoListBroadcaster :: Assistant NotificationBroadcaster
|
|
|
|
getRepoListBroadcaster = syncRemotesNotifier <$> getDaemonStatus
|