packages feed

telega 0.1.3 → 0.1.4

raw patch · 22 files changed

+202/−176 lines, 22 filesdep +time

Dependencies added: time

Files

CHANGELOG.md view
@@ -15,6 +15,14 @@ * Rename `Member` datatype to `Moving` * Define `Access Chat Callback` instance * Define `Access From Callback` instance-* Define `Access From Moving` instance+* Define `Access Chat Moving` instance * Define `Access Chat Message` instance * Define `Access From Message` instance++# 0.1.4+* Define `Member` datatype for chat users+* No implicit `Prelude` anymore (NoImplicitPrelude)+* Move HTTP request function into `Internal` module+* Define `Endpoint` typeclass to replace `Capacity`+* Remove `Capacity` classes and theirs instances+* Define `Object` type family
Network/Telegram/API/Bot.hs view
@@ -1,7 +1,7 @@ module Network.Telegram.API.Bot (module Exports) where  import Network.Telegram.API.Bot.Property as Exports-import Network.Telegram.API.Bot.Capacity as Exports import Network.Telegram.API.Bot.Object as Exports+import Network.Telegram.API.Bot.Endpoint as Exports import Network.Telegram.API.Bot.Access as Exports import Network.Telegram.API.Bot.Core as Exports
− Network/Telegram/API/Bot/Capacity.hs
@@ -1,6 +0,0 @@-module Network.Telegram.API.Bot.Capacity (module Exports) where--import Network.Telegram.API.Bot.Capacity.Purgeable as Exports-import Network.Telegram.API.Bot.Capacity.Postable as Exports-import Network.Telegram.API.Bot.Capacity.Editable as Exports-import Network.Telegram.API.Bot.Capacity.Droppable as Exports
− Network/Telegram/API/Bot/Capacity/Droppable.hs
@@ -1,28 +0,0 @@-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
− Network/Telegram/API/Bot/Capacity/Editable.hs
@@ -1,28 +0,0 @@-module Network.Telegram.API.Bot.Capacity.Editable (Editable (..), Substitution) where--import "aeson" Data.Aeson (FromJSON, Value, decode)-import "base" Control.Exception (try)-import "base" Control.Monad (join)-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 Substitution a = r | r -> a--class FromJSON a => Editable a where-	{-# MINIMAL substitution_value, edit_endpoint #-}-	substitution_value :: Substitution a -> Value-	edit_endpoint :: Substitution a -> String--	edit :: Substitution a -> Telegram e a-	edit x = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try-		. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)-			. flip (Wreq.post session) (substitution_value x) $-				"https://api.telegram.org/" <> unpack token <> "/" <> edit_endpoint x
− Network/Telegram/API/Bot/Capacity/Postable.hs
@@ -1,28 +0,0 @@-module Network.Telegram.API.Bot.Capacity.Postable (Postable (..), Initial) where--import "aeson" Data.Aeson (FromJSON, Value, decode)-import "base" Control.Exception (try)-import "base" Control.Monad (join)-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 Initial a = r | r -> a--class FromJSON a => Postable a where-	{-# MINIMAL initial_value, post_endpoint #-}-	initial_value :: Initial a -> Value-	post_endpoint :: Initial a -> String--	post :: Initial a -> Telegram e a-	post x = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try-		. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)-			. flip (Wreq.post session) (initial_value x) $-				"https://api.telegram.org/" <> unpack token <> "/" <> post_endpoint x
− Network/Telegram/API/Bot/Capacity/Purgeable.hs
@@ -1,28 +0,0 @@-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
Network/Telegram/API/Bot/Core.hs view
@@ -1,7 +1,17 @@ module Network.Telegram.API.Bot.Core (Telegram, telegram, ask', Token (..), Ok, result) where  import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "base" Control.Applicative (Applicative ((<*>))) import "base" Control.Exception (SomeException)+import "base" Data.Bool (Bool (True, False))+import "base" Data.Eq (Eq)+import "base" Data.Either (Either)+import "base" Data.Function (flip, (.), ($))+import "base" Data.Functor ((<$>))+import "base" Data.Maybe (Maybe (Just, Nothing))+import "base" Data.Tuple (fst)+import "base" System.IO (IO)+import "base" Text.Show (Show) import "text" Data.Text (Text) import "transformers" Control.Monad.Trans.Reader (ReaderT (runReaderT), ask) import "transformers" Control.Monad.Trans.Except (ExceptT, runExceptT)
+ Network/Telegram/API/Bot/Endpoint.hs view
@@ -0,0 +1,22 @@+module Network.Telegram.API.Bot.Endpoint+	(Endpoint (..), Payload, Drop, Edit, Post, Purge) where++import "aeson" Data.Aeson (FromJSON, Value)+import "base" Data.String (String)++import Network.Telegram.API.Bot.Core (Telegram)+import Network.Telegram.API.Bot.Internal (telegram_request)++type family Payload a = r | r -> a++data Drop a+data Edit a+data Post a+data Purge a++class Endpoint a where+	{-# MINIMAL payload, endpoint #-}+	payload :: Payload a -> Value+	endpoint :: Payload a -> String+	request :: FromJSON r => Payload a -> Telegram e r+	request x = telegram_request (endpoint x) (payload x)
+ Network/Telegram/API/Bot/Internal.hs view
@@ -0,0 +1,25 @@+module Network.Telegram.API.Bot.Internal (telegram_request) where++import "aeson" Data.Aeson (FromJSON, Value, decode)+import "base" Control.Exception (try)+import "base" Control.Monad (Monad ((>>=)), join)+import "base" Data.Function (flip, (.), ($))+import "base" Data.Functor (Functor (fmap), (<$>))+import "base" Data.Maybe (fromJust)+import "base" Data.Semigroup (Semigroup ((<>)))+import "base" Data.String (String)+import "base" Data.Tuple (snd)+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)++telegram_request :: forall a e . FromJSON a => String -> Value -> Telegram e a+telegram_request endpoint payload = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try+	. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)+		. flip (Wreq.post session) payload $ "https://api.telegram.org/" <> unpack token <> "/" <> endpoint
Network/Telegram/API/Bot/Object.hs view
@@ -1,11 +1,26 @@-module Network.Telegram.API.Bot.Object (module Exports) where+module Network.Telegram.API.Bot.Object (module Exports, Object) where  import Network.Telegram.API.Bot.Object.Update as Exports import Network.Telegram.API.Bot.Object.Notification as Exports import Network.Telegram.API.Bot.Object.Moving as Exports import Network.Telegram.API.Bot.Object.Message as Exports+import Network.Telegram.API.Bot.Object.Member as Exports import Network.Telegram.API.Bot.Object.Keyboard as Exports import Network.Telegram.API.Bot.Object.From as Exports import Network.Telegram.API.Bot.Object.Chat as Exports import Network.Telegram.API.Bot.Object.Callback as Exports import Network.Telegram.API.Bot.Object.Button as Exports++import "base" Data.Kind (Constraint)++type family Object (a :: *) :: Constraint+type instance Object Update = ()+type instance Object Notification = ()+type instance Object Moving = ()+type instance Object Message = ()+type instance Object Member = ()+type instance Object Keyboard = ()+type instance Object From = ()+type instance Object Chat = ()+type instance Object Callback = ()+type instance Object Button = ()
Network/Telegram/API/Bot/Object/Button.hs view
@@ -3,7 +3,12 @@ import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON) 	, Object, Value (Object), object, withObject, (.:), (.:?), (.=)) import "aeson" Data.Aeson.Types (Parser)-import "base" Control.Applicative (Alternative ((<|>)))+import "base" Control.Applicative (Applicative (pure, (<*>)), Alternative ((<|>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function ((.), ($))+import "base" Data.Functor (Functor (fmap), (<$>))+import "base" Data.Maybe (Maybe, maybe)+import "base" Text.Show (Show) import "text" Data.Text (Text)  data Button = Button Text Pressed deriving Show@@ -23,7 +28,7 @@ instance FromJSON Pressed where 	parseJSON = withObject "Pressed" $ \v -> 		(is_open v <|> is_callback v) >>= maybe-			(fail "Action on pressing isn't set") return where+			(fail "Action on pressing isn't set") pure where  		is_open, is_callback :: Object -> Parser (Maybe Pressed) 		is_open v = (fmap . fmap) Open $ v .:? "url"
Network/Telegram/API/Bot/Object/Callback.hs view
@@ -1,6 +1,10 @@ module Network.Telegram.API.Bot.Object.Callback (Callback (..)) where  import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Data.Function (flip, ($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show) import "text" Data.Text (Text)  import Network.Telegram.API.Bot.Access (Access (access))@@ -15,7 +19,9 @@ 		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"  instance Access Chat Callback where-	access f (Datatext cq_id msg dttxt) = flip (Datatext cq_id) dttxt <$> access f msg+	access f (Datatext cq_id msg dttxt) = flip+		(Datatext cq_id) dttxt <$> access f msg  instance Access From Callback where-	access f (Datatext cq_id msg dttxt) = flip (Datatext cq_id) dttxt <$> access f msg+	access f (Datatext cq_id msg dttxt) = flip+		(Datatext cq_id) dttxt <$> access f msg
Network/Telegram/API/Bot/Object/Chat.hs view
@@ -2,6 +2,11 @@  import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "base" Data.Int (Int64)+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show) import "text" Data.Text (Text)  import Network.Telegram.API.Bot.Property.Identifiable
Network/Telegram/API/Bot/Object/From.hs view
@@ -3,7 +3,15 @@  import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?)) import "aeson" Data.Aeson.Types (Parser)-import "base" Data.Bool (bool)+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Control.Monad (Monad ((>>=)))+import "base" Data.Bool (Bool (False), bool)+import "base" Data.Eq (Eq ((==)))+import "base" Data.Int (Int)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Data.Maybe (Maybe)+import "base" Text.Show (Show) import "lens" Control.Lens (Lens') import "text" Data.Text (Text) 
Network/Telegram/API/Bot/Object/Keyboard.hs view
@@ -1,16 +1,16 @@-module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..), Substitution) where+module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..), Payload) where  import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))-import "base" Data.Int (Int64)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Data.Int (Int, Int64)+import "base" Text.Show (Show) -import Network.Telegram.API.Bot.Capacity.Editable-	(Substitution, Editable (substitution_value, edit_endpoint))+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Edit) import Network.Telegram.API.Bot.Object.Button (Button)  data Keyboard = Inline [[Button]] deriving Show -type instance Substitution Keyboard = (Int64, Int, Keyboard)- instance FromJSON Keyboard where 	parseJSON = withObject "Inline" $ \v -> 		Inline <$> v .: "inline_keyboard"@@ -19,7 +19,9 @@ 	toJSON (Inline buttons) = object 		["inline_keyboard" .= buttons] -instance Editable Keyboard where-	substitution_value (chat_id, message_id, reply_markup) = object+type instance Payload (Edit Keyboard) = (Int64, Int, Keyboard)++instance Endpoint (Edit Keyboard) where+	payload (chat_id, message_id, reply_markup) = object 		["chat_id" .= chat_id, "message_id" .= message_id, "reply_markup" .= reply_markup]-	edit_endpoint _ = "editMessageReplyMarkup"+	endpoint _ = "editMessageReplyMarkup"
+ Network/Telegram/API/Bot/Object/Member.hs view
@@ -0,0 +1,31 @@+module Network.Telegram.API.Bot.Object.Member (Member (..)) where++import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show)+import "text" Data.Text (Text)+import "time" Data.Time.Clock.POSIX (POSIXTime)++import Network.Telegram.API.Bot.Object.From (From)++data Member+	= Creator From+	| Administrator From+	| Member From+	| Restricted From POSIXTime+	-- | Left From+	| Kicked From POSIXTime+	deriving Show++instance FromJSON Member where+	parseJSON = withObject "Member" $ \v -> v .: "status" >>= \case+		("creator" :: Text) -> Creator <$> v .: "user"+		("administrator" :: Text) -> Administrator <$> v .: "user"+		("member" :: Text) -> Member <$> v .: "user"+		("restricted" :: Text) -> Restricted <$> v .: "user" <*> v .: "until_date"+		-- ("left" :: Text) -> Left <$> v .: "user"+		("kicked" :: Text) -> Kicked <$> v .: "user" <*> v.: "until_date"+		_ -> fail "Status of chat member is not defined"
Network/Telegram/API/Bot/Object/Message.hs view
@@ -1,22 +1,26 @@ module Network.Telegram.API.Bot.Object.Message-	(Message (..), Initial, Marking) where+	(Message (..), Payload) where  import "aeson" Data.Aeson (FromJSON (parseJSON), object, withArray, withObject, (.:), (.=)) import "aeson" Data.Aeson.Types (Object, Parser, Value)-import "base" Control.Applicative (Alternative ((<|>), empty))-import "base" Data.Int (Int64)+import "base" Control.Applicative (Applicative ((<*>)), Alternative (empty, (<|>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function ((.), ($))+import "base" Data.Functor ((<$>))+import "base" Data.Foldable (Foldable (foldr))+import "base" Data.Int (Int, Int64)+import "base" Data.Maybe (Maybe (Just, Nothing))+import "base" Text.Show (Show)+import "base" Prelude ((+)) import "text" Data.Text (Text)  import qualified "text" Data.Text as T (drop, take)  import Network.Telegram.API.Bot.Access (Access (access))+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Post, Purge) import Network.Telegram.API.Bot.Object.Chat (Chat) import Network.Telegram.API.Bot.Object.From (From) import Network.Telegram.API.Bot.Object.Keyboard (Keyboard)-import Network.Telegram.API.Bot.Capacity.Postable-	(Initial, Postable (initial_value, post_endpoint))-import Network.Telegram.API.Bot.Capacity.Purgeable-	(Marking, Purgeable (marking_value, purge_endpoint)) import Network.Telegram.API.Bot.Property.Identifiable 	(Identifiable (identificator), Identificator) @@ -25,8 +29,6 @@ 	| Command Int Chat From Text 	deriving Show -type instance Initial Message = (Int64, Text, Maybe Keyboard)-type instance Marking Message = (Int64, Int) type instance Identificator Message = Int  instance Identifiable Message where@@ -56,18 +58,6 @@ 		extract_command :: Object -> (Int, Int) -> Parser Text 		extract_command v (ofs, len) = (T.take len . T.drop (ofs + 1)) <$> v .: "text" -instance Postable Message where-	initial_value (chat_id, text, Nothing) =-		object ["chat_id" .= chat_id, "text" .= text]-	initial_value (chat_id, text, Just kb) =-		object ["chat_id" .= chat_id, "text" .= text, "reply_markup" .= kb]-	post_endpoint _ = "sendMessage"--instance Purgeable Message where-	marking_value (chat_id, message_id) =-		object ["chat_id" .= chat_id, "message_id" .= message_id]-	purge_endpoint _ = "deleteMessage"- instance Access Chat Message where 	access f (Textual msg_id chat from txt) = (\chat' -> Textual msg_id chat' from txt) <$> f chat 	access f (Command msg_id chat from cmd) = (\chat' -> Command msg_id chat' from cmd) <$> f chat@@ -75,3 +65,15 @@ instance Access From Message where 	access f (Textual msg_id chat from txt) = (\from' -> Textual msg_id chat from' txt) <$> f from 	access f (Command msg_id chat from cmd) = (\from' -> Command msg_id chat from' cmd) <$> f from++type instance Payload (Post Message) = (Int64, Text, Maybe Keyboard)+type instance Payload (Purge Message) = (Int64, Int)++instance Endpoint (Post Message) where+	payload (chat_id, text, Nothing) = object ["chat_id" .= chat_id, "text" .= text]+	payload (chat_id, text, Just kb) = object ["chat_id" .= chat_id, "text" .= text, "reply_markup" .= kb]+	endpoint _ = "sendMessage"++instance Endpoint (Purge Message) where+	payload (chat_id, message_id) = object ["chat_id" .= chat_id, "message_id" .= message_id]+	endpoint _ = "deleteMessage"
Network/Telegram/API/Bot/Object/Moving.hs view
@@ -2,7 +2,10 @@  import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "aeson" Data.Aeson.Types (Object, Parser)-import "base" Control.Applicative (Alternative ((<|>)))+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show)  import Network.Telegram.API.Bot.Access (Access (access)) import Network.Telegram.API.Bot.Object.Chat (Chat)
Network/Telegram/API/Bot/Object/Notification.hs view
@@ -1,16 +1,15 @@-module Network.Telegram.API.Bot.Object.Notification (Notification) where+module Network.Telegram.API.Bot.Object.Notification (Notification, Payload) where  import "aeson" Data.Aeson (object, (.=)) import "text" Data.Text (Text) -import Network.Telegram.API.Bot.Capacity.Droppable-	(Drop, Droppable (drop_value, drop_endpoint))+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Drop)  data Notification -type instance Drop Notification = (Text, Text)+type instance Payload (Drop Notification) = (Text, Text) -instance Droppable Notification where-	drop_value (cbq_id, text) =-		object ["callback_query_id" .= cbq_id, "text" .= text]-	drop_endpoint _ = "answerCallbackQuery"+instance Endpoint (Drop Notification) where+	payload (cbq_id, text) = object+		["callback_query_id" .= cbq_id, "text" .= text]+	endpoint _ = "answerCallbackQuery"
Network/Telegram/API/Bot/Object/Update.hs view
@@ -2,7 +2,11 @@  import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "aeson" Data.Aeson.Types (Object, Parser)-import "base" Control.Applicative (Alternative ((<|>)))+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Data.Int (Int)+import "base" Text.Show (Show)  import Network.Telegram.API.Bot.Access (Access (access)) import Network.Telegram.API.Bot.Object.Callback (Callback)
telega.cabal view
@@ -1,5 +1,5 @@ name:                telega-version:             0.1.3+version:             0.1.4 synopsis:            Telegram Bot API binding description:         High-level bindings, typed entities, inline mode only homepage:            https://github.com/iokasimov/telega@@ -22,26 +22,25 @@     Network.Telegram.API.Bot     Network.Telegram.API.Bot.Core     Network.Telegram.API.Bot.Access+    Network.Telegram.API.Bot.Endpoint     Network.Telegram.API.Bot.Object     Network.Telegram.API.Bot.Object.Chat     Network.Telegram.API.Bot.Object.From     Network.Telegram.API.Bot.Object.Button     Network.Telegram.API.Bot.Object.Callback     Network.Telegram.API.Bot.Object.Keyboard-    Network.Telegram.API.Bot.Object.Moving+    Network.Telegram.API.Bot.Object.Member     Network.Telegram.API.Bot.Object.Message+    Network.Telegram.API.Bot.Object.Moving     Network.Telegram.API.Bot.Object.Notification     Network.Telegram.API.Bot.Object.Update-    Network.Telegram.API.Bot.Capacity-    Network.Telegram.API.Bot.Capacity.Droppable-    Network.Telegram.API.Bot.Capacity.Editable-    Network.Telegram.API.Bot.Capacity.Postable-    Network.Telegram.API.Bot.Capacity.Purgeable     Network.Telegram.API.Bot.Property     Network.Telegram.API.Bot.Property.Identifiable-  build-depends: base == 4.*, transformers, lens, aeson, text, http-client, wreq-  default-extensions: DataKinds, LambdaCase, OverloadedStrings,-    MultiParamTypeClasses, PackageImports, ScopedTypeVariables,+  other-modules:+    Network.Telegram.API.Bot.Internal+  build-depends: base == 4.*, transformers, lens, aeson, text, time, http-client, wreq+  default-extensions: DataKinds, LambdaCase, OverloadedStrings, NoImplicitPrelude,+    FlexibleInstances, MultiParamTypeClasses, PackageImports, ScopedTypeVariables,     TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators   default-language: Haskell2010   ghc-options: -Wall -fno-warn-tabs