telegram-api
High-level bindings to the Telegram Bot API based on servant library.
Both getUpdates
request or webhook can be used to receive updates for your bot.
Inline mode is supported.
Uploading stickers, documents, video, etc is not supported yet, but you can send items which are already uploaded on the Telegram servers.
Almost full support of Bot-2.0 API
See TODO section for details.
Usage
getMe
example
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Client (newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Web.Telegram.API.Bot
main :: IO ()
main = do
manager <- newManager tlsManagerSettings
res <- getMe token manager
case res of
Left e -> do
putStrLn "Request failed"
print e
Right GetMeResponse { user_result = u } -> do
putStrLn "Request succeded"
print $ user_first_name u
where token = Token "bot<token>" -- entire Token should be bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
sendMessage
example
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Client (newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Web.Telegram.API.Bot
main :: IO ()
main = do
manager <- newManager tlsManagerSettings
let request = sendMessageRequest chatId message
res <- sendMessage token request manager
case res of
Left e -> do
putStrLn "Request failed"
print e
Right MessageResponse { message_result = m } -> do
putStrLn "Request succeded"
print $ message_id m
print $ text m
where token = Token "bot<token>" -- entire Token should be bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
chatId = "<chat_id> or <@channelusername>"
message = "text *bold* _italic_ [github](github.com/klappvisor/haskell-telegram-api)"
Note on requests:
Many request data records have a lot of optional parameters which are usually redundant.
There are two ways to create requests:
With data type constructor:
let request = SendMessageRequest "chatId" "text" Nothing (Just True) Nothing Nothing Nothing
Using default instance:
let request = sendMessageRequest "chatId" "text" -- only with required fields
let request = (sendMessageRequest "chatId" "text") {
message_disable_notification = Just True -- with optional fields
}
Contribution
Contributions are welcome!
- Fork repository
- Do some changes
- Create pull request
- Wait for CI build and review
- ??????
- PROFIT
Bear in mind that the CI build won't run integration test suite against your pull request since the necessary environment
variables ($BOT_TOKEN
, $CHAT_ID
and $BOT_NAME
) aren't exported when a fork
starts the build (for security reasons). If you do want to run them before creating RP, you can integration your fork
with CircleCI.
You can use stack
to build project
stack build
To run test you have to create your own bot. Go to BotFather and create the bot. As the result you will have private bot's access token. Keep it safe!
stack test --test-arguments "--integration -t BOT_TOKEN -c CHAT_ID -b BOT_NAME -- HSPEC_ARGS"
where
BOT_TOKEN
is the token obtained from BotFather
CHAT_ID
can be id of your chat with your bot. Send some messages to this chat in Telegram and do curl "https://api.telegram.org/bot<replace_with_token>/getUpdates"
, you'll have to parse some JSON with your brain ;-) or any other suitable tool and you will find chat id there.
BOT_NAME
is the name of your bot
HSPEC_ARGS
are the normal hspec
arguments you can find here
The help option is available for the tests and for hspec:
stack test --test-arguments "-h"
stack test --test-arguments "--integration -t BOT_TOKEN -c CHAT_ID -v BOT_NAME -- -h"
Note: Inline Spec is disabled for now...
If everything is fine after running the tests you will receive a few new messages from your bot.
TODO
sendPhoto
- upload photo done
sendAudio
- upload audio done
sendDocument
- upload documents done
sendSticker
- upload stickers done
sendVideo
- upload video done
sendVoice
- upload voice done
setWebhook
- upload certificate