You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/12/30 05:52:49 UTC

[camel] branch master updated: CAMEL-13226: Add sendSticker option (#3453)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 27f2405  CAMEL-13226: Add sendSticker option (#3453)
27f2405 is described below

commit 27f24052b4f80db6c431ab101c080833e58a3339
Author: Miguel Caetano Serra <se...@gmail.com>
AuthorDate: Mon Dec 30 05:52:31 2019 +0000

    CAMEL-13226: Add sendSticker option (#3453)
---
 .../src/main/docs/telegram-component.adoc          |   1 +
 .../telegram/model/IncomingMaskPosition.java       |  82 +++++++++++++
 .../component/telegram/model/IncomingMessage.java  |  11 ++
 .../component/telegram/model/IncomingSticker.java  | 128 +++++++++++++++++++++
 .../telegram/model/OutgoingStickerMessage.java     | 120 +++++++++++++++++++
 .../service/TelegramServiceRestBotAPIAdapter.java  |  18 +++
 .../telegram/TelegramConsumerMediaStickerTest.java |  94 +++++++++++++++
 .../telegram/integration/TelegramServiceTest.java  |  30 ++++-
 .../component/telegram/util/TelegramTestUtil.java  |   2 +
 .../src/test/resources/attachments/sample.webp     | Bin 0 -> 5298 bytes
 .../resources/messages/updates-media-sticker.json  |  44 +++++++
 11 files changed, 529 insertions(+), 1 deletion(-)

diff --git a/components/camel-telegram/src/main/docs/telegram-component.adoc b/components/camel-telegram/src/main/docs/telegram-component.adoc
index 1f93c08..b03a054 100644
--- a/components/camel-telegram/src/main/docs/telegram-component.adoc
+++ b/components/camel-telegram/src/main/docs/telegram-component.adoc
@@ -226,6 +226,7 @@ The following message bodies are allowed for a producer endpoint (messages of ty
 | `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)
+| `OutgoingStickerMessage` | To send a sticker to a chat (WEBP)
 | `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)
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMaskPosition.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMaskPosition.java
new file mode 100644
index 0000000..7ae0f32
--- /dev/null
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMaskPosition.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.telegram.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * This object describes the position on faces where a mask should be placed by default.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class IncomingMaskPosition {
+
+    private String point;
+
+    @JsonProperty("x_shift")
+    private Float xShift;
+
+    @JsonProperty("y_shift")
+    private Float yShift;
+
+    private Float scale;
+
+    public IncomingMaskPosition() {
+    }
+
+    public String getPoint() {
+        return point;
+    }
+
+    public void setPoint(String point) {
+        this.point = point;
+    }
+
+    public Float getxShift() {
+        return xShift;
+    }
+
+    public void setxShift(Float xShift) {
+        this.xShift = xShift;
+    }
+
+    public Float getyShift() {
+        return yShift;
+    }
+
+    public void setyShift(Float yShift) {
+        this.yShift = yShift;
+    }
+
+    public Float getScale() {
+        return scale;
+    }
+
+    public void setScale(Float scale) {
+        this.scale = scale;
+    }
+
+    @Override
+    public String toString() {
+        return "IncomingMaskPosition{"
+            + "point='" + point + '\''
+            + ", xShift=" + xShift
+            + ", yShift=" + yShift
+            + ", scale=" + scale
+            + '}';
+    }
+}
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMessage.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMessage.java
index 89a7934..1fa6d7e 100644
--- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMessage.java
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingMessage.java
@@ -54,6 +54,8 @@ public class IncomingMessage implements Serializable {
 
     private IncomingDocument document;
 
+    private IncomingSticker sticker;
+
     @JsonProperty("location")
     private Location location;
 
@@ -132,6 +134,14 @@ public class IncomingMessage implements Serializable {
         this.document = document;
     }
 
+    public IncomingSticker getSticker() {
+        return sticker;
+    }
+
+    public void setSticker(IncomingSticker sticker) {
+        this.sticker = sticker;
+    }
+
     public Location getLocation() {
         return location;
     }
@@ -152,6 +162,7 @@ public class IncomingMessage implements Serializable {
         sb.append(", video=").append(video);
         sb.append(", audio=").append(audio);
         sb.append(", document=").append(document);
+        sb.append(", sticker=").append(sticker);
         sb.append(", location=").append(location);
         sb.append('}');
         return sb.toString();
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingSticker.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingSticker.java
new file mode 100644
index 0000000..7262a3b
--- /dev/null
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingSticker.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.telegram.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Contains information about a sticker.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class IncomingSticker {
+
+    @JsonProperty("file_id")
+    private String fileId;
+
+    private Integer width;
+
+    private Integer height;
+
+    @JsonProperty("is_animated")
+    private Boolean isAnimated;
+
+    private IncomingPhotoSize thumb;
+
+    private String emoji;
+
+    @JsonProperty("set_name")
+    private String setName;
+
+    @JsonProperty("mask_position")
+    private IncomingMaskPosition maskPosition;
+
+    public IncomingSticker() {
+    }
+
+    public String getFileId() {
+        return fileId;
+    }
+
+    public void setFileId(String fileId) {
+        this.fileId = fileId;
+    }
+
+    public Integer getWidth() {
+        return width;
+    }
+
+    public void setWidth(Integer width) {
+        this.width = width;
+    }
+
+    public Integer getHeight() {
+        return height;
+    }
+
+    public void setHeight(Integer height) {
+        this.height = height;
+    }
+
+    public Boolean getAnimated() {
+        return isAnimated;
+    }
+
+    public void setAnimated(Boolean animated) {
+        isAnimated = animated;
+    }
+
+    public IncomingPhotoSize getThumb() {
+        return thumb;
+    }
+
+    public void setThumb(IncomingPhotoSize thumb) {
+        this.thumb = thumb;
+    }
+
+    public String getEmoji() {
+        return emoji;
+    }
+
+    public void setEmoji(String emoji) {
+        this.emoji = emoji;
+    }
+
+    public String getSetName() {
+        return setName;
+    }
+
+    public void setSetName(String setName) {
+        this.setName = setName;
+    }
+
+    public IncomingMaskPosition getMaskPosition() {
+        return maskPosition;
+    }
+
+    public void setMaskPosition(IncomingMaskPosition maskPosition) {
+        this.maskPosition = maskPosition;
+    }
+
+    @Override
+    public String toString() {
+        return "IncomingSticker{"
+            + "fileId='" + fileId + '\''
+            + ", width=" + width
+            + ", height=" + height
+            + ", isAnimated=" + isAnimated
+            + ", thumb=" + thumb
+            + ", emoji='" + emoji + '\''
+            + ", setName='" + setName + '\''
+            + ", maskPosition=" + maskPosition
+            + '}';
+    }
+}
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/OutgoingStickerMessage.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/OutgoingStickerMessage.java
new file mode 100644
index 0000000..9bc6c53
--- /dev/null
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/OutgoingStickerMessage.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.telegram.model;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * An outgoing sticker message.
+ */
+public final class OutgoingStickerMessage extends OutgoingMessage {
+
+    private static final long serialVersionUID = 5118405983382009364L;
+
+    private String sticker;
+
+    private byte[] stickerImage;
+
+    private String filenameWithExtension;
+
+    private OutgoingStickerMessage(String sticker, byte[] stickerImage, String filenameWithExtension,
+                                   String chatId, Boolean disableNotification, Long replyToMessageId) {
+        this.sticker = sticker;
+        this.stickerImage = stickerImage;
+        this.filenameWithExtension = filenameWithExtension;
+        this.chatId = chatId;
+        this.disableNotification = disableNotification;
+        this.replyToMessageId = replyToMessageId;
+    }
+
+    /**
+     * Creates {@link OutgoingStickerMessage} based on a given webp image.
+     *
+     * @param image                 the image
+     * @param filenameWithExtension the name of the file to send. Example: file.webp
+     * @param chatId                Unique identifier for the target chat or username of the target channel
+     * @param disableNotification   Sends the message silently. Users will receive a notification with no sound.
+     * @param replyToMessageId      If the message is a reply, ID of the original message
+     * @return Sticker message.
+     */
+    public static OutgoingStickerMessage createWithImage(
+        byte[] image, String filenameWithExtension,
+        String chatId, Boolean disableNotification, Long replyToMessageId
+    ) {
+        Objects.requireNonNull(image);
+        Objects.requireNonNull(filenameWithExtension);
+        return new OutgoingStickerMessage(
+            null, image, filenameWithExtension, chatId, disableNotification, replyToMessageId);
+    }
+
+    /**
+     * Creates {@link OutgoingStickerMessage} based on a HTTP URL as a String for Telegram to get a .webp file from
+     * the Internet.
+     *
+     * @param url                 image URL
+     * @param chatId              Unique identifier for the target chat or username of the target channel
+     * @param disableNotification Sends the message silently. Users will receive a notification with no sound.
+     * @param replyToMessageId    If the message is a reply, ID of the original message
+     * @return Sticker message.
+     */
+    public static OutgoingStickerMessage createWithUrl(
+        String url, String chatId, Boolean disableNotification, Long replyToMessageId
+    ) {
+        Objects.requireNonNull(url);
+        return createWithFileId(url, chatId, disableNotification, replyToMessageId);
+    }
+
+    /**
+     * Creates {@link OutgoingStickerMessage} based on a file_id to send a file that exists on the Telegram servers.
+     *
+     * @param fileId              file_id as {@link String} to send a file that exists on the Telegram servers
+     * @param chatId              Unique identifier for the target chat or username of the target channel
+     * @param disableNotification Sends the message silently. Users will receive a notification with no sound.
+     * @param replyToMessageId    If the message is a reply, ID of the original message
+     * @return Sticker message.
+     */
+    public static OutgoingStickerMessage createWithFileId(String fileId, String chatId, Boolean disableNotification,
+                                                          Long replyToMessageId) {
+        Objects.requireNonNull(fileId);
+        return new OutgoingStickerMessage(fileId, null, null, chatId, disableNotification, replyToMessageId);
+    }
+
+    public String getSticker() {
+        return sticker;
+    }
+
+    public byte[] getStickerImage() {
+        return stickerImage;
+    }
+
+    public String getFilenameWithExtension() {
+        return filenameWithExtension;
+    }
+
+    @Override
+    public String toString() {
+        return "OutgoingStickerMessage{"
+            + "sticker='" + sticker + '\''
+            + ", stickerImage=" + Arrays.toString(stickerImage)
+            + ", filenameWithExtension='" + filenameWithExtension + '\''
+            + ", chatId='" + chatId + '\''
+            + ", disableNotification=" + disableNotification
+            + ", replyToMessageId=" + replyToMessageId
+            + '}';
+    }
+}
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/TelegramServiceRestBotAPIAdapter.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/TelegramServiceRestBotAPIAdapter.java
index 560d227..3373c9b 100644
--- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/TelegramServiceRestBotAPIAdapter.java
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/TelegramServiceRestBotAPIAdapter.java
@@ -40,6 +40,7 @@ import org.apache.camel.component.telegram.model.OutgoingAudioMessage;
 import org.apache.camel.component.telegram.model.OutgoingDocumentMessage;
 import org.apache.camel.component.telegram.model.OutgoingMessage;
 import org.apache.camel.component.telegram.model.OutgoingPhotoMessage;
+import org.apache.camel.component.telegram.model.OutgoingStickerMessage;
 import org.apache.camel.component.telegram.model.OutgoingTextMessage;
 import org.apache.camel.component.telegram.model.OutgoingVideoMessage;
 import org.apache.camel.component.telegram.model.SendLocationMessage;
@@ -88,6 +89,7 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService {
         m.put(OutgoingAudioMessage.class, new OutgoingAudioMessageHandler(asyncHttpClient, bufferSize, mapper, baseUri));
         m.put(OutgoingVideoMessage.class, new OutgoingVideoMessageHandler(asyncHttpClient, bufferSize, mapper, baseUri));
         m.put(OutgoingDocumentMessage.class, new OutgoingDocumentMessageHandler(asyncHttpClient, bufferSize, mapper, baseUri));
+        m.put(OutgoingStickerMessage.class, new OutgoingStickerMessageHandler(asyncHttpClient, bufferSize, mapper, baseUri));
         m.put(SendLocationMessage.class,
                 new OutgoingPlainMessageHandler(asyncHttpClient, bufferSize, mapper, baseUri + "/sendLocation"));
         m.put(EditMessageLiveLocationMessage.class,
@@ -265,6 +267,22 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService {
 
     }
 
+    static class OutgoingStickerMessageHandler extends OutgoingMessageHandler<OutgoingStickerMessage> {
+        public OutgoingStickerMessageHandler(AsyncHttpClient asyncHttpClient, int bufferSize, ObjectMapper mapper, String baseUri) {
+            super(asyncHttpClient, bufferSize, mapper, baseUri + "/sendSticker", null);
+        }
+
+        @Override
+        protected void addBody(RequestBuilder builder, OutgoingStickerMessage message) {
+            fillCommonMediaParts(builder, message);
+            if (message.getSticker() != null) {
+                buildTextPart(builder, "sticker", message.getSticker());
+            } else {
+                buildMediaPart(builder, "sticker", message.getFilenameWithExtension(), message.getStickerImage());
+            }
+        }
+    }
+
     abstract static class OutgoingMessageHandler<T extends OutgoingMessage> {
         protected final ObjectMapper mapper;
         private final AsyncHttpClient asyncHttpClient;
diff --git a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMediaStickerTest.java b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMediaStickerTest.java
new file mode 100644
index 0000000..5e18fca
--- /dev/null
+++ b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMediaStickerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.telegram;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.telegram.model.IncomingMaskPosition;
+import org.apache.camel.component.telegram.model.IncomingMessage;
+import org.apache.camel.component.telegram.model.IncomingPhotoSize;
+import org.apache.camel.component.telegram.model.IncomingSticker;
+import org.apache.camel.component.telegram.util.TelegramMockRoutes;
+import org.apache.camel.component.telegram.util.TelegramTestSupport;
+import org.apache.camel.component.telegram.util.TelegramTestUtil;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class TelegramConsumerMediaStickerTest extends TelegramTestSupport {
+
+    @EndpointInject("mock:telegram")
+    private MockEndpoint endpoint;
+
+    @Test
+    public void testReceptionOfAMessageWithASticker() throws Exception {
+        endpoint.expectedMinimumMessageCount(1);
+        endpoint.assertIsSatisfied(5000);
+
+        Exchange mediaExchange = endpoint.getExchanges().get(0);
+        IncomingMessage msg = mediaExchange.getIn().getBody(IncomingMessage.class);
+
+        IncomingSticker sticker = msg.getSticker();
+
+        assertNotNull(sticker);
+        assertEquals(Integer.valueOf(512), sticker.getHeight());
+        assertEquals(Integer.valueOf(512), sticker.getWidth());
+        assertEquals("\ud83d\ude28", sticker.getEmoji());
+        assertEquals("CAADBAADEQADmDVxAkmg3XnDZam0FgQ", sticker.getFileId());
+        assertEquals("GreatMindsColor", sticker.getSetName());
+        assertFalse(sticker.getAnimated());
+
+        IncomingMaskPosition incomingMaskPosition = sticker.getMaskPosition();
+        assertEquals("forehead", incomingMaskPosition.getPoint());
+        assertEquals(2.0f, incomingMaskPosition.getScale());
+        assertEquals(-1.0f, incomingMaskPosition.getxShift());
+        assertEquals(1.0f, incomingMaskPosition.getyShift());
+
+        IncomingPhotoSize thumb = sticker.getThumb();
+        assertNotNull(thumb);
+
+    }
+
+    @Override
+    protected RoutesBuilder[] createRouteBuilders() throws Exception {
+        return new RoutesBuilder[] {
+            getMockRoutes(),
+            new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                    from("telegram:bots?authorizationToken=mock-token")
+                        .to("mock:telegram");
+                }
+            }};
+    }
+
+    @Override
+    protected TelegramMockRoutes createMockRoutes() {
+        return new TelegramMockRoutes(port)
+            .addEndpoint(
+                "getUpdates",
+                "GET",
+                String.class,
+                TelegramTestUtil.stringResource("messages/updates-media-sticker.json"),
+                TelegramTestUtil.stringResource("messages/updates-empty.json"));
+    }
+}
diff --git a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/integration/TelegramServiceTest.java b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/integration/TelegramServiceTest.java
index 0d2e517..f5e3988 100644
--- a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/integration/TelegramServiceTest.java
+++ b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/integration/TelegramServiceTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.component.telegram.model.InlineKeyboardButton;
 import org.apache.camel.component.telegram.model.OutgoingAudioMessage;
 import org.apache.camel.component.telegram.model.OutgoingDocumentMessage;
 import org.apache.camel.component.telegram.model.OutgoingPhotoMessage;
+import org.apache.camel.component.telegram.model.OutgoingStickerMessage;
 import org.apache.camel.component.telegram.model.OutgoingTextMessage;
 import org.apache.camel.component.telegram.model.OutgoingVideoMessage;
 import org.apache.camel.component.telegram.model.ReplyKeyboardMarkup;
@@ -241,10 +242,37 @@ public class TelegramServiceTest extends TelegramTestSupport {
         OutgoingDocumentMessage msg = new OutgoingDocumentMessage();
         msg.setDocument(document);
         msg.setChatId(chatId);
-        msg.setFilenameWithExtension("file.png");
+        msg.setFilenameWithExtension("file.txt");
         msg.setCaption("A document");
 
         template.requestBody(String.format("telegram://bots?chatId=%s", chatId), msg);
     }
 
+    @Test
+    public void testSendStickerViaImage() throws IOException {
+        byte[] document = TelegramTestUtil.createSampleImage("WEBP");
+
+        OutgoingStickerMessage msg = OutgoingStickerMessage.createWithImage(document, "file.webp", chatId, null, null);
+
+        template.requestBody(String.format("telegram://bots?chatId=%s", chatId), msg);
+    }
+
+    @Test
+    public void testSendStickerViaFileId() {
+        String fileId = "CAADBAADEQADmDVxAkmg3XnDZam0FgQ";
+
+        OutgoingStickerMessage msg = OutgoingStickerMessage.createWithFileId(fileId, chatId, null, null);
+
+        template.requestBody(String.format("telegram://bots?chatId=%s", chatId), msg);
+    }
+
+    @Test
+    public void testSendStickerViaUrl() {
+        String imageUri = "https://www.gstatic.com/webp/gallery/1.sm.webp?dcb_=0.7185987052045011";
+
+        OutgoingStickerMessage msg = OutgoingStickerMessage.createWithUrl(imageUri, chatId, null, null);
+
+        template.requestBody(String.format("telegram://bots?chatId=%s", chatId), msg);
+    }
+
 }
diff --git a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/util/TelegramTestUtil.java b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/util/TelegramTestUtil.java
index b5630da..3c08005 100644
--- a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/util/TelegramTestUtil.java
+++ b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/util/TelegramTestUtil.java
@@ -49,6 +49,8 @@ public final class TelegramTestUtil {
             img = readBytesFromStream(TelegramTestUtil.class.getResourceAsStream("/attachments/sample.png"));
         } else if (imageIOType.equalsIgnoreCase("jpg")) {
             img = readBytesFromStream(TelegramTestUtil.class.getResourceAsStream("/attachments/sample.jpg"));
+        } else if ("webp".equalsIgnoreCase(imageIOType)) {
+            img = readBytesFromStream(TelegramTestUtil.class.getResourceAsStream("/attachments/sample.webp"));
         } else {
             throw new IllegalArgumentException("Unknown format " + imageIOType);
         }
diff --git a/components/camel-telegram/src/test/resources/attachments/sample.webp b/components/camel-telegram/src/test/resources/attachments/sample.webp
new file mode 100644
index 0000000..2cadf19
Binary files /dev/null and b/components/camel-telegram/src/test/resources/attachments/sample.webp differ
diff --git a/components/camel-telegram/src/test/resources/messages/updates-media-sticker.json b/components/camel-telegram/src/test/resources/messages/updates-media-sticker.json
new file mode 100644
index 0000000..63e318e
--- /dev/null
+++ b/components/camel-telegram/src/test/resources/messages/updates-media-sticker.json
@@ -0,0 +1,44 @@
+{
+  "ok": true,
+  "result": [
+    {
+      "update_id": 525704899,
+      "message": {
+        "message_id": 180,
+        "from": {
+          "id": 1585844777,
+          "first_name": "John",
+          "last_name": "Doe"
+        },
+        "chat": {
+          "id": 158584478,
+          "first_name": "John",
+          "last_name": "Doe",
+          "type": "private"
+        },
+        "date": 1463479642,
+        "sticker": {
+          "file_id":"CAADBAADEQADmDVxAkmg3XnDZam0FgQ",
+          "file_size":42112,
+          "width":512,
+          "height":512,
+          "emoji":"\ud83d\ude28",
+          "set_name":"GreatMindsColor",
+          "is_animated":false,
+          "mask_position": {
+            "point": "forehead",
+            "x_shift": "-1.0 ",
+            "y_shift": "1.0",
+            "scale": "2.0"
+          },
+          "thumb": {
+            "file_id":"AAQCAAPfCAACCLcZAnLSRFdZiNzlpSg5DwAEAQAHbQADXxgAAhYE",
+            "file_size":6316,
+            "width":128,
+            "height":128
+          }
+        }
+      }
+    }
+  ]
+}