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] |