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 +5/−0
- calamity.cabal +2/−2
- src/Calamity/Client/Client.hs +16/−2
- src/Calamity/Client/Types.hs +4/−0
- src/Calamity/Gateway/DispatchEvents.hs +2/−5
- src/Calamity/Gateway/Shard.hs +11/−18
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 ()