packages feed

telega-0.2.8: Network/API/Telegram/Bot/Object/Update/Callback.hs

module Network.API.Telegram.Bot.Object.Update.Callback
	(module Exports, Callback (..), Trigger (..)) where

import Network.API.Telegram.Bot.Object.Update.Callback.Notification as Exports

import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
import "base" Control.Applicative (Applicative ((<*>)))
import "base" Data.Eq (Eq ((==)))
import "base" Data.Function (flip, ($))
import "base" Data.Functor ((<$>))
import "base" Data.Semigroup ((<>))
import "base" Text.Show (Show)
import "text" Data.Text (Text)

import Network.API.Telegram.Bot.Object.Chat (Chat)
import Network.API.Telegram.Bot.Object.Sender (Sender)
import Network.API.Telegram.Bot.Object.Update.Message (Message)
import Network.API.Telegram.Bot.Property (Accessible (access), Identifiable (Identificator, ident), ID)
import Network.API.Telegram.Bot.Property.Persistable (Persistable (Payload, Returning, payload, endpoint))
import Network.API.Telegram.Bot.Utils (field)

data Callback = Datatext Text Sender Message Text deriving Show

instance Eq Callback where
	c == c' = ident c == ident c'

instance Accessible Sender Callback where
	access f (Datatext cq_id sender msg dttxt) =
		(\sender' -> Datatext cq_id sender' msg dttxt) <$> f sender

instance Accessible Message Callback where
	access f (Datatext cq_id sender msg dttxt) =
		(\msg' -> Datatext cq_id sender msg' dttxt) <$> f msg

instance Accessible (ID Chat) Callback where
	access f (Datatext cq_id sender msg dttxt) =
		flip (Datatext cq_id sender) dttxt <$> access f msg

instance FromJSON Callback where
	parseJSON = withObject "Callback" $ \v ->
		Datatext <$> v .: "id" <*> v .: "from"
			<*> v .: "message" <*> v .: "data"

instance Identifiable Callback where
	type Identificator Callback = Text
	ident (Datatext i _ _ _) = i

data Trigger a = Trigger Text Text

instance Persistable (Trigger Notification) where
	type Payload (Trigger Notification) = Trigger Notification
	type Returning (Trigger Notification) = ()
	payload (Trigger cbq_id text) = field "text" text <> field "callback_query_id" cbq_id
	endpoint _ = "answerCallbackQuery"