/**
* 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.service;
import java.io.ByteArrayInputStream;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import org.apache.camel.component.telegram.TelegramService;
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.UpdateResult;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;
/**
* Adapts the {@code RestBotAPI} to the {@code TelegramService} interface.
*/
public class TelegramServiceRestBotAPIAdapter implements TelegramService {
private RestBotAPI api;
public TelegramServiceRestBotAPIAdapter() {
this.api = JAXRSClientFactory.create(RestBotAPI.BOT_API_DEFAULT_URL, RestBotAPI.class, Collections.singletonList(new JacksonJsonProvider()));
WebClient.getConfig(this.api).getHttpConduit().getClient().setAllowChunking(false);
}
@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) {
if (message instanceof OutgoingTextMessage) {
this.sendMessage(authorizationToken, (OutgoingTextMessage) message);
} else if (message instanceof OutgoingPhotoMessage) {
this.sendMessage(authorizationToken, (OutgoingPhotoMessage) message);
} else if (message instanceof OutgoingAudioMessage) {
this.sendMessage(authorizationToken, (OutgoingAudioMessage) message);
} else if (message instanceof OutgoingVideoMessage) {
this.sendMessage(authorizationToken, (OutgoingVideoMessage) message);
} else if (message instanceof OutgoingDocumentMessage) {
this.sendMessage(authorizationToken, (OutgoingDocumentMessage) 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.getChatId(), message.getText(), message.getParseMode(), message.getDisableWebPagePreview(), message.getDisableNotification(), message
.getReplyToMessageId());
}
private void sendMessage(String authorizationToken, OutgoingPhotoMessage message) {
List<Attachment> parts = new LinkedList<>();
fillCommonMediaParts(parts, message);
parts.add(buildMediaPart("photo", message.getFilenameWithExtension(), message.getPhoto()));
if (message.getCaption() != null) {
parts.add(buildTextPart("caption", message.getCaption()));
}
api.sendPhoto(authorizationToken, parts);
}
private void sendMessage(String authorizationToken, OutgoingAudioMessage message) {
List<Attachment> parts = new LinkedList<>();
fillCommonMediaParts(parts, message);
parts.add(buildMediaPart("audio", message.getFilenameWithExtension(), message.getAudio()));
if (message.getTitle() != null) {
parts.add(buildTextPart("title", message.getTitle()));
}
if (message.getDurationSeconds() != null) {
parts.add(buildTextPart("duration", String.valueOf(message.getDurationSeconds())));
}
if (message.getPerformer() != null) {
parts.add(buildTextPart("performer", message.getPerformer()));
}
api.sendAudio(authorizationToken, parts);
}
private void sendMessage(String authorizationToken, OutgoingVideoMessage message) {
List<Attachment> parts = new LinkedList<>();
fillCommonMediaParts(parts, message);
parts.add(buildMediaPart("video", message.getFilenameWithExtension(), message.getVideo()));
if (message.getCaption() != null) {
parts.add(buildTextPart("caption", message.getCaption()));
}
if (message.getDurationSeconds() != null) {
parts.add(buildTextPart("duration", String.valueOf(message.getDurationSeconds())));
}
if (message.getWidth() != null) {
parts.add(buildTextPart("width", String.valueOf(message.getWidth())));
}
if (message.getHeight() != null) {
parts.add(buildTextPart("height", String.valueOf(message.getHeight())));
}
api.sendVideo(authorizationToken, parts);
}
private void sendMessage(String authorizationToken, OutgoingDocumentMessage message) {
List<Attachment> parts = new LinkedList<>();
fillCommonMediaParts(parts, message);
parts.add(buildMediaPart("document", message.getFilenameWithExtension(), message.getDocument()));
if (message.getCaption() != null) {
parts.add(buildTextPart("caption", message.getCaption()));
}
api.sendDocument(authorizationToken, parts);
}
private void fillCommonMediaParts(List<Attachment> parts, OutgoingMessage message) {
parts.add(buildTextPart("chat_id", message.getChatId()));
if (message.getReplyToMessageId() != null) {
parts.add(buildTextPart("reply_to_message_id", String.valueOf(message.getReplyToMessageId())));
}
if (message.getDisableNotification() != null) {
parts.add(buildTextPart("disable_notification", String.valueOf(message.getDisableNotification())));
}
}
private Attachment buildTextPart(String name, String value) {
MultivaluedMap m = new MultivaluedHashMap<>();
m.putSingle("Content-Type", "text/plain");
m.putSingle("Content-Disposition", "form-data; name=\"" + escapeMimeName(name) + "\"");
Attachment a = new Attachment(m, value);
return a;
}
private Attachment buildMediaPart(String name, String fileNameWithExtension, byte[] value) {
Attachment a = new Attachment(name, new ByteArrayInputStream(value),
new ContentDisposition("form-data; name=\"" + escapeMimeName(name) + "\"; filename=\"" + escapeMimeName(fileNameWithExtension) + "\""));
return a;
}
private String escapeMimeName(String name) {
return name.replace("\"", "");
}
}