Add disconnect function
Also fix parsing for ping-events.
This commit is contained in:
parent
3203ecb591
commit
615e74583e
1 changed files with 17 additions and 12 deletions
|
|
@ -12,6 +12,7 @@ module EuphApi.Threads (
|
||||||
, euphApp
|
, euphApp
|
||||||
, getEvent
|
, getEvent
|
||||||
-- * API functions
|
-- * API functions
|
||||||
|
, disconnect
|
||||||
, pingReply
|
, pingReply
|
||||||
, nick
|
, nick
|
||||||
, send
|
, send
|
||||||
|
|
@ -244,27 +245,30 @@ recvThread euphCon@(Connection locked qSend qEvent) qRecv con = do
|
||||||
- API functions
|
- API functions
|
||||||
-}
|
-}
|
||||||
|
|
||||||
sendPacket :: (ToJSON p, FromJSON r) => Connection -> T.Text -> p -> IO r
|
writeSend :: Connection -> Send -> STM ()
|
||||||
sendPacket (Connection locked qSend _) packetType packetData = do
|
writeSend (Connection locked qSend _) s = do
|
||||||
var <- newEmptyMVar
|
|
||||||
let packet = SReply packetType packetData (ReplyMVar var)
|
|
||||||
atomically $ do
|
|
||||||
isLocked <- readTVar locked
|
isLocked <- readTVar locked
|
||||||
if isLocked
|
if isLocked
|
||||||
then throwSTM EuphClosed
|
then throwSTM EuphClosed
|
||||||
else writeTBQueue qSend packet
|
else writeTBQueue qSend s
|
||||||
|
|
||||||
|
sendPacket :: (ToJSON p, FromJSON r) => Connection -> T.Text -> p -> IO r
|
||||||
|
sendPacket euphCon packetType packetData = do
|
||||||
|
var <- newEmptyMVar
|
||||||
|
let packet = SReply packetType packetData (ReplyMVar var)
|
||||||
|
atomically $ writeSend euphCon packet
|
||||||
result <- readMVar var
|
result <- readMVar var
|
||||||
case result of
|
case result of
|
||||||
Left f -> throw f
|
Left f -> throw f
|
||||||
Right r -> return r
|
Right r -> return r
|
||||||
|
|
||||||
sendPacketNoReply :: (ToJSON p) => Connection -> T.Text -> p -> IO ()
|
sendPacketNoReply :: (ToJSON p) => Connection -> T.Text -> p -> IO ()
|
||||||
sendPacketNoReply (Connection locked qSend _) packetType packetData = atomically $ do
|
sendPacketNoReply euphCon packetType packetData = do
|
||||||
let packet = SNoReply packetType packetData
|
let packet = SNoReply packetType packetData
|
||||||
isLocked <- readTVar locked
|
atomically $ writeSend euphCon packet
|
||||||
if isLocked
|
|
||||||
then throwSTM EuphClosed
|
disconnect :: Connection -> IO ()
|
||||||
else writeTBQueue qSend packet
|
disconnect euphCon = atomically $ writeSend euphCon SDisconnect
|
||||||
|
|
||||||
pingReply :: Connection -> UTCTime -> IO ()
|
pingReply :: Connection -> UTCTime -> IO ()
|
||||||
pingReply euphCon pingReplyCommandTime =
|
pingReply euphCon pingReplyCommandTime =
|
||||||
|
|
@ -422,7 +426,8 @@ instance FromJSON Event where
|
||||||
pEditMessageEvent v = EditMessageEvent <$> parseJSON v
|
pEditMessageEvent v = EditMessageEvent <$> parseJSON v
|
||||||
pPartEvent v = PartEvent <$> parseJSON v
|
pPartEvent v = PartEvent <$> parseJSON v
|
||||||
pPingEvent = withObject "PingEvent" $ \o ->
|
pPingEvent = withObject "PingEvent" $ \o ->
|
||||||
PingEvent <$> o .: "time" <*> o .: "next"
|
PingEvent <$> (posixSecondsToUTCTime <$> o .: "time")
|
||||||
|
<*> (posixSecondsToUTCTime <$> o .: "next")
|
||||||
pSendEvent v = SendEvent <$> parseJSON v
|
pSendEvent v = SendEvent <$> parseJSON v
|
||||||
pSnapshotEvent = withObject "SnapshotEvent" $ \o ->
|
pSnapshotEvent = withObject "SnapshotEvent" $ \o ->
|
||||||
SnapshotEvent <$> o .: "version" <*> o .: "listing" <*> o .: "log" <*> o .:? "nick"
|
SnapshotEvent <$> o .: "version" <*> o .: "listing" <*> o .: "log" <*> o .:? "nick"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue