/**
* 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.util;
import org.apache.camel.Converter;
import org.apache.camel.Exchange;
import org.apache.camel.component.telegram.TelegramConstants;
import org.apache.camel.component.telegram.TelegramMediaType;
import org.apache.camel.component.telegram.TelegramParseMode;
import org.apache.camel.component.telegram.model.IncomingMessage;
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.Update;
/**
* Utilities for converting between Telegram APIs and standard java objects.
*/
@Converter
public final class TelegramConverter {
private TelegramConverter() {
}
@Converter
public static String toString(Update update) {
return update != null ? toString(update.getMessage()) : null;
}
@Converter
public static String toString(IncomingMessage message) {
return message != null ? message.getText() : null;
}
/**
* Fallback converter for any unlisted object, using String default mapping.
*/
@Converter
public static OutgoingMessage toOutgoingMessage(Object message, Exchange exchange) {
String content = exchange.getIn().getBody(String.class);
return toOutgoingMessage(content, exchange);
}
@Converter
public static OutgoingMessage toOutgoingMessage(String message, Exchange exchange) {
if (message == null) {
// fail fast
return null;
}
Object typeObj = exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TYPE);
TelegramMediaType type;
if (typeObj instanceof String) {
type = TelegramMediaType.valueOf((String) typeObj);
} else {
type = (TelegramMediaType) typeObj;
}
// If the message is a string, it will be converted to a OutgoingTextMessage
if (type == null) {
type = TelegramMediaType.TEXT;
}
OutgoingMessage result;
switch (type) {
case TEXT: {
OutgoingTextMessage txt = new OutgoingTextMessage();
txt.setText(message);
TelegramParseMode parseMode = getParseMode(exchange);
if (parseMode != null) {
txt.setParseMode(parseMode.getCode());
}
result = txt;
break;
}
default: {
throw new IllegalArgumentException("Unsupported conversion from String to media type " + type);
}
}
return result;
}
@Converter
public static OutgoingMessage toOutgoingMessage(byte[] message, Exchange exchange) {
if (message == null) {
// fail fast
return null;
}
Object typeObj = exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TYPE);
TelegramMediaType type;
if (typeObj instanceof String) {
type = TelegramMediaType.valueOf((String) typeObj);
} else {
type = (TelegramMediaType) typeObj;
}
// If the message is a string, it will be converted to a OutgoingTextMessage
if (type == null) {
throw new IllegalStateException("Binary message require the header " + TelegramConstants.TELEGRAM_MEDIA_TYPE + " to be set with an appropriate org.apache.camel.component.telegram"
+ ".TelegramMediaType object");
}
OutgoingMessage result;
switch (type) {
case PHOTO_JPG:
case PHOTO_PNG: {
OutgoingPhotoMessage img = new OutgoingPhotoMessage();
String caption = (String) exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TITLE_CAPTION);
String fileName = "photo." + type.getFileExtension();
img.setCaption(caption);
img.setFilenameWithExtension(fileName);
img.setPhoto(message);
result = img;
break;
}
case AUDIO: {
OutgoingAudioMessage audio = new OutgoingAudioMessage();
String title = (String) exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TITLE_CAPTION);
String fileName = "audio." + type.getFileExtension();
audio.setTitle(title);
audio.setFilenameWithExtension(fileName);
audio.setAudio(message);
result = audio;
break;
}
case VIDEO: {
OutgoingVideoMessage video = new OutgoingVideoMessage();
String title = (String) exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TITLE_CAPTION);
String fileName = "video." + type.getFileExtension();
video.setCaption(title);
video.setFilenameWithExtension(fileName);
video.setVideo(message);
result = video;
break;
}
case DOCUMENT:
default: {
// this can be any file
OutgoingDocumentMessage document = new OutgoingDocumentMessage();
String title = (String) exchange.getIn().getHeader(TelegramConstants.TELEGRAM_MEDIA_TITLE_CAPTION);
document.setCaption(title);
document.setFilenameWithExtension("file");
document.setDocument(message);
result = document;
break;
}
}
return result;
}
private static TelegramParseMode getParseMode(Exchange exchange) {
TelegramParseMode mode = null;
Object parseMode = exchange.getIn().getHeader(TelegramConstants.TELEGRAM_PARSE_MODE);
if (parseMode instanceof String) {
mode = TelegramParseMode.valueOf((String) parseMode);
} else {
mode = (TelegramParseMode) parseMode;
}
return mode;
}
}