gameServer/OfficialServer/GameReplayStore.hs
changeset 8479 8d71109b04d2
parent 8423 8aa450f6cf2c
child 8482 5656a73fe3c3
equal deleted inserted replaced
8478:d12531f09d59 8479:8d71109b04d2
     7 import Data.Sequence()
     7 import Data.Sequence()
     8 import System.Log.Logger
     8 import System.Log.Logger
     9 import Data.Maybe
     9 import Data.Maybe
    10 import Data.Unique
    10 import Data.Unique
    11 import Control.Monad
    11 import Control.Monad
       
    12 import Data.List
    12 ---------------
    13 ---------------
    13 import CoreTypes
    14 import CoreTypes
       
    15 import EngineInteraction
    14 
    16 
    15 
    17 
    16 saveReplay :: RoomInfo -> IO ()
    18 saveReplay :: RoomInfo -> IO ()
    17 saveReplay r = do
    19 saveReplay r = do
    18     let gi = fromJust $ gameInfo r
    20     let gi = fromJust $ gameInfo r
    19     when (allPlayersHaveRegisteredAccounts gi) $ do
    21     when (allPlayersHaveRegisteredAccounts gi) $ do
    20         time <- getCurrentTime
    22         time <- getCurrentTime
    21         u <- liftM hashUnique newUnique
    23         u <- liftM hashUnique newUnique
    22         let fileName = "replays/" ++ show time ++ "-" ++ show u
    24         let fileName = "replays/" ++ show time ++ "-" ++ show u ++ "." ++ show (roomProto r)
    23         let replayInfo = (teamsAtStart gi, Map.toList $ mapParams r, Map.toList $ params r, roundMsgs gi)
    25         let replayInfo = (teamsAtStart gi, Map.toList $ mapParams r, Map.toList $ params r, roundMsgs gi)
    24         E.catch
    26         E.catch
    25             (writeFile fileName (show replayInfo))
    27             (writeFile fileName (show replayInfo))
    26             (\(e :: IOException) -> warningM "REPLAYS" $ "Couldn't write to " ++ fileName ++ ": " ++ show e)
    28             (\(e :: IOException) -> warningM "REPLAYS" $ "Couldn't write to " ++ fileName ++ ": " ++ show e)
       
    29 
       
    30 
       
    31 loadReplay :: Int -> IO [B.ByteString]
       
    32 loadReplay p = E.handle (\(e :: SomeException) -> warningM "REPLAYS" $ "Problems reading replay") $ do
       
    33     files <- liftM (isSuffixOf ('.' : show p)) getDirectoryContents
       
    34     if (not $ null files) then
       
    35         loadFile $ head files
       
    36         else
       
    37         return []
       
    38     where
       
    39         loadFile fileName = E.handle (\(e :: SomeException) -> warningM "REPLAYS" $ "Problems reading " ++ fileName) $ do
       
    40             (teams, params1, params2, roundMsgs) <- liftM read $ readFile fileName
       
    41             return $ replayToDemo teams (Map.fromList params1) (Map.fromList params2) roundMsgs