gameServer/EngineInteraction.hs
changeset 11855 ad435d95ca4b
parent 11586 2963c85c6de4
child 12113 72f5d670bbee
equal deleted inserted replaced
11854:0b8f2116aa26 11855:ad435d95ca4b
    61         finalise = right BL.fromChunks
    61         finalise = right BL.fromChunks
    62 {- end snippet  -}
    62 {- end snippet  -}
    63 #endif
    63 #endif
    64 
    64 
    65 toEngineMsg :: B.ByteString -> B.ByteString
    65 toEngineMsg :: B.ByteString -> B.ByteString
    66 toEngineMsg msg = B.pack $ Base64.encode (fromIntegral (BW.length msg) : BW.unpack msg)
    66 toEngineMsg msg = Base64.encode (fromIntegral (BW.length msg) `BW.cons` msg)
    67 
    67 
    68 
    68 
    69 {-fromEngineMsg :: B.ByteString -> Maybe B.ByteString
    69 {-fromEngineMsg :: B.ByteString -> Maybe B.ByteString
    70 fromEngineMsg msg = liftM BW.pack (Base64.decode (B.unpack msg) >>= removeLength)
    70 fromEngineMsg msg = liftM BW.pack (Base64.decode (B.unpack msg) >>= removeLength)
    71     where
    71     where
    83 
    83 
    84 
    84 
    85 checkNetCmd :: [Word8] -> B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
    85 checkNetCmd :: [Word8] -> B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
    86 checkNetCmd teamsIndexes msg = check decoded
    86 checkNetCmd teamsIndexes msg = check decoded
    87     where
    87     where
    88         decoded = liftM (splitMessages . BW.pack) $ Base64.decode $ B.unpack msg
    88         decoded = liftM splitMessages $ Base64.decode msg
    89         check Nothing = (B.empty, B.empty, Nothing)
    89         check (Left _) = (B.empty, B.empty, Nothing)
    90         check (Just msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a)
    90         check (Right msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a)
    91         encode = B.pack . Base64.encode . BW.unpack . B.concat
    91         encode = Base64.encode . B.concat
    92         isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m) && not (isMalformed (B.head m) (B.tail m))
    92         isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m) && not (isMalformed (B.head m) (B.tail m))
    93         lft = foldr l Nothing
    93         lft = foldr l Nothing
    94         l m n = let m' = B.head $ B.tail m; tst = flip Set.member in
    94         l m n = let m' = B.head $ B.tail m; tst = flip Set.member in
    95                       if not $ tst timedMessages m' then n
    95                       if not $ tst timedMessages m' then n
    96                         else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m
    96                         else if '+' /= m' then Just Nothing else Just . Just . Base64.encode $ m
    97         isNonEmpty = (/=) '+' . B.head . B.tail
    97         isNonEmpty = (/=) '+' . B.head . B.tail
    98         legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345" ++ slotMessages
    98         legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345" ++ slotMessages
    99         slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
    99         slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
   100         timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
   100         timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
   101         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
   101         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