# HG changeset patch # User unc0rr # Date 1456431472 -10800 # Node ID db7743e2fad15e5265d5541453b73c149ce08841 # Parent 8fd1808b12ed80b325f8b8719272fbef95abdcaf More work on best time ghost feature diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/Actions.hs --- a/gameServer/Actions.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/Actions.hs Thu Feb 25 23:17:52 2016 +0300 @@ -728,6 +728,26 @@ processAction $ AnswerClients chans ["CHAT", "[random]", i !! n] +processAction (LoadGhost location) = do + points <- io $ loadFile (B.unpack $ "ghosts/" `B.append` sanitizeName location) + ri <- clientRoomA + rnc <- gets roomsClients + thisRoomChans <- liftM (map sendChan) $ roomClientsS ri + -- inject ghost points into map + rm <- io $ room'sM rnc id ri + cl <- client's id + mapM processAction $ map (replaceChans thisRoomChans) $ answerFullConfigParams cl (mapParams rm) (params rm) + return () + where + loadFile :: String -> IO [Int] + loadFile fileName = E.handle (\(e :: SomeException) -> return []) $ do + points <- liftM read $ readFile fileName + return (points `deepseq` points) + replaceChans chans (AnswerClients _ msg) = AnswerClients chans msg + replaceChans _ a = a +{- + let a = map (replaceChans chans) $ answerFullConfigParams cl mp p +-} #if defined(OFFICIAL_SERVER) processAction SaveReplay = do ri <- clientRoomA @@ -846,4 +866,4 @@ forM_ (actions `deepseq` actions) processAction processAction CheckVotes = - checkVotes >>= mapM_ processAction \ No newline at end of file + checkVotes >>= mapM_ processAction diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/CoreTypes.hs Thu Feb 25 23:17:52 2016 +0300 @@ -93,6 +93,7 @@ | CheckFailed B.ByteString | CheckSuccess [B.ByteString] | Random [ClientChan] [B.ByteString] + | LoadGhost B.ByteString | QueryReplay B.ByteString | ShowReplay B.ByteString | Cleanup @@ -237,7 +238,7 @@ roomBansList :: ![B.ByteString], mapParams :: !(Map.Map B.ByteString B.ByteString), params :: !(Map.Map B.ByteString [B.ByteString]), - roomSaves :: !(Map.Map B.ByteString (Map.Map B.ByteString B.ByteString, Map.Map B.ByteString [B.ByteString])) + roomSaves :: !(Map.Map B.ByteString (B.ByteString, Map.Map B.ByteString B.ByteString, Map.Map B.ByteString [B.ByteString])) } newRoom :: RoomInfo diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/HWProtoCore.hs --- a/gameServer/HWProtoCore.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/HWProtoCore.hs Thu Feb 25 23:17:52 2016 +0300 @@ -67,7 +67,7 @@ h "DELEGATE" n | not $ B.null n = handleCmd ["DELEGATE", n] h "SAVEROOM" n | not $ B.null n = handleCmd ["SAVEROOM", n] h "LOADROOM" n | not $ B.null n = handleCmd ["LOADROOM", n] - h "SAVE" n | not $ B.null n = handleCmd ["SAVE", n] + h "SAVE" n | not $ B.null n = let (sn, ln) = B.break (== ' ') n in if B.null ln then return [] else handleCmd ["SAVE", sn, B.tail ln] h "DELETE" n | not $ B.null n = handleCmd ["DELETE", n] h "STATS" _ = handleCmd ["STATS"] h "PART" m | not $ B.null m = handleCmd ["PART", m] diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/HWProtoInRoomState.hs Thu Feb 25 23:17:52 2016 +0300 @@ -492,8 +492,8 @@ return [AnswerClients [sendChan cl] ["CHAT", "[server]", "vote: 'yes' or 'no'"]] -handleCmd_inRoom ["SAVE", stateName] = serverAdminOnly $ do - return [ModifyRoom $ \r -> r{roomSaves = Map.insert stateName (mapParams r, params r) (roomSaves r)}] +handleCmd_inRoom ["SAVE", stateName, location] = serverAdminOnly $ do + return [ModifyRoom $ \r -> r{roomSaves = Map.insert stateName (location, mapParams r, params r) (roomSaves r)}] handleCmd_inRoom ["DELETE", stateName] = serverAdminOnly $ do return [ModifyRoom $ \r -> r{roomSaves = Map.delete stateName (roomSaves r)}] diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/OfficialServer/extdbinterface.hs --- a/gameServer/OfficialServer/extdbinterface.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/OfficialServer/extdbinterface.hs Thu Feb 25 23:17:52 2016 +0300 @@ -140,13 +140,13 @@ ps bs ps ("GHOST_POINTS" : n : bs) = do let pointsNum = readInt_ n - (loc, time) <- get - res <- io $ query dbConn dbQueryBestTime $ Only loc + (location, time) <- get + res <- io $ query dbConn dbQueryBestTime $ Only location let bestTime = case res of [Only a] -> a _ -> maxBound :: Int when (time < bestTime) $ do - -- store it + io $ writeFile (B.unpack $ "ghosts/" `B.append` sanitizeName location) $ show (map readInt_ $ take (2 * pointsNum) bs) return () ps (drop (2 * pointsNum) bs) ps (b:bs) = ps bs diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/Utils.hs --- a/gameServer/Utils.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/Utils.hs Thu Feb 25 23:17:52 2016 +0300 @@ -241,3 +241,8 @@ deleteFirstsBy2 :: (a -> b -> Bool) -> [a] -> [b] -> [a] deleteFirstsBy2 eq = foldl (flip (deleteBy2 (flip eq))) +sanitizeName :: B.ByteString -> B.ByteString +sanitizeName = B.map sc + where + sc c | isAlphaNum c = c + | otherwise = '_' diff -r 8fd1808b12ed -r db7743e2fad1 gameServer/Votes.hs --- a/gameServer/Votes.hs Wed Feb 24 22:37:03 2016 +0300 +++ b/gameServer/Votes.hs Thu Feb 25 23:17:52 2016 +0300 @@ -95,17 +95,14 @@ let rs = Map.lookup roomSave (roomSaves rm) case rs of Nothing -> return [] - Just (mp, p) -> do + Just (location, mp, p) -> do cl <- thisClient chans <- roomClientsChans - let a = map (replaceChans chans) $ answerFullConfigParams cl mp p - return $ - (ModifyRoom $ \r -> r{params = p, mapParams = mp}) - : SendUpdateOnThisRoom - : a - where - replaceChans chans (AnswerClients _ msg) = AnswerClients chans msg - replaceChans _ a = a + return $ + [ModifyRoom $ \r -> r{params = p, mapParams = mp} + , AnswerClients chans ["CHAT", "[server]", location] + , SendUpdateOnThisRoom + , LoadGhost location] act (VotePause) = do rm <- thisRoom chans <- roomClientsChans