telega 0.2.5 → 0.2.6
raw patch · 12 files changed
+91/−85 lines, 12 files
Files
- CHANGELOG.md +7/−0
- Network/API/Telegram/Bot/Object/Update.hs +9/−16
- Network/API/Telegram/Bot/Object/Update/Callback.hs +11/−5
- Network/API/Telegram/Bot/Object/Update/Message.hs +14/−18
- Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs +15/−17
- Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs +4/−0
- Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs +2/−1
- Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs +0/−2
- Network/API/Telegram/Bot/Object/Update/Message/Origin.hs +15/−14
- Network/API/Telegram/Bot/Object/Update/Moving.hs +3/−8
- Network/API/Telegram/Bot/Object/Update/Moving/Group.hs +7/−0
- telega.cabal +4/−4
CHANGELOG.md view
@@ -126,3 +126,10 @@ * Define `Persistable` instance for sending `Photo` * Separate `Venue` and `Contact` into module and datatype from `Info` datatype * Rename `User` constructor of `Sender` datatype to `Human`++# 0.2.6+* Define `Eq` instance for `Update`, `Message`, `Callback`, `Origin`, `File` and `Size`+* Start to write documentation step-by-step, show three simple examples+* Add `Sender` field into `Callback` datatype to understand from whom action goes+* Change endpoint for `Edit`ing `Keyboard` object, remove `Edit` `Text :&: Keyboard` instance+* Replace `Group` and `Supergroup` constructors by including `Group` field in `Origin` datatype
Network/API/Telegram/Bot/Object/Update.hs view
@@ -1,20 +1,17 @@-module Network.API.Telegram.Bot.Object.Update (Update (..), module Exports) where+module Network.API.Telegram.Bot.Object.Update (module Exports, Update (..)) where import Network.API.Telegram.Bot.Object.Update.Callback as Exports import Network.API.Telegram.Bot.Object.Update.Message as Exports import Network.API.Telegram.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 ((<|>)))+import "base" Control.Applicative ((<*>), (<|>))+import "base" Data.Eq (Eq ((==))) import "base" Data.Function (($)) import "base" Data.Functor ((<$>)) import "base" Data.Int (Int) import "base" Text.Show (Show) -import Network.API.Telegram.Bot.Object.Update.Callback (Callback)-import Network.API.Telegram.Bot.Object.Update.Message (Message)-import Network.API.Telegram.Bot.Object.Update.Moving (Moving) import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident)) data Update@@ -23,6 +20,9 @@ | Incoming Int Message deriving Show +instance Eq Update where+ u == u' = ident u == ident u'+ instance Identifiable Update where type Identificator Update = Int ident (Query i _) = i@@ -31,13 +31,6 @@ instance FromJSON Update where parseJSON = withObject "Update" $ \v ->- query v <|> membership v <|> incoming v where-- query :: Object -> Parser Update- query v = Query <$> v .: "update_id" <*> v .: "callback_query"-- membership :: Object -> Parser Update- membership v = Membership <$> v .: "update_id" <*> v .: "message"-- incoming :: Object -> Parser Update- incoming v = Incoming <$> v .: "update_id" <*> v .: "message"+ (Query <$> v .: "update_id" <*> v .: "callback_query") <|>+ (Membership <$> v .: "update_id" <*> v .: "message") <|>+ (Incoming <$> v .: "update_id" <*> v .: "message")
Network/API/Telegram/Bot/Object/Update/Callback.hs view
@@ -5,12 +5,14 @@ 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.Sender (Sender) import Network.API.Telegram.Bot.Object.Update.Message (Message) import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin) import Network.API.Telegram.Bot.Property.Accessible (Accessible (access))@@ -18,19 +20,23 @@ import Network.API.Telegram.Bot.Property.Persistable (Persistable (Payload, Returning, payload, endpoint)) import Network.API.Telegram.Bot.Utils (field) -data Callback = Datatext Text Message Text deriving Show+data Callback = Datatext Text Sender Message Text deriving Show +instance Eq Callback where+ c == c' = ident c == ident c'+ instance Accessible Origin Callback where- access f (Datatext cq_id msg dttxt) = flip- (Datatext cq_id) dttxt <$> access f msg+ access f (Datatext cq_id from msg dttxt) = flip+ (Datatext cq_id from) dttxt <$> access f msg instance FromJSON Callback where parseJSON = withObject "Callback" $ \v ->- Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"+ Datatext <$> v .: "id" <*> v .: "from"+ <*> v .: "message" <*> v .: "data" instance Identifiable Callback where type Identificator Callback = Text- ident (Datatext i _ _) = i+ ident (Datatext i _ _ _) = i data Trigger a = Trigger Text Text
Network/API/Telegram/Bot/Object/Update/Message.hs view
@@ -10,6 +10,7 @@ import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>))) import "base" Control.Monad (Monad ((>>=)), fail) import "base" Data.Bool (Bool (True))+import "base" Data.Eq (Eq ((==))) import "base" Data.Function (($)) import "base" Data.Functor ((<$>)) import "base" Data.Int (Int, Int64)@@ -19,7 +20,7 @@ import "with" Data.With (type (:&:)((:&:))) import Network.API.Telegram.Bot.Object.Update.Message.Content (Content)-import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))+import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (Private, Group, Channel)) import Network.API.Telegram.Bot.Property.Accessible (Accessible (access)) import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident)) import Network.API.Telegram.Bot.Property.Persistable (Persistable (Payload, Returning, payload, endpoint))@@ -31,6 +32,9 @@ | Replied Int Origin Content Message deriving Show +instance Eq Message where+ m == m' = ident m == ident m'+ instance Accessible Content Message where access f (Direct msg_id origin content) = (\content' -> Direct msg_id origin content') <$> f content access f (Forwarded msg_id origin content) = (\content' -> Forwarded msg_id origin content') <$> f content@@ -41,6 +45,12 @@ access f (Forwarded msg_id origin content) = (\origin' -> Forwarded msg_id origin' content) <$> f origin access f (Replied msg_id origin content msg) = (\origin' -> Replied msg_id origin' content msg) <$> f origin +instance Identifiable Message where+ type Identificator Message = Int+ ident (Direct i _ _) = i+ ident (Forwarded i _ _) = i+ ident (Replied i _ _ _) = i+ instance FromJSON Message where parseJSON = withObject "Message" $ \v -> forward_channel v <|> forward_chat v <|> reply v <|> direct v where@@ -59,8 +69,8 @@ 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"+ ("group" :: Text) -> Group <$> parseJSON (Object c) <*> v .: "forward_from"+ ("supergroup" :: Text) -> Group <$> parseJSON (Object c) <*> v .: "forward_from" _ -> fail "Type of chat is not defined" reply :: Object -> Parser Message@@ -71,12 +81,6 @@ direct v = Direct <$> v .: "message_id" <*> parseJSON (Object v) <*> parseJSON (Object v) -instance Identifiable Message where- type Identificator Message = Int- ident (Direct i _ _) = i- ident (Forwarded i _ _) = i- ident (Replied i _ _ _) = i- data Forward a = Forward Int Int64 Int64 instance Persistable (Forward Message) where@@ -215,15 +219,7 @@ type Returning (Edit Keyboard) = Message payload (Edit chat_id message_id reply_markup) = field "chat_id" chat_id <> field "message_id" message_id <> field "reply_markup" reply_markup- endpoint _ = "editMessageText"--instance Persistable (Edit (Text :&: Keyboard)) where- type Payload (Edit (Text :&: Keyboard)) = Edit (Text :&: Keyboard)- type Returning (Edit (Text :&: Keyboard)) = Message- payload (Edit chat_id message_id (text :&: reply_markup)) =- field "chat_id" chat_id <> field "message_id" message_id- <> field "text" text <> field "reply_markup" reply_markup- endpoint _ = "editMessageText"+ endpoint _ = "editMessageReplyMarkup" instance Persistable (Edit (Live Location)) where type Payload (Edit (Live Location)) = Edit Location
Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs view
@@ -10,8 +10,9 @@ import Network.API.Telegram.Bot.Object.Update.Message.Content.File.Voice as Exports import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))-import "aeson" Data.Aeson.Types (Object, Parser) import "base" Control.Applicative ((<*>), (<|>))+import "base" Data.Bool (Bool (False))+import "base" Data.Eq (Eq ((==))) import "base" Control.Monad ((>>=)) import "base" Data.Function (($)) import "base" Data.Functor ((<$>))@@ -25,21 +26,18 @@ | Photography [Size] deriving Show +instance Eq File where+ Audiofile i _ == Audiofile i' _ = i == i'+ Videofile i _ == Videofile i' _ = i == i'+ General i _ == General i' _ = i == i'+ Voicerecord i _ == Voicerecord i' _ = i == i'+ Photography ss == Photography ss' = ss == ss'+ _ == _ = False+ instance FromJSON File where parseJSON = withObject "Message" $ \v ->- photo v <|> document v <|> audio v <|> video v <|> voice v where-- photo :: Object -> Parser File- photo v = Photography <$> v .: "photo"-- audio :: Object -> Parser File- audio v = Audiofile <$> (v .: "audio" >>= parseJSON) <*> v .: "audio"-- document :: Object -> Parser File- document v = General <$> (v .: "document" >>= parseJSON) <*> v .: "document"-- video :: Object -> Parser File- video v = Videofile <$> (v .: "video" >>= parseJSON) <*> v .: "video"-- voice :: Object -> Parser File- voice v = Voicerecord <$> (v .: "voice" >>= parseJSON) <*> v .: "voice"+ (Photography <$> v .: "photo") <|>+ (Audiofile <$> (v .: "audio" >>= parseJSON) <*> v .: "audio") <|>+ (General <$> (v .: "document" >>= parseJSON) <*> v .: "document") <|>+ (Videofile <$> (v .: "video" >>= parseJSON) <*> v .: "video") <|>+ (Voicerecord <$> (v .: "voice" >>= parseJSON) <*> v .: "voice")
Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs view
@@ -2,6 +2,7 @@ import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "base" Control.Applicative ((<*>))+import "base" Data.Eq (Eq ((==))) import "base" Data.Int (Int) import "base" Data.Function (($)) import "base" Data.Functor ((<$>))@@ -12,6 +13,9 @@ import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident)) data Size = Size Text Int Int (Maybe Int) deriving Show++instance Eq Size where+ s == s' = ident s == ident s' instance Identifiable Size where type Identificator Size = Text
Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs view
@@ -1,13 +1,14 @@ module Network.API.Telegram.Bot.Object.Update.Message.Content.File.URI (URI (..)) where import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), Value (String), withObject, (.:))+import "base" Data.Eq (Eq) import "base" Data.Functor ((<$>)) import "base" Data.Function (($)) import "base" Text.Show (Show) import "text" Data.Text (Text) newtype URI = URI Text- deriving Show+ deriving (Eq, Show) instance FromJSON URI where parseJSON = withObject "URI" $ \v ->
Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs view
@@ -8,8 +8,6 @@ import "base" Text.Show (Show) import "text" Data.Text (Text) -import Network.API.Telegram.Bot.Object.Update.Message.Content.Info.Location (Location)- data Contact = Contact Text (Maybe Text) (Maybe Text) Text (Maybe Text) deriving Show
Network/API/Telegram/Bot/Object/Update/Message/Origin.hs view
@@ -1,9 +1,10 @@ module Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (..)) where import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))-import "aeson" Data.Aeson.Types (Object, Parser, Value)+import "aeson" Data.Aeson.Types (Object, Parser, Value (Object)) import "base" Control.Applicative (Applicative ((<*>)))-import "base" Control.Monad (Monad ((>>=)), fail)+import "base" Control.Monad (Monad ((>>=)))+import "base" Data.Eq (Eq ((==))) import "base" Data.Function (($)) import "base" Data.Functor ((<$>)) import "base" Data.Int (Int64)@@ -11,29 +12,29 @@ import "text" Data.Text (Text) import Network.API.Telegram.Bot.Object.Sender (Sender)+import Network.API.Telegram.Bot.Object.Update.Moving.Group (Group) import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident)) data Origin = Private Int64 Sender- | Group Int64 Text Sender- | Supergroup Int64 Text Sender+ | Group Group Sender | Channel Int64 Text deriving Show +instance Eq Origin where+ o == o' = ident o == ident o'++instance Identifiable Origin where+ type Identificator Origin = Int64+ ident (Private i _) = i+ ident (Group g _) = ident g+ ident (Channel i _) = i+ 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"--instance Identifiable Origin where- type Identificator Origin = Int64- ident (Private i _) = i- ident (Group i _ _) = i- ident (Supergroup i _ _) = i- ident (Channel i _) = i+ _ -> parseJSON (Object v)
Network/API/Telegram/Bot/Object/Update/Moving.hs view
@@ -3,7 +3,6 @@ import Network.API.Telegram.Bot.Object.Update.Moving.Group as Exports import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))-import "aeson" Data.Aeson.Types (Object, Parser) import "base" Control.Applicative ((<*>), (<|>)) import "base" Data.Function (($)) import "base" Data.Functor ((<$>))@@ -17,10 +16,6 @@ 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" <*> v .: "chat"-- joined :: Object -> Parser Moving- joined v = Joined <$> v .: "new_chat_members" <*> v .: "chat"+ parseJSON = withObject "Moving" $ \v ->+ (Gone <$> v .: "left_chat_member" <*> v .: "chat") <|>+ (Joined <$> v .: "new_chat_members" <*> v .: "chat")
Network/API/Telegram/Bot/Object/Update/Moving/Group.hs view
@@ -10,10 +10,17 @@ import "base" Text.Show (Show) import "text" Data.Text (Text) +import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))+ data Group = Basic Int64 Text | Super Int64 Text (Maybe Text) deriving Show++instance Identifiable Group where+ type Identificator Group = Int64+ ident (Basic i _ ) = i+ ident (Super i _ _) = i instance FromJSON Group where parseJSON = withObject "Group" $ \v -> v .: "type" >>= \case
telega.cabal view
@@ -1,5 +1,5 @@ name: telega-version: 0.2.5+version: 0.2.6 synopsis: Telegram Bot API binding description: High-level bindings, typed entities, inline mode only homepage: https://github.com/iokasimov/telega@@ -58,7 +58,7 @@ Network.API.Telegram.Bot.Utils build-depends: base == 4.*, data-default, transformers, with, lens, aeson, text, unordered-containers, http-client, wreq default-extensions: DataKinds, LambdaCase, OverloadedStrings, NoImplicitPrelude, PackageImports, GADTs,- FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances, UndecidableSuperClasses,- TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators, ScopedTypeVariables, PolyKinds+ FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances+ TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators, ScopedTypeVariables default-language: Haskell2010- ghc-options: -Wall -fno-warn-tabs -fprint-explicit-kinds+ ghc-options: -Wall -fno-warn-tabs