packages feed

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