packages feed

hcheckers-0.1.0.0: src/Core/Checkers.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Core.Checkers where

import Control.Monad (when)
import Control.Concurrent
import qualified Control.Monad.Metrics as Metrics
import Data.Maybe
import qualified Data.Text.Encoding as TE
import System.Log.Heavy
import qualified System.Metrics as EKG
import qualified System.Remote.Monitoring as EKG
import Lens.Micro ((^.))

import Core.Types
import Core.CmdLine
import Core.Config
import Core.Supervisor

isGameMessage :: LogMessage -> Bool
isGameMessage msg = 
  isJust $ gameIdFromLogMsg msg

withCheckers :: CmdLine -> Checkers a -> IO a
withCheckers cmd actions = do
  supervisor <- mkSupervisor
  cfg <- loadConfig cmd
  print cfg
  logChan <- newChan
  metrics <- Metrics.initialize
  when (gcEnableMetrics cfg) $ do
    let store = metrics ^. Metrics.metricsStore
    EKG.registerGcMetrics store
    EKG.forkServerWith store (TE.encodeUtf8 $ gcHost cfg) (gcMetricsPort cfg)
    return ()
  let file = (defFileSettings (gcLogFile cfg)) {
                lsFormat = "{time} [{level}] {source} [{game}|{thread}]: {message}\n"
             }
      game = Filtering isGameMessage $ ChanLoggerSettings logChan
      logSettings = ParallelLogSettings [LoggingSettings game, LoggingSettings file]
  withLoggingB logSettings $ \backend -> do
    let logger = makeLogger backend
        logging = LoggingTState logger (AnyLogBackend backend) []
        cs = CheckersState logging supervisor metrics cfg
        actions' = do
          forkCheckers $ logRouter supervisor logChan
          actions
    res <- runCheckersT actions' cs
    case res of
      Right result -> return result
      Left err -> fail $ show err