packages feed

telega 0.1.5 → 0.1.6

raw patch · 25 files changed

+332/−288 lines, 25 files

Files

CHANGELOG.md view
@@ -35,3 +35,14 @@ * Use `UndecidableInstances` and `UndecidableSuperClasses` to use `Object` type family * Replace `Access` module with `Accessible` `Property` * Replace `Endpoint` module with `Persistable` `Property`++# 0.1.6+* Split `Message` on `Message` and `Content` datatypes+* Add `Forward` constructor to `Message` datatype+* Combine `Chat` and `From` objects into `Origin` datatype+* Put `Content`, `From` and `Origin` objects into `Message` submodule+* Put `Button` object into `Keyboard` submodule+* Put `Notification` object into `Callback` submodule+* Put `Keyboard` submodule into `Message` submodule+* Put `Callback`, `Message` and `Moving` modules into `Update` submodule+* Rename `From` to `Sender` and move it from `Message` and `Update` submodules
Network/Telegram/API/Bot/Object.hs view
@@ -1,26 +1,20 @@ 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.Sender 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 Sender = () 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 Content = ()+type instance Object Origin = () type instance Object Callback = () type instance Object Button = ()
− Network/Telegram/API/Bot/Object/Button.hs
@@ -1,35 +0,0 @@-module Network.Telegram.API.Bot.Object.Button (Button (..), Pressed (..)) where--import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)-	, Object, Value (Object), object, withObject, (.:), (.:?), (.=))-import "aeson" Data.Aeson.Types (Parser)-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--instance FromJSON Button where-	parseJSON = withObject "Button" $ \v ->-		Button <$> v .: "text" <*> parseJSON (Object v)--instance ToJSON Button where-	toJSON (Button text (Open url)) = object-		["text" .= text, "url" .= url]-	toJSON (Button text (Callback cbd)) = object-		["text" .= text, "callback_data" .= cbd]--data Pressed = Open Text | Callback Text deriving Show--instance FromJSON Pressed where-	parseJSON = withObject "Pressed" $ \v ->-		(is_open v <|> is_callback v) >>= maybe-			(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"-		is_callback v = (fmap . fmap) Callback $ v .:? "callback_data"
− Network/Telegram/API/Bot/Object/Callback.hs
@@ -1,16 +0,0 @@-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 (($))-import "base" Data.Functor ((<$>))-import "base" Text.Show (Show)-import "text" Data.Text (Text)--import Network.Telegram.API.Bot.Object.Message (Message)--data Callback = Datatext Text Message Text deriving Show--instance FromJSON Callback where-	parseJSON = withObject "Callback" $ \v ->-		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
− Network/Telegram/API/Bot/Object/Chat.hs
@@ -1,25 +0,0 @@-module Network.Telegram.API.Bot.Object.Chat (Chat (..)) where--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)--data Chat-	= Private Int64-	| Group Int64 Text-	| Supergroup Int64 Text-	| Channel Int64 Text-	deriving Show--instance FromJSON Chat where-	parseJSON = withObject "Chat" $ \v -> v .: "type" >>= \case-		("private" :: Text) -> Private <$> v .: "id"-		("group" :: Text) -> Group <$> v .: "id" <*> v .: "title"-		("supergroup" :: Text) -> Supergroup <$> v .: "id" <*> v .: "title"-		("channel" :: Text) -> Channel <$> v .: "id" <*> v .: "title"-		_ -> fail "Type of chat is not defined"
− Network/Telegram/API/Bot/Object/From.hs
@@ -1,51 +0,0 @@-module Network.Telegram.API.Bot.Object.From-	(From (..), nickname, firstname, lastname) where--import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?))-import "aeson" Data.Aeson.Types (Parser)-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)--data From-	= Bot Int (Maybe Text) Text (Maybe Text) (Maybe Text)-	| User Int (Maybe Text) Text (Maybe Text) (Maybe Text)-	deriving Show--instance Eq From where-	Bot i _ _ _ _ == Bot i' _ _ _ _ = i == i'-	User i _ _ _ _ == User i' _ _ _ _ = i == i'-	_ == _ = False--type Whom = Int -> Maybe Text -> Text -> Maybe Text -> Maybe Text -> From--instance FromJSON From where-	parseJSON = withObject "From" $ \v -> v .: "is_bot"-		>>= bool (from v User) (from v Bot) where--		from :: Object -> Whom -> Parser From-		from v f = f <$> v .: "id"-			<*> v .:? "username"-			<*> v .: "first_name"-			<*> v .:? "last_name"-			<*> v .:? "language_code"--nickname :: Lens' From (Maybe Text)-nickname f (Bot uid nn fn ln lng) = (\nn' -> Bot uid nn' fn ln lng) <$> f nn-nickname f (User uid nn fn ln lng) = (\nn' -> User uid nn' fn ln lng) <$> f nn--firstname :: Lens' From Text-firstname f (Bot uid nn fn ln lng) = (\fn' -> Bot uid nn fn' ln lng) <$> f fn-firstname f (User uid nn fn ln lng) = (\fn' -> User uid nn fn' ln lng) <$> f fn--lastname :: Lens' From (Maybe Text)-lastname f (Bot uid nn fn ln lng) = (\ln' -> Bot uid nn fn ln' lng) <$> f ln-lastname f (User uid nn fn ln lng) = (\ln' -> User uid nn fn ln' lng) <$> f ln
− Network/Telegram/API/Bot/Object/Keyboard.hs
@@ -1,18 +0,0 @@-module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..)) where--import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))-import "base" Data.Function (($))-import "base" Data.Functor ((<$>))-import "base" Text.Show (Show)--import Network.Telegram.API.Bot.Object.Button (Button)--data Keyboard = Inline [[Button]] deriving Show--instance FromJSON Keyboard where-	parseJSON = withObject "Inline" $ \v ->-		Inline <$> v .: "inline_keyboard"--instance ToJSON Keyboard where-	toJSON (Inline buttons) = object-		["inline_keyboard" .= buttons]
Network/Telegram/API/Bot/Object/Member.hs view
@@ -9,15 +9,15 @@ import "text" Data.Text (Text) import "time" Data.Time.Clock.POSIX (POSIXTime) -import Network.Telegram.API.Bot.Object.From (From)+import Network.Telegram.API.Bot.Object.Sender (Sender)  data Member-	= Creator From-	| Administrator From-	| Member From-	| Restricted From POSIXTime-	| Left From-	| Kicked From POSIXTime+	= Creator Sender+	| Administrator Sender+	| Member Sender+	| Restricted Sender POSIXTime+	| Left Sender+	| Kicked Sender POSIXTime 	deriving Show  instance FromJSON Member where
− Network/Telegram/API/Bot/Object/Message.hs
@@ -1,44 +0,0 @@-module Network.Telegram.API.Bot.Object.Message (Message (..)) where--import "aeson" Data.Aeson (FromJSON (parseJSON), withArray, withObject, (.:))-import "aeson" Data.Aeson.Types (Object, Parser, Value)-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)-import "base" Text.Show (Show)-import "base" Prelude ((+))-import "text" Data.Text (Text, drop, take)--import Network.Telegram.API.Bot.Object.Chat (Chat)-import Network.Telegram.API.Bot.Object.From (From)--data Message-	= Textual Int Chat From Text-	| Command Int Chat From Text-	deriving Show--instance FromJSON Message where-	parseJSON = withObject "Message" $ \v -> command v <|> textual v where--		command :: Object -> Parser Message-		command v = Command <$> v .: "message_id" <*> v .: "chat" <*> v .: "from"-			<*> (v .: "entities" >>= command_entity >>= extract_command v)--		textual :: Object -> Parser Message-		textual v = Textual <$> v .: "message_id"-			<*> v .: "chat" <*> v .: "from" <*> v .: "text"--		command_entity :: Value -> Parser (Int, Int)-		command_entity = withArray "Command entity" $ \a ->-			foldr ((<|>) . entity) empty a where--			entity :: Value -> Parser (Int, Int)-			entity = withObject "Command entity" $ \v -> v .: "type" >>= \case-				("bot_command" :: Text) -> (,) <$> v .: "offset" <*> v .: "length"-				_ -> fail "It's not a bot command"--		extract_command :: Object -> (Int, Int) -> Parser Text-		extract_command v (ofs, len) = (take len . drop (ofs + 1)) <$> v .: "text"
− Network/Telegram/API/Bot/Object/Moving.hs
@@ -1,22 +0,0 @@-module Network.Telegram.API.Bot.Object.Moving (Moving (..)) where--import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))-import "aeson" Data.Aeson.Types (Object, Parser)-import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))-import "base" Data.Function (($))-import "base" Data.Functor ((<$>))-import "base" Text.Show (Show)--import Network.Telegram.API.Bot.Object.Chat (Chat)-import Network.Telegram.API.Bot.Object.From (From)--data Moving = Gone Chat From | Joined Chat [From] deriving Show--instance FromJSON Moving where-	parseJSON = withObject "Moving" $ \v -> gone v <|> joined v where--		gone :: Object -> Parser Moving-		gone v = Gone <$> v .: "chat" <*> v .: "left_chat_member"--		joined :: Object -> Parser Moving-		joined v = Joined <$> v .: "chat" <*> v .: "new_chat_members"
− Network/Telegram/API/Bot/Object/Notification.hs
@@ -1,3 +0,0 @@-module Network.Telegram.API.Bot.Object.Notification (Notification) where--data Notification
+ Network/Telegram/API/Bot/Object/Sender.hs view
@@ -0,0 +1,50 @@+module Network.Telegram.API.Bot.Object.Sender (Sender (..), nickname, firstname, lastname) where++import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?))+import "aeson" Data.Aeson.Types (Parser)+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)++data Sender+	= Bot Int (Maybe Text) Text (Maybe Text) (Maybe Text)+	| User Int (Maybe Text) Text (Maybe Text) (Maybe Text)+	deriving Show++instance Eq Sender where+	Bot i _ _ _ _ == Bot i' _ _ _ _ = i == i'+	User i _ _ _ _ == User i' _ _ _ _ = i == i'+	_ == _ = False++type Whom = Int -> Maybe Text -> Text -> Maybe Text -> Maybe Text -> Sender++instance FromJSON Sender where+	parseJSON = withObject "Sender" $ \v -> v .: "is_bot"+		>>= bool (sender v User) (sender v Bot) where++		sender :: Object -> Whom -> Parser Sender+		sender v f = f <$> v .: "id"+			<*> v .:? "username"+			<*> v .: "first_name"+			<*> v .:? "last_name"+			<*> v .:? "language_code"++nickname :: Lens' Sender (Maybe Text)+nickname f (Bot uid nn fn ln lng) = (\nn' -> Bot uid nn' fn ln lng) <$> f nn+nickname f (User uid nn fn ln lng) = (\nn' -> User uid nn' fn ln lng) <$> f nn++firstname :: Lens' Sender Text+firstname f (Bot uid nn fn ln lng) = (\fn' -> Bot uid nn fn' ln lng) <$> f fn+firstname f (User uid nn fn ln lng) = (\fn' -> User uid nn fn' ln lng) <$> f fn++lastname :: Lens' Sender (Maybe Text)+lastname f (Bot uid nn fn ln lng) = (\ln' -> Bot uid nn fn ln' lng) <$> f ln+lastname f (User uid nn fn ln lng) = (\ln' -> User uid nn fn ln' lng) <$> f ln
Network/Telegram/API/Bot/Object/Update.hs view
@@ -1,5 +1,9 @@-module Network.Telegram.API.Bot.Object.Update (Update (..)) where+module Network.Telegram.API.Bot.Object.Update (Update (..), module Exports) where +import Network.Telegram.API.Bot.Object.Update.Callback as Exports+import Network.Telegram.API.Bot.Object.Update.Message as Exports+import Network.Telegram.API.Bot.Object.Update.Moving as Exports+ import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "aeson" Data.Aeson.Types (Object, Parser) import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))@@ -8,9 +12,9 @@ import "base" Data.Int (Int) import "base" Text.Show (Show) -import Network.Telegram.API.Bot.Object.Callback (Callback)-import Network.Telegram.API.Bot.Object.Moving (Moving)-import Network.Telegram.API.Bot.Object.Message (Message)+import Network.Telegram.API.Bot.Object.Update.Callback (Callback)+import Network.Telegram.API.Bot.Object.Update.Message (Message)+import Network.Telegram.API.Bot.Object.Update.Moving (Moving)  data Update 	= Query Int Callback
+ Network/Telegram/API/Bot/Object/Update/Callback.hs view
@@ -0,0 +1,18 @@+module Network.Telegram.API.Bot.Object.Update.Callback (Callback (..), module Exports) where++import Network.Telegram.API.Bot.Object.Update.Callback.Notification as Exports++import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show)+import "text" Data.Text (Text)++import Network.Telegram.API.Bot.Object.Update.Message (Message)++data Callback = Datatext Text Message Text deriving Show++instance FromJSON Callback where+	parseJSON = withObject "Callback" $ \v ->+		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
+ Network/Telegram/API/Bot/Object/Update/Callback/Notification.hs view
@@ -0,0 +1,3 @@+module Network.Telegram.API.Bot.Object.Update.Callback.Notification (Notification) where++data Notification
+ Network/Telegram/API/Bot/Object/Update/Message.hs view
@@ -0,0 +1,49 @@+module Network.Telegram.API.Bot.Object.Update.Message (Message (..), module Exports) where++import Network.Telegram.API.Bot.Object.Update.Message.Content as Exports+import Network.Telegram.API.Bot.Object.Update.Message.Keyboard as Exports+import Network.Telegram.API.Bot.Object.Update.Message.Origin as Exports++import "aeson" Data.Aeson (FromJSON (parseJSON), Value (Object), withObject, (.:))+import "aeson" Data.Aeson.Types (Object, Parser)+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Data.Int (Int)+import "base" Text.Show (Show)+import "text" Data.Text (Text)++import Network.Telegram.API.Bot.Object.Update.Message.Content (Content)+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))++data Message+	= Direct Int Origin Content+	| Forward Int Origin Content+	deriving Show++instance FromJSON Message where+	parseJSON = withObject "Message" $ \v ->+		forward_from_channel v <|> forward_from_chat v <|> direct v where++		forward_from_channel :: Object -> Parser Message+		forward_from_channel v = Forward <$> v .: "forward_from_message_id"+			<*> (v .: "forward_from_chat" >>= channel) <*> parseJSON (Object v) where++			channel :: Value -> Parser Origin+			channel = withObject "Channel" $ \c -> Channel <$> c .: "id" <*> c .: "title"++		forward_from_chat :: Object -> Parser Message+		forward_from_chat v = Forward <$> v .: "message_id"+			<*> (v .: "chat" >>= chat) <*> parseJSON (Object v) where++			chat :: Value -> Parser Origin+			chat = withObject "Origin" $ \c -> c .: "type" >>= \case+				("private" :: Text) -> Private <$> c .: "id" <*> v .: "forward_from"+				("group" :: Text) -> Group <$> c .: "id" <*> c .: "title" <*> v .: "forward_from"+				("supergroup" :: Text) -> Supergroup <$> c .: "id" <*> c .: "title" <*> v .: "forward_from"+				_ -> fail "Type of chat is not defined"++		direct :: Object -> Parser Message+		direct v = Direct <$> v .: "message_id"+			<*> parseJSON (Object v) <*> parseJSON (Object v)
+ Network/Telegram/API/Bot/Object/Update/Message/Content.hs view
@@ -0,0 +1,39 @@+module Network.Telegram.API.Bot.Object.Update.Message.Content (Content (..)) where++import "aeson" Data.Aeson (FromJSON (parseJSON), withArray, withObject, (.:))+import "aeson" Data.Aeson.Types (Object, Parser, Value)+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)+import "base" Text.Show (Show)+import "base" Prelude ((+))+import "text" Data.Text (Text, drop, take)++data Content+	= Textual Text+	| Command Text+	deriving Show++instance FromJSON Content where+	parseJSON = withObject "Content" $ \v -> command v <|> textual v where++		command :: Object -> Parser Content+		command v = Command <$> (v .: "entities" >>= command_entity >>= extract_command v)++		textual :: Object -> Parser Content+		textual v = Textual <$> v .: "text"++		command_entity :: Value -> Parser (Int, Int)+		command_entity = withArray "Command content" $ \a ->+			foldr ((<|>) . entity) empty a where++			entity :: Value -> Parser (Int, Int)+			entity = withObject "Command entity" $ \v -> v .: "type" >>= \case+				("bot_command" :: Text) -> (,) <$> v .: "offset" <*> v .: "length"+				_ -> fail "It's not a bot command"++		extract_command :: Object -> (Int, Int) -> Parser Text+		extract_command v (ofs, len) = (take len . drop (ofs + 1)) <$> v .: "text"
+ Network/Telegram/API/Bot/Object/Update/Message/Keyboard.hs view
@@ -0,0 +1,20 @@+module Network.Telegram.API.Bot.Object.Update.Message.Keyboard (Keyboard (..), module Exports) where++import Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button as Exports++import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show)++import Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button (Button)++data Keyboard = Inline [[Button]] deriving Show++instance FromJSON Keyboard where+	parseJSON = withObject "Inline" $ \v ->+		Inline <$> v .: "inline_keyboard"++instance ToJSON Keyboard where+	toJSON (Inline buttons) = object+		["inline_keyboard" .= buttons]
+ Network/Telegram/API/Bot/Object/Update/Message/Keyboard/Button.hs view
@@ -0,0 +1,35 @@+module Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button (Button (..), Pressed (..)) where++import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)+	, Object, Value (Object), object, withObject, (.:), (.:?), (.=))+import "aeson" Data.Aeson.Types (Parser)+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++instance FromJSON Button where+	parseJSON = withObject "Button" $ \v ->+		Button <$> v .: "text" <*> parseJSON (Object v)++instance ToJSON Button where+	toJSON (Button text (Open url)) = object+		["text" .= text, "url" .= url]+	toJSON (Button text (Callback cbd)) = object+		["text" .= text, "callback_data" .= cbd]++data Pressed = Open Text | Callback Text deriving Show++instance FromJSON Pressed where+	parseJSON = withObject "Pressed" $ \v ->+		(is_open v <|> is_callback v) >>= maybe+			(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"+		is_callback v = (fmap . fmap) Callback $ v .:? "callback_data"
+ Network/Telegram/API/Bot/Object/Update/Message/Origin.hs view
@@ -0,0 +1,31 @@+module Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (..)) where++import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "aeson" Data.Aeson.Types (Object, Parser, Value)+import "base" Control.Applicative (Applicative ((<*>)))+import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Data.Int (Int64)+import "base" Text.Show (Show)+import "text" Data.Text (Text)++import Network.Telegram.API.Bot.Object.Sender (Sender)++data Origin+	= Private Int64 Sender+	| Group Int64 Text Sender+	| Supergroup Int64 Text Sender+	| Channel Int64 Text+	deriving Show++instance FromJSON Origin where+	parseJSON = withObject "Message" $ \v -> v .: "chat" >>= chat v where++		chat :: Object -> Value -> Parser Origin+		chat v = withObject "Origin" $ \c -> c .: "type" >>= \case+			("private" :: Text) -> Private <$> c .: "id" <*> v .: "from"+			("group" :: Text) -> Group <$> c .: "id" <*> c .: "title" <*> v .: "from"+			("supergroup" :: Text) -> Supergroup <$> c .: "id" <*> c .: "title" <*> v .: "from"+			("channel" :: Text) -> Channel <$> c .: "id" <*> c .: "title"+			_ -> fail "Type of chat is not defined"
+ Network/Telegram/API/Bot/Object/Update/Moving.hs view
@@ -0,0 +1,21 @@+module Network.Telegram.API.Bot.Object.Update.Moving (Moving (..)) where++import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))+import "aeson" Data.Aeson.Types (Object, Parser)+import "base" Control.Applicative (Alternative ((<|>)))+import "base" Data.Function (($))+import "base" Data.Functor ((<$>))+import "base" Text.Show (Show)++import Network.Telegram.API.Bot.Object.Sender (Sender)++data Moving = Gone Sender | Joined [Sender] deriving Show++instance FromJSON Moving where+	parseJSON = withObject "Moving" $ \v -> gone v <|> joined v where++		gone :: Object -> Parser Moving+		gone v = Gone <$> v .: "left_chat_member"++		joined :: Object -> Parser Moving+		joined v = Joined <$> v .: "new_chat_members"
Network/Telegram/API/Bot/Property/Accessible.hs view
@@ -5,37 +5,22 @@ import "lens" Control.Lens (Lens')  import Network.Telegram.API.Bot.Object (Object)-import Network.Telegram.API.Bot.Object.Callback (Callback (Datatext))-import Network.Telegram.API.Bot.Object.Chat (Chat)-import Network.Telegram.API.Bot.Object.From (From)-import Network.Telegram.API.Bot.Object.Message (Message (Textual, Command))-import Network.Telegram.API.Bot.Object.Moving (Moving (Gone, Joined))-import Network.Telegram.API.Bot.Object.Update (Update (Query, Membership, Incoming))+import Network.Telegram.API.Bot.Object.Update.Callback (Callback (Datatext))+import Network.Telegram.API.Bot.Object.Update.Message (Message (Direct, Forward))+import Network.Telegram.API.Bot.Object.Update.Message.Content (Content)+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin)  class Object source => Accessible target source where 	access :: Lens' source target -instance Accessible Chat Callback where-	access f (Datatext cq_id msg dttxt) = flip-		(Datatext cq_id) dttxt <$> access f msg--instance Accessible 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--instance Accessible Chat Moving where-	access f (Gone chat from) = (\chat' -> Gone chat' from) <$> f chat-	access f (Joined chat froms) = (\chat' -> Joined chat' froms) <$> f chat--instance Accessible Chat Update where-	access f (Incoming upd_id msg) = Incoming upd_id <$> access f msg-	access f (Query upd_id cb) = Query upd_id <$> access f cb-	access f (Membership upd_id mmb) = Membership upd_id <$> access f mmb+instance Accessible Content Message where+	access f (Direct msg_id origin content) = (\content' -> Direct msg_id origin content') <$> f content+	access f (Forward msg_id origin content) = (\content' -> Forward msg_id origin content') <$> f content -instance Accessible From Callback where+instance Accessible Origin Callback where 	access f (Datatext cq_id msg dttxt) = flip 		(Datatext cq_id) dttxt <$> access f msg -instance Accessible 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+instance Accessible Origin Message where+	access f (Direct msg_id origin content) = (\origin' -> Direct msg_id origin' content) <$> f origin+	access f (Forward msg_id origin content) = (\origin' -> Forward msg_id origin' content) <$> f origin
Network/Telegram/API/Bot/Property/Identifiable.hs view
@@ -3,10 +3,10 @@ import "base" Data.Int (Int, Int64)  import Network.Telegram.API.Bot.Object (Object)-import Network.Telegram.API.Bot.Object.Chat (Chat (Private, Group, Supergroup, Channel))-import Network.Telegram.API.Bot.Object.From (From (Bot, User))-import Network.Telegram.API.Bot.Object.Message (Message (Textual, Command)) import Network.Telegram.API.Bot.Object.Update (Update (Query, Membership, Incoming))+import Network.Telegram.API.Bot.Object.Update.Message (Message (Direct, Forward))+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))+import Network.Telegram.API.Bot.Object.Sender (Sender (Bot, User))  type family Identificator o = i @@ -14,24 +14,24 @@ 	{-# MINIMAL identificator #-} 	identificator :: o -> Identificator o -type instance Identificator Chat = Int64-type instance Identificator From = Int type instance Identificator Message = Int+type instance Identificator Origin = Int64+type instance Identificator Sender = Int type instance Identificator Update = Int -instance Identifiable Chat where-	identificator (Private i) = i-	identificator (Group i _) = i-	identificator (Supergroup i _) = i+instance Identifiable Message where+	identificator (Direct i _ _) = i+	identificator (Forward i _ _) = i++instance Identifiable Origin where+	identificator (Private i _) = i+	identificator (Group i _ _) = i+	identificator (Supergroup i _ _) = i 	identificator (Channel i _) = i -instance Identifiable From where+instance Identifiable Sender where 	identificator (Bot i _ _ _ _) = i 	identificator (User i _ _ _ _) = i--instance Identifiable Message where-	identificator (Textual i _ _ _) = i-	identificator (Command i _ _ _) = i  instance Identifiable Update where 	identificator (Query i _) = i
Network/Telegram/API/Bot/Property/Persistable.hs view
@@ -18,10 +18,7 @@ import "wreq" Network.Wreq.Session (post)  import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)-import Network.Telegram.API.Bot.Object (Object)-import Network.Telegram.API.Bot.Object.Keyboard (Keyboard)-import Network.Telegram.API.Bot.Object.Message (Message)-import Network.Telegram.API.Bot.Object.Notification (Notification)+import Network.Telegram.API.Bot.Object (Keyboard, Notification, Message, Object)  data Capacity = Post | Edit | Purge 
telega.cabal view
@@ -1,5 +1,5 @@ name:                telega-version:             0.1.5+version:             0.1.6 synopsis:            Telegram Bot API binding description:         High-level bindings, typed entities, inline mode only homepage:            https://github.com/iokasimov/telega@@ -22,16 +22,17 @@     Network.Telegram.API.Bot     Network.Telegram.API.Bot.Core     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.Member-    Network.Telegram.API.Bot.Object.Message-    Network.Telegram.API.Bot.Object.Moving-    Network.Telegram.API.Bot.Object.Notification+    Network.Telegram.API.Bot.Object.Sender     Network.Telegram.API.Bot.Object.Update+    Network.Telegram.API.Bot.Object.Update.Callback+    Network.Telegram.API.Bot.Object.Update.Callback.Notification+    Network.Telegram.API.Bot.Object.Update.Message+    Network.Telegram.API.Bot.Object.Update.Message.Content+    Network.Telegram.API.Bot.Object.Update.Message.Keyboard+    Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button+    Network.Telegram.API.Bot.Object.Update.Message.Origin+    Network.Telegram.API.Bot.Object.Update.Moving     Network.Telegram.API.Bot.Property     Network.Telegram.API.Bot.Property.Accessible     Network.Telegram.API.Bot.Property.Identifiable