telega 0.1.5 → 0.1.6
raw patch · 25 files changed
+332/−288 lines, 25 files
Files
- CHANGELOG.md +11/−0
- Network/Telegram/API/Bot/Object.hs +4/−10
- Network/Telegram/API/Bot/Object/Button.hs +0/−35
- Network/Telegram/API/Bot/Object/Callback.hs +0/−16
- Network/Telegram/API/Bot/Object/Chat.hs +0/−25
- Network/Telegram/API/Bot/Object/From.hs +0/−51
- Network/Telegram/API/Bot/Object/Keyboard.hs +0/−18
- Network/Telegram/API/Bot/Object/Member.hs +7/−7
- Network/Telegram/API/Bot/Object/Message.hs +0/−44
- Network/Telegram/API/Bot/Object/Moving.hs +0/−22
- Network/Telegram/API/Bot/Object/Notification.hs +0/−3
- Network/Telegram/API/Bot/Object/Sender.hs +50/−0
- Network/Telegram/API/Bot/Object/Update.hs +8/−4
- Network/Telegram/API/Bot/Object/Update/Callback.hs +18/−0
- Network/Telegram/API/Bot/Object/Update/Callback/Notification.hs +3/−0
- Network/Telegram/API/Bot/Object/Update/Message.hs +49/−0
- Network/Telegram/API/Bot/Object/Update/Message/Content.hs +39/−0
- Network/Telegram/API/Bot/Object/Update/Message/Keyboard.hs +20/−0
- Network/Telegram/API/Bot/Object/Update/Message/Keyboard/Button.hs +35/−0
- Network/Telegram/API/Bot/Object/Update/Message/Origin.hs +31/−0
- Network/Telegram/API/Bot/Object/Update/Moving.hs +21/−0
- Network/Telegram/API/Bot/Property/Accessible.hs +11/−26
- Network/Telegram/API/Bot/Property/Identifiable.hs +14/−14
- Network/Telegram/API/Bot/Property/Persistable.hs +1/−4
- telega.cabal +10/−9
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