content: -- | Logging an IRC channel..
  module Lambdabot.Plugin.Social.Activity (activityPlugin) where
  
  import Lambdabot.Monad
  import Lambdabot.Plugin
  import Lambdabot.Util
  
  import Control.Arrow ((&&&))
  import Control.Exception (evaluate)
  import Data.List
  import Data.Maybe
  import Data.Time
  
  type ActivityState = [(UTCTime,Nick)]
  type Activity       = ModuleT ActivityState LB
  
  activityPlugin :: Module [(UTCTime, Nick)]
  activityPlugin = newModule
      { moduleDefState = return []
      , moduleInit = registerOutputFilter activityFilter
  
      , moduleCmds = return
          [ (command "activity")
              { help = say helpStr
              , process = activity False
              }
          , (command "activity-full")
              { help = say helpStr
              , privileged = True
              , process = activity True
              }
          ]
      }
  
  helpStr :: String
  helpStr = "activity seconds. Find out where/how much the bot is being used"
  
  activity :: Bool -> String -> Cmd Activity ()
  activity full args = do
      let obscure nm
              | full || isPrefixOf "#" (nName nm) = return nm
              | otherwise = readNick "private"
  
      now <- io getCurrentTime
      let cutoff = addUTCTime (- fromInteger (fromMaybe 90 $ readM args)) now
      users <- mapM (obscure . snd) . takeWhile ((> cutoff) . fst) =<< readMS
      let agg_users = reverse . sort . map (length &&& head) . group . sort $ users
      fmt_agg <- fmap (intercalate " " . (:) (show (length users) ++ "*total"))
                      (mapM (\(n,u) -> do u' <- showNick u; return (show n ++ "*" ++ u')) $ agg_users)
  
      say fmt_agg
  
  activityFilter :: Nick -> [String] -> Activity [String]
  activityFilter target lns = do
      io $ evaluate $ foldr seq () $ map (foldr seq ()) $ lns
      withMS $ \ st wr -> do
          now <- io getCurrentTime
          wr (map (const (now,target)) lns ++ st)
      return lns
  