packages feed

calamity 0.1.9.4 → 0.1.10

raw patch · 12 files changed

+177/−37 lines, 12 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Calamity.Commands.Parser: data KleeneConcat (a :: Type)
- Calamity.Commands.Parser: instance (GHC.Base.Monoid (Calamity.Commands.Parser.ParserResult a), Calamity.Commands.Parser.Parser a r) => Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneConcat a) r
- Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneConcat Data.Text.Internal.Lazy.Text) r
- Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneConcat Data.Text.Internal.Text) r
+ Calamity.Cache.Eff: [GetGuildChannel] :: Snowflake GuildChannel -> CacheEff m (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9JTW. MemberWithError CacheEff r_a9JTW => Snowflake GuildChannel -> Sem r_a9JTW (Maybe GuildChannel)
+ Calamity.Commands.Parser: data KleenePlusConcat (a :: Type)
+ Calamity.Commands.Parser: data KleeneStarConcat (a :: Type)
+ Calamity.Commands.Parser: instance (GHC.Base.Monoid (Calamity.Commands.Parser.ParserResult a), Calamity.Commands.Parser.Parser a r) => Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleenePlusConcat a) r
+ Calamity.Commands.Parser: instance (GHC.Base.Monoid (Calamity.Commands.Parser.ParserResult a), Calamity.Commands.Parser.Parser a r) => Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneStarConcat a) r
+ Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleenePlusConcat Data.Text.Internal.Lazy.Text) r
+ Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleenePlusConcat Data.Text.Internal.Text) r
+ Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneStarConcat Data.Text.Internal.Lazy.Text) r
+ Calamity.Commands.Parser: instance Calamity.Commands.Parser.Parser (Calamity.Commands.Parser.KleeneStarConcat Data.Text.Internal.Text) r
+ Calamity.Types.Upgradeable: class Upgradeable a ids | a -> ids, ids -> a
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.Channel.Channel (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Channel.Channel)
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.Channel.Guild.GuildChannel (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Channel.Guild.GuildChannel)
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.Guild.Emoji.Emoji (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Guild.Guild.Guild, Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Guild.Emoji.Emoji)
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.Guild.Guild.Guild (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Guild.Guild.Guild)
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.Guild.Member.Member (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Guild.Guild.Guild, Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.Guild.Member.Member)
+ Calamity.Types.Upgradeable: instance Calamity.Types.Upgradeable.Upgradeable Calamity.Types.Model.User.User (Calamity.Types.Snowflake.Snowflake Calamity.Types.Model.User.User)
+ Calamity.Types.Upgradeable: upgrade :: (Upgradeable a ids, BotC r) => ids -> Sem r (Maybe a)
- Calamity.Cache.Eff: delDM :: forall r_a9JDf. MemberWithError CacheEff r_a9JDf => Snowflake DMChannel -> Sem r_a9JDf ()
+ Calamity.Cache.Eff: delDM :: forall r_a9JU6. MemberWithError CacheEff r_a9JU6 => Snowflake DMChannel -> Sem r_a9JU6 ()
- Calamity.Cache.Eff: delGuild :: forall r_a9JD8. MemberWithError CacheEff r_a9JD8 => Snowflake Guild -> Sem r_a9JD8 ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9JTZ. MemberWithError CacheEff r_a9JTZ => Snowflake Guild -> Sem r_a9JTZ ()
- Calamity.Cache.Eff: delMessage :: forall r_a9JDA. MemberWithError CacheEff r_a9JDA => Snowflake Message -> Sem r_a9JDA ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9JUr. MemberWithError CacheEff r_a9JUr => Snowflake Message -> Sem r_a9JUr ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9JDt. MemberWithError CacheEff r_a9JDt => Snowflake Guild -> Sem r_a9JDt ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9JUk. MemberWithError CacheEff r_a9JUk => Snowflake Guild -> Sem r_a9JUk ()
- Calamity.Cache.Eff: delUser :: forall r_a9JDm. MemberWithError CacheEff r_a9JDm => Snowflake User -> Sem r_a9JDm ()
+ Calamity.Cache.Eff: delUser :: forall r_a9JUd. MemberWithError CacheEff r_a9JUd => Snowflake User -> Sem r_a9JUd ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9JD2. MemberWithError CacheEff r_a9JD2 => Sem r_a9JD2 (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9JTR. MemberWithError CacheEff r_a9JTR => Sem r_a9JTR (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9JDc. MemberWithError CacheEff r_a9JDc => Snowflake DMChannel -> Sem r_a9JDc (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9JU3. MemberWithError CacheEff r_a9JU3 => Snowflake DMChannel -> Sem r_a9JU3 (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9JDe. MemberWithError CacheEff r_a9JDe => Sem r_a9JDe [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9JU5. MemberWithError CacheEff r_a9JU5 => Sem r_a9JU5 [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9JD5. MemberWithError CacheEff r_a9JD5 => Snowflake Guild -> Sem r_a9JD5 (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9JTU. MemberWithError CacheEff r_a9JTU => Snowflake Guild -> Sem r_a9JTU (Maybe Guild)
- Calamity.Cache.Eff: getGuilds :: forall r_a9JD7. MemberWithError CacheEff r_a9JD7 => Sem r_a9JD7 [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9JTY. MemberWithError CacheEff r_a9JTY => Sem r_a9JTY [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9JDx. MemberWithError CacheEff r_a9JDx => Snowflake Message -> Sem r_a9JDx (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9JUo. MemberWithError CacheEff r_a9JUo => Snowflake Message -> Sem r_a9JUo (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9JDz. MemberWithError CacheEff r_a9JDz => Sem r_a9JDz [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9JUq. MemberWithError CacheEff r_a9JUq => Sem r_a9JUq [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9JDs. MemberWithError CacheEff r_a9JDs => Sem r_a9JDs [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9JUj. MemberWithError CacheEff r_a9JUj => Sem r_a9JUj [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9JDj. MemberWithError CacheEff r_a9JDj => Snowflake User -> Sem r_a9JDj (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9JUa. MemberWithError CacheEff r_a9JUa => Snowflake User -> Sem r_a9JUa (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9JDl. MemberWithError CacheEff r_a9JDl => Sem r_a9JDl [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9JUc. MemberWithError CacheEff r_a9JUc => Sem r_a9JUc [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9JDq. MemberWithError CacheEff r_a9JDq => Snowflake Guild -> Sem r_a9JDq Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9JUh. MemberWithError CacheEff r_a9JUh => Snowflake Guild -> Sem r_a9JUh Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9JD0. MemberWithError CacheEff r_a9JD0 => User -> Sem r_a9JD0 ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9JTP. MemberWithError CacheEff r_a9JTP => User -> Sem r_a9JTP ()
- Calamity.Cache.Eff: setDM :: forall r_a9JDa. MemberWithError CacheEff r_a9JDa => DMChannel -> Sem r_a9JDa ()
+ Calamity.Cache.Eff: setDM :: forall r_a9JU1. MemberWithError CacheEff r_a9JU1 => DMChannel -> Sem r_a9JU1 ()
- Calamity.Cache.Eff: setGuild :: forall r_a9JD3. MemberWithError CacheEff r_a9JD3 => Guild -> Sem r_a9JD3 ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9JTS. MemberWithError CacheEff r_a9JTS => Guild -> Sem r_a9JTS ()
- Calamity.Cache.Eff: setMessage :: forall r_a9JDv. MemberWithError CacheEff r_a9JDv => Message -> Sem r_a9JDv ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9JUm. MemberWithError CacheEff r_a9JUm => Message -> Sem r_a9JUm ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9JDo. MemberWithError CacheEff r_a9JDo => Snowflake Guild -> Sem r_a9JDo ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9JUf. MemberWithError CacheEff r_a9JUf => Snowflake Guild -> Sem r_a9JUf ()
- Calamity.Cache.Eff: setUser :: forall r_a9JDh. MemberWithError CacheEff r_a9JDh => User -> Sem r_a9JDh ()
+ Calamity.Cache.Eff: setUser :: forall r_a9JU8. MemberWithError CacheEff r_a9JU8 => User -> Sem r_a9JU8 ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a6F6G. MemberWithError ParsePrefix r_a6F6G => Message -> Sem r_a6F6G (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a6Fl4. MemberWithError ParsePrefix r_a6Fl4 => Message -> Sem r_a6Fl4 (Maybe (Text, Text))
- Calamity.Internal.LocalWriter: llisten :: forall o_aCfF r_aCrQ a_XCfF. MemberWithError (LocalWriter o_aCfF) r_aCrQ => Sem r_aCrQ a_XCfF -> Sem r_aCrQ (o_aCfF, a_XCfF)
+ Calamity.Internal.LocalWriter: llisten :: forall o_aC32 r_aCfd a_XC32. MemberWithError (LocalWriter o_aC32) r_aCfd => Sem r_aCfd a_XC32 -> Sem r_aCfd (o_aC32, a_XC32)
- Calamity.Internal.LocalWriter: ltell :: forall o_aCfB r_aCrO. MemberWithError (LocalWriter o_aCfB) r_aCrO => o_aCfB -> Sem r_aCrO ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_aC2Y r_aCfb. MemberWithError (LocalWriter o_aC2Y) r_aCfb => o_aC2Y -> Sem r_aCfb ()
- Calamity.Internal.RunIntoIO: intoIO :: forall p_aDRI r_aDRK r_aDWU. MemberWithError (IntoIO p_aDRI r_aDRK) r_aDWU => (p_aDRI -> Sem r_aDWU r_aDRK) -> Sem r_aDWU (p_aDRI -> IO (Maybe r_aDRK))
+ Calamity.Internal.RunIntoIO: intoIO :: forall p_aDF5 r_aDF7 r_aDKh. MemberWithError (IntoIO p_aDF5 r_aDF7) r_aDKh => (p_aDF5 -> Sem r_aDKh r_aDF7) -> Sem r_aDKh (p_aDF5 -> IO (Maybe r_aDF7))
- Calamity.Metrics.Eff: addCounter :: forall r_aGtJ. MemberWithError MetricEff r_aGtJ => Int -> Counter -> Sem r_aGtJ Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aGh6. MemberWithError MetricEff r_aGh6 => Int -> Counter -> Sem r_aGh6 Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aGtM. MemberWithError MetricEff r_aGtM => (Double -> Double) -> Gauge -> Sem r_aGtM Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aGh9. MemberWithError MetricEff r_aGh9 => (Double -> Double) -> Gauge -> Sem r_aGh9 Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aGtP. MemberWithError MetricEff r_aGtP => Double -> Histogram -> Sem r_aGtP HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aGhc. MemberWithError MetricEff r_aGhc => Double -> Histogram -> Sem r_aGhc HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aGtz. MemberWithError MetricEff r_aGtz => Text -> [(Text, Text)] -> Sem r_aGtz Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aGgW. MemberWithError MetricEff r_aGgW => Text -> [(Text, Text)] -> Sem r_aGgW Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aGtC. MemberWithError MetricEff r_aGtC => Text -> [(Text, Text)] -> Sem r_aGtC Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aGgZ. MemberWithError MetricEff r_aGgZ => Text -> [(Text, Text)] -> Sem r_aGgZ Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aGtF. MemberWithError MetricEff r_aGtF => Text -> [(Text, Text)] -> [Double] -> Sem r_aGtF Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aGh2. MemberWithError MetricEff r_aGh2 => Text -> [(Text, Text)] -> [Double] -> Sem r_aGh2 Histogram

Files

ChangeLog.md view
@@ -1,5 +1,13 @@ # Changelog for Calamity +## 0.1.10.0++* Renamed `Calamity.Commands.Parser.KleeneConcat` to+  `Calamity.Commands.Parser.KleeneStarConcat` and added+  `Calamity.Commands.Parser.KleenePlusConcat`+  +* Added `Calamity.Types.Upgradeable`+ ## 0.1.9.2  *2020-05-23*
README.md view
@@ -107,7 +107,7 @@ main :: IO () main = do   token <- view packed <$> getEnv "BOT_TOKEN"-  void . P.runFinal . P.embedToFinal . runCounterAtomic . runCacheInMemory . runMetricsPrometheusIO . useConstantPrefix "!"+  void . P.runFinal . P.embedToFinal . runCounterAtomic . runCacheInMemory . runMetricsNoop . useConstantPrefix "!"     $ runBotIO (BotToken token) $ do     addCommands $ do       helpCommand@@ -126,7 +126,7 @@           val <- getCounter           void $ tellt ctx ("The value is: " <> showtl val)         group "say" $ do-          command @'[KleeneConcat L.Text] "this" $ \ctx msg -> do+          command @'[KleenePlusConcat L.Text] "this" $ \ctx msg -> do             void $ tellt ctx msg       command @'[Snowflake Emoji] "etest" $ \ctx e -> do         void $ tellt ctx $ "got emoji: " <> showtl e
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: d09b5d61b03cb493c415218e661c595c070b5c50807b090c8689f0cbe15a9782+-- hash: 386f342de92acd940a2fa9856b8efa38f04e137426a3c6100bcbeaadb5ac5e17  name:           calamity-version:        0.1.9.4+version:        0.1.10 synopsis:       A library for writing discord bots description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web@@ -121,6 +121,7 @@       Calamity.Types.Tellable       Calamity.Types.Token       Calamity.Types.UnixTimestamp+      Calamity.Types.Upgradeable   other-modules:       Paths_calamity   hs-source-dirs:
src/Calamity/Cache/Eff.hs view
@@ -9,6 +9,7 @@     , setGuild     , updateGuild     , getGuild+    , getGuildChannel     , getGuilds     , delGuild     , setDM@@ -53,6 +54,8 @@   SetGuild :: Guild -> CacheEff m ()   -- | Get a 'Guild' from the cache   GetGuild :: Snowflake Guild -> CacheEff m (Maybe Guild)+  -- | Get a 'GuildChannel' from the cache+  GetGuildChannel :: Snowflake GuildChannel -> CacheEff m (Maybe GuildChannel)   -- | Get all 'Guild's from the cache   GetGuilds :: CacheEff m [Guild]   -- | Delete a 'Guild' from the cache
src/Calamity/Cache/InMemory.hs view
@@ -14,6 +14,8 @@ import           Control.Lens import           Control.Monad.State.Strict +import qualified Data.HashMap.Lazy as LH+ import           Data.Default.Class import           Data.Foldable import qualified Data.HashSet                   as LS@@ -28,7 +30,7 @@   { user              :: Maybe User   , guilds            :: SM.SnowflakeMap Guild   , dms               :: SM.SnowflakeMap DMChannel-  , channels          :: SM.SnowflakeMap GuildChannel+  , guildChannels     :: LH.HashMap (Snowflake GuildChannel) Guild   , users             :: SM.SnowflakeMap User   , unavailableGuilds :: LS.HashSet (Snowflake Guild)   , messages          :: BoundedStore Message@@ -36,7 +38,7 @@   deriving ( Generic, Show )  emptyCache :: Cache-emptyCache = Cache Nothing SM.empty SM.empty SM.empty SM.empty LS.empty def+emptyCache = Cache Nothing SM.empty SM.empty LH.empty SM.empty LS.empty def  runCacheInMemory :: P.Member (P.Embed IO) r => P.Sem (CacheEff ': r) a -> P.Sem r a runCacheInMemory m = do@@ -51,10 +53,16 @@ runCache (SetBotUser u) = #user ?= u runCache GetBotUser     = use #user -runCache (SetGuild g)   = #guilds %= SM.insert g+runCache (SetGuild g)   = do+  #guilds %= SM.insert g+  #guildChannels %= LH.filter (\v -> getID @Guild v /= getID @Guild g)+  #guildChannels %= LH.union (LH.fromList $ map (,g) (SM.keys (g ^. #channels))) runCache (GetGuild gid) = use (#guilds . at gid)+runCache (GetGuildChannel cid) = use (#guildChannels . at cid) <&> (>>= (^. #channels . at cid)) runCache GetGuilds      = SM.elems <$> use #guilds-runCache (DelGuild gid) = #guilds %= sans gid+runCache (DelGuild gid) = do+  #guilds %= sans gid+  #guildChannels %= LH.filter (\v -> getID @Guild v /= gid)  runCache (SetDM dm)  = #dms %= SM.insert dm runCache (GetDM did) = use (#dms . at did)
src/Calamity/Commands/CommandUtils.hs view
@@ -69,7 +69,7 @@ -- Building a command that bans a user by id. -- -- @--- 'buildCommand' @\'['Named' "user" ('Snowflake' 'User'), 'Named' "reason" ('KleeneConcat' 'S.Text')]+-- 'buildCommand' @\'['Named' "user" ('Snowflake' 'User'), 'Named' "reason" ('KleeneStarConcat' 'S.Text')] --    "ban" 'Nothing' [] ('const' "Ban a user") $ \ctx uid r -> case (ctx 'Control.Lens.^.' #guild) of --      'Just' guild -> do --        'void' . 'Calamity.HTTP.invoke' . 'Calamity.HTTP.reason' r $ 'Calamity.HTTP.Guild.CreateGuildBan' guild uid
src/Calamity/Commands/Dsl.hs view
@@ -73,7 +73,7 @@ -- -- @ -- 'command' \@\'['Calamity.Commands.Parser.Named' "user" ('Calamity.Types.Snowflake' 'Calamity.Types.Model.User'),---                'Calamity.Commands.Parser.Named' "reason" ('Calamity.Commands.Parser.KleeneConcat' 'S.Text')]+--                'Calamity.Commands.Parser.Named' "reason" ('Calamity.Commands.Parser.KleeneStarConcat' 'S.Text')] --    "ban" $ \ctx uid r -> case (ctx 'Control.Lens.^.' #guild) of --      'Just' guild -> do --        'Control.Monad.void' . 'Calamity.HTTP.invoke' . 'Calamity.HTTP.reason' r $ 'Calamity.HTTP.Guild.CreateGuildBan' guild uid
src/Calamity/Commands/Parser.hs view
@@ -2,7 +2,8 @@ module Calamity.Commands.Parser     ( Parser(..)     , Named-    , KleeneConcat+    , KleeneStarConcat+    , KleenePlusConcat     , runCommandParser ) where  import           Calamity.Cache.Eff@@ -19,6 +20,7 @@ import           Data.Char                     ( isSpace ) import           Data.Kind import           Data.List.NonEmpty            ( NonEmpty(..) )+import           Data.Semigroup import qualified Data.Text                     as S import qualified Data.Text.Lazy                as L import           Data.Typeable@@ -118,26 +120,48 @@  -- | A parser that consumes zero or more of @a@ then concatenates them together. ----- @'KleeneConcat' 'L.Text'@ Is therefore consumes all remaining input.-data KleeneConcat (a :: Type)+-- @'KleeneStarConcat' 'L.Text'@ Is therefore consumes all remaining input.+data KleeneStarConcat (a :: Type) -instance (Monoid (ParserResult a), Parser a r) => Parser (KleeneConcat a) r where-  type ParserResult (KleeneConcat a) = ParserResult a+instance (Monoid (ParserResult a), Parser a r) => Parser (KleeneStarConcat a) r where+  type ParserResult (KleeneStarConcat a) = ParserResult a    parse = mconcat <$> parse @[a] -instance {-# OVERLAPS #-}Parser (KleeneConcat L.Text) r where-  type ParserResult (KleeneConcat L.Text) = ParserResult L.Text+instance {-# OVERLAPS #-}Parser (KleeneStarConcat L.Text) r where+  type ParserResult (KleeneStarConcat L.Text) = ParserResult L.Text    -- consume rest on text just takes everything remaining-  parse = parseMP (parserName @(KleeneConcat L.Text)) someSingle+  parse = parseMP (parserName @(KleeneStarConcat L.Text)) manySingle -instance {-# OVERLAPS #-}Parser (KleeneConcat S.Text) r where-  type ParserResult (KleeneConcat S.Text) = ParserResult S.Text+instance {-# OVERLAPS #-}Parser (KleeneStarConcat S.Text) r where+  type ParserResult (KleeneStarConcat S.Text) = ParserResult S.Text    -- consume rest on text just takes everything remaining-  parse = parseMP (parserName @(KleeneConcat S.Text)) (L.toStrict <$> someSingle)+  parse = parseMP (parserName @(KleeneStarConcat S.Text)) (L.toStrict <$> manySingle) +-- | A parser that consumes one or more of @a@ then concatenates them together.+--+-- @'KleenePlusConcat' 'L.Text'@ Is therefore consumes all remaining input.+data KleenePlusConcat (a :: Type)++instance (Monoid (ParserResult a), Parser a r) => Parser (KleenePlusConcat a) r where+  type ParserResult (KleenePlusConcat a) = ParserResult a++  parse = sconcat <$> parse @(NonEmpty a)++instance {-# OVERLAPS #-}Parser (KleenePlusConcat L.Text) r where+  type ParserResult (KleenePlusConcat L.Text) = ParserResult L.Text++  -- consume rest on text just takes everything remaining+  parse = parseMP (parserName @(KleenePlusConcat L.Text)) someSingle++instance {-# OVERLAPS #-}Parser (KleenePlusConcat S.Text) r where+  type ParserResult (KleenePlusConcat S.Text) = ParserResult S.Text++  -- consume rest on text just takes everything remaining+  parse = parseMP (parserName @(KleenePlusConcat S.Text)) (L.toStrict <$> someSingle)+ instance Typeable (Snowflake a) => Parser (Snowflake a) r where   parse = parseMP (parserName @(Snowflake a)) snowflake @@ -226,8 +250,8 @@ item :: MonadParsec e L.Text m => m L.Text item = try quotedString <|> someNonWS --- manySingle :: MonadParsec e s m => m (Tokens s)--- manySingle = takeWhileP (Just "Any character") (const True)+manySingle :: MonadParsec e s m => m (Tokens s)+manySingle = takeWhileP (Just "Any character") (const True)  someSingle :: MonadParsec e s m => m (Tokens s) someSingle = takeWhile1P (Just "any character") (const True)
src/Calamity/HTTP/Internal/Request.hs view
@@ -15,7 +15,6 @@ import           Calamity.HTTP.Internal.Ratelimit import           Calamity.HTTP.Internal.Route import           Calamity.HTTP.Internal.Types-import           Calamity.Internal.Utils import           Calamity.Metrics.Eff import           Calamity.Types.Token @@ -38,8 +37,6 @@ import qualified Polysemy                         as P import qualified Polysemy.Error                   as P import qualified Polysemy.Reader                  as P--import           TextShow  fromResult :: P.Member (P.Error RestError) r => Data.Aeson.Result a -> Sem r a fromResult (Success a) = pure a
src/Calamity/Internal/BoundedStore.hs view
@@ -12,20 +12,20 @@ import           Control.Monad.State.Lazy  import           Data.Default.Class-import           Data.Generics.Labels                 ()-import           Data.HashMap.Lazy                    ( HashMap )-import qualified Data.HashMap.Lazy                    as H+import           Data.Generics.Labels     ()+import           Data.HashMap.Lazy        ( HashMap )+import qualified Data.HashMap.Lazy        as H -import qualified Deque.Lazy                           as DQ-import           Deque.Lazy                           ( Deque )+import qualified Deque.Lazy               as DQ+import           Deque.Lazy               ( Deque )  import           GHC.Generics  data BoundedStore a = BoundedStore   { itemQueue :: Deque (Snowflake a)   , items     :: HashMap (Snowflake a) a-  , limit        :: Int-  , size         :: Int+  , limit     :: Int+  , size      :: Int   }   deriving ( Show, Generic ) @@ -36,6 +36,7 @@   def = BoundedStore mempty H.empty 1000 0  type instance (Index (BoundedStore a)) = Snowflake a+ type instance (IxValue (BoundedStore a)) = a  instance HasID' a => Ixed (BoundedStore a)@@ -51,14 +52,14 @@  addItem :: HasID' a => a -> BoundedStore a -> BoundedStore a addItem m = execState $ do-  unlessM (H.member (getID m) <$> use #items) do+  unlessM (H.member (getID m) <$> use #items) $ do     #itemQueue %= DQ.cons (getID m)     #size += 1    size <- use #size   limit <- use #limit -  when (size > limit) do+  when (size > limit) $ do     q <- use #itemQueue     let Just (rid, q') = DQ.unsnoc q     #itemQueue .= q'@@ -76,7 +77,7 @@  dropItem :: Snowflake a -> BoundedStore a -> BoundedStore a dropItem id = execState $ do-  whenM (H.member id <$> use #items) do+  whenM (H.member id <$> use #items) $ do     #size -= 1    #itemQueue %= DQ.filter (/= id)
src/Calamity/Types.hs view
@@ -5,6 +5,7 @@     , module Calamity.Types.Snowflake     , module Calamity.Types.Token     , module Calamity.Types.Tellable+    , module Calamity.Types.Upgradeable     , module Calamity.Types.UnixTimestamp     -- * Types     -- $typesDocs@@ -15,11 +16,15 @@ import           Calamity.Types.Snowflake import           Calamity.Types.Token import           Calamity.Types.Tellable+import           Calamity.Types.Upgradeable import           Calamity.Types.UnixTimestamp  -- $typesDocs -- -- This module collects all discord models, and other useful types together. ----- The 'Tellable' class is also in here, which allows you to construct and send+-- The 'Tellable' class allows you to construct and send -- messages to things to you can send messages to in a neat way.+--+-- The 'Upgradeable' class allows you to upgrade a snowflake to the full value+-- it refers to.
+ src/Calamity/Types/Upgradeable.hs view
@@ -0,0 +1,93 @@+-- | Things that can be upgraded from snowflakes to their full data+module Calamity.Types.Upgradeable+    ( Upgradeable(..) ) where++import           Calamity.Cache.Eff+import           Calamity.Client.Types+import           Calamity.HTTP                  as H+import           Calamity.Internal.Utils+import           Calamity.Types.Model.Channel+import           Calamity.Types.Model.Guild+import           Calamity.Types.Model.User+import           Calamity.Types.Snowflake++import           Control.Applicative+import           Control.Lens++import           Data.Generics.Sum.Constructors++import qualified Polysemy                       as P+import qualified Polysemy.Fail                  as P+import qualified Polysemy.NonDet                as P++class Upgradeable a ids | a -> ids, ids -> a where+  upgrade :: BotC r => ids -> P.Sem r (Maybe a)++maybeToAlt :: Alternative f => Maybe a -> f a+maybeToAlt (Just x) = pure x+maybeToAlt Nothing = empty++instance Upgradeable User (Snowflake User) where+  upgrade uid = P.runNonDetMaybe ((getUser uid >>= maybeToAlt) <|> gethttp)+    where+      gethttp = P.failToNonDet $ do+        Right u <- invoke $ H.GetUser uid+        setUser u+        pure u++instance Upgradeable Member (Snowflake Guild, Snowflake Member) where+  upgrade (gid, mid) = P.runNonDetMaybe (getcache <|> gethttp)+    where+      getcache = P.failToNonDet $ do+        Just g <- getGuild gid+        Just m <- pure (g ^. #members . at mid)+        pure m+      gethttp = P.failToNonDet $ do+        Right m <- invoke $ H.GetGuildMember gid (coerceSnowflake @_ @User mid)+        -- getcache could have failed becuase the member wasn't cached+        updateGuild gid (#members . at mid ?~ m)+        pure m++instance Upgradeable Guild (Snowflake Guild) where+  upgrade gid = P.runNonDetMaybe ((getGuild gid >>= maybeToAlt) <|> gethttp)+    where+      gethttp = P.failToNonDet $ do+        Right g <- invoke $ H.GetGuild gid+        pure g++insertChannel :: BotC r => Channel -> P.Sem r ()+insertChannel (DMChannel' dm) = setDM dm+insertChannel (GuildChannel' ch) =+  updateGuild (getID ch) (#channels . at (getID @GuildChannel ch) ?~ ch)+insertChannel _ = pure ()++instance Upgradeable Channel (Snowflake Channel) where+  upgrade cid = P.runNonDetMaybe (getcacheDM <|> getcacheGuild <|> gethttp)+    where+      getcacheDM = DMChannel' <<$>> getDM (coerceSnowflake cid) >>= maybeToAlt+      getcacheGuild = GuildChannel' <<$>> getGuildChannel (coerceSnowflake cid) >>= maybeToAlt+      gethttp = P.failToNonDet $ do+        Right c <- invoke $ H.GetChannel cid+        insertChannel c+        pure c++instance Upgradeable GuildChannel (Snowflake GuildChannel) where+  upgrade cid = P.runNonDetMaybe (getcache <|> gethttp)+    where+      getcache = getGuildChannel (coerceSnowflake cid) >>= maybeToAlt+      gethttp = P.failToNonDet $ do+        Right c <- invoke $ H.GetChannel (coerceSnowflake @_ @Channel cid)+        insertChannel c+        maybeToAlt (c ^? _Ctor @"GuildChannel'")++instance Upgradeable Emoji (Snowflake Guild, Snowflake Emoji) where+  upgrade (gid, eid) = P.runNonDetMaybe (getcache <|> gethttp)+    where+      getcache = P.failToNonDet $ do+        Just g <- getGuild gid+        Just m <- pure (g ^. #emojis . at eid)+        pure m+      gethttp = P.failToNonDet $ do+        Right e <- invoke $ H.GetGuildEmoji gid eid+        updateGuild gid (#emojis . at eid ?~ e)+        pure e