kevin-0.4: Kevin/Chatrooms.hs
module Kevin.Chatrooms (
removeRoom,
addUser,
setUsers,
removeUser,
removeUserAll,
numUsers,
setPrivclasses,
getPrivclass,
getPrivclassLevel,
setUserPrivclass,
setTitle
) where
import Control.Applicative
import Control.Lens
import Data.List
-- import Data.Monoid
import qualified Data.Text as T
import qualified Data.Map as M
import Data.Maybe
import Kevin.Types
deleteBy' :: (a -> Bool) -> [a] -> [a]
deleteBy' f (x:xs) = if f x then xs else x:deleteBy' f xs
deleteBy' _ [] = []
removeRoom :: Chatroom -> KevinIO ()
removeRoom c = kevin $ privclasses.at c .= Nothing >> users.at c .= Nothing
addUser :: Chatroom -> User -> KevinIO ()
addUser ch us = kevin $ users.ix ch %= (us:)
numUsers :: Chatroom -> T.Text -> KevinIO Int
numUsers ch us = do
st <- gets_ $ view users
case st^.at ch of
Just usrs -> return . length $ findIndices (\u -> us == username u) usrs
Nothing -> return 0
removeUser :: Chatroom -> T.Text -> KevinIO ()
removeUser ch us = kevin $ users.ix ch %= deleteBy' ((== us) . username)
removeUserAll :: Chatroom -> T.Text -> KevinIO ()
removeUserAll ch us = kevin $ users.ix ch %= filter ((/= us) . username)
setUsers :: Chatroom -> [User] -> KevinIO ()
setUsers ch uss = kevin $ users.at ch .= Just uss
-- addPrivclass :: Chatroom -> Privclass -> KevinIO ()
-- addPrivclass room (p,i) = kevin $ privclasses.ix room %= (M.singleton p i <>)
setPrivclasses :: Chatroom -> [Privclass] -> KevinIO ()
setPrivclasses room ps = kevin $ privclasses.at room .= Just (M.fromList ps)
getPrivclass :: Chatroom -> T.Text -> KevinIO (Maybe T.Text)
getPrivclass room user = do
st <- gets_ $ view users
case st^.at room of
Just qs -> return $ privclass <$> listToMaybe (filter ((== user) . username) qs)
Nothing -> return Nothing
getPrivclassLevel :: Chatroom -> T.Text -> KevinIO Int
getPrivclassLevel room pc = do
st <- gets_ $ view privclasses
return . fromMaybe 0 $ st^.at room >>= (^.at pc)
setUserPrivclass :: Chatroom -> T.Text -> T.Text -> KevinIO ()
setUserPrivclass room user pc = do
pclevel <- getPrivclassLevel room pc
kevin $ users.ix room.traverse.filtered ((user ==) . username) %= (\u -> u {privclass = pc, privclassLevel = pclevel})
setTitle :: Chatroom -> T.Text -> KevinIO ()
setTitle ch t = kevin $ titles.at ch .= Just t