hask-irc/hask-irc-handlers/Network/IRC/Handlers/NickTracker/Types.hs

54 lines
1.8 KiB
Haskell
Raw Normal View History

2014-05-23 02:45:45 +05:30
{-# LANGUAGE TemplateHaskell #-}
module Network.IRC.Handlers.NickTracker.Types where
import ClassyPrelude
2014-06-01 06:48:24 +05:30
import Control.Concurrent.Lifted (Chan, writeChan)
import Data.Data (Data)
import Data.IxSet (IxSet, Indexable (..), ixSet, ixFun)
import Data.SafeCopy (base, deriveSafeCopy)
2014-05-23 02:45:45 +05:30
2014-06-01 02:11:20 +05:30
import Network.IRC.Types
2014-06-01 23:14:19 +05:30
newtype CanonicalNick = CanonicalNick { canonicalNickToText :: Text }
deriving (Eq, Ord, Show, Data, Typeable)
2014-05-25 01:09:31 +05:30
newtype LastSeenOn = LastSeenOn UTCTime deriving (Eq, Ord, Show, Data, Typeable)
2014-05-23 02:45:45 +05:30
data NickTrack = NickTrack {
2014-05-24 23:49:52 +05:30
nick :: !Nick,
canonicalNick :: !CanonicalNick,
lastSeenOn :: !LastSeenOn,
lastMessageOn :: !UTCTime,
lastMessage :: !Text
2014-05-23 02:45:45 +05:30
} deriving (Eq, Ord, Show, Data, Typeable)
instance Indexable NickTrack where
empty = ixSet [ ixFun $ (: []) . nick
, ixFun $ (: []) . canonicalNick
, ixFun $ (: []) . lastSeenOn ]
2014-05-25 01:09:31 +05:30
newtype NickTracking = NickTracking { nickTracking :: IxSet NickTrack }
deriving (Eq, Ord, Show, Data, Typeable)
2014-05-23 02:45:45 +05:30
$(deriveSafeCopy 0 'base ''CanonicalNick)
$(deriveSafeCopy 0 'base ''LastSeenOn)
$(deriveSafeCopy 0 'base ''NickTrack)
$(deriveSafeCopy 0 'base ''NickTracking)
emptyNickTracking :: NickTracking
emptyNickTracking = NickTracking empty
2014-06-01 06:48:24 +05:30
2014-06-01 23:14:19 +05:30
data NickTrackRequest = NickTrackRequest Nick (MVar (Maybe NickTrack)) deriving (Eq, Typeable)
2014-06-01 06:48:24 +05:30
instance Event NickTrackRequest
instance Show NickTrackRequest where
show (NickTrackRequest nick _) = "NickTrackRequest[" ++ unpack (nickToText nick) ++ "]"
getCanonicalNick :: Chan SomeEvent -> Nick -> IO (Maybe CanonicalNick)
getCanonicalNick eventChan nick = do
2014-06-01 23:14:19 +05:30
reply <- newEmptyMVar
2014-06-01 06:48:24 +05:30
request <- toEvent $ NickTrackRequest nick reply
writeChan eventChan request
map (map canonicalNick) $ takeMVar reply