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 +8/−0
- README.md +2/−2
- calamity.cabal +3/−2
- src/Calamity/Cache/Eff.hs +3/−0
- src/Calamity/Cache/InMemory.hs +12/−4
- src/Calamity/Commands/CommandUtils.hs +1/−1
- src/Calamity/Commands/Dsl.hs +1/−1
- src/Calamity/Commands/Parser.hs +37/−13
- src/Calamity/HTTP/Internal/Request.hs +0/−3
- src/Calamity/Internal/BoundedStore.hs +11/−10
- src/Calamity/Types.hs +6/−1
- src/Calamity/Types/Upgradeable.hs +93/−0
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