1
{-# LANGUAGE OverloadedStrings #-}
6
import qualified Data.Map as Map
7
import qualified Data.Set as Set
8
import qualified Data.Char as Char
12
import qualified Data.List as List
14
import qualified Codec.Binary.Base64 as Base64
15
import qualified Data.ByteString.Lazy as BL
16
import qualified Text.Show.ByteString as BS
17
import qualified Data.ByteString.Char8 as B
18
import qualified Data.ByteString.UTF8 as UTF8
19
import qualified Data.ByteString as BW
20
-------------------------------------------------
24
sockAddr2String :: SockAddr -> IO B.ByteString
25
sockAddr2String (SockAddrInet _ hostAddr) = liftM B.pack $ inet_ntoa hostAddr
26
sockAddr2String (SockAddrInet6 _ _ (a, b, c, d) _) =
27
return $ B.pack $ (foldr1 (.)
28
$ List.intersperse (':':)
29
$ concatMap (\n -> (\(a0, a1) -> [showHex a0, showHex a1]) $ divMod n 65536) [a, b, c, d]) []
31
maybeRead :: Read a => String -> Maybe a
32
maybeRead s = case reads s of
33
[(x, rest)] | all isSpace rest -> Just x
36
teamToNet :: TeamInfo -> [B.ByteString]
45
: (showB . difficulty $ team)
48
hhsInfo = concatMap (\(HedgehogInfo n hat) -> [n, hat]) $ hedgehogs team
50
modifyTeam :: TeamInfo -> RoomInfo -> RoomInfo
51
modifyTeam team room = room{teams = replaceTeam team $ teams room}
53
replaceTeam _ [] = error "modifyTeam: no such team"
54
replaceTeam tm (t:ts) =
55
if teamname tm == teamname t then
60
illegalName :: B.ByteString -> Bool
61
illegalName s = B.null s || B.all isSpace s || isSpace (B.head s) || isSpace (B.last s) || B.any isIllegalChar s
63
isIllegalChar c = c `List.elem` "$()*+?[]^{|}"
65
protoNumber2ver :: Word16 -> B.ByteString
66
protoNumber2ver v = Map.findWithDefault "Unknown" v vermap
68
vermap = Map.fromList [
95
askFromConsole :: B.ByteString -> IO B.ByteString
96
askFromConsole msg = do
102
unfoldrE :: (b -> Either b (a, b)) -> b -> ([a], b)
105
Right (a, new_b) -> let (a', b') = unfoldrE f new_b in (a : a', b')
106
Left new_b -> ([], new_b)
108
showB :: (BS.Show a) => a -> B.ByteString
109
showB = B.concat . BL.toChunks . BS.show
111
readInt_ :: (Num a) => B.ByteString -> a
113
case B.readInt str of
114
Just (i, t) | B.null t -> fromIntegral i
117
cutHost :: B.ByteString -> B.ByteString
118
cutHost = B.intercalate "." . flip (++) ["*","*"] . List.take 2 . B.split '.'
120
caseInsensitiveCompare :: B.ByteString -> B.ByteString -> Bool
121
caseInsensitiveCompare a b = f a == f b
123
f = map Char.toUpper . UTF8.toString