packages feed

telega 0.2.5 → 0.2.6

raw patch · 12 files changed

+91/−85 lines, 12 files

Files

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