gameServer/EngineInteraction.hs
changeset 11556 af9aa8d5863c
parent 11547 2bbbe9cb2980
child 11577 bee3a2f8e117
equal deleted inserted replaced
11555:b96080df19d0 11556:af9aa8d5863c
    76 
    76 
    77 splitMessages :: B.ByteString -> [B.ByteString]
    77 splitMessages :: B.ByteString -> [B.ByteString]
    78 splitMessages = L.unfoldr (\b -> if B.null b then Nothing else Just $ B.splitAt (1 + fromIntegral (BW.head b)) b)
    78 splitMessages = L.unfoldr (\b -> if B.null b then Nothing else Just $ B.splitAt (1 + fromIntegral (BW.head b)) b)
    79 
    79 
    80 
    80 
    81 checkNetCmd :: B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
    81 checkNetCmd :: [Word8] -> B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
    82 checkNetCmd msg = check decoded
    82 checkNetCmd teamsIndexes msg = check decoded
    83     where
    83     where
    84         decoded = liftM (splitMessages . BW.pack) $ Base64.decode $ B.unpack msg
    84         decoded = liftM (splitMessages . BW.pack) $ Base64.decode $ B.unpack msg
    85         check Nothing = (B.empty, B.empty, Nothing)
    85         check Nothing = (B.empty, B.empty, Nothing)
    86         check (Just msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a)
    86         check (Just msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a)
    87         encode = B.pack . Base64.encode . BW.unpack . B.concat
    87         encode = B.pack . Base64.encode . BW.unpack . B.concat
    88         isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m)
    88         isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m) && not (isMalformed (B.head m) (B.tail m))
    89         lft = foldr l Nothing
    89         lft = foldr l Nothing
    90         l m n = let m' = B.head $ B.tail m; tst = flip Set.member in
    90         l m n = let m' = B.head $ B.tail m; tst = flip Set.member in
    91                       if not $ tst timedMessages m' then n
    91                       if not $ tst timedMessages m' then n
    92                         else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m
    92                         else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m
    93         isNonEmpty = (/=) '+' . B.head . B.tail
    93         isNonEmpty = (/=) '+' . B.head . B.tail
    94         legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sNpPwtgfhbc12345" ++ slotMessages
    94         legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sNpPwtgfhbc12345" ++ slotMessages
    95         slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
    95         slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
    96         timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
    96         timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
       
    97         isMalformed 'h' m | B.length m >= 3 = let hognum = m `B.index` 1; teamnum = m `BW.index` 2 in hognum < '1' || hognum > '8' || teamnum `L.notElem` teamsIndexes
       
    98                           | otherwise = True
       
    99         isMalformed _ _ = False
    97 
   100 
    98 #if defined(OFFICIAL_SERVER)
   101 #if defined(OFFICIAL_SERVER)
    99 replayToDemo :: [TeamInfo]
   102 replayToDemo :: [TeamInfo]
   100         -> Map.Map B.ByteString B.ByteString
   103         -> Map.Map B.ByteString B.ByteString
   101         -> Map.Map B.ByteString [B.ByteString]
   104         -> Map.Map B.ByteString [B.ByteString]