packages feed

telega-0.1.1: Network/Telegram/API/Bot/Capacity/Droppable.hs

module Network.Telegram.API.Bot.Capacity.Droppable (Droppable (..), Drop) 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 Drop a = r | r -> a

class Droppable a where
	{-# MINIMAL drop_value, drop_endpoint #-}
	drop_value :: Drop a -> Value
	drop_endpoint :: Drop a -> String

	drop :: Drop a -> Telegram e ()
	drop x = snd <$> ask >>= \(session, Token token) -> void . lift . ExceptT . try
		. fmap (fromJust . join . fmap result . decode @(Ok ()) . responseBody)
			. flip (Wreq.post session) (drop_value x) $
				"https://api.telegram.org/" <> unpack token <> "/" <> drop_endpoint x