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 |