calamity 0.1.14.7 → 0.1.14.8
raw patch · 5 files changed
+41/−54 lines, 5 filesdep ~di-polysemyPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: di-polysemy
API changes (from Hackage documentation)
- Calamity.Internal.RunIntoIO: [IntoIO] :: (p -> m r) -> IntoIO p r m (p -> IO (Maybe r))
- Calamity.Internal.RunIntoIO: data IntoIO p r m a
- Calamity.Internal.RunIntoIO: intoIO :: forall p_aFYQ r_aFYS r_aG3X. MemberWithError (IntoIO p_aFYQ r_aFYS) r_aG3X => (p_aFYQ -> Sem r_aG3X r_aFYS) -> Sem r_aG3X (p_aFYQ -> IO (Maybe r_aFYS))
- Calamity.Internal.RunIntoIO: runIntoIOFinal :: forall r p b a. Member (Final IO) r => Sem (IntoIO p b : r) a -> Sem r a
+ Calamity.Internal.RunIntoIO: runSemToIO :: forall r a. Member (Final IO) r => Sem r a -> Sem r (IO (Maybe a))
- Calamity.Cache.Eff: delDM :: forall r_a9wXn. MemberWithError CacheEff r_a9wXn => Snowflake DMChannel -> Sem r_a9wXn ()
+ Calamity.Cache.Eff: delDM :: forall r_a9wUM. MemberWithError CacheEff r_a9wUM => Snowflake DMChannel -> Sem r_a9wUM ()
- Calamity.Cache.Eff: delGuild :: forall r_a9wXg. MemberWithError CacheEff r_a9wXg => Snowflake Guild -> Sem r_a9wXg ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9wUF. MemberWithError CacheEff r_a9wUF => Snowflake Guild -> Sem r_a9wUF ()
- Calamity.Cache.Eff: delMessage :: forall r_a9wXI. MemberWithError CacheEff r_a9wXI => Snowflake Message -> Sem r_a9wXI ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9wV7. MemberWithError CacheEff r_a9wV7 => Snowflake Message -> Sem r_a9wV7 ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9wXB. MemberWithError CacheEff r_a9wXB => Snowflake Guild -> Sem r_a9wXB ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9wV0. MemberWithError CacheEff r_a9wV0 => Snowflake Guild -> Sem r_a9wV0 ()
- Calamity.Cache.Eff: delUser :: forall r_a9wXu. MemberWithError CacheEff r_a9wXu => Snowflake User -> Sem r_a9wXu ()
+ Calamity.Cache.Eff: delUser :: forall r_a9wUT. MemberWithError CacheEff r_a9wUT => Snowflake User -> Sem r_a9wUT ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9wX8. MemberWithError CacheEff r_a9wX8 => Sem r_a9wX8 (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9wUx. MemberWithError CacheEff r_a9wUx => Sem r_a9wUx (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9wXk. MemberWithError CacheEff r_a9wXk => Snowflake DMChannel -> Sem r_a9wXk (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9wUJ. MemberWithError CacheEff r_a9wUJ => Snowflake DMChannel -> Sem r_a9wUJ (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9wXm. MemberWithError CacheEff r_a9wXm => Sem r_a9wXm [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9wUL. MemberWithError CacheEff r_a9wUL => Sem r_a9wUL [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9wXb. MemberWithError CacheEff r_a9wXb => Snowflake Guild -> Sem r_a9wXb (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9wUA. MemberWithError CacheEff r_a9wUA => Snowflake Guild -> Sem r_a9wUA (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9wXd. MemberWithError CacheEff r_a9wXd => Snowflake GuildChannel -> Sem r_a9wXd (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9wUC. MemberWithError CacheEff r_a9wUC => Snowflake GuildChannel -> Sem r_a9wUC (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9wXf. MemberWithError CacheEff r_a9wXf => Sem r_a9wXf [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9wUE. MemberWithError CacheEff r_a9wUE => Sem r_a9wUE [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9wXF. MemberWithError CacheEff r_a9wXF => Snowflake Message -> Sem r_a9wXF (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9wV4. MemberWithError CacheEff r_a9wV4 => Snowflake Message -> Sem r_a9wV4 (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9wXH. MemberWithError CacheEff r_a9wXH => Sem r_a9wXH [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9wV6. MemberWithError CacheEff r_a9wV6 => Sem r_a9wV6 [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9wXA. MemberWithError CacheEff r_a9wXA => Sem r_a9wXA [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9wUZ. MemberWithError CacheEff r_a9wUZ => Sem r_a9wUZ [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9wXr. MemberWithError CacheEff r_a9wXr => Snowflake User -> Sem r_a9wXr (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9wUQ. MemberWithError CacheEff r_a9wUQ => Snowflake User -> Sem r_a9wUQ (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9wXt. MemberWithError CacheEff r_a9wXt => Sem r_a9wXt [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9wUS. MemberWithError CacheEff r_a9wUS => Sem r_a9wUS [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9wXy. MemberWithError CacheEff r_a9wXy => Snowflake Guild -> Sem r_a9wXy Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9wUX. MemberWithError CacheEff r_a9wUX => Snowflake Guild -> Sem r_a9wUX Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9wX6. MemberWithError CacheEff r_a9wX6 => User -> Sem r_a9wX6 ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9wUv. MemberWithError CacheEff r_a9wUv => User -> Sem r_a9wUv ()
- Calamity.Cache.Eff: setDM :: forall r_a9wXi. MemberWithError CacheEff r_a9wXi => DMChannel -> Sem r_a9wXi ()
+ Calamity.Cache.Eff: setDM :: forall r_a9wUH. MemberWithError CacheEff r_a9wUH => DMChannel -> Sem r_a9wUH ()
- Calamity.Cache.Eff: setGuild :: forall r_a9wX9. MemberWithError CacheEff r_a9wX9 => Guild -> Sem r_a9wX9 ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9wUy. MemberWithError CacheEff r_a9wUy => Guild -> Sem r_a9wUy ()
- Calamity.Cache.Eff: setMessage :: forall r_a9wXD. MemberWithError CacheEff r_a9wXD => Message -> Sem r_a9wXD ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9wV2. MemberWithError CacheEff r_a9wV2 => Message -> Sem r_a9wV2 ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9wXw. MemberWithError CacheEff r_a9wXw => Snowflake Guild -> Sem r_a9wXw ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9wUV. MemberWithError CacheEff r_a9wUV => Snowflake Guild -> Sem r_a9wUV ()
- Calamity.Cache.Eff: setUser :: forall r_a9wXp. MemberWithError CacheEff r_a9wXp => User -> Sem r_a9wXp ()
+ Calamity.Cache.Eff: setUser :: forall r_a9wUO. MemberWithError CacheEff r_a9wUO => User -> Sem r_a9wUO ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7a8X. MemberWithError ParsePrefix r_a7a8X => Message -> Sem r_a7a8X (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7a6m. MemberWithError ParsePrefix r_a7a6m => Message -> Sem r_a7a6m (Maybe (Text, Text))
- Calamity.Metrics.Eff: addCounter :: forall r_aIL7. MemberWithError MetricEff r_aIL7 => Int -> Counter -> Sem r_aIL7 Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aIIy. MemberWithError MetricEff r_aIIy => Int -> Counter -> Sem r_aIIy Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aILa. MemberWithError MetricEff r_aILa => (Double -> Double) -> Gauge -> Sem r_aILa Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aIIB. MemberWithError MetricEff r_aIIB => (Double -> Double) -> Gauge -> Sem r_aIIB Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aILd. MemberWithError MetricEff r_aILd => Double -> Histogram -> Sem r_aILd HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aIIE. MemberWithError MetricEff r_aIIE => Double -> Histogram -> Sem r_aIIE HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aIKX. MemberWithError MetricEff r_aIKX => Text -> [(Text, Text)] -> Sem r_aIKX Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aIIo. MemberWithError MetricEff r_aIIo => Text -> [(Text, Text)] -> Sem r_aIIo Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aIL0. MemberWithError MetricEff r_aIL0 => Text -> [(Text, Text)] -> Sem r_aIL0 Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aIIr. MemberWithError MetricEff r_aIIr => Text -> [(Text, Text)] -> Sem r_aIIr Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aIL3. MemberWithError MetricEff r_aIL3 => Text -> [(Text, Text)] -> [Double] -> Sem r_aIL3 Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aIIu. MemberWithError MetricEff r_aIIu => Text -> [(Text, Text)] -> [Double] -> Sem r_aIIu Histogram
Files
- ChangeLog.md +6/−0
- calamity.cabal +3/−3
- src/Calamity/Client/Client.hs +1/−1
- src/Calamity/Gateway/Shard.hs +20/−32
- src/Calamity/Internal/RunIntoIO.hs +11/−18
ChangeLog.md view
@@ -1,5 +1,11 @@ # Changelog for Calamity +## 0.1.14.8++*2020-06-21*++* Replace uses of withLowerToIO with interpretFinal (should be more performant)+ ## 0.1.14.7 *2020-06-21*
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 8d7e2384272bd3170cf997e20fa3c1aa01a622aa2f515fda81b9cde2ee1dd641+-- hash: b703a1d32e704130629ed6fcd9b163debe4dc5f03cacb736036bf9e142bde656 name: calamity-version: 0.1.14.7+version: 0.1.14.8 synopsis: A library for writing discord bots in haskell description: Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category: Network, Web@@ -149,7 +149,7 @@ , deepseq >=1.4.4.0 && <2 , deque >=0.4 && <0.5 , df1 >=0.3 && <0.5- , di-polysemy >=0.1.3 && <0.2+ , di-polysemy >=0.1.4 && <0.2 , exceptions >=0.10 && <0.11 , fmt >=0.6 && <0.7 , focus >=1.0 && <2
src/Calamity/Client/Client.hs view
@@ -112,7 +112,7 @@ runBotIO' token status intents setup = do client <- P.embed $ newClient token handlers <- P.embed $ newTVarIO def- P.asyncToIOFinal . P.runAtomicStateTVar handlers . P.runReader client . Di.runDiToStderrIO . Di.push "calamity" $ do+ P.asyncToIOFinal . P.runAtomicStateTVar handlers . P.runReader client . Di.runDiToStderrIOFinal . Di.push "calamity" $ do void $ Di.push "calamity-setup" setup r <- shardBot status intents case r of
src/Calamity/Gateway/Shard.hs view
@@ -10,6 +10,7 @@ import Calamity.Gateway.Intents import Calamity.Gateway.Types import Calamity.Internal.Utils+import Calamity.Internal.RunIntoIO import Calamity.Metrics.Eff import Calamity.Types.LogEff import Calamity.Types.Token@@ -29,8 +30,7 @@ import Data.Functor import Data.IORef import Data.Maybe-import Data.Text.Lazy ( Text, stripPrefix )-import Data.Text.Lazy.Lens+import qualified Data.Text.Lazy as L import Data.Void import DiPolysemy hiding ( debug, error, info )@@ -50,36 +50,22 @@ import Prelude hiding ( error ) import Wuss-import qualified Data.Text.Lazy as L -data Websocket m a where- RunWebsocket :: Text -> Text -> (Connection -> m a) -> Websocket m a--P.makeSem ''Websocket--websocketToIO :: forall r a. P.Member (P.Embed IO) r => Sem (Websocket ': r) a -> Sem r a-websocketToIO = P.interpretH- (\case- RunWebsocket host path a -> do- istate <- P.getInitialStateT- ma <- P.bindT a-- P.withLowerToIO $ \lower finish -> do- let done :: Sem (Websocket ': r) x -> IO x- done = lower . P.raise . websocketToIO-- runSecureClient (host ^. unpacked) 443 (path ^. unpacked)- (\x -> do- res <- done (ma $ istate $> x)- finish- pure res))+runWebsocket :: P.Members '[P.Final IO, P.Embed IO] r+ => L.Text+ -> L.Text+ -> (Connection -> P.Sem r a)+ -> P.Sem r (Maybe a)+runWebsocket host path ma = do+ inner <- bindSemToIO ma+ P.embed $ runSecureClient (L.unpack host) 443 (L.unpack path) inner newShardState :: Shard -> ShardState newShardState shard = ShardState shard Nothing Nothing False Nothing Nothing Nothing -- | Creates and launches a shard newShard :: P.Members '[LogEff, MetricEff, P.Embed IO, P.Final IO, P.Async] r- => Text+ => L.Text -> Int -> Int -> Token@@ -141,7 +127,7 @@ r <- atomically $ tryWriteTBMQueue' outqueue (Control v) when r inner - handleWSException :: SomeException -> IO (Either (ControlMessage, Maybe Text) a)+ handleWSException :: SomeException -> IO (Either (ControlMessage, Maybe L.Text) a) handleWSException e = pure $ case fromException e of Just (CloseRequest code _) | code `elem` [1000, 4004, 4010, 4011] ->@@ -176,21 +162,23 @@ outerloop = P.runError . forever $ do shard :: Shard <- P.atomicGets (^. #shardS) let host = shard ^. #gateway- let host' = fromMaybe host $ stripPrefix "wss://" host+ let host' = fromMaybe host $ L.stripPrefix "wss://" host info $ "starting up shard "+| (shard ^. #shardID) |+" of "+| (shard ^. #shardCount) |+"" -- innerLoopVal <- websocketToIO $ runWebsocket host' "/?v=6&encoding=json" innerloop+ innerLoopVal <- runWebsocket host' "/?v=6&encoding=json" innerloop case innerLoopVal of- ShardFlowShutDown -> do+ Just ShardFlowShutDown -> do info "Shutting down shard" P.throw ShardFlowShutDown - ShardFlowRestart ->+ Just ShardFlowRestart -> info "Restaring shard" -- we restart normally when we loop + Nothing -> -- won't happen unless innerloop starts using a non-deterministic effect+ info "Restarting shard (abnormal reasons?)"+ -- | The inner loop, handles receiving a message from discord or a command message -- and then decides what to do with it innerloop :: ShardC r => Connection -> Sem r ShardFlowControl@@ -327,5 +315,5 @@ unlessM (P.atomicGets (^. #hbResponse)) $ do debug "No heartbeat response, restarting shard" wsConn <- fromJust <$> P.atomicGets (^. #wsConn)- P.embed $ sendCloseCode wsConn 4000 ("No heartbeat in time" :: Text)+ P.embed $ sendCloseCode wsConn 4000 ("No heartbeat in time" :: L.Text) P.throw ()
src/Calamity/Internal/RunIntoIO.hs view
@@ -2,9 +2,7 @@ -- | Something for converting polysemy actions into IO actions module Calamity.Internal.RunIntoIO- ( IntoIO(..)- , runIntoIOFinal- , intoIO+ ( runSemToIO , bindSemToIO ) where import Data.Functor@@ -12,20 +10,15 @@ import qualified Polysemy as P import qualified Polysemy.Final as P -data IntoIO p r m a where- IntoIO :: (p -> m r) -> IntoIO p r m (p -> IO (Maybe r))--runIntoIOFinal :: forall r p b a. P.Member (P.Final IO) r => P.Sem (IntoIO p b ': r) a -> P.Sem r a-runIntoIOFinal = P.interpretFinal $ \case- IntoIO m -> do- istate <- P.getInitialStateS- m' <- P.bindS m- ins <- P.getInspectorS- P.liftS $ pure (\x -> P.inspect ins <$> m' (istate $> x))--P.makeSem ''IntoIO+runSemToIO :: forall r a. P.Member (P.Final IO) r => P.Sem r a -> P.Sem r (IO (Maybe a))+runSemToIO m = P.withStrategicToFinal $ do+ m' <- P.runS m+ ins <- P.getInspectorS+ P.liftS $ pure (P.inspect ins <$> m') bindSemToIO :: forall r p a. P.Member (P.Final IO) r => (p -> P.Sem r a) -> P.Sem r (p -> IO (Maybe a))-bindSemToIO f = runIntoIOFinal go- where go :: P.Sem (IntoIO p a ': r) (p -> IO (Maybe a))- go = intoIO (P.raise . f)+bindSemToIO m = P.withStrategicToFinal $ do+ istate <- P.getInitialStateS+ m' <- P.bindS m+ ins <- P.getInspectorS+ P.liftS $ pure (\x -> P.inspect ins <$> m' (istate $> x))