telega-0.1.0: Network/Telegram/API/Bot/Capacity/Purgeable.hs
module Network.Telegram.API.Bot.Capacity.Purgeable (Purgeable (..), Marking) where
import "aeson" Data.Aeson (Value, decode)
import "base" Control.Exception (try)
import "base" Control.Monad (join, void)
import "base" Data.Maybe (fromJust)
import "http-client" Network.HTTP.Client (Response (responseBody))
import "text" Data.Text (unpack)
import "transformers" Control.Monad.Trans.Class (lift)
import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
import "transformers" Control.Monad.Trans.Reader (ask)
import qualified "wreq" Network.Wreq.Session as Wreq (post)
import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
type family Marking a = r | r -> a
class Purgeable a where
{-# MINIMAL marking_value, purge_endpoint #-}
marking_value :: Marking a -> Value
purge_endpoint :: Marking a -> String
purge :: Marking a -> Telegram e ()
purge x = snd <$> ask >>= \(session, Token token) -> void . lift . ExceptT . try
. fmap (fromJust . join . fmap result . decode @(Ok ()) . responseBody)
. flip (Wreq.post session) (marking_value x) $
"https://api.telegram.org/" <> unpack token <> "/" <> purge_endpoint x