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 |