From d40815fd56bf1895af89b72b1171675a2e0ae5f7 Mon Sep 17 00:00:00 2001 From: tv Date: Wed, 23 Jan 2019 00:02:42 +0100 Subject: src: use more simple functions --- src/Reaktor/Nick.hs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/Reaktor/Nick.hs (limited to 'src/Reaktor/Nick.hs') diff --git a/src/Reaktor/Nick.hs b/src/Reaktor/Nick.hs new file mode 100644 index 0000000..591ea4b --- /dev/null +++ b/src/Reaktor/Nick.hs @@ -0,0 +1,44 @@ +module Reaktor.Nick where + +import Data.ByteString.Char8.Extended (ByteString) +import qualified Data.ByteString.Char8.Extended as BS +import Data.Char (chr) +import Data.Char (isDigit) +import System.Random (getStdRandom, randomR) + + +getNext :: ByteString -> ByteString +getNext nick_ = nick' + where + splitNick s = + (prefix, maybe 0 fst (BS.readInt suffix)) + where + prefix = BS.take (BS.length s - BS.length suffix) s + suffix = BS.reverse . BS.takeWhile isDigit . BS.reverse $ s + (nickPrefix, nickSuffix) = splitNick nick_ + nick' = nickPrefix <> (BS.pack . show $ nickSuffix + 1) + + +getRandom :: IO ByteString +getRandom = do + h_chr <- getRandomChar nickhead + t_len <- getStdRandom (randomR (4,8)) :: IO Int + t_str <- mapM (const $ getRandomChar nicktail) [1..t_len] + return $ BS.pack (h_chr:t_str) + where + getRandomChar cs = (cs!!) <$> getStdRandom (randomR (0, length cs - 1)) + + -- RFC2812 (doesn't work with charybdis) + --nickhead = letters <> specials + --nicktail = letters <> digits <> specials <> minus + --letters = map chr $ [0x41..0x5A] <> [0x61..0x7A] + --digits = map chr $ [0x30..0x39] + --specials = map chr $ [0x5B..0x60] <> [0x7B..0x7D] + --minus = map chr $ [0x2D] + + -- RFC1459 + nickhead = letters + nicktail = letters <> number <> special + letters = map chr $ [0x41..0x5A] <> [0x61..0x7A] + number = map chr $ [0x30..0x39] + special = map chr $ [0x5B..0x60] <> [0x7B..0x7D] <> [0x2D] -- cgit v1.2.3