packages feed

calamity 0.1.24.1 → 0.1.24.2

raw patch · 6 files changed

+40/−27 lines, 6 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Calamity.Gateway.DispatchEvents: VoiceStateUpdateData :: Value -> VoiceStateUpdateData
- Calamity.Gateway.DispatchEvents: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Gateway.DispatchEvents.VoiceStateUpdateData
- Calamity.Gateway.DispatchEvents: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.Gateway.DispatchEvents.VoiceStateUpdateData
- Calamity.Gateway.DispatchEvents: instance GHC.Generics.Generic Calamity.Gateway.DispatchEvents.VoiceStateUpdateData
- Calamity.Gateway.DispatchEvents: instance GHC.Show.Show Calamity.Gateway.DispatchEvents.VoiceStateUpdateData
- Calamity.Gateway.DispatchEvents: newtype VoiceStateUpdateData
+ Calamity.Client.Types: VoiceStateUpdateEvt :: EventType
- Calamity.Cache.Eff: delDM :: forall r_a9myH. MemberWithError CacheEff r_a9myH => Snowflake DMChannel -> Sem r_a9myH ()
+ Calamity.Cache.Eff: delDM :: forall r_a9NXx. MemberWithError CacheEff r_a9NXx => Snowflake DMChannel -> Sem r_a9NXx ()
- Calamity.Cache.Eff: delGuild :: forall r_a9myA. MemberWithError CacheEff r_a9myA => Snowflake Guild -> Sem r_a9myA ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9NXq. MemberWithError CacheEff r_a9NXq => Snowflake Guild -> Sem r_a9NXq ()
- Calamity.Cache.Eff: delMessage :: forall r_a9mz2. MemberWithError CacheEff r_a9mz2 => Snowflake Message -> Sem r_a9mz2 ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9NXS. MemberWithError CacheEff r_a9NXS => Snowflake Message -> Sem r_a9NXS ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9myV. MemberWithError CacheEff r_a9myV => Snowflake Guild -> Sem r_a9myV ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9NXL. MemberWithError CacheEff r_a9NXL => Snowflake Guild -> Sem r_a9NXL ()
- Calamity.Cache.Eff: delUser :: forall r_a9myO. MemberWithError CacheEff r_a9myO => Snowflake User -> Sem r_a9myO ()
+ Calamity.Cache.Eff: delUser :: forall r_a9NXE. MemberWithError CacheEff r_a9NXE => Snowflake User -> Sem r_a9NXE ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9mys. MemberWithError CacheEff r_a9mys => Sem r_a9mys (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9NXi. MemberWithError CacheEff r_a9NXi => Sem r_a9NXi (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9myE. MemberWithError CacheEff r_a9myE => Snowflake DMChannel -> Sem r_a9myE (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9NXu. MemberWithError CacheEff r_a9NXu => Snowflake DMChannel -> Sem r_a9NXu (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9myG. MemberWithError CacheEff r_a9myG => Sem r_a9myG [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9NXw. MemberWithError CacheEff r_a9NXw => Sem r_a9NXw [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9myv. MemberWithError CacheEff r_a9myv => Snowflake Guild -> Sem r_a9myv (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9NXl. MemberWithError CacheEff r_a9NXl => Snowflake Guild -> Sem r_a9NXl (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9myx. MemberWithError CacheEff r_a9myx => Snowflake GuildChannel -> Sem r_a9myx (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9NXn. MemberWithError CacheEff r_a9NXn => Snowflake GuildChannel -> Sem r_a9NXn (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9myz. MemberWithError CacheEff r_a9myz => Sem r_a9myz [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9NXp. MemberWithError CacheEff r_a9NXp => Sem r_a9NXp [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9myZ. MemberWithError CacheEff r_a9myZ => Snowflake Message -> Sem r_a9myZ (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9NXP. MemberWithError CacheEff r_a9NXP => Snowflake Message -> Sem r_a9NXP (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9mz1. MemberWithError CacheEff r_a9mz1 => Sem r_a9mz1 [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9NXR. MemberWithError CacheEff r_a9NXR => Sem r_a9NXR [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9myU. MemberWithError CacheEff r_a9myU => Sem r_a9myU [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9NXK. MemberWithError CacheEff r_a9NXK => Sem r_a9NXK [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9myL. MemberWithError CacheEff r_a9myL => Snowflake User -> Sem r_a9myL (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9NXB. MemberWithError CacheEff r_a9NXB => Snowflake User -> Sem r_a9NXB (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9myN. MemberWithError CacheEff r_a9myN => Sem r_a9myN [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9NXD. MemberWithError CacheEff r_a9NXD => Sem r_a9NXD [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9myS. MemberWithError CacheEff r_a9myS => Snowflake Guild -> Sem r_a9myS Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9NXI. MemberWithError CacheEff r_a9NXI => Snowflake Guild -> Sem r_a9NXI Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9myq. MemberWithError CacheEff r_a9myq => User -> Sem r_a9myq ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9NXg. MemberWithError CacheEff r_a9NXg => User -> Sem r_a9NXg ()
- Calamity.Cache.Eff: setDM :: forall r_a9myC. MemberWithError CacheEff r_a9myC => DMChannel -> Sem r_a9myC ()
+ Calamity.Cache.Eff: setDM :: forall r_a9NXs. MemberWithError CacheEff r_a9NXs => DMChannel -> Sem r_a9NXs ()
- Calamity.Cache.Eff: setGuild :: forall r_a9myt. MemberWithError CacheEff r_a9myt => Guild -> Sem r_a9myt ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9NXj. MemberWithError CacheEff r_a9NXj => Guild -> Sem r_a9NXj ()
- Calamity.Cache.Eff: setMessage :: forall r_a9myX. MemberWithError CacheEff r_a9myX => Message -> Sem r_a9myX ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9NXN. MemberWithError CacheEff r_a9NXN => Message -> Sem r_a9NXN ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9myQ. MemberWithError CacheEff r_a9myQ => Snowflake Guild -> Sem r_a9myQ ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9NXG. MemberWithError CacheEff r_a9NXG => Snowflake Guild -> Sem r_a9NXG ()
- Calamity.Cache.Eff: setUser :: forall r_a9myJ. MemberWithError CacheEff r_a9myJ => User -> Sem r_a9myJ ()
+ Calamity.Cache.Eff: setUser :: forall r_a9NXz. MemberWithError CacheEff r_a9NXz => User -> Sem r_a9NXz ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a6Xeg. MemberWithError ParsePrefix r_a6Xeg => Message -> Sem r_a6Xeg (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7hVK. MemberWithError ParsePrefix r_a7hVK => Message -> Sem r_a7hVK (Maybe (Text, Text))
- Calamity.Gateway.DispatchEvents: VoiceStateUpdate :: !VoiceStateUpdateData -> DispatchData
+ Calamity.Gateway.DispatchEvents: VoiceStateUpdate :: !VoiceState -> DispatchData
- Calamity.Internal.LocalWriter: llisten :: forall o_aryT r_arGq a_XryT. MemberWithError (LocalWriter o_aryT) r_arGq => Sem r_arGq a_XryT -> Sem r_arGq (o_aryT, a_XryT)
+ Calamity.Internal.LocalWriter: llisten :: forall o_aFhR r_aFxR a_XFhR. MemberWithError (LocalWriter o_aFhR) r_aFxR => Sem r_aFxR a_XFhR -> Sem r_aFxR (o_aFhR, a_XFhR)
- Calamity.Internal.LocalWriter: ltell :: forall o_aryP r_arGo. MemberWithError (LocalWriter o_aryP) r_arGo => o_aryP -> Sem r_arGo ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_aFhN r_aFxP. MemberWithError (LocalWriter o_aFhN) r_aFxP => o_aFhN -> Sem r_aFxP ()
- Calamity.Metrics.Eff: addCounter :: forall r_avbV. MemberWithError MetricEff r_avbV => Int -> Counter -> Sem r_avbV Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aLeS. MemberWithError MetricEff r_aLeS => Int -> Counter -> Sem r_aLeS Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_avbY. MemberWithError MetricEff r_avbY => (Double -> Double) -> Gauge -> Sem r_avbY Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aLeV. MemberWithError MetricEff r_aLeV => (Double -> Double) -> Gauge -> Sem r_aLeV Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_avc1. MemberWithError MetricEff r_avc1 => Double -> Histogram -> Sem r_avc1 HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aLeY. MemberWithError MetricEff r_aLeY => Double -> Histogram -> Sem r_aLeY HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_avbL. MemberWithError MetricEff r_avbL => Text -> [(Text, Text)] -> Sem r_avbL Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aLeI. MemberWithError MetricEff r_aLeI => Text -> [(Text, Text)] -> Sem r_aLeI Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_avbO. MemberWithError MetricEff r_avbO => Text -> [(Text, Text)] -> Sem r_avbO Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aLeL. MemberWithError MetricEff r_aLeL => Text -> [(Text, Text)] -> Sem r_aLeL Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_avbR. MemberWithError MetricEff r_avbR => Text -> [(Text, Text)] -> [Double] -> Sem r_avbR Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aLeO. MemberWithError MetricEff r_aLeO => Text -> [(Text, Text)] -> [Double] -> Sem r_aLeO Histogram

Files

ChangeLog.md view
@@ -1,5 +1,10 @@ # Changelog for Calamity +## 0.1.24.2+++ Add event handlers for voice state update events: `'VoiceStateUpdateEvt`++ Apply some fixes for a few memory leaks+ ## 0.1.24.1  + Fix some memory leaks
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 9feeea689fb0b9d305f0fe00b6993523fb12bc6e272225ca890b5af595a2dde9+-- hash: a5c065a71cfed945f41be7a4a6f14517749ae7e80ebeb56e60944a845ef100a4  name:           calamity-version:        0.1.24.1+version:        0.1.24.2 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
src/Calamity/Client/Client.hs view
@@ -31,6 +31,7 @@ import           Calamity.Types.Model.Guild import           Calamity.Types.Model.Presence     ( Presence(..) ) import           Calamity.Types.Model.User+import qualified Calamity.Types.Model.Voice as V import           Calamity.Types.Snowflake import           Calamity.Types.Token import           Calamity.Types.LogEff@@ -604,6 +605,11 @@   Just newUser <- getBotUser   pure $ map ($ (oldUser, newUser)) (getEventHandlers @'UserUpdateEvt eh) +handleEvent' eh evt@(VoiceStateUpdate newVoiceState@V.VoiceState{guildID=Just guildID}) = do+  oldVoiceState <- join . fmap (find ((==V.sessionID newVoiceState) . V.sessionID) . voiceStates) <$> getGuild guildID+  updateCache evt+  pure $ map ($ (oldVoiceState, newVoiceState)) (getEventHandlers @'VoiceStateUpdateEvt eh)+ handleEvent' _ e = fail $ "Unhandled event: " <> show e  updateCache :: P.Members '[CacheEff, P.Fail] r => DispatchData -> P.Sem r ()@@ -712,6 +718,14 @@ updateCache (InviteCreate _) = pure () updateCache (InviteDelete _) = pure () --- we don't handle voice state currently-updateCache (VoiceStateUpdate _) = pure ()+updateCache (VoiceStateUpdate voiceState@V.VoiceState{guildID=Just guildID}) =+  updateGuild guildID (#voiceStates %~ updateVoiceStates)+  where+    updateVoiceStates [] = [voiceState]+    updateVoiceStates (x:xs)+        | V.sessionID x == V.sessionID voiceState = voiceState : xs+        | otherwise = x : updateVoiceStates xs++  -- we don't handle voice server update and direct voice connections currently+updateCache (VoiceStateUpdate V.VoiceState{guildID=Nothing}) = pure () updateCache (VoiceServerUpdate _) = pure ()
src/Calamity/Client/Types.hs view
@@ -25,6 +25,7 @@ import           Calamity.Types.Model.Channel.UpdatedMessage import           Calamity.Types.Model.Guild import           Calamity.Types.Model.User+import           Calamity.Types.Model.Voice import           Calamity.Types.Token import           Calamity.Types.UnixTimestamp import           Calamity.Types.Snowflake@@ -152,6 +153,8 @@   -- ^ Fired when all reactions are removed from a message.   | TypingStartEvt   | UserUpdateEvt+  | VoiceStateUpdateEvt+  -- ^ Sent when someone joins/leaves/moves voice channels   | forall s a. CustomEvt s a   -- ^ A custom event, @s@ is the name and @a@ is the data sent to the handler @@ -206,6 +209,7 @@   EHType 'RawMessageReactionRemoveAllEvt = Snowflake Message   EHType 'TypingStartEvt              = (Channel, Snowflake User, UnixTimestamp)   EHType 'UserUpdateEvt               = (User, User)+  EHType 'VoiceStateUpdateEvt         = (Maybe VoiceState, VoiceState)   EHType ('CustomEvt s a)             = a  type StoredEHType t = EHType t -> IO ()
src/Calamity/Gateway/DispatchEvents.hs view
@@ -14,6 +14,7 @@ import           Calamity.Types.Model.Guild.UnavailableGuild import           Calamity.Types.Model.Presence.Presence import           Calamity.Types.Model.User+import           Calamity.Types.Model.Voice import           Calamity.Types.Snowflake import           Calamity.Types.UnixTimestamp @@ -69,7 +70,7 @@   | PresenceUpdate !PresenceUpdateData   | TypingStart !TypingStartData   | UserUpdate !User-  | VoiceStateUpdate !VoiceStateUpdateData+  | VoiceStateUpdate !VoiceState   | VoiceServerUpdate !VoiceServerUpdateData   | WebhooksUpdate !WebhooksUpdateData   deriving ( Show, Generic, CtorName )@@ -219,10 +220,6 @@   }   deriving ( Show, Generic )   deriving FromJSON via CalamityJSON TypingStartData--newtype VoiceStateUpdateData = VoiceStateUpdateData Value-  deriving newtype ( Show, Generic )-  deriving newtype ( ToJSON, FromJSON )  newtype VoiceServerUpdateData = VoiceServerUpdateData Value   deriving newtype ( Show, Generic )
src/Calamity/Gateway/Shard.hs view
@@ -15,7 +15,6 @@ import Calamity.Metrics.Eff import Calamity.Types.LogEff import Calamity.Types.Token- import Control.Concurrent import Control.Concurrent.Async import qualified Control.Concurrent.Chan.Unagi as UC@@ -26,17 +25,18 @@ import Control.Lens import Control.Monad import Control.Monad.State.Lazy- import qualified Data.Aeson as A+import qualified Data.ByteString.Lazy as LBS+import Data.Default.Class (def) import Data.Functor import Data.IORef import Data.Maybe import qualified Data.Text.Lazy as L- import DiPolysemy hiding (debug, error, info)- import Fmt-+import qualified Network.Connection as NC+import qualified Network.TLS as NT+import qualified Network.TLS.Extra as NT import Network.WebSockets (   Connection,   ConnectionException (..),@@ -44,24 +44,17 @@   sendCloseCode,   sendTextData,  )-+import qualified Network.WebSockets as NW+import qualified Network.WebSockets.Stream as NW import Polysemy (Sem) import qualified Polysemy as P import qualified Polysemy.Async as P import qualified Polysemy.AtomicState as P import qualified Polysemy.Error as P import qualified Polysemy.Resource as P--import Prelude hiding (error)--import qualified Data.ByteString.Lazy as LBS-import Data.Default.Class (def)-import qualified Network.Connection as NC-import qualified Network.TLS as NT-import qualified Network.TLS.Extra as NT-import qualified Network.WebSockets as NW-import qualified Network.WebSockets.Stream as NW import qualified System.X509 as X509+import TextShow (showtl)+import Prelude hiding (error)  runWebsocket ::   P.Members '[P.Final IO, P.Embed IO] r =>@@ -171,8 +164,8 @@   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] ->-        Left (ShutDownShard, Nothing)+      | code `elem` [4004, 4010, 4011, 4012, 4013, 4014] ->+        Left (ShutDownShard, Just . showtl $ code)     e -> Left (RestartShard, Just . L.pack . show $ e)    discordStream :: P.Members '[LogEff, MetricEff, P.Embed IO, P.Final IO] r => Connection -> TBMQueue ShardMsg -> Sem r ()