[[telegram-component]]
= Telegram Component
:page-source: components/camel-telegram/src/main/docs/telegram-component.adoc

*Available as of Camel version 2.18*

The Telegram component provides access to the https://core.telegram.org/bots/api[Telegram Bot API].
It allows a Camel-based application to send and receive messages by acting as a Bot, participating in
direct conversations with normal users, private and public groups or channels.

A Telegram Bot must be created before using this component, following the instructions at the
https://core.telegram.org/bots#3-how-do-i-create-a-bot[Telegram Bot developers home].
When a new Bot is created, the https://telegram.me/botfather[BotFather] provides an
**authorization token** corresponding to the Bot. The authorization token is a mandatory parameter
for the camel-telegram endpoint.

NOTE: In order to allow the Bot to receive all messages exchanged within a group or channel (not just
the ones starting with a '/' character), ask the BotFather to *disable the privacy mode*, using the
*/setprivacy* command.


Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-telegram</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

== URI format

[source,text]
----------------------------------------------------
telegram:type/authorizationToken[?options]
----------------------------------------------------

You can append query options to the URI in the following format,
`?option=value&option=value&...`

== Options

// component options: START
The Telegram component supports 2 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *authorizationToken* (security) | The default Telegram authorization token to be used when the information is not provided in the endpoints. |  | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END



// endpoint options: START
The Telegram endpoint is configured using URI syntax:

----
telegram:type
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *type* | *Required* The endpoint type. Currently, only the 'bots' type is supported. |  | String
|===


=== Query Parameters (28 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *limit* (consumer) | Limit on the number of updates that can be received in a single polling request. | 100 | Integer
| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
| *timeout* (consumer) | Timeout in seconds for long polling. Put 0 for short polling or a bigger number for long polling. Long polling produces shorter response time. | 30 | Integer
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
| *chatId* (producer) | The identifier of the chat that will receive the produced messages. Chat ids can be first obtained from incoming messages (eg. when a telegram user starts a conversation with a bot, its client sends automatically a '/start' message containing the chat id). It is an optional parameter, as the chat id can be set dynamically for each outgoing message (using body or headers). |  | String
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
| *delay* (scheduler) | Milliseconds before the next poll. You can also specify time values using units, such as 60s (60 seconds), 5m30s (5 minutes and 30 seconds), and 1h (1 hour). | 500 | long
| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
| *initialDelay* (scheduler) | Milliseconds before the first poll starts. You can also specify time values using units, such as 60s (60 seconds), 5m30s (5 minutes and 30 seconds), and 1h (1 hour). | 1000 | long
| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. | TRACE | LoggingLevel
| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component | none | String
| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. | MILLISECONDS | TimeUnit
| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
| *proxyHost* (proxy) | HTTP proxy host which could be used when sending out the message. |  | String
| *proxyPort* (proxy) | HTTP proxy port which could be used when sending out the message. |  | Integer
| *authorizationToken* (security) | *Required* The authorization token for using the bot (ask the BotFather) |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-telegram-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.telegram.authorization-token* | The default Telegram authorization token to be used when the information is not provided in the endpoints. |  | String
| *camel.component.telegram.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.telegram.enabled* | Enable telegram component | true | Boolean
|===
// spring-boot-auto-configure options: END





== Message Headers

[width="100%",cols="20%,80%",options="header",]
|=======================================================================
|Name |Description
|`CamelTelegramChatId` |This header is used by the producer endpoint in order to
resolve the chat id that will receive the message. The recipient chat id can be
placed (in order of priority) in message body, in the `CamelTelegramChatId` header
or in the endpoint configuration (`chatId` option).
This header is also present in all incoming messages.

|`CamelTelegramMediaType` |This header is used to identify the media type when
the outgoing message is composed of pure binary data. Possible values are strings or enum values
belonging to the `org.apache.camel.component.telegram.TelegramMediaType` enumeration.

|`CamelTelegramMediaTitleCaption` |This header is used to provide a caption or title
for outgoing binary messages.

|`CamelTelegramParseMode` |This header is used to format text messages using HTML or Markdown (see `org.apache.camel.component.telegram.TelegramParseMode`).

|=======================================================================

== Usage

The Telegram component supports both consumer and producer endpoints.
It can also be used in *reactive chat-bot mode* (to consume, then produce messages).

== Producer Example

The following is a basic example of how to send a message to a Telegram chat through the
Telegram Bot API.

in Java DSL

[source,java]
---------------------------------------------------------
from("direct:start").to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="direct:start"/>
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>
---------------------------------------------

The code `123456789:insertYourAuthorizationTokenHere` is the *authorization token* corresponding to the Bot.

When using the producer endpoint without specifying the *chat id* option, the target chat will be identified using information contained in the body or headers of the message.
The following message bodies are allowed for a producer endpoint (messages of type `OutgoingXXXMessage` belong to the package `org.apache.camel.component.telegram.model`)

[width="100%",cols="40%,60%",options="header",]
|===================================================
| Java Type | Description

| `OutgoingTextMessage` | To send a text message to a chat
| `OutgoingPhotoMessage` | To send a photo (JPG, PNG) to a chat
| `OutgoingAudioMessage` | To send a mp3 audio to a chat
| `OutgoingVideoMessage` | To send a mp4 video to a chat
| `OutgoingDocumentMessage` | To send a file to a chat (any media type)
| `SendLocationMessage` | To send a location (setSendLocation)
| `EditMessageLiveLocationMessage` | To send changes to a live location (editMessageLiveLocation)
| `StopMessageLiveLocationMessage` | To stop updating a live location message sent by the bot or via the bot (for inline bots) before live_period expires (stopMessageLiveLocation)
| `SendVenueMessage` | To send information about a venue (sendVenue)
| `byte[]` | To send any media type supported. It requires the `CamelTelegramMediaType` header to be set to the appropriate media type
| `String` | To send a text message to a chat. It gets converted automatically into a `OutgoingTextMessage`

|===================================================


== Consumer Example

The following is a basic example of how to receive all messages that telegram users are sending to the configured Bot.
In Java DSL

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ProcessorBean.class)
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="myBean" />
<route>

<bean id="myBean" class="com.example.MyBean"/>
---------------------------------------------

The `MyBean` is a simple bean that will receive the messages

[source,java]
---------------------------------------------------------
public class MyBean {

    public void process(String message) {
        // or Exchange, or org.apache.camel.component.telegram.model.IncomingMessage (or both)

        // do process
    }

}
---------------------------------------------------------


Supported types for incoming messages are

[width="100%",cols="40%,60%",options="header",]
|===================================================
| Java Type | Description

| `IncomingMessage` | The full object representation of an incoming message
| `String` | The content of the message, for text messages only

|===================================================




== Reactive Chat-Bot Example

The reactive chat-bot mode is a simple way of using the Camel component to build a simple
chat bot that replies directly to chat messages received from the Telegram users.

The following is a basic configuration of the chat-bot in Java DSL

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ChatBotLogic.class)
.to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="chatBotLogic" />
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>

<bean id="chatBotLogic" class="com.example.ChatBotLogic"/>
---------------------------------------------


The `ChatBotLogic` is a simple bean that implements a generic String-to-String method.

[source,java]
---------------------------------------------------------
public class ChatBotLogic {

    public String chatBotProcess(String message) {
        if( "do-not-reply".equals(message) ) {
            return null; // no response in the chat
        }

        return "echo from the bot: " + message; // echoes the message
    }

}
---------------------------------------------------------


Every non-null string returned by the `chatBotProcess` method is automatically routed to the
chat that originated the request (as the `CamelTelegramChatId` header is used to route the message).

== Getting the Chat ID

If you want to push messages to a specific Telegram chat when an event occurs, you need to
retrieve the corresponding chat ID. The chat ID is not currently shown in the telegram client,
but you can obtain it using a simple route.

First, add the bot to the chat where you want to push messages, then run a route like the following one.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.to("log:INFO?showHeaders=true");
---------------------------------------------------------

Any message received by the bot will be dumped to your log together with information about the chat (`CamelTelegramChatId`
header).

Once you get the chat ID, you can use the following sample route to push message to it.

[source,java]
---------------------------------------------------------
from("timer:tick")
.setBody().constant("Hello")
to("telegram:bots/123456789:insertYourAuthorizationTokenHere?chatId=123456")
---------------------------------------------------------

Note that the corresponding URI parameter is simply `chatId`.

== Customizing keyboard

You can customize the user keyboard instead of asking him to write an option. `OutgoingTextMessage` has the property `ReplyKeyboardMarkup` which can be used for such thing.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Choose one option!");

        InlineKeyboardButton buttonOptionOneI = InlineKeyboardButton.builder()
                .text("Option One - I").build();

        InlineKeyboardButton buttonOptionOneII = InlineKeyboardButton.builder()
                .text("Option One - II").build();

        InlineKeyboardButton buttonOptionTwoI = InlineKeyboardButton.builder()
                .text("Option Two - I").build();

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .keyboard()
                    .addRow(Arrays.asList(buttonOptionOneI, buttonOptionOneII))
                    .addRow(Arrays.asList(buttonOptionTwoI))
                    .close()
                .oneTimeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

If you want to disable it the next message must have the property `removeKeyboard` set on `ReplyKeyboardMarkup` object.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Your answer was accepted!");

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .removeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------


== Webhook Mode

The Telegram component supports usage in the *webhook mode* using the *camel-webhook* component.

In order to enable webhook mode, users need first to add a REST implementation to their application.
Maven users, for example, can add *netty-http* to their `pom.xml` file:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

Once done, you need to prepend the webhook URI to the telegram URI you want to use.

In Java DSL:

[source,java]
---------------------------------------------------------
from("webhook:telegram:bots/123456789:insertYourAuthorizationTokenHere").to("log:info");
---------------------------------------------------------

Some endpoints will be exposed by your application and Telegram will be configured to send messages to them.
You need to ensure that your server is exposed to the internet and to pass the right value of the
*camel.component.webhook.configuration.webhook-external-url* property.

Refer to the *camel-webhook* component documentation for instructions on how to set it.
