This is an automated email from the ASF dual-hosted git repository. acosentino 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 8f912fc CAMEL-11541: Add "sendLocation", "editMessageLiveLocation" methods support 8f912fc is described below commit 8f912fc9a3f1d2793c2c2841570183a99881f6a0 Author: Denis Istomin <istomin....@gmail.com> AuthorDate: Tue Jan 22 19:04:29 2019 +0500 CAMEL-11541: Add "sendLocation", "editMessageLiveLocation" methods support --- .../src/main/docs/telegram-component.adoc | 2 + .../component/telegram/TelegramComponent.java | 3 +- .../camel/component/telegram/TelegramProducer.java | 5 +- .../camel/component/telegram/TelegramService.java | 4 +- .../camel/component/telegram/model/Chat.java | 13 ++++ .../model/EditMessageLiveLocationMessage.java | 71 +++++++++++++++++ .../component/telegram/model/IncomingAudio.java | 2 +- .../component/telegram/model/IncomingMessage.java | 11 +++ .../telegram/model/{Chat.java => Location.java} | 52 ++++--------- .../model/{Chat.java => MessageResult.java} | 48 +++++------- .../telegram/model/SendLocationMessage.java | 82 ++++++++++++++++++++ .../telegram/model/UnixTimestampDeserializer.java | 1 - .../camel/component/telegram/model/User.java | 12 +++ .../component/telegram/service/RestBotAPI.java | 28 +++++-- .../service/TelegramServiceRestBotAPIAdapter.java | 50 +++++++----- .../telegram/TelegramConsumerMappingTest.java | 26 ++++++- .../telegram/TelegramProducerLocationTest.java | 90 ++++++++++++++++++++++ .../resources/messages/updates-sendLocation.json | 23 ++++++ 18 files changed, 422 insertions(+), 101 deletions(-) diff --git a/components/camel-telegram/src/main/docs/telegram-component.adoc b/components/camel-telegram/src/main/docs/telegram-component.adoc index 83a4461..bc928b0 100644 --- a/components/camel-telegram/src/main/docs/telegram-component.adoc +++ b/components/camel-telegram/src/main/docs/telegram-component.adoc @@ -192,6 +192,8 @@ 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) +| `SendLocationMessage` | To send a location (setSendLocation) +| `EditMessageLiveLocationMessage` | To send changes to a live location (editMessageLiveLocation) | `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` diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramComponent.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramComponent.java index 0fd35f8..7c616a9 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramComponent.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramComponent.java @@ -19,9 +19,8 @@ package org.apache.camel.component.telegram; import java.util.Map; import org.apache.camel.Endpoint; - -import org.apache.camel.spi.annotations.Component; import org.apache.camel.spi.Metadata; +import org.apache.camel.spi.annotations.Component; import org.apache.camel.support.DefaultComponent; import org.apache.camel.util.ObjectHelper; diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramProducer.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramProducer.java index 7d63312..4a68550 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramProducer.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramProducer.java @@ -62,7 +62,10 @@ public class TelegramProducer extends DefaultProducer { log.debug("Message being sent is: {}", message); log.debug("Headers of message being sent are: {}", exchange.getIn().getHeaders()); - service.sendMessage(config.getAuthorizationToken(), message); + Object receivedMessage = service.sendMessage(config.getAuthorizationToken(), message); + log.debug("Message being received is: {}", receivedMessage); + + exchange.getOut().setBody(receivedMessage); } private String resolveChatId(TelegramConfiguration config, OutgoingMessage message, Exchange exchange) { diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramService.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramService.java index b38f4ad..c3641ce 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramService.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramService.java @@ -24,9 +24,7 @@ import org.apache.camel.component.telegram.model.UpdateResult; */ public interface TelegramService { - UpdateResult getUpdates(String authorizationToken, Long offset, Integer limit, Integer timeoutSeconds); - void sendMessage(String authorizationToken, OutgoingMessage message); - + Object sendMessage(String authorizationToken, OutgoingMessage message); } diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java index 75de354..988d418 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java @@ -19,6 +19,7 @@ package org.apache.camel.component.telegram.model; import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Contains information about a telegram chat. @@ -34,6 +35,9 @@ public class Chat implements Serializable { private String type; + @JsonProperty("all_members_are_administrators") + private boolean allMembersAreAdministrators; + public Chat() { } @@ -61,12 +65,21 @@ public class Chat implements Serializable { this.type = type; } + public boolean isAllMembersAreAdministrators() { + return allMembersAreAdministrators; + } + + public void setAllMembersAreAdministrators(boolean allMembersAreAdministrators) { + this.allMembersAreAdministrators = allMembersAreAdministrators; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("Chat{"); sb.append("id='").append(id).append('\''); sb.append(", title='").append(title).append('\''); sb.append(", type='").append(type).append('\''); + sb.append(", all_members_are_administrators='").append(allMembersAreAdministrators).append('\''); sb.append('}'); return sb.toString(); } diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/EditMessageLiveLocationMessage.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/EditMessageLiveLocationMessage.java new file mode 100644 index 0000000..42ecc3a --- /dev/null +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/EditMessageLiveLocationMessage.java @@ -0,0 +1,71 @@ +/** + * 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.JsonProperty; + +public class EditMessageLiveLocationMessage extends OutgoingMessage { + + @JsonProperty("latitude") + private double latitude; + + @JsonProperty("longitude") + private double longitude; + + @JsonProperty("message_id") + private Long messageId; + + @JsonProperty("inline_message_id") + private String inlineMessageId; + + @JsonProperty("reply_markup") + private ReplyKeyboardMarkup replyKeyboardMarkup; + + public EditMessageLiveLocationMessage(double latitude, double longitude) { + this.setLatitude(latitude); + this.setLongitude(longitude); + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + public void setReplyKeyboardMarkup(ReplyKeyboardMarkup replyKeyboardMarkup) { + this.replyKeyboardMarkup = replyKeyboardMarkup; + } + + public void setMessageId(Long messageId) { + this.messageId = messageId; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("message_id='").append(messageId).append('\''); + sb.append(", inlineMessageId=").append(inlineMessageId).append('\''); + sb.append(", latitude=").append(latitude).append('\''); + sb.append(", longitude=").append(longitude).append('\''); + sb.append(", replyKeyboardMarkup=").append(replyKeyboardMarkup); + sb.append('}'); + return sb.toString(); + } +} + diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingAudio.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingAudio.java index c4a649a..278a272 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingAudio.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/IncomingAudio.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; /** - * ontains information about an audio file. + * Contains information about an audio file. */ @JsonIgnoreProperties(ignoreUnknown = true) public class IncomingAudio { 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 44d1fde..f28e8d4 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 @@ -52,6 +52,9 @@ public class IncomingMessage implements Serializable { private IncomingDocument document; + @JsonProperty("location") + private Location location; + public IncomingMessage() { } @@ -127,6 +130,13 @@ public class IncomingMessage implements Serializable { this.document = document; } + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } @Override public String toString() { @@ -140,6 +150,7 @@ public class IncomingMessage implements Serializable { sb.append(", video=").append(video); sb.append(", audio=").append(audio); sb.append(", document=").append(document); + 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/Chat.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Location.java similarity index 55% copy from components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java copy to components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Location.java index 75de354..558267c 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Location.java @@ -16,57 +16,39 @@ */ package org.apache.camel.component.telegram.model; -import java.io.Serializable; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; -/** - * Contains information about a telegram chat. - */ @JsonIgnoreProperties(ignoreUnknown = true) -public class Chat implements Serializable { - - private static final long serialVersionUID = 4706232811327318379L; - - private String id; - - private String title; +public class Location { - private String type; + @JsonProperty("latitude") + private double latitude; - public Chat() { - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } + @JsonProperty("longitude") + private double longitude; - public String getTitle() { - return title; + public double getLatitude() { + return latitude; } - public void setTitle(String title) { - this.title = title; + public void setLatitude(float latitude) { + this.latitude = latitude; } - public String getType() { - return type; + public double getLongitude() { + return longitude; } - public void setType(String type) { - this.type = type; + public void setLongitude(float longitude) { + this.longitude = longitude; } @Override public String toString() { - final StringBuilder sb = new StringBuilder("Chat{"); - sb.append("id='").append(id).append('\''); - sb.append(", title='").append(title).append('\''); - sb.append(", type='").append(type).append('\''); + final StringBuilder sb = new StringBuilder("Location{"); + sb.append("longitude='").append(longitude).append('\''); + sb.append(", latitude=").append(latitude); sb.append('}'); return sb.toString(); } diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/MessageResult.java similarity index 57% copy from components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java copy to components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/MessageResult.java index 75de354..2086e49 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/Chat.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/MessageResult.java @@ -19,54 +19,42 @@ package org.apache.camel.component.telegram.model; import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; -/** - * Contains information about a telegram chat. - */ @JsonIgnoreProperties(ignoreUnknown = true) -public class Chat implements Serializable { - - private static final long serialVersionUID = 4706232811327318379L; - - private String id; +public class MessageResult implements Serializable { - private String title; + private static final long serialVersionUID = -4560342931918215225L; - private String type; + private boolean ok; - public Chat() { - } - - public String getId() { - return id; - } + @JsonProperty("result") + private IncomingMessage message; - public void setId(String id) { - this.id = id; + public MessageResult() { } - public String getTitle() { - return title; + public boolean isOk() { + return ok; } - public void setTitle(String title) { - this.title = title; + public void setOk(boolean ok) { + this.ok = ok; } - public String getType() { - return type; + public IncomingMessage getMessage() { + return message; } - public void setType(String type) { - this.type = type; + public void setMessage(IncomingMessage message) { + this.message = message; } @Override public String toString() { - final StringBuilder sb = new StringBuilder("Chat{"); - sb.append("id='").append(id).append('\''); - sb.append(", title='").append(title).append('\''); - sb.append(", type='").append(type).append('\''); + final StringBuilder sb = new StringBuilder("MessageResult{"); + sb.append("ok=").append(ok); + sb.append(", message=").append(message); sb.append('}'); return sb.toString(); } diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/SendLocationMessage.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/SendLocationMessage.java new file mode 100644 index 0000000..67391a8 --- /dev/null +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/SendLocationMessage.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.JsonProperty; + +public class SendLocationMessage extends OutgoingMessage { + @JsonProperty("longitude") + private double longitude; + + @JsonProperty("latitude") + private double latitude; + + @JsonProperty("live_period") + private Integer livePeriod; + + @JsonProperty("disable_notification") + private boolean disableNotification; + + @JsonProperty("reply_markup") + private ReplyKeyboardMarkup replyKeyboardMarkup; + + public SendLocationMessage(double latitude, double longitude) { + this.setLatitude(latitude); + this.setLongitude(longitude); + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + public void setLivePeriod(Integer livePeriod) { + this.livePeriod = livePeriod; + } + + public boolean isDisableNotification() { + return disableNotification; + } + + public void setDisableNotification(boolean disableNotification) { + this.disableNotification = disableNotification; + } + + public ReplyKeyboardMarkup getReplyKeyboardMarkup() { + return replyKeyboardMarkup; + } + + public void setReplyKeyboardMarkup(ReplyKeyboardMarkup replyKeyboardMarkup) { + this.replyKeyboardMarkup = replyKeyboardMarkup; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SendLocationMessage{"); + sb.append("latitude=").append(latitude).append('\''); + sb.append(", longitude=").append(longitude).append('\''); + sb.append(", livePeriod=").append(livePeriod).append('\''); + sb.append(", disableNotification=").append(disableNotification).append('\''); + sb.append(", replyToMessageId=").append(replyToMessageId).append('\''); + sb.append(", replyKeyboardMarkup=").append(replyKeyboardMarkup); + sb.append('}'); + return sb.toString(); + } +} diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/UnixTimestampDeserializer.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/UnixTimestampDeserializer.java index 844dfa3..c18c5fd 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/UnixTimestampDeserializer.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/UnixTimestampDeserializer.java @@ -23,7 +23,6 @@ import java.time.Instant; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/User.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/User.java index cdd3552..4fc7ef1 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/User.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/model/User.java @@ -39,6 +39,9 @@ public class User implements Serializable { private String username; + @JsonProperty("is_bot") + private boolean isBot; + public User() { } @@ -74,10 +77,19 @@ public class User implements Serializable { this.username = username; } + public boolean isBot() { + return isBot; + } + + public void setBot(boolean bot) { + isBot = bot; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("User{"); sb.append("id=").append(id); + sb.append(", is_bot='").append(isBot).append('\''); sb.append(", firstName='").append(firstName).append('\''); sb.append(", lastName='").append(lastName).append('\''); sb.append(", username='").append(username).append('\''); diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/RestBotAPI.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/RestBotAPI.java index 93642cf..422c3ff 100644 --- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/RestBotAPI.java +++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/service/RestBotAPI.java @@ -27,7 +27,10 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage; +import org.apache.camel.component.telegram.model.MessageResult; import org.apache.camel.component.telegram.model.OutgoingTextMessage; +import org.apache.camel.component.telegram.model.SendLocationMessage; import org.apache.camel.component.telegram.model.UpdateResult; import org.apache.cxf.jaxrs.ext.multipart.Attachment; @@ -48,38 +51,47 @@ public interface RestBotAPI { @QueryParam("limit") Integer limit, @QueryParam("timeout") Integer timeoutSeconds); - @POST @Path("/bot{authorizationToken}/sendMessage") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - void sendMessage( + MessageResult sendMessage( @PathParam("authorizationToken") String authorizationToken, OutgoingTextMessage message); - @POST @Path("/bot{authorizationToken}/sendPhoto") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) - void sendPhoto(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); - + MessageResult sendPhoto(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); @POST @Path("/bot{authorizationToken}/sendAudio") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) - void sendAudio(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); + MessageResult sendAudio(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); @POST @Path("/bot{authorizationToken}/sendVideo") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) - void sendVideo(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); + MessageResult sendVideo(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); @POST @Path("/bot{authorizationToken}/sendDocument") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) - void sendDocument(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); + MessageResult sendDocument(@PathParam("authorizationToken") String authorizationToken, List<Attachment> attachments); + + @POST + @Path("/bot{authorizationToken}/sendLocation") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + MessageResult sendLocation(@PathParam("authorizationToken") String authorizationToken, SendLocationMessage location); + + @POST + @Path("/bot{authorizationToken}/editMessageLiveLocation") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + MessageResult editMessageLiveLocation(@PathParam("authorizationToken") String authorizationToken, EditMessageLiveLocationMessage location); } 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 465b253..d337ffc 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 @@ -27,14 +27,16 @@ import javax.ws.rs.core.MultivaluedMap; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; - import org.apache.camel.component.telegram.TelegramService; +import org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage; +import org.apache.camel.component.telegram.model.MessageResult; 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.OutgoingTextMessage; import org.apache.camel.component.telegram.model.OutgoingVideoMessage; +import org.apache.camel.component.telegram.model.SendLocationMessage; import org.apache.camel.component.telegram.model.UpdateResult; import org.apache.cxf.jaxrs.client.JAXRSClientFactory; import org.apache.cxf.jaxrs.client.WebClient; @@ -53,35 +55,45 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService { WebClient.getConfig(this.api).getHttpConduit().getClient().setAllowChunking(false); } + public TelegramServiceRestBotAPIAdapter(RestBotAPI api) { + this.api = api; + } + @Override public UpdateResult getUpdates(String authorizationToken, Long offset, Integer limit, Integer timeoutSeconds) { return api.getUpdates(authorizationToken, offset, limit, timeoutSeconds); } @Override - public void sendMessage(String authorizationToken, OutgoingMessage message) { + public Object sendMessage(String authorizationToken, OutgoingMessage message) { + Object resultMessage; + if (message instanceof OutgoingTextMessage) { - this.sendMessage(authorizationToken, (OutgoingTextMessage) message); + resultMessage = this.sendMessage(authorizationToken, (OutgoingTextMessage) message); } else if (message instanceof OutgoingPhotoMessage) { - this.sendMessage(authorizationToken, (OutgoingPhotoMessage) message); + resultMessage = this.sendMessage(authorizationToken, (OutgoingPhotoMessage) message); } else if (message instanceof OutgoingAudioMessage) { - this.sendMessage(authorizationToken, (OutgoingAudioMessage) message); + resultMessage = this.sendMessage(authorizationToken, (OutgoingAudioMessage) message); } else if (message instanceof OutgoingVideoMessage) { - this.sendMessage(authorizationToken, (OutgoingVideoMessage) message); + resultMessage = this.sendMessage(authorizationToken, (OutgoingVideoMessage) message); } else if (message instanceof OutgoingDocumentMessage) { - this.sendMessage(authorizationToken, (OutgoingDocumentMessage) message); + resultMessage = this.sendMessage(authorizationToken, (OutgoingDocumentMessage) message); + } else if (message instanceof SendLocationMessage) { + resultMessage = api.sendLocation(authorizationToken, (SendLocationMessage) message); + } else if (message instanceof EditMessageLiveLocationMessage) { + resultMessage = api.editMessageLiveLocation(authorizationToken, (EditMessageLiveLocationMessage) message); } else { throw new IllegalArgumentException("Unsupported message type " + (message != null ? message.getClass().getName() : null)); } - } - - private void sendMessage(String authorizationToken, OutgoingTextMessage message) { - api.sendMessage(authorizationToken, message); + return resultMessage; } + private MessageResult sendMessage(String authorizationToken, OutgoingTextMessage message) { + return api.sendMessage(authorizationToken, message); + } - private void sendMessage(String authorizationToken, OutgoingPhotoMessage message) { + private MessageResult sendMessage(String authorizationToken, OutgoingPhotoMessage message) { List<Attachment> parts = new LinkedList<>(); fillCommonMediaParts(parts, message); @@ -91,10 +103,10 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService { parts.add(buildTextPart("caption", message.getCaption())); } - api.sendPhoto(authorizationToken, parts); + return api.sendPhoto(authorizationToken, parts); } - private void sendMessage(String authorizationToken, OutgoingAudioMessage message) { + private MessageResult sendMessage(String authorizationToken, OutgoingAudioMessage message) { List<Attachment> parts = new LinkedList<>(); fillCommonMediaParts(parts, message); @@ -110,10 +122,10 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService { parts.add(buildTextPart("performer", message.getPerformer())); } - api.sendAudio(authorizationToken, parts); + return api.sendAudio(authorizationToken, parts); } - private void sendMessage(String authorizationToken, OutgoingVideoMessage message) { + private MessageResult sendMessage(String authorizationToken, OutgoingVideoMessage message) { List<Attachment> parts = new LinkedList<>(); fillCommonMediaParts(parts, message); @@ -132,10 +144,10 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService { parts.add(buildTextPart("height", String.valueOf(message.getHeight()))); } - api.sendVideo(authorizationToken, parts); + return api.sendVideo(authorizationToken, parts); } - private void sendMessage(String authorizationToken, OutgoingDocumentMessage message) { + private MessageResult sendMessage(String authorizationToken, OutgoingDocumentMessage message) { List<Attachment> parts = new LinkedList<>(); fillCommonMediaParts(parts, message); @@ -145,7 +157,7 @@ public class TelegramServiceRestBotAPIAdapter implements TelegramService { parts.add(buildTextPart("caption", message.getCaption())); } - api.sendDocument(authorizationToken, parts); + return api.sendDocument(authorizationToken, parts); } private void fillCommonMediaParts(List<Attachment> parts, OutgoingMessage message) { diff --git a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMappingTest.java b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMappingTest.java index 005de59..dca3b99 100644 --- a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMappingTest.java +++ b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramConsumerMappingTest.java @@ -17,6 +17,7 @@ package org.apache.camel.component.telegram; import java.time.Instant; +import java.util.Date; import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; @@ -26,6 +27,7 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.component.telegram.model.Chat; import org.apache.camel.component.telegram.model.IncomingMessage; +import org.apache.camel.component.telegram.model.MessageResult; import org.apache.camel.component.telegram.model.UpdateResult; import org.apache.camel.component.telegram.model.User; import org.apache.camel.component.telegram.util.TelegramTestSupport; @@ -93,8 +95,30 @@ public class TelegramConsumerMappingTest extends TelegramTestSupport { } + @Test + public void testMessageResultMapping() { + MessageResult messageResult = getJSONResource("messages/updates-sendLocation.json", MessageResult.class); + + assertEquals(true, messageResult.isOk()); + assertEquals(true, messageResult.isOk()); + assertEquals((Long) 33L, messageResult.getMessage().getMessageId()); + assertEquals(Instant.ofEpochSecond(1548091564).getEpochSecond(), messageResult.getMessage().getDate().getEpochSecond()); + assertEquals((Long) 665977497L, messageResult.getMessage().getFrom().getId()); + assertEquals(true, messageResult.getMessage().getFrom().isBot()); + assertEquals("camelbot", messageResult.getMessage().getFrom().getFirstName()); + assertEquals("camel_component_bot", messageResult.getMessage().getFrom().getUsername()); + + assertEquals("-182520913", messageResult.getMessage().getChat().getId()); + assertEquals("testgroup", messageResult.getMessage().getChat().getTitle()); + assertEquals("group", messageResult.getMessage().getChat().getType()); + assertEquals(true, messageResult.getMessage().getChat().isAllMembersAreAdministrators()); + + assertEquals(59.9386292, messageResult.getMessage().getLocation().getLatitude(), 1.0E-07); + assertEquals(30.3141308, messageResult.getMessage().getLocation().getLongitude(), 1.0E-07); + } + @Override - protected RoutesBuilder createRouteBuilder() throws Exception { + protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { @Override public void configure() throws Exception { diff --git a/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramProducerLocationTest.java b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramProducerLocationTest.java new file mode 100644 index 0000000..75dba91 --- /dev/null +++ b/components/camel-telegram/src/test/java/org/apache/camel/component/telegram/TelegramProducerLocationTest.java @@ -0,0 +1,90 @@ +/** + * 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.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage; +import org.apache.camel.component.telegram.model.MessageResult; +import org.apache.camel.component.telegram.model.SendLocationMessage; +import org.apache.camel.component.telegram.service.RestBotAPI; +import org.apache.camel.component.telegram.service.TelegramServiceRestBotAPIAdapter; +import org.apache.camel.component.telegram.util.TelegramTestSupport; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +/** + * Tests a producer that sends location information. + */ +@RunWith(MockitoJUnitRunner.class) +public class TelegramProducerLocationTest extends TelegramTestSupport { + + private final double latitude = 59.9386292; + private final double longitude = 30.3141308; + + private TelegramService service; + + @Mock + private RestBotAPI restBotAPI; + + @Before + public void setUp() { + service = new TelegramServiceRestBotAPIAdapter(restBotAPI); + TelegramServiceProvider.get().setAlternativeService(service); + } + + @Test + public void testSendLocation() { + MessageResult expected = new MessageResult(); + expected.setOk(true); + when(restBotAPI.sendLocation(anyString(), any(SendLocationMessage.class))).thenReturn(expected); + + SendLocationMessage msg = new SendLocationMessage(latitude, longitude); + MessageResult actual = (MessageResult) service.sendMessage("mock-token", msg); + + assertEquals(expected, actual); + } + + @Test + public void testEditMessageLiveLocation() { + MessageResult expected = new MessageResult(); + expected.setOk(true); + when(restBotAPI.editMessageLiveLocation(anyString(), any(EditMessageLiveLocationMessage.class))).thenReturn(expected); + + EditMessageLiveLocationMessage msg = new EditMessageLiveLocationMessage(latitude, longitude); + MessageResult actual = (MessageResult) service.sendMessage("mock-token", msg); + + assertEquals(expected, actual); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("direct:telegram").to("telegram:bots/mock-token?chatId=my-id"); + } + }; + } +} diff --git a/components/camel-telegram/src/test/resources/messages/updates-sendLocation.json b/components/camel-telegram/src/test/resources/messages/updates-sendLocation.json new file mode 100644 index 0000000..ae4c091 --- /dev/null +++ b/components/camel-telegram/src/test/resources/messages/updates-sendLocation.json @@ -0,0 +1,23 @@ +{ + "ok": true, + "result": { + "message_id": 33, + "from": { + "id": 665977497, + "is_bot": true, + "first_name": "camelbot", + "username": "camel_component_bot" + }, + "chat": { + "id": -182520913, + "title": "testgroup", + "type": "group", + "all_members_are_administrators": true + }, + "date": 1548091564, + "location": { + "latitude": 59.9386292, + "longitude": 30.3141308 + } + } +} \ No newline at end of file