From d0950a23e1be9946e2970436d0d7113bfb6aac53 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Sun, 8 May 2016 01:54:53 +0200 Subject: [PATCH 01/17] Possible improvements, may be unestable --- .../telegrambots/api/objects/Message.java | 14 +++--- .../updatesreceivers/BotSession.java | 46 +++++++++---------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/api/objects/Message.java b/src/main/java/org/telegram/telegrambots/api/objects/Message.java index 126cb67f..6f68a03a 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/Message.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/Message.java @@ -61,7 +61,7 @@ public class Message implements IBotApiObject { @JsonProperty(FORWARDFROM_FIELD) private User forwardFrom; ///< Optional. For forwarded messages, sender of the original message @JsonProperty(FORWARDFROMCHAT_FIELD) - private Chat forwardedFromChat; ///< Optional. For messages forwarded from a channel, information about the original channel + private Chat forwardFromChat; ///< Optional. For messages forwarded from a channel, information about the original channel @JsonProperty(FORWARDDATE_FIELD) private Integer forwardDate; ///< Optional. For forwarded messages, date the original message was sent @JsonProperty(TEXT_FIELD) @@ -130,7 +130,7 @@ public class Message implements IBotApiObject { } this.chat = new Chat(jsonObject.getJSONObject(CHAT_FIELD)); if (jsonObject.has(FORWARDFROMCHAT_FIELD)) { - this.forwardedFromChat = new Chat(jsonObject.getJSONObject(FORWARDFROMCHAT_FIELD)); + this.forwardFromChat = new Chat(jsonObject.getJSONObject(FORWARDFROMCHAT_FIELD)); } if (jsonObject.has(FORWARDFROM_FIELD)) { this.forwardFrom = new User(jsonObject.getJSONObject(FORWARDFROM_FIELD)); @@ -373,8 +373,8 @@ public class Message implements IBotApiObject { return location != null; } - public Chat getForwardedFromChat() { - return forwardedFromChat; + public Chat getForwardFromChat() { + return forwardFromChat; } @Override @@ -388,8 +388,8 @@ public class Message implements IBotApiObject { gen.writeNumberField(DATE_FIELD, date); } gen.writeObjectField(CHAT_FIELD, chat); - if (forwardedFromChat != null) { - gen.writeObjectField(FORWARDFROMCHAT_FIELD, forwardedFromChat); + if (forwardFromChat != null) { + gen.writeObjectField(FORWARDFROMCHAT_FIELD, forwardFromChat); } if (forwardFrom != null) { gen.writeObjectField(FORWARDFROM_FIELD, forwardFrom); @@ -485,7 +485,7 @@ public class Message implements IBotApiObject { ", date=" + date + ", chat=" + chat + ", forwardFrom=" + forwardFrom + - ", forwardedFromChat=" + forwardedFromChat + + ", forwardFromChat=" + forwardFromChat + ", forwardDate=" + forwardDate + ", text='" + text + '\'' + ", audio=" + audio + diff --git a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java index f770700c..519fdf22 100644 --- a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java +++ b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java @@ -1,8 +1,8 @@ package org.telegram.telegrambots.updatesreceivers; import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.BufferedHttpEntity; @@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit; */ public class BotSession { private static final String LOGTAG = "BOTSESSION"; - private static final int SOCKET_TIMEOUT = 30 * 1000; + private static final int SOCKET_TIMEOUT = 10 * 1000; private final ITelegramLongPollingBot callback; private final ReaderThread readerThread; @@ -55,6 +55,10 @@ public class BotSession { this.handlerThread = new HandlerThread(); handlerThread.setName(callback.getBotUsername() + " Executor"); this.handlerThread.start(); + httpclient = HttpClientBuilder.create() + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .setConnectionTimeToLive(120, TimeUnit.SECONDS) + .build(); } public void close() @@ -79,32 +83,28 @@ public class BotSession { public void run() { setPriority(Thread.MIN_PRIORITY); while(running) { - GetUpdates request = new GetUpdates(); - request.setLimit(100); - request.setTimeout(20); - request.setOffset(lastReceivedUpdate + 1); - httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).setConnectionTimeToLive(20, TimeUnit.SECONDS).build(); - String url = Constants.BASEURL + token + "/" + GetUpdates.PATH; - //config - RequestConfig defaultRequestConfig = RequestConfig.custom().build(); - RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig) - .setSocketTimeout(SOCKET_TIMEOUT) - .setConnectTimeout(SOCKET_TIMEOUT) - .setConnectionRequestTimeout(SOCKET_TIMEOUT).build(); - //http client - HttpPost httpPost = new HttpPost(url); try { + GetUpdates request = new GetUpdates(); + request.setLimit(100); + request.setTimeout(50); + request.setOffset(lastReceivedUpdate + 1); + String url = Constants.BASEURL + token + "/" + GetUpdates.PATH; + //config + RequestConfig defaultRequestConfig = RequestConfig.custom().build(); + RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig) + .setSocketTimeout(SOCKET_TIMEOUT) + .setConnectTimeout(SOCKET_TIMEOUT) + .setConnectionRequestTimeout(SOCKET_TIMEOUT).build(); + //http client + HttpPost httpPost = new HttpPost(url); httpPost.addHeader("charset", StandardCharsets.UTF_8.name()); httpPost.setConfig(requestConfig); httpPost.setEntity(new StringEntity(request.toJson().toString(), ContentType.APPLICATION_JSON)); - HttpResponse response; - response = httpclient.execute(httpPost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); - - try { + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { throw new InvalidObjectException(jsonObject.toString()); From 199152e9bffcea2542b2165db92bedc436a2b7fb Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Sun, 8 May 2016 13:55:27 +0200 Subject: [PATCH 02/17] Possible improvements, may be unestable --- .../updatesreceivers/BotSession.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java index 519fdf22..932abb23 100644 --- a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java +++ b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java @@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit; */ public class BotSession { private static final String LOGTAG = "BOTSESSION"; - private static final int SOCKET_TIMEOUT = 10 * 1000; + private static final int SOCKET_TIMEOUT = 75 * 1000; private final ITelegramLongPollingBot callback; private final ReaderThread readerThread; @@ -44,21 +44,27 @@ public class BotSession { private int lastReceivedUpdate = 0; private volatile boolean running = true; private volatile CloseableHttpClient httpclient; + private volatile RequestConfig requestConfig; public BotSession(String token, ITelegramLongPollingBot callback) { this.token = token; this.callback = callback; + httpclient = HttpClientBuilder.create() + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .setConnectionTimeToLive(70, TimeUnit.SECONDS) + .setMaxConnTotal(100) + .build(); + requestConfig = RequestConfig.copy(RequestConfig.custom().build()) + .setSocketTimeout(SOCKET_TIMEOUT) + .setConnectTimeout(SOCKET_TIMEOUT) + .setConnectionRequestTimeout(SOCKET_TIMEOUT).build(); this.readerThread = new ReaderThread(); readerThread.setName(callback.getBotUsername() + " Telegram Connection"); this.readerThread.start(); this.handlerThread = new HandlerThread(); handlerThread.setName(callback.getBotUsername() + " Executor"); this.handlerThread.start(); - httpclient = HttpClientBuilder.create() - .setSSLHostnameVerifier(new NoopHostnameVerifier()) - .setConnectionTimeToLive(120, TimeUnit.SECONDS) - .build(); } public void close() @@ -89,12 +95,6 @@ public class BotSession { request.setTimeout(50); request.setOffset(lastReceivedUpdate + 1); String url = Constants.BASEURL + token + "/" + GetUpdates.PATH; - //config - RequestConfig defaultRequestConfig = RequestConfig.custom().build(); - RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig) - .setSocketTimeout(SOCKET_TIMEOUT) - .setConnectTimeout(SOCKET_TIMEOUT) - .setConnectionRequestTimeout(SOCKET_TIMEOUT).build(); //http client HttpPost httpPost = new HttpPost(url); httpPost.addHeader("charset", StandardCharsets.UTF_8.name()); From 19f473cfe5ec5290c6e7c5d45c4a2e6e88c36bec Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Mon, 9 May 2016 02:01:31 +0200 Subject: [PATCH 03/17] Compute message entities content during Message deserialization --- .../org/telegram/telegrambots/api/objects/Message.java | 4 ++++ .../telegrambots/api/objects/MessageEntity.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/org/telegram/telegrambots/api/objects/Message.java b/src/main/java/org/telegram/telegrambots/api/objects/Message.java index 6f68a03a..05414b84 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/Message.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/Message.java @@ -219,6 +219,10 @@ public class Message implements IBotApiObject { if (jsonObject.has(MIGRATEFROMCHAT_FIELD)) { this.migrateFromChatId = jsonObject.getLong(MIGRATEFROMCHAT_FIELD); } + + if (hasText() && entities != null) { + entities.forEach(x -> x.computeText(text)); + } } public Integer getMessageId() { diff --git a/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java b/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java index b436f51f..14a9bccc 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java @@ -45,6 +45,8 @@ public class MessageEntity implements IBotApiObject { @JsonProperty(URL_FIELD) private String url; ///< Optional. For “text_link” only, url that will be opened after user taps on the text + private String text; ///< Text present in the entity. Computed from offset and length + public MessageEntity() { super(); } @@ -75,6 +77,14 @@ public class MessageEntity implements IBotApiObject { return url; } + public String getText() { + return text; + } + + protected void computeText(String message) { + text = message.substring(offset, offset + length); + } + @Override public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); From 077ac9e6d68092b44b45c4cc5daf7a73329f1a48 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Mon, 9 May 2016 02:16:00 +0200 Subject: [PATCH 04/17] Closes #71 --- .../org/telegram/telegrambots/BotLogger.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/BotLogger.java b/src/main/java/org/telegram/telegrambots/BotLogger.java index e098f60d..3caebda6 100644 --- a/src/main/java/org/telegram/telegrambots/BotLogger.java +++ b/src/main/java/org/telegram/telegrambots/BotLogger.java @@ -64,7 +64,6 @@ public class BotLogger { logToFile(level, tag, msg); } - public static void severe(String tag, String msg) { logger.severe(String.format("[%s] %s", tag, msg)); logToFile(Level.SEVERE, tag, msg); @@ -91,37 +90,31 @@ public class BotLogger { logToFile(Level.WARNING, tag, msg); } - public static void info(String tag, String msg) { logger.info(String.format("[%s] %s", tag, msg)); logToFile(Level.INFO, tag, msg); } - public static void config(String tag, String msg) { logger.config(String.format("[%s] %s", tag, msg)); logToFile(Level.CONFIG, tag, msg); } - public static void fine(String tag, String msg) { logger.fine(String.format("[%s] %s", tag, msg)); logToFile(Level.FINE, tag, msg); } - public static void finer(String tag, String msg) { logger.finer(String.format("[%s] %s", tag, msg)); logToFile(Level.FINER, tag, msg); } - public static void finest(String tag, String msg) { logger.finest(String.format("[%s] %s", tag, msg)); logToFile(Level.FINEST, tag, msg); } - public static void log(Level level, String tag, Throwable throwable) { logger.log(level, String.format("[%s] Exception", tag), throwable); logToFile(level, tag, throwable); @@ -133,30 +126,37 @@ public class BotLogger { } public static void severe(String tag, Throwable throwable) { + logger.log(Level.SEVERE, tag, throwable); logToFile(Level.SEVERE, tag, throwable); } public static void warning(String tag, Throwable throwable) { + logger.log(Level.WARNING, tag, throwable); logToFile(Level.WARNING, tag, throwable); } public static void info(String tag, Throwable throwable) { + logger.log(Level.INFO, tag, throwable); logToFile(Level.INFO, tag, throwable); } public static void config(String tag, Throwable throwable) { + logger.log(Level.CONFIG, tag, throwable); logToFile(Level.CONFIG, tag, throwable); } public static void fine(String tag, Throwable throwable) { + logger.log(Level.FINE, tag, throwable); logToFile(Level.FINE, tag, throwable); } public static void finer(String tag, Throwable throwable) { + logger.log(Level.FINER, tag, throwable); logToFile(Level.FINER, tag, throwable); } public static void finest(String tag, Throwable throwable) { + logger.log(Level.FINEST, tag, throwable); logToFile(Level.FINEST, tag, throwable); } @@ -267,7 +267,6 @@ public class BotLogger { } } - private static void logToFile(Level level, String tag, Throwable throwable) { if (isLoggable(level)) { synchronized (lockToWrite) { @@ -279,7 +278,6 @@ public class BotLogger { } } - private static void logToFile(Level level, String tag, String msg) { if (isLoggable(level)) { synchronized (lockToWrite) { From c42a23501d23b2f757425a07c87e81bf387f20d4 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Mon, 9 May 2016 02:27:49 +0200 Subject: [PATCH 05/17] Fix bug when sending locations --- src/main/java/org/telegram/telegrambots/bots/AbsSender.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index ae987e06..b1571d3c 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -61,6 +61,7 @@ import java.util.concurrent.Executors; * @brief Implementation of all the methods needed to interact with Telegram Servers * @date 14 of January of 2016 */ +@SuppressWarnings("unused") public abstract class AbsSender { private final ExecutorService exe = Executors.newSingleThreadExecutor(); @@ -244,7 +245,7 @@ public abstract class AbsSender { sendApiMethodAsync(forwardMessage, sentCallback); } - public void sendLocationAsync(SendLocation sendLocation, SentCallback sentCallback) throws TelegramApiException { + public void sendLocationAsync(SendLocation sendLocation, SentCallback sentCallback) throws TelegramApiException { if (sendLocation == null) { throw new TelegramApiException("Parameter sendLocation can not be null"); } @@ -780,7 +781,8 @@ public abstract class AbsSender { // Simplified methods - private void sendApiMethodAsync(BotApiMethod method, SentCallback callback) { + private , Callback extends SentCallback> void sendApiMethodAsync(Method method, Callback callback) { + //noinspection Convert2Lambda exe.submit(new Runnable() { @Override public void run() { From 0f13e22917bf1525ca9ea7c7cc4138e6250c9d4c Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Mon, 9 May 2016 02:44:26 +0200 Subject: [PATCH 06/17] Several improvements --- .gitignore | 4 - .../org/telegram/telegrambots/BotLogger.java | 6 +- .../telegrambots/TelegramBotsApi.java | 18 +-- .../result/InlineQueryResultArticle.java | 7 +- .../result/InlineQueryResultGif.java | 5 +- .../result/InlineQueryResultMpeg4Gif.java | 3 +- .../telegram/telegrambots/bots/AbsSender.java | 106 +++++++++--------- 7 files changed, 74 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 8a74bebb..e3308905 100644 --- a/.gitignore +++ b/.gitignore @@ -22,10 +22,6 @@ buildNumber.properties # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* -# unneeded files -.idea/dataSources.* -.idea/workspace.xml - # logs files *.log diff --git a/src/main/java/org/telegram/telegrambots/BotLogger.java b/src/main/java/org/telegram/telegrambots/BotLogger.java index 3caebda6..5622834b 100644 --- a/src/main/java/org/telegram/telegrambots/BotLogger.java +++ b/src/main/java/org/telegram/telegrambots/BotLogger.java @@ -121,8 +121,8 @@ public class BotLogger { } public static void log(Level level, String tag, String msg, Throwable thrown) { - logger.log(level, msg, thrown); - logToFile(level, msg, thrown); + logger.log(level, String.format("[%s] %s", tag, msg), thrown); + logToFile(level, tag, msg, thrown); } public static void severe(String tag, Throwable throwable) { @@ -201,7 +201,7 @@ public class BotLogger { } public static void finest(String msg, String tag, Throwable throwable) { - log(Level.FINEST, msg, throwable); + log(Level.FINEST, tag, msg, throwable); } public static void warn(String msg, String tag, Throwable throwable) { diff --git a/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java b/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java index 19017ea1..23fa3617 100644 --- a/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java +++ b/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java @@ -94,8 +94,7 @@ public class TelegramBotsApi { * @throws TelegramApiException */ private static void setWebhook(String webHookURL, String botToken, String publicCertificatePath, String publicCertificateName) throws TelegramApiException { - try { - CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + try (CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { String url = Constants.BASEURL + botToken + "/" + SetWebhook.PATH; HttpPost httppost = new HttpPost(url); @@ -106,13 +105,14 @@ public class TelegramBotsApi { } HttpEntity multipart = builder.build(); httppost.setEntity(multipart); - CloseableHttpResponse response = httpclient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); - JSONObject jsonObject = new JSONObject(responseContent); - if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException(webHookURL == null ? "Error removing old webhook" : "Error setting webhook", responseContent); + try (CloseableHttpResponse response = httpclient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + JSONObject jsonObject = new JSONObject(responseContent); + if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { + throw new TelegramApiException(webHookURL == null ? "Error removing old webhook" : "Error setting webhook", responseContent); + } } } catch (JSONException e) { throw new TelegramApiException("Error deserializing setWebhook method response", e); diff --git a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultArticle.java b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultArticle.java index 65ff5849..3a09675d 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultArticle.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultArticle.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + import org.json.JSONObject; import org.telegram.telegrambots.api.objects.inlinequery.inputmessagecontent.InputMessageContent; import org.telegram.telegrambots.api.objects.replykeyboard.InlineKeyboardMarkup; @@ -52,7 +53,7 @@ public class InlineQueryResultArticle implements InlineQueryResult { @JsonProperty(THUMBHEIGHT_FIELD) private Integer thumbHeight; ///< Optional. Thumbnail height - public String getType() { + public static String getType() { return type; } @@ -150,8 +151,8 @@ public class InlineQueryResultArticle implements InlineQueryResult { public JSONObject toJson() { JSONObject jsonObject = new JSONObject(); - jsonObject.put(TYPE_FIELD, this.type); - jsonObject.put(ID_FIELD, this.id); + jsonObject.put(TYPE_FIELD, type); + jsonObject.put(ID_FIELD, id); jsonObject.put(TITLE_FIELD, this.title); jsonObject.put(INPUTMESSAGECONTENT_FIELD, inputMessageContent.toJson()); if (replyMarkup != null) { diff --git a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultGif.java b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultGif.java index cd09d6e7..3cb3db9a 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultGif.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultGif.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + import org.json.JSONObject; import org.telegram.telegrambots.api.objects.inlinequery.inputmessagecontent.InputMessageContent; import org.telegram.telegrambots.api.objects.replykeyboard.InlineKeyboardMarkup; @@ -51,7 +52,7 @@ public class InlineQueryResultGif implements InlineQueryResult { @JsonProperty(REPLY_MARKUP_FIELD) private InlineKeyboardMarkup replyMarkup; ///< Optional. Inline keyboard attached to the message - public String getType() { + public static String getType() { return type; } @@ -139,7 +140,7 @@ public class InlineQueryResultGif implements InlineQueryResult { @Override public JSONObject toJson() { JSONObject jsonObject = new JSONObject(); - jsonObject.put(TYPE_FIELD, this.type); + jsonObject.put(TYPE_FIELD, type); jsonObject.put(ID_FIELD, this.id); jsonObject.put(GIFURL_FIELD, this.gifUrl); if (gifWidth != null) { diff --git a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultMpeg4Gif.java b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultMpeg4Gif.java index ae5e2f03..6185db31 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultMpeg4Gif.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/inlinequery/result/InlineQueryResultMpeg4Gif.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + import org.json.JSONObject; import org.telegram.telegrambots.api.objects.inlinequery.inputmessagecontent.InputMessageContent; import org.telegram.telegrambots.api.objects.replykeyboard.InlineKeyboardMarkup; @@ -51,7 +52,7 @@ public class InlineQueryResultMpeg4Gif implements InlineQueryResult { @JsonProperty(REPLY_MARKUP_FIELD) private InlineKeyboardMarkup replyMarkup; ///< Optional. Inline keyboard attached to the message - public String getType() { + public static String getType() { return type; } diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index b1571d3c..994ffd6d 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -382,8 +382,7 @@ public abstract class AbsSender { public Message sendDocument(SendDocument sendDocument) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendDocument.PATH; HttpPost httppost = new HttpPost(url); if (sendDocument.isNewDocument()) { @@ -423,10 +422,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send document", e); } @@ -441,8 +441,7 @@ public abstract class AbsSender { public Message sendPhoto(SendPhoto sendPhoto) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendPhoto.PATH; HttpPost httppost = new HttpPost(url); if (sendPhoto.isNewPhoto()) { @@ -482,10 +481,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send photo", e); } @@ -500,8 +500,7 @@ public abstract class AbsSender { public Message sendVideo(SendVideo sendVideo) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendVideo.PATH; HttpPost httppost = new HttpPost(url); if (sendVideo.isNewVideo()) { @@ -559,10 +558,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send video", e); } @@ -578,8 +578,7 @@ public abstract class AbsSender { public Message sendSticker(SendSticker sendSticker) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendSticker.PATH; HttpPost httppost = new HttpPost(url); if (sendSticker.isNewSticker()) { @@ -613,10 +612,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send sticker", e); } @@ -638,9 +638,8 @@ public abstract class AbsSender { public Message sendAudio(SendAudio sendAudio) throws TelegramApiException { String responseContent; - - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendAudio.PATH; HttpPost httppost = new HttpPost(url); @@ -690,10 +689,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send sticker", e); } @@ -721,8 +721,7 @@ public abstract class AbsSender { public Message sendVoice(SendVoice sendVoice) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String url = getBaseUrl() + SendVoice.PATH; HttpPost httppost = new HttpPost(url); @@ -763,10 +762,11 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - CloseableHttpResponse response = httpClient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to send sticker", e); } @@ -786,22 +786,22 @@ public abstract class AbsSender { exe.submit(new Runnable() { @Override public void run() { - try { - CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + try (CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { String url = getBaseUrl() + method.getPath(); HttpPost httppost = new HttpPost(url); httppost.addHeader("charset", StandardCharsets.UTF_8.name()); httppost.setEntity(new StringEntity(method.toJson().toString(), ContentType.APPLICATION_JSON)); - CloseableHttpResponse response = httpclient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpclient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); - JSONObject jsonObject = new JSONObject(responseContent); - if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - callback.onError(method, jsonObject); + JSONObject jsonObject = new JSONObject(responseContent); + if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { + callback.onError(method, jsonObject); + } + callback.onResult(method, jsonObject); } - callback.onResult(method, jsonObject); } catch (IOException e) { callback.onException(method, e); } @@ -812,16 +812,16 @@ public abstract class AbsSender { private Serializable sendApiMethod(BotApiMethod method) throws TelegramApiException { String responseContent; - try { - CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + try (CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { String url = getBaseUrl() + method.getPath(); HttpPost httppost = new HttpPost(url); httppost.addHeader("charset", StandardCharsets.UTF_8.name()); httppost.setEntity(new StringEntity(method.toJson().toString(), ContentType.APPLICATION_JSON)); - CloseableHttpResponse response = httpclient.execute(httppost); - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + try (CloseableHttpResponse response = httpclient.execute(httppost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + } } catch (IOException e) { throw new TelegramApiException("Unable to execute " + method.getPath() + " method", e); } From f1ce1a6ee902179d5985b821544dc98174f0771c Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Mon, 9 May 2016 02:56:49 +0200 Subject: [PATCH 07/17] Improve telegramapiexceptions --- .../org/telegram/telegrambots/Constants.java | 2 ++ .../telegrambots/TelegramApiException.java | 7 +++++-- .../telegram/telegrambots/TelegramBotsApi.java | 5 ++++- .../telegram/telegrambots/bots/AbsSender.java | 17 ++++++++++------- .../updatesreceivers/BotSession.java | 8 ++++++-- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/Constants.java b/src/main/java/org/telegram/telegrambots/Constants.java index bac4a237..60371d0f 100644 --- a/src/main/java/org/telegram/telegrambots/Constants.java +++ b/src/main/java/org/telegram/telegrambots/Constants.java @@ -10,4 +10,6 @@ public class Constants { public static final String BASEURL = "https://api.telegram.org/bot"; public static final String RESPONSEFIELDOK = "ok"; public static final String RESPONSEFIELDRESULT = "result"; + public static final String ERRORDESCRIPTIONFIELD = "description"; + public static final String ERRORCODEFIELD = "error_code"; } diff --git a/src/main/java/org/telegram/telegrambots/TelegramApiException.java b/src/main/java/org/telegram/telegrambots/TelegramApiException.java index 84643e66..d9653b9f 100644 --- a/src/main/java/org/telegram/telegrambots/TelegramApiException.java +++ b/src/main/java/org/telegram/telegrambots/TelegramApiException.java @@ -8,12 +8,13 @@ package org.telegram.telegrambots; */ public class TelegramApiException extends Exception { private String apiResponse = null; + private Integer errorCode; public TelegramApiException(String message) { super(message); } - public TelegramApiException(String message, String apiResponse) { + public TelegramApiException(String message, String apiResponse, Integer errorCode) { super(message); this.apiResponse = apiResponse; } @@ -30,8 +31,10 @@ public class TelegramApiException extends Exception { public String toString() { if (apiResponse == null) { return super.toString(); - } else { + } else if (errorCode == null) { return super.toString() + ": " + apiResponse; + } else { + return super.toString() + ": [" + errorCode + "] " + apiResponse; } } } diff --git a/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java b/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java index 23fa3617..17f37ff2 100644 --- a/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java +++ b/src/main/java/org/telegram/telegrambots/TelegramBotsApi.java @@ -22,6 +22,9 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import static org.telegram.telegrambots.Constants.ERRORCODEFIELD; +import static org.telegram.telegrambots.Constants.ERRORDESCRIPTIONFIELD; + /** * @author Ruben Bermudez * @version 1.0 @@ -111,7 +114,7 @@ public class TelegramBotsApi { String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException(webHookURL == null ? "Error removing old webhook" : "Error setting webhook", responseContent); + throw new TelegramApiException(webHookURL == null ? "Error removing old webhook" : "Error setting webhook", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } } } catch (JSONException e) { diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index 994ffd6d..75e99ce7 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -55,6 +55,9 @@ import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import static org.telegram.telegrambots.Constants.ERRORCODEFIELD; +import static org.telegram.telegrambots.Constants.ERRORDESCRIPTIONFIELD; + /** * @author Ruben Bermudez * @version 1.0 @@ -433,7 +436,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendDocument", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendDocument", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); @@ -492,7 +495,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendPhoto", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendPhoto", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); @@ -569,7 +572,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendVideo", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendVideo", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); @@ -623,7 +626,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendSticker", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendSticker", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); @@ -705,7 +708,7 @@ public abstract class AbsSender { * {"description":"[Error]: Bad Request: chat not found","error_code":400,"ok":false} */ if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendAudio", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendAudio", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } // and if not, we can expect a "result" section. and out of this can a new Message object be built @@ -773,7 +776,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at sendVoice", jsonObject.getString("description")); + throw new TelegramApiException("Error at sendVoice", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); @@ -828,7 +831,7 @@ public abstract class AbsSender { JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new TelegramApiException("Error at " + method.getPath(), jsonObject.getString("description")); + throw new TelegramApiException("Error at " + method.getPath(), jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } return method.deserializeResponse(jsonObject); diff --git a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java index 932abb23..c3178b6b 100644 --- a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java +++ b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java @@ -16,6 +16,7 @@ import org.json.JSONException; import org.json.JSONObject; import org.telegram.telegrambots.BotLogger; import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.TelegramApiException; import org.telegram.telegrambots.api.methods.updates.GetUpdates; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.ITelegramLongPollingBot; @@ -26,6 +27,9 @@ import java.nio.charset.StandardCharsets; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; +import static org.telegram.telegrambots.Constants.ERRORCODEFIELD; +import static org.telegram.telegrambots.Constants.ERRORDESCRIPTIONFIELD; + /** * @author Ruben Bermudez * @version 1.0 @@ -107,7 +111,7 @@ public class BotSession { String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); JSONObject jsonObject = new JSONObject(responseContent); if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { - throw new InvalidObjectException(jsonObject.toString()); + throw new TelegramApiException("Error getting updates", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } JSONArray jsonArray = jsonObject.getJSONArray(Constants.RESPONSEFIELDRESULT); if (jsonArray.length() != 0) { @@ -130,7 +134,7 @@ public class BotSession { BotLogger.severe(LOGTAG, e); } } - } catch (InvalidObjectException | JSONException e) { + } catch (InvalidObjectException | JSONException | TelegramApiException e) { BotLogger.severe(LOGTAG, e); } } catch (Exception global) { From 10df49a11ea0934e0bf60010698f3aa90af9f9ae Mon Sep 17 00:00:00 2001 From: antonu17 Date: Tue, 10 May 2016 22:39:36 +0600 Subject: [PATCH 08/17] Fix caption field var --- .../org/telegram/telegrambots/api/methods/send/SendPhoto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/telegram/telegrambots/api/methods/send/SendPhoto.java b/src/main/java/org/telegram/telegrambots/api/methods/send/SendPhoto.java index e1059aa0..fcb59daa 100644 --- a/src/main/java/org/telegram/telegrambots/api/methods/send/SendPhoto.java +++ b/src/main/java/org/telegram/telegrambots/api/methods/send/SendPhoto.java @@ -13,7 +13,7 @@ public class SendPhoto { public static final String CHATID_FIELD = "chat_id"; public static final String PHOTO_FIELD = "photo"; - public static final String CAPTION_FIELD = "photo"; + public static final String CAPTION_FIELD = "caption"; public static final String DISABLENOTIFICATION_FIELD = "disable_notification"; public static final String REPLYTOMESSAGEID_FIELD = "reply_to_message_id"; public static final String REPLYMARKUP_FIELD = "reply_markup"; From 85e31f87a46b4d9ab8d61e30e6c808dcb21238aa Mon Sep 17 00:00:00 2001 From: antonu17 Date: Tue, 10 May 2016 22:40:16 +0600 Subject: [PATCH 09/17] Send caption in UTF-8 encoding --- src/main/java/org/telegram/telegrambots/bots/AbsSender.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index ae987e06..3276910a 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -396,7 +396,7 @@ public abstract class AbsSender { builder.addTextBody(SendDocument.REPLYTOMESSAGEID_FIELD, sendDocument.getReplayToMessageId().toString()); } if (sendDocument.getCaption() != null) { - builder.addTextBody(SendDocument.CAPTION_FIELD, sendDocument.getCaption()); + builder.addTextBody(SendDocument.CAPTION_FIELD, sendDocument.getCaption(), ContentType.create("text/plain", StandardCharsets.UTF_8)); } if (sendDocument.getDisableNotification() != null) { builder.addTextBody(SendDocument.DISABLENOTIFICATION_FIELD, sendDocument.getDisableNotification().toString()); @@ -455,7 +455,7 @@ public abstract class AbsSender { builder.addTextBody(SendPhoto.REPLYTOMESSAGEID_FIELD, sendPhoto.getReplayToMessageId().toString()); } if (sendPhoto.getCaption() != null) { - builder.addTextBody(SendPhoto.CAPTION_FIELD, sendPhoto.getCaption()); + builder.addTextBody(SendPhoto.CAPTION_FIELD, sendPhoto.getCaption(), ContentType.create("text/plain", StandardCharsets.UTF_8)); } if (sendPhoto.getDisableNotification() != null) { builder.addTextBody(SendPhoto.DISABLENOTIFICATION_FIELD, sendPhoto.getDisableNotification().toString()); @@ -514,7 +514,7 @@ public abstract class AbsSender { builder.addTextBody(SendVideo.REPLYTOMESSAGEID_FIELD, sendVideo.getReplayToMessageId().toString()); } if (sendVideo.getCaption() != null) { - builder.addTextBody(SendVideo.CAPTION_FIELD, sendVideo.getCaption()); + builder.addTextBody(SendVideo.CAPTION_FIELD, sendVideo.getCaption(), ContentType.create("text/plain", StandardCharsets.UTF_8)); } if (sendVideo.getDuration() != null) { builder.addTextBody(SendVideo.DURATION_FIELD, sendVideo.getDuration().toString()); From 13a5ca6e0c491f5cfb19c9c925757cc4c8e16bdc Mon Sep 17 00:00:00 2001 From: Eugene Kurpilyansky Date: Tue, 10 May 2016 22:40:00 +0300 Subject: [PATCH 10/17] Fix serialization ReplayMarkup in sendPhoto, sendDocument, etc. --- .../org/telegram/telegrambots/bots/AbsSender.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index ae987e06..fe02add9 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -408,7 +408,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendDocument.CHATID_FIELD, sendDocument.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendDocument.DOCUMENT_FIELD, sendDocument.getDocument())); if (sendDocument.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendDocument.REPLYMARKUP_FIELD, sendDocument.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendDocument.REPLYMARKUP_FIELD, sendDocument.getReplayMarkup().toJson().toString())); } if (sendDocument.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendDocument.REPLYTOMESSAGEID_FIELD, sendDocument.getReplayToMessageId().toString())); @@ -467,7 +467,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendPhoto.CHATID_FIELD, sendPhoto.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendPhoto.PHOTO_FIELD, sendPhoto.getPhoto())); if (sendPhoto.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendPhoto.REPLYMARKUP_FIELD, sendPhoto.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendPhoto.REPLYMARKUP_FIELD, sendPhoto.getReplayMarkup().toJson().toString())); } if (sendPhoto.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendPhoto.REPLYTOMESSAGEID_FIELD, sendPhoto.getReplayToMessageId().toString())); @@ -535,7 +535,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendVideo.CHATID_FIELD, sendVideo.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendVideo.VIDEO_FIELD, sendVideo.getVideo())); if (sendVideo.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendVideo.REPLYMARKUP_FIELD, sendVideo.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendVideo.REPLYMARKUP_FIELD, sendVideo.getReplayMarkup().toJson().toString())); } if (sendVideo.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendVideo.REPLYTOMESSAGEID_FIELD, sendVideo.getReplayToMessageId().toString())); @@ -601,7 +601,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendSticker.CHATID_FIELD, sendSticker.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendSticker.STICKER_FIELD, sendSticker.getSticker())); if (sendSticker.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendSticker.REPLYMARKUP_FIELD, sendSticker.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendSticker.REPLYMARKUP_FIELD, sendSticker.getReplayMarkup().toJson().toString())); } if (sendSticker.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendSticker.REPLYTOMESSAGEID_FIELD, sendSticker.getReplayToMessageId().toString())); @@ -672,7 +672,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendAudio.CHATID_FIELD, sendAudio.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendAudio.AUDIO_FIELD, sendAudio.getAudio())); if (sendAudio.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendAudio.REPLYMARKUP_FIELD, sendAudio.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendAudio.REPLYMARKUP_FIELD, sendAudio.getReplayMarkup().toJson().toString())); } if (sendAudio.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendAudio.REPLYTOMESSAGEID_FIELD, sendAudio.getReplayToMessageId().toString())); @@ -748,7 +748,7 @@ public abstract class AbsSender { nameValuePairs.add(new BasicNameValuePair(SendVoice.CHATID_FIELD, sendVoice.getChatId())); nameValuePairs.add(new BasicNameValuePair(SendVoice.AUDIO_FIELD, sendVoice.getAudio())); if (sendVoice.getReplayMarkup() != null) { - nameValuePairs.add(new BasicNameValuePair(SendVoice.REPLYMARKUP_FIELD, sendVoice.getReplayMarkup().toString())); + nameValuePairs.add(new BasicNameValuePair(SendVoice.REPLYMARKUP_FIELD, sendVoice.getReplayMarkup().toJson().toString())); } if (sendVoice.getReplayToMessageId() != null) { nameValuePairs.add(new BasicNameValuePair(SendVoice.REPLYTOMESSAGEID_FIELD, sendVoice.getReplayToMessageId().toString())); From acc9d14d0459855fc47036d799a4285354870d2e Mon Sep 17 00:00:00 2001 From: dapoldi Date: Wed, 11 May 2016 15:24:40 +0200 Subject: [PATCH 11/17] Alpha, closeable for keepalive connections. --- .../telegram/telegrambots/bots/AbsSender.java | 94 ++++++++++--------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index 75e99ce7..d6f75daf 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -2,6 +2,7 @@ package org.telegram.telegrambots.bots; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; @@ -12,32 +13,15 @@ import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.json.JSONObject; import org.telegram.telegrambots.Constants; import org.telegram.telegrambots.TelegramApiException; -import org.telegram.telegrambots.api.methods.AnswerCallbackQuery; -import org.telegram.telegrambots.api.methods.AnswerInlineQuery; -import org.telegram.telegrambots.api.methods.BotApiMethod; -import org.telegram.telegrambots.api.methods.ForwardMessage; -import org.telegram.telegrambots.api.methods.GetFile; -import org.telegram.telegrambots.api.methods.GetMe; -import org.telegram.telegrambots.api.methods.GetUserProfilePhotos; +import org.telegram.telegrambots.api.methods.*; import org.telegram.telegrambots.api.methods.groupadministration.KickChatMember; import org.telegram.telegrambots.api.methods.groupadministration.UnbanChatMember; -import org.telegram.telegrambots.api.methods.send.SendAudio; -import org.telegram.telegrambots.api.methods.send.SendChatAction; -import org.telegram.telegrambots.api.methods.send.SendContact; -import org.telegram.telegrambots.api.methods.send.SendDocument; -import org.telegram.telegrambots.api.methods.send.SendLocation; -import org.telegram.telegrambots.api.methods.send.SendMessage; -import org.telegram.telegrambots.api.methods.send.SendPhoto; -import org.telegram.telegrambots.api.methods.send.SendSticker; -import org.telegram.telegrambots.api.methods.send.SendVenue; -import org.telegram.telegrambots.api.methods.send.SendVideo; -import org.telegram.telegrambots.api.methods.send.SendVoice; +import org.telegram.telegrambots.api.methods.send.*; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageCaption; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageReplyMarkup; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageText; @@ -54,6 +38,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import static org.telegram.telegrambots.Constants.ERRORCODEFIELD; import static org.telegram.telegrambots.Constants.ERRORDESCRIPTIONFIELD; @@ -67,6 +52,21 @@ import static org.telegram.telegrambots.Constants.ERRORDESCRIPTIONFIELD; @SuppressWarnings("unused") public abstract class AbsSender { private final ExecutorService exe = Executors.newSingleThreadExecutor(); + private volatile CloseableHttpClient httpclient; + private volatile RequestConfig requestConfig; + private static final int SOCKET_TIMEOUT = 75 * 1000; + + public AbsSender() { + httpclient = HttpClientBuilder.create() + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .setConnectionTimeToLive(70, TimeUnit.SECONDS) + .setMaxConnTotal(100) + .build(); + requestConfig = RequestConfig.copy(RequestConfig.custom().build()) + .setSocketTimeout(SOCKET_TIMEOUT) + .setConnectTimeout(SOCKET_TIMEOUT) + .setConnectionRequestTimeout(SOCKET_TIMEOUT).build(); + } /** * Returns the token of the bot to be able to perform Telegram Api Requests @@ -183,12 +183,12 @@ public abstract class AbsSender { } public File getFile(GetFile getFile) throws TelegramApiException{ - if(getFile == null){ - throw new TelegramApiException("Parameter getFile can not be null"); - } - else if(getFile.getFileId() == null){ - throw new TelegramApiException("Attribute file_id in parameter getFile can not be null"); - } + if(getFile == null){ + throw new TelegramApiException("Parameter getFile can not be null"); + } + else if(getFile.getFileId() == null){ + throw new TelegramApiException("Attribute file_id in parameter getFile can not be null"); + } return (File) sendApiMethod(getFile); } @@ -385,9 +385,10 @@ public abstract class AbsSender { public Message sendDocument(SendDocument sendDocument) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendDocument.PATH; HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); if (sendDocument.isNewDocument()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendDocument.CHATID_FIELD, sendDocument.getChatId()); @@ -425,7 +426,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -444,9 +445,10 @@ public abstract class AbsSender { public Message sendPhoto(SendPhoto sendPhoto) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendPhoto.PATH; HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); if (sendPhoto.isNewPhoto()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendPhoto.CHATID_FIELD, sendPhoto.getChatId()); @@ -484,7 +486,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -503,9 +505,10 @@ public abstract class AbsSender { public Message sendVideo(SendVideo sendVideo) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendVideo.PATH; HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); if (sendVideo.isNewVideo()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendVideo.CHATID_FIELD, sendVideo.getChatId()); @@ -561,7 +564,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -581,9 +584,10 @@ public abstract class AbsSender { public Message sendSticker(SendSticker sendSticker) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendSticker.PATH; HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); if (sendSticker.isNewSticker()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendSticker.CHATID_FIELD, sendSticker.getChatId()); @@ -615,7 +619,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -642,10 +646,10 @@ public abstract class AbsSender { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendAudio.PATH; HttpPost httppost = new HttpPost(url); - + httppost.setConfig(requestConfig); if (sendAudio.isNewAudio()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendAudio.CHATID_FIELD, sendAudio.getChatId()); @@ -663,7 +667,7 @@ public abstract class AbsSender { builder.addTextBody(SendAudio.TITLE_FIELD, sendAudio.getTitle()); } if(sendAudio.getDuration() != null){ - builder.addTextBody(SendAudio.DURATION_FIELD, sendAudio.getDuration().toString()); + builder.addTextBody(SendAudio.DURATION_FIELD, sendAudio.getDuration().toString()); } if (sendAudio.getDisableNotification() != null) { builder.addTextBody(SendAudio.DISABLENOTIFICATION_FIELD, sendAudio.getDisableNotification().toString()); @@ -692,7 +696,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -710,8 +714,8 @@ public abstract class AbsSender { if (!jsonObject.getBoolean(Constants.RESPONSEFIELDOK)) { throw new TelegramApiException("Error at sendAudio", jsonObject.getString(ERRORDESCRIPTIONFIELD), jsonObject.getInt(ERRORCODEFIELD)); } - - // and if not, we can expect a "result" section. and out of this can a new Message object be built + + // and if not, we can expect a "result" section. and out of this can a new Message object be built return new Message(jsonObject.getJSONObject(Constants.RESPONSEFIELDRESULT)); } @@ -724,10 +728,10 @@ public abstract class AbsSender { public Message sendVoice(SendVoice sendVoice) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + try { String url = getBaseUrl() + SendVoice.PATH; HttpPost httppost = new HttpPost(url); - + httppost.setConfig(requestConfig); if (sendVoice.isNewVoice()) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody(SendVoice.CHATID_FIELD, sendVoice.getChatId()); @@ -765,7 +769,7 @@ public abstract class AbsSender { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); } - try (CloseableHttpResponse response = httpClient.execute(httppost)) { + try (CloseableHttpResponse response = httpclient.execute(httppost)) { HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); @@ -789,9 +793,10 @@ public abstract class AbsSender { exe.submit(new Runnable() { @Override public void run() { - try (CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { + try { String url = getBaseUrl() + method.getPath(); HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); httppost.addHeader("charset", StandardCharsets.UTF_8.name()); httppost.setEntity(new StringEntity(method.toJson().toString(), ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(httppost)) { @@ -815,9 +820,10 @@ public abstract class AbsSender { private Serializable sendApiMethod(BotApiMethod method) throws TelegramApiException { String responseContent; - try (CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { + try { String url = getBaseUrl() + method.getPath(); HttpPost httppost = new HttpPost(url); + httppost.setConfig(requestConfig); httppost.addHeader("charset", StandardCharsets.UTF_8.name()); httppost.setEntity(new StringEntity(method.toJson().toString(), ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(httppost)) { From a854a027e791fca4393bd99182b10bcb4ec35eaa Mon Sep 17 00:00:00 2001 From: antonu17 Date: Thu, 19 May 2016 23:25:52 +0600 Subject: [PATCH 12/17] Add caption field --- .../telegram/telegrambots/api/objects/Message.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/org/telegram/telegrambots/api/objects/Message.java b/src/main/java/org/telegram/telegrambots/api/objects/Message.java index 126cb67f..9a1b7444 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/Message.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/Message.java @@ -46,6 +46,7 @@ public class Message implements IBotApiObject { private static final String GROUPCHATCREATED_FIELD = "group_chat_created"; private static final String REPLYTOMESSAGE_FIELD = "reply_to_message"; private static final String VOICE_FIELD = "voice"; + private static final String CAPTION_FIELD = "caption"; private static final String SUPERGROUPCREATED_FIELD = "supergroup_chat_created"; private static final String CHANNELCHATCREATED_FIELD = "channel_chat_created"; private static final String MIGRATETOCHAT_FIELD = "migrate_to_chat_id"; @@ -106,6 +107,8 @@ public class Message implements IBotApiObject { private Message replyToMessage; @JsonProperty(VOICE_FIELD) private Voice voice; ///< Optional. Message is a voice message, information about the file + @JsonProperty(CAPTION_FIELD) + private String caption; ///< Optional. Caption for the document, photo or video, 0-200 characters @JsonProperty(SUPERGROUPCREATED_FIELD) private Boolean superGroupCreated; ///< Optional. Informs that the supergroup has been created @JsonProperty(CHANNELCHATCREATED_FIELD) @@ -182,6 +185,9 @@ public class Message implements IBotApiObject { if (jsonObject.has(VOICE_FIELD)) { this.voice = new Voice(jsonObject.getJSONObject(VOICE_FIELD)); } + if (jsonObject.has(CAPTION_FIELD)) { + this.caption = jsonObject.getString(CAPTION_FIELD); + } if (jsonObject.has(NEWCHATMEMBER_FIELD)) { this.newChatMember = new User(jsonObject.getJSONObject(NEWCHATMEMBER_FIELD)); } @@ -321,6 +327,10 @@ public class Message implements IBotApiObject { return voice; } + public String getCaption() { + return caption; + } + public Boolean getSuperGroupCreated() { return superGroupCreated; } @@ -431,6 +441,9 @@ public class Message implements IBotApiObject { if (voice != null) { gen.writeObjectField(VOICE_FIELD, voice); } + if (caption != null) { + gen.writeObjectField(CAPTION_FIELD, caption); + } if (newChatMember != null) { gen.writeObjectField(NEWCHATMEMBER_FIELD, newChatMember); } @@ -504,6 +517,7 @@ public class Message implements IBotApiObject { ", groupchatCreated=" + groupchatCreated + ", replyToMessage=" + replyToMessage + ", voice=" + voice + + ", caption=" + caption + ", superGroupCreated=" + superGroupCreated + ", channelChatCreated=" + channelChatCreated + ", migrateToChatId=" + migrateToChatId + From 61557310587b2ae95269aa5e8621f8ec34526e8f Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Thu, 19 May 2016 20:14:15 +0200 Subject: [PATCH 13/17] Improve logging system --- pom.xml | 2 +- .../org/telegram/telegrambots/BotLogger.java | 353 ------------------ .../telegrambots/logging/BotLogger.java | 167 +++++++++ .../telegrambots/logging/BotsFileHandler.java | 45 +++ .../telegrambots/logging/FileFormatter.java | 52 +++ .../updatesreceivers/BotSession.java | 2 +- 6 files changed, 266 insertions(+), 355 deletions(-) delete mode 100644 src/main/java/org/telegram/telegrambots/BotLogger.java create mode 100644 src/main/java/org/telegram/telegrambots/logging/BotLogger.java create mode 100644 src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java create mode 100644 src/main/java/org/telegram/telegrambots/logging/FileFormatter.java diff --git a/pom.xml b/pom.xml index 860b1770..2a7f2926 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ UTF-8 UTF-8 - 2.22.2 + 2.23 1.19.1 4.5.2 20160212 diff --git a/src/main/java/org/telegram/telegrambots/BotLogger.java b/src/main/java/org/telegram/telegrambots/BotLogger.java deleted file mode 100644 index 5622834b..00000000 --- a/src/main/java/org/telegram/telegrambots/BotLogger.java +++ /dev/null @@ -1,353 +0,0 @@ -package org.telegram.telegrambots; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.time.LocalDateTime; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Ruben Bermudez - * @version 2.0 - * @brief Logger to file - * @date 21/01/15 - */ -public class BotLogger { - private static final Object lockToWrite = new Object(); - private static final String pathToLogs = "./"; - private static final Logger logger = Logger.getLogger("Telegram Bots Api"); - private static final ConcurrentLinkedQueue logsToFile = new ConcurrentLinkedQueue<>(); - private static volatile PrintWriter logginFile; - private static volatile String currentFileName; - private static volatile LocalDateTime lastFileDate; - private static LoggerThread loggerThread = new LoggerThread(); - - static { - logger.setLevel(Level.OFF); - loggerThread.start(); - lastFileDate = LocalDateTime.now(); - if ((currentFileName == null) || (currentFileName.compareTo("") == 0)) { - currentFileName = pathToLogs + dateFormatterForFileName(lastFileDate) + ".log"; - try { - final File file = new File(currentFileName); - if (file.exists()) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - final boolean created = file.createNewFile(); - if (created) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - throw new NullPointerException("File for logging error"); - } - } - } catch (IOException ignored) { - } - - } - } - - public static void setLevel(Level level) { - logger.setLevel(level); - } - - public static void registerLogger(Handler handler) { - logger.addHandler(handler); - } - - public static void log(Level level, String tag, String msg) { - logger.log(level, String.format("[%s] %s", tag, msg)); - logToFile(level, tag, msg); - } - - public static void severe(String tag, String msg) { - logger.severe(String.format("[%s] %s", tag, msg)); - logToFile(Level.SEVERE, tag, msg); - } - - public static void warn(String tag, String msg) { - warning(tag, msg); - } - - public static void debug(String tag, String msg) { - fine(tag, msg); - } - - public static void error(String tag, String msg) { - severe(tag, msg); - } - - public static void trace(String tag, String msg) { - finer(tag, msg); - } - - public static void warning(String tag, String msg) { - logger.warning(String.format("[%s] %s", tag, msg)); - logToFile(Level.WARNING, tag, msg); - } - - public static void info(String tag, String msg) { - logger.info(String.format("[%s] %s", tag, msg)); - logToFile(Level.INFO, tag, msg); - } - - public static void config(String tag, String msg) { - logger.config(String.format("[%s] %s", tag, msg)); - logToFile(Level.CONFIG, tag, msg); - } - - public static void fine(String tag, String msg) { - logger.fine(String.format("[%s] %s", tag, msg)); - logToFile(Level.FINE, tag, msg); - } - - public static void finer(String tag, String msg) { - logger.finer(String.format("[%s] %s", tag, msg)); - logToFile(Level.FINER, tag, msg); - } - - public static void finest(String tag, String msg) { - logger.finest(String.format("[%s] %s", tag, msg)); - logToFile(Level.FINEST, tag, msg); - } - - public static void log(Level level, String tag, Throwable throwable) { - logger.log(level, String.format("[%s] Exception", tag), throwable); - logToFile(level, tag, throwable); - } - - public static void log(Level level, String tag, String msg, Throwable thrown) { - logger.log(level, String.format("[%s] %s", tag, msg), thrown); - logToFile(level, tag, msg, thrown); - } - - public static void severe(String tag, Throwable throwable) { - logger.log(Level.SEVERE, tag, throwable); - logToFile(Level.SEVERE, tag, throwable); - } - - public static void warning(String tag, Throwable throwable) { - logger.log(Level.WARNING, tag, throwable); - logToFile(Level.WARNING, tag, throwable); - } - - public static void info(String tag, Throwable throwable) { - logger.log(Level.INFO, tag, throwable); - logToFile(Level.INFO, tag, throwable); - } - - public static void config(String tag, Throwable throwable) { - logger.log(Level.CONFIG, tag, throwable); - logToFile(Level.CONFIG, tag, throwable); - } - - public static void fine(String tag, Throwable throwable) { - logger.log(Level.FINE, tag, throwable); - logToFile(Level.FINE, tag, throwable); - } - - public static void finer(String tag, Throwable throwable) { - logger.log(Level.FINER, tag, throwable); - logToFile(Level.FINER, tag, throwable); - } - - public static void finest(String tag, Throwable throwable) { - logger.log(Level.FINEST, tag, throwable); - logToFile(Level.FINEST, tag, throwable); - } - - public static void warn(String tag, Throwable throwable) { - warning(tag, throwable); - } - - public static void debug(String tag, Throwable throwable) { - fine(tag, throwable); - } - - public static void error(String tag, Throwable throwable) { - severe(tag, throwable); - } - - public static void trace(String tag, Throwable throwable) { - finer(tag, throwable); - } - - public static void severe(String msg, String tag, Throwable throwable) { - log(Level.SEVERE, tag, msg, throwable); - } - - public static void warning(String msg, String tag, Throwable throwable) { - log(Level.WARNING, tag, msg, throwable); - } - - public static void info(String msg, String tag, Throwable throwable) { - log(Level.INFO, tag, msg, throwable); - } - - public static void config(String msg, String tag, Throwable throwable) { - log(Level.CONFIG, tag, msg, throwable); - } - - public static void fine(String msg, String tag, Throwable throwable) { - log(Level.FINE, tag, msg, throwable); - } - - public static void finer(String msg, String tag, Throwable throwable) { - log(Level.FINER, tag, msg, throwable); - } - - public static void finest(String msg, String tag, Throwable throwable) { - log(Level.FINEST, tag, msg, throwable); - } - - public static void warn(String msg, String tag, Throwable throwable) { - log(Level.WARNING, tag, msg, throwable); - } - - public static void debug(String msg, String tag, Throwable throwable) { - log(Level.FINE, tag, msg, throwable); - } - - public static void error(String msg, String tag, Throwable throwable) { - log(Level.SEVERE, tag, msg, throwable); - } - - public static void trace(String msg, String tag, Throwable throwable) { - log(Level.FINER, tag, msg, throwable); - } - - private static boolean isCurrentDate(LocalDateTime dateTime) { - return dateTime.toLocalDate().isEqual(lastFileDate.toLocalDate()); - } - - private static String dateFormatterForFileName(LocalDateTime dateTime) { - String dateString = ""; - dateString += dateTime.getDayOfMonth(); - dateString += dateTime.getMonthValue(); - dateString += dateTime.getYear(); - return dateString; - } - - private static String dateFormatterForLogs(LocalDateTime dateTime) { - String dateString = "["; - dateString += dateTime.getDayOfMonth() + "_"; - dateString += dateTime.getMonthValue() + "_"; - dateString += dateTime.getYear() + "_"; - dateString += dateTime.getHour() + ":"; - dateString += dateTime.getMinute() + ":"; - dateString += dateTime.getSecond(); - dateString += "] "; - return dateString; - } - - private static void updateAndCreateFile(LocalDateTime dateTime) { - if (!isCurrentDate(dateTime)) { - lastFileDate = LocalDateTime.now(); - currentFileName = pathToLogs + dateFormatterForFileName(lastFileDate) + ".log"; - try { - logginFile.flush(); - logginFile.close(); - final File file = new File(currentFileName); - if (file.exists()) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - final boolean created = file.createNewFile(); - if (created) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - throw new NullPointerException("Error updating log file"); - } - } - } catch (IOException ignored) { - } - } - } - - private static void logToFile(Level level, String tag, Throwable throwable) { - if (isLoggable(level)) { - synchronized (lockToWrite) { - final LocalDateTime currentDate = LocalDateTime.now(); - final String dateForLog = dateFormatterForLogs(currentDate); - updateAndCreateFile(currentDate); - logThrowableToFile(level, tag, throwable, dateForLog); - } - } - } - - private static void logToFile(Level level, String tag, String msg) { - if (isLoggable(level)) { - synchronized (lockToWrite) { - final LocalDateTime currentDate = LocalDateTime.now(); - updateAndCreateFile(currentDate); - final String dateForLog = dateFormatterForLogs(currentDate); - logMsgToFile(level, tag, msg, dateForLog); - } - } - } - - private static void logToFile(Level level, String tag, String msg, Throwable throwable) { - if (isLoggable(level)) { - synchronized (lockToWrite) { - final LocalDateTime currentDate = LocalDateTime.now(); - updateAndCreateFile(currentDate); - final String dateForLog = dateFormatterForLogs(currentDate); - logMsgToFile(level, tag, msg, dateForLog); - logThrowableToFile(level, tag, throwable, dateForLog); - } - } - } - - private static void logMsgToFile(Level level, String tag, String msg, String dateForLog) { - final String logMessage = String.format("%s{%s} %s - %s", dateForLog, level.toString(), tag, msg); - logsToFile.add(logMessage); - synchronized (logsToFile) { - logsToFile.notifyAll(); - } - } - - private static void logThrowableToFile(Level level, String tag, Throwable throwable, String dateForLog) { - String throwableLog = String.format("%s{%s} %s - %s", dateForLog, level.toString(), tag, throwable.toString()); - for (StackTraceElement element : throwable.getStackTrace()) { - throwableLog += "\tat " + element + "\n"; - } - logsToFile.add(throwableLog); - synchronized (logsToFile) { - logsToFile.notifyAll(); - } - } - - private static boolean isLoggable(Level level) { - return logger.isLoggable(level); - } - - private static class LoggerThread extends Thread { - - @Override - public void run() { - while (true) { - final ConcurrentLinkedQueue stringsToLog = new ConcurrentLinkedQueue<>(); - synchronized (logsToFile) { - if (logsToFile.isEmpty()) { - try { - logsToFile.wait(); - } catch (InterruptedException e) { - return; - } - if (logsToFile.isEmpty()) { - continue; - } - } - stringsToLog.addAll(logsToFile); - logsToFile.clear(); - } - - stringsToLog.stream().forEach(logginFile::println); - logginFile.flush(); - } - } - } -} diff --git a/src/main/java/org/telegram/telegrambots/logging/BotLogger.java b/src/main/java/org/telegram/telegrambots/logging/BotLogger.java new file mode 100644 index 00000000..681c43bc --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/logging/BotLogger.java @@ -0,0 +1,167 @@ +package org.telegram.telegrambots.logging; + +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author Ruben Bermudez + * @version 2.0 + * @brief Logger to file + * @date 21/01/15 + */ +public class BotLogger { + private static final Logger logger = Logger.getLogger("Telegram Bots Api"); + + public static void setLevel(Level level) { + logger.setLevel(level); + } + + public static void registerLogger(Handler handler) { + logger.addHandler(handler); + } + + public static void log(Level level, String tag, String msg) { + logger.log(level, String.format("%s - %s", tag, msg)); + } + + public static void severe(String tag, String msg) { + logger.severe(String.format("%s - %s", tag, msg)); + } + + public static void warn(String tag, String msg) { + warning(tag, msg); + } + + public static void debug(String tag, String msg) { + fine(tag, msg); + } + + public static void error(String tag, String msg) { + severe(tag, msg); + } + + public static void trace(String tag, String msg) { + finer(tag, msg); + } + + public static void warning(String tag, String msg) { + logger.warning(String.format("%s - %s", tag, msg)); + } + + public static void info(String tag, String msg) { + logger.info(String.format("%s - %s", tag, msg)); + } + + public static void config(String tag, String msg) { + logger.config(String.format("%s - %s", tag, msg)); + } + + public static void fine(String tag, String msg) { + logger.fine(String.format("%s - %s", tag, msg)); + } + + public static void finer(String tag, String msg) { + logger.finer(String.format("%s - %s", tag, msg)); + } + + public static void finest(String tag, String msg) { + logger.finest(String.format("%s - %s", tag, msg)); + } + + public static void log(Level level, String tag, Throwable throwable) { + logger.log(level, tag, throwable); + } + + public static void log(Level level, String tag, String msg, Throwable thrown) { + logger.log(level, String.format("%s - %s", tag, msg), thrown); + } + + public static void severe(String tag, Throwable throwable) { + logger.log(Level.SEVERE, tag, throwable); + } + + public static void warning(String tag, Throwable throwable) { + logger.log(Level.WARNING, tag, throwable); + } + + public static void info(String tag, Throwable throwable) { + logger.log(Level.INFO, tag, throwable); + } + + public static void config(String tag, Throwable throwable) { + logger.log(Level.CONFIG, tag, throwable); + } + + public static void fine(String tag, Throwable throwable) { + logger.log(Level.FINE, tag, throwable); + } + + public static void finer(String tag, Throwable throwable) { + logger.log(Level.FINER, tag, throwable); + } + + public static void finest(String tag, Throwable throwable) { + logger.log(Level.FINEST, tag, throwable); + } + + public static void warn(String tag, Throwable throwable) { + warning(tag, throwable); + } + + public static void debug(String tag, Throwable throwable) { + fine(tag, throwable); + } + + public static void error(String tag, Throwable throwable) { + severe(tag, throwable); + } + + public static void trace(String tag, Throwable throwable) { + finer(tag, throwable); + } + + public static void severe(String msg, String tag, Throwable throwable) { + log(Level.SEVERE, tag, msg, throwable); + } + + public static void warning(String msg, String tag, Throwable throwable) { + log(Level.WARNING, tag, msg, throwable); + } + + public static void info(String msg, String tag, Throwable throwable) { + log(Level.INFO, tag, msg, throwable); + } + + public static void config(String msg, String tag, Throwable throwable) { + log(Level.CONFIG, tag, msg, throwable); + } + + public static void fine(String msg, String tag, Throwable throwable) { + log(Level.FINE, tag, msg, throwable); + } + + public static void finer(String msg, String tag, Throwable throwable) { + log(Level.FINER, tag, msg, throwable); + } + + public static void finest(String msg, String tag, Throwable throwable) { + log(Level.FINEST, tag, msg, throwable); + } + + public static void warn(String msg, String tag, Throwable throwable) { + log(Level.WARNING, tag, msg, throwable); + } + + public static void debug(String msg, String tag, Throwable throwable) { + log(Level.FINE, tag, msg, throwable); + } + + public static void error(String msg, String tag, Throwable throwable) { + log(Level.SEVERE, tag, msg, throwable); + } + + public static void trace(String msg, String tag, Throwable throwable) { + log(Level.FINER, tag, msg, throwable); + } +} diff --git a/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java b/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java new file mode 100644 index 00000000..bf4baf2e --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java @@ -0,0 +1,45 @@ +package org.telegram.telegrambots.logging; + +import java.io.IOException; +import java.util.logging.FileHandler; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief TODO + * @date 19 of May of 2016 + */ +public class BotsFileHandler extends FileHandler { + private static final String filePattern = "./TelegramBots%g.%u.log"; + + public BotsFileHandler() throws IOException, SecurityException { + super(filePattern); + setFormatter(new FileFormatter()); + } + + public BotsFileHandler(int limit, int count) throws IOException, SecurityException { + super(filePattern, limit, count); + setFormatter(new FileFormatter()); + } + + public BotsFileHandler(String pattern) throws IOException, SecurityException { + super(pattern); + setFormatter(new FileFormatter()); + } + + public BotsFileHandler(String pattern, boolean append) throws IOException, SecurityException { + super(pattern, append); + setFormatter(new FileFormatter()); + } + + public BotsFileHandler(String pattern, int limit, int count) throws IOException, SecurityException { + super(pattern, limit, count); + setFormatter(new FileFormatter()); + } + + public BotsFileHandler(String pattern, int limit, int count, boolean append) throws IOException, SecurityException { + super(pattern, limit, count, append); + setFormatter(new FileFormatter()); + } + +} diff --git a/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java b/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java new file mode 100644 index 00000000..f0b0cb00 --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java @@ -0,0 +1,52 @@ +package org.telegram.telegrambots.logging; + +import java.time.LocalDateTime; +import java.util.logging.Formatter; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief TODO + * @date 19 of May of 2016 + */ +class FileFormatter extends Formatter { + + @Override + public String format(LogRecord record) { + final LocalDateTime currentDate = LocalDateTime.now(); + final String dateForLog = dateFormatterForLogs(currentDate); + String result; + if (record.getThrown() == null) { + result = logMsgToFile(record.getLevel(), record.getMessage(), dateForLog); + } else { + result = logThrowableToFile(record.getLevel(), record.getMessage(), record.getThrown(), dateForLog); + } + return result; + } + + private static String dateFormatterForLogs(LocalDateTime dateTime) { + String dateString = "["; + dateString += dateTime.getDayOfMonth() + "_"; + dateString += dateTime.getMonthValue() + "_"; + dateString += dateTime.getYear() + "_"; + dateString += dateTime.getHour() + ":"; + dateString += dateTime.getMinute() + ":"; + dateString += dateTime.getSecond(); + dateString += "] "; + return dateString; + } + + private static String logMsgToFile(Level level, String msg, String dateForLog) { + return String.format("%s{%s} %s", dateForLog, level.toString(), msg); + } + + private static String logThrowableToFile(Level level, String message, Throwable throwable, String dateForLog) { + String throwableLog = String.format("%s{%s} %s - %s", dateForLog, level.toString(), message, throwable.toString()); + for (StackTraceElement element : throwable.getStackTrace()) { + throwableLog += "\tat " + element + "\n"; + } + return throwableLog; + } +} diff --git a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java index c3178b6b..39b5f1ec 100644 --- a/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java +++ b/src/main/java/org/telegram/telegrambots/updatesreceivers/BotSession.java @@ -14,7 +14,7 @@ import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import org.telegram.telegrambots.BotLogger; +import org.telegram.telegrambots.logging.BotLogger; import org.telegram.telegrambots.Constants; import org.telegram.telegrambots.TelegramApiException; import org.telegram.telegrambots.api.methods.updates.GetUpdates; From dc474a2c2f6a411469d9bc9053287aff28d3aad8 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Thu, 19 May 2016 20:22:20 +0200 Subject: [PATCH 14/17] Fix formatter --- .../java/org/telegram/telegrambots/logging/FileFormatter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java b/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java index f0b0cb00..a36da759 100644 --- a/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java +++ b/src/main/java/org/telegram/telegrambots/logging/FileFormatter.java @@ -39,11 +39,11 @@ class FileFormatter extends Formatter { } private static String logMsgToFile(Level level, String msg, String dateForLog) { - return String.format("%s{%s} %s", dateForLog, level.toString(), msg); + return String.format("%s{%s} %s\n", dateForLog, level.toString(), msg); } private static String logThrowableToFile(Level level, String message, Throwable throwable, String dateForLog) { - String throwableLog = String.format("%s{%s} %s - %s", dateForLog, level.toString(), message, throwable.toString()); + String throwableLog = String.format("%s{%s} %s - %s\n", dateForLog, level.toString(), message, throwable.toString()); for (StackTraceElement element : throwable.getStackTrace()) { throwableLog += "\tat " + element + "\n"; } From e54396a0cab085dddd45dd7250349c6497419ecc Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Thu, 19 May 2016 20:29:45 +0200 Subject: [PATCH 15/17] Final bot logger version --- .../java/org/telegram/telegrambots/logging/BotsFileHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java b/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java index bf4baf2e..c225f497 100644 --- a/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java +++ b/src/main/java/org/telegram/telegrambots/logging/BotsFileHandler.java @@ -13,7 +13,7 @@ public class BotsFileHandler extends FileHandler { private static final String filePattern = "./TelegramBots%g.%u.log"; public BotsFileHandler() throws IOException, SecurityException { - super(filePattern); + super(filePattern, 1024 * 1024 * 10, 50, true); setFormatter(new FileFormatter()); } From 0b6f4e1d060bbf6671822752e855cffe16732b15 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Sun, 22 May 2016 11:42:04 +0200 Subject: [PATCH 16/17] Support Telegram Bots API 2.1 --- .../methods/groupadministration/GetChat.java | 79 ++++++++++++ .../GetChatAdministrators.java | 90 ++++++++++++++ .../groupadministration/GetChatMember.java | 94 +++++++++++++++ .../GetChatMemberCount.java | 78 ++++++++++++ .../groupadministration/LeaveChat.java | 78 ++++++++++++ .../telegrambots/api/objects/ChatMember.java | 58 +++++++++ .../telegrambots/api/objects/EntityType.java | 1 + .../api/objects/MemberStatus.java | 15 +++ .../telegrambots/api/objects/Message.java | 14 +++ .../api/objects/MessageEntity.java | 15 +++ .../telegrambots/api/objects/Update.java | 17 +++ .../telegram/telegrambots/bots/AbsSender.java | 114 +++++++++++++++++- 12 files changed, 651 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChat.java create mode 100644 src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatAdministrators.java create mode 100644 src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMember.java create mode 100644 src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMemberCount.java create mode 100644 src/main/java/org/telegram/telegrambots/api/methods/groupadministration/LeaveChat.java create mode 100644 src/main/java/org/telegram/telegrambots/api/objects/ChatMember.java create mode 100644 src/main/java/org/telegram/telegrambots/api/objects/MemberStatus.java diff --git a/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChat.java b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChat.java new file mode 100644 index 00000000..74e3af2b --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChat.java @@ -0,0 +1,79 @@ +package org.telegram.telegrambots.api.methods.groupadministration; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONObject; +import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.api.methods.BotApiMethod; +import org.telegram.telegrambots.api.objects.Chat; + +import java.io.IOException; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Use this method to get information about the chat. Returns Chat object on success. + * @date 20 of May of 2016 + */ +public class GetChat extends BotApiMethod { + public static final String PATH = "getChat"; + + private static final String CHATID_FIELD = "chat_id"; + private String chatId; ///< Unique identifier for the chat to send the message to (Or username for channels) + + public GetChat() { + super(); + } + + public String getChatId() { + return chatId; + } + + public GetChat setChatId(String chatId) { + this.chatId = chatId; + return this; + } + + @Override + public JSONObject toJson() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put(CHATID_FIELD, chatId); + return jsonObject; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public Chat deserializeResponse(JSONObject answer) { + if (answer.getBoolean(Constants.RESPONSEFIELDOK)) { + return new Chat(answer.getJSONObject(Constants.RESPONSEFIELDRESULT)); + } + return null; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeStringField(METHOD_FIELD, PATH); + gen.writeStringField(CHATID_FIELD, chatId); + gen.writeEndObject(); + gen.flush(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "GetChat{" + + "chatId='" + chatId + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatAdministrators.java b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatAdministrators.java new file mode 100644 index 00000000..cd910ada --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatAdministrators.java @@ -0,0 +1,90 @@ +package org.telegram.telegrambots.api.methods.groupadministration; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.api.methods.BotApiMethod; +import org.telegram.telegrambots.api.objects.ChatMember; + +import java.io.IOException; +import java.util.ArrayList; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Use this method to get a list of administrators in a chat. + * An Array of ChatMember objects is returned on success, + * containing information about all chat administrators except other bots. + * If the chat is a group or a supergroup and no administrators were appointed, + * only the creator will be returned. + * @date 20 of May of 2016 + */ +public class GetChatAdministrators extends BotApiMethod> { + public static final String PATH = "getChatAdministrators"; + + private static final String CHATID_FIELD = "chat_id"; + private String chatId; ///< Unique identifier for the chat to send the message to (Or username for channels) + + public GetChatAdministrators() { + super(); + } + + public String getChatId() { + return chatId; + } + + public GetChatAdministrators setChatId(String chatId) { + this.chatId = chatId; + return this; + } + + @Override + public JSONObject toJson() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put(CHATID_FIELD, chatId); + return jsonObject; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public ArrayList deserializeResponse(JSONObject answer) { + if (answer.getBoolean(Constants.RESPONSEFIELDOK)) { + JSONArray admins = answer.getJSONArray(Constants.RESPONSEFIELDRESULT); + ArrayList members = new ArrayList<>(); + for (int i = 0; i < admins.length(); i++) { + members.add(new ChatMember(admins.getJSONObject(i))); + } + return members; + } + return null; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeStringField(METHOD_FIELD, PATH); + gen.writeStringField(CHATID_FIELD, chatId); + gen.writeEndObject(); + gen.flush(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "GetChatAdministrators{" + + "chatId='" + chatId + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMember.java b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMember.java new file mode 100644 index 00000000..73648daf --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMember.java @@ -0,0 +1,94 @@ +package org.telegram.telegrambots.api.methods.groupadministration; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONObject; +import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.api.methods.BotApiMethod; +import org.telegram.telegrambots.api.objects.ChatMember; + +import java.io.IOException; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Use this method to get information about a member of a chat. + * Returns a ChatMember object on success. + * @date 20 of May of 2016 + */ +public class GetChatMember extends BotApiMethod { + public static final String PATH = "getChatAdministrators"; + + private static final String CHATID_FIELD = "chat_id"; + private static final String USERID_FIELD = "user_id"; + private String chatId; ///< Unique identifier for the chat to send the message to (Or username for channels) + private Integer userId; ///< Unique identifier of the target user + + public GetChatMember() { + super(); + } + + public String getChatId() { + return chatId; + } + + public GetChatMember setChatId(String chatId) { + this.chatId = chatId; + return this; + } + + public Integer getUserId() { + return userId; + } + + public GetChatMember setUserId(Integer userId) { + this.userId = userId; + return this; + } + + @Override + public JSONObject toJson() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put(CHATID_FIELD, chatId); + jsonObject.put(USERID_FIELD, userId); + return jsonObject; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public ChatMember deserializeResponse(JSONObject answer) { + if (answer.getBoolean(Constants.RESPONSEFIELDOK)) { + return new ChatMember(answer.getJSONObject(Constants.RESPONSEFIELDRESULT)); + } + return null; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeStringField(METHOD_FIELD, PATH); + gen.writeStringField(CHATID_FIELD, chatId); + gen.writeNumberField(USERID_FIELD, userId); + gen.writeEndObject(); + gen.flush(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "GetChatMember{" + + "chatId='" + chatId + '\'' + + ", userId='" + userId + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMemberCount.java b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMemberCount.java new file mode 100644 index 00000000..3b350902 --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/GetChatMemberCount.java @@ -0,0 +1,78 @@ +package org.telegram.telegrambots.api.methods.groupadministration; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONObject; +import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.api.methods.BotApiMethod; + +import java.io.IOException; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Use this method to get the number of members in a chat. Returns Int on success. + * @date 20 of May of 2016 + */ +public class GetChatMemberCount extends BotApiMethod { + public static final String PATH = "getChatAdministrators"; + + private static final String CHATID_FIELD = "chat_id"; + private String chatId; ///< Unique identifier for the chat to send the message to (Or username for channels) + + public GetChatMemberCount() { + super(); + } + + public String getChatId() { + return chatId; + } + + public GetChatMemberCount setChatId(String chatId) { + this.chatId = chatId; + return this; + } + + @Override + public JSONObject toJson() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put(CHATID_FIELD, chatId); + return jsonObject; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public Integer deserializeResponse(JSONObject answer) { + if (answer.getBoolean(Constants.RESPONSEFIELDOK)) { + return answer.getInt(Constants.RESPONSEFIELDRESULT); + } + return null; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeStringField(METHOD_FIELD, PATH); + gen.writeStringField(CHATID_FIELD, chatId); + gen.writeEndObject(); + gen.flush(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "GetChatMemberCount{" + + "chatId='" + chatId + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/LeaveChat.java b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/LeaveChat.java new file mode 100644 index 00000000..20fea86c --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/methods/groupadministration/LeaveChat.java @@ -0,0 +1,78 @@ +package org.telegram.telegrambots.api.methods.groupadministration; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONObject; +import org.telegram.telegrambots.Constants; +import org.telegram.telegrambots.api.methods.BotApiMethod; + +import java.io.IOException; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Use this method for your bot to leave a group, supergroup or channel. Returns True on success. + * @date 20 of May of 2016 + */ +public class LeaveChat extends BotApiMethod { + public static final String PATH = "leaveChat"; + + private static final String CHATID_FIELD = "chat_id"; + private String chatId; ///< Unique identifier for the chat to send the message to (Or username for channels) + + public LeaveChat() { + super(); + } + + public String getChatId() { + return chatId; + } + + public LeaveChat setChatId(String chatId) { + this.chatId = chatId; + return this; + } + + @Override + public JSONObject toJson() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put(CHATID_FIELD, chatId); + return jsonObject; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public Boolean deserializeResponse(JSONObject answer) { + if (answer.getBoolean(Constants.RESPONSEFIELDOK)) { + return answer.getBoolean(Constants.RESPONSEFIELDRESULT); + } + return null; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeStringField(METHOD_FIELD, PATH); + gen.writeStringField(CHATID_FIELD, chatId); + gen.writeEndObject(); + gen.flush(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "LeaveChat{" + + "chatId='" + chatId + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/objects/ChatMember.java b/src/main/java/org/telegram/telegrambots/api/objects/ChatMember.java new file mode 100644 index 00000000..9a022778 --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/objects/ChatMember.java @@ -0,0 +1,58 @@ +package org.telegram.telegrambots.api.objects; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import org.json.JSONObject; +import org.telegram.telegrambots.api.interfaces.IBotApiObject; + +import java.io.IOException; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief This object contains information about one member of the chat. + * @date 20 of May of 2016 + */ +public class ChatMember implements IBotApiObject { + private static final String USER_FIELD = "user"; + private static final String STATUS_FIELD = "status"; + + private User user; ///< Information about the user + private String status; ///< The member's status in the chat. Can be “creator”, “administrator”, “member”, “left” or “kicked” + + public ChatMember(JSONObject object) { + user = new User(object.getJSONObject(USER_FIELD)); + status = object.getString(STATUS_FIELD); + } + + public User getUser() { + return user; + } + + public String getStatus() { + return status; + } + + @Override + public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + gen.writeObjectField(USER_FIELD, user); + gen.writeStringField(STATUS_FIELD, status); + gen.writeEndObject(); + } + + @Override + public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + serialize(gen, serializers); + } + + @Override + public String toString() { + return "ChatMember{" + + "user=" + user + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/src/main/java/org/telegram/telegrambots/api/objects/EntityType.java b/src/main/java/org/telegram/telegrambots/api/objects/EntityType.java index f6308e80..bbf33cb3 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/EntityType.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/EntityType.java @@ -17,6 +17,7 @@ public class EntityType { public static final String CODE = "code"; ///< Monowidth string public static final String PRE = "pre"; ///< Monowidth block public static final String TEXTLINK = "text_link"; ///< Clickable urls + public static final String TEXTMENTION = "text_mention"; ///< for users without usernames private EntityType() { } diff --git a/src/main/java/org/telegram/telegrambots/api/objects/MemberStatus.java b/src/main/java/org/telegram/telegrambots/api/objects/MemberStatus.java new file mode 100644 index 00000000..3ae2c83c --- /dev/null +++ b/src/main/java/org/telegram/telegrambots/api/objects/MemberStatus.java @@ -0,0 +1,15 @@ +package org.telegram.telegrambots.api.objects; + +/** + * @author Ruben Bermudez + * @version 1.0 + * @brief Group members categories + * @date 22 of May of 2016 + */ +public final class MemberStatus { + public static final String CREATOR = "creator"; + public static final String ADMINISTRATOR = "administrator"; + public static final String MEMBER = "member"; + public static final String LEFT = "left"; + public static final String KICKED = "kicked"; +} diff --git a/src/main/java/org/telegram/telegrambots/api/objects/Message.java b/src/main/java/org/telegram/telegrambots/api/objects/Message.java index 81a7e0b8..b5029148 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/Message.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/Message.java @@ -51,6 +51,7 @@ public class Message implements IBotApiObject { private static final String CHANNELCHATCREATED_FIELD = "channel_chat_created"; private static final String MIGRATETOCHAT_FIELD = "migrate_to_chat_id"; private static final String MIGRATEFROMCHAT_FIELD = "migrate_from_chat_id"; + private static final String EDITDATE_FIELD = "edit_date"; @JsonProperty(MESSAGEID_FIELD) private Integer messageId; ///< Integer Unique message identifier @JsonProperty(FROM_FIELD) @@ -117,6 +118,8 @@ public class Message implements IBotApiObject { private Long migrateToChatId; ///< Optional. The chat has been migrated to a chat with specified identifier, not exceeding 1e13 by absolute value @JsonProperty(MIGRATEFROMCHAT_FIELD) private Long migrateFromChatId; ///< Optional. The chat has been migrated from a chat with specified identifier, not exceeding 1e13 by absolute value + @JsonProperty(EDITDATE_FIELD) + private Integer editDate; ///< Optional. Date the message was last edited in Unix time public Message() { super(); @@ -225,6 +228,9 @@ public class Message implements IBotApiObject { if (jsonObject.has(MIGRATEFROMCHAT_FIELD)) { this.migrateFromChatId = jsonObject.getLong(MIGRATEFROMCHAT_FIELD); } + if (jsonObject.has(EDITDATE_FIELD)) { + editDate = jsonObject.getInt(EDITDATE_FIELD); + } if (hasText() && entities != null) { entities.forEach(x -> x.computeText(text)); @@ -391,6 +397,10 @@ public class Message implements IBotApiObject { return forwardFromChat; } + public Integer getEditDate() { + return editDate; + } + @Override public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); @@ -485,6 +495,9 @@ public class Message implements IBotApiObject { if (migrateFromChatId != null) { gen.writeNumberField(MIGRATEFROMCHAT_FIELD, migrateFromChatId); } + if (editDate != null) { + gen.writeNumberField(EDITDATE_FIELD, editDate); + } gen.writeEndObject(); gen.flush(); } @@ -526,6 +539,7 @@ public class Message implements IBotApiObject { ", channelChatCreated=" + channelChatCreated + ", migrateToChatId=" + migrateToChatId + ", migrateFromChatId=" + migrateFromChatId + + ", editDate=" + editDate + '}'; } } diff --git a/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java b/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java index 14a9bccc..fc8fefa9 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/MessageEntity.java @@ -23,6 +23,7 @@ public class MessageEntity implements IBotApiObject { private static final String OFFSET_FIELD = "offset"; private static final String LENGTH_FIELD = "length"; private static final String URL_FIELD = "url"; + private static final String USER_FIELD = "user"; @JsonProperty(TYPE_FIELD) /** * Type of the entity. One of @@ -36,6 +37,7 @@ public class MessageEntity implements IBotApiObject { * code (monowidth string), * pre (monowidth block), * text_link (for clickable text URLs) + * text_mention (for users without usernames) */ private String type; @JsonProperty(OFFSET_FIELD) @@ -44,6 +46,8 @@ public class MessageEntity implements IBotApiObject { private Integer length; ///< Length of the entity in UTF-16 code units @JsonProperty(URL_FIELD) private String url; ///< Optional. For “text_link” only, url that will be opened after user taps on the text + @JsonProperty(USER_FIELD) + private User user; ///< Optional. For “text_mention” only, the mentioned user private String text; ///< Text present in the entity. Computed from offset and length @@ -59,6 +63,9 @@ public class MessageEntity implements IBotApiObject { if (EntityType.TEXTLINK.equals(type)) { this.url = jsonObject.getString(URL_FIELD); } + if (EntityType.TEXTMENTION.equals(type)) { + this.user = new User(jsonObject.getJSONObject(USER_FIELD)); + } } public String getType() { @@ -81,6 +88,10 @@ public class MessageEntity implements IBotApiObject { return text; } + public User getUser() { + return user; + } + protected void computeText(String message) { text = message.substring(offset, offset + length); } @@ -94,6 +105,9 @@ public class MessageEntity implements IBotApiObject { if (url != null && EntityType.TEXTLINK.equals(type)) { gen.writeStringField(URL_FIELD, url); } + if (user != null && EntityType.TEXTMENTION.equals(type)) { + gen.writeObjectField(USER_FIELD, user); + } gen.writeEndObject(); gen.flush(); } @@ -110,6 +124,7 @@ public class MessageEntity implements IBotApiObject { ", offset=" + offset + ", length=" + length + ", url=" + url + + ", user=" + user + '}'; } } diff --git a/src/main/java/org/telegram/telegrambots/api/objects/Update.java b/src/main/java/org/telegram/telegrambots/api/objects/Update.java index 45cb59ba..a9e271d2 100644 --- a/src/main/java/org/telegram/telegrambots/api/objects/Update.java +++ b/src/main/java/org/telegram/telegrambots/api/objects/Update.java @@ -25,6 +25,7 @@ public class Update implements IBotApiObject { private static final String INLINEQUERY_FIELD = "inline_query"; private static final String CHOSENINLINEQUERY_FIELD = "chosen_inline_result"; private static final String CALLBACKQUERY_FIELD = "callback_query"; + private static final String EDITEDMESSAGE_FIELD = "callback_query"; @JsonProperty(UPDATEID_FIELD) private Integer updateId; @JsonProperty(MESSAGE_FIELD) @@ -35,6 +36,8 @@ public class Update implements IBotApiObject { private ChosenInlineQuery chosenInlineQuery; ///< Optional. The result of a inline query that was chosen by a user and sent to their chat partner @JsonProperty(CALLBACKQUERY_FIELD) private CallbackQuery callbackQuery; ///< Optional. New incoming callback query + @JsonProperty(EDITEDMESSAGE_FIELD) + private Message editedMessage; ///< Optional. New version of a message that is known to the bot and was edited public Update() { super(); @@ -55,6 +58,9 @@ public class Update implements IBotApiObject { if (jsonObject.has(CALLBACKQUERY_FIELD)) { callbackQuery = new CallbackQuery(jsonObject.getJSONObject(CALLBACKQUERY_FIELD)); } + if (jsonObject.has(EDITEDMESSAGE_FIELD)){ + editedMessage = new Message(jsonObject.getJSONObject(EDITEDMESSAGE_FIELD)); + } } public Integer getUpdateId() { @@ -77,6 +83,10 @@ public class Update implements IBotApiObject { return callbackQuery; } + public Message getEditedMessage() { + return editedMessage; + } + public boolean hasMessage() { return message != null; } @@ -93,6 +103,9 @@ public class Update implements IBotApiObject { return callbackQuery != null; } + public boolean hasEditedMessage() { + return editedMessage != null; + } @Override public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); @@ -109,6 +122,9 @@ public class Update implements IBotApiObject { if (callbackQuery != null) { gen.writeObjectField(CALLBACKQUERY_FIELD, callbackQuery); } + if (editedMessage != null) { + gen.writeObjectField(EDITEDMESSAGE_FIELD, editedMessage); + } gen.writeEndObject(); gen.flush(); } @@ -126,6 +142,7 @@ public class Update implements IBotApiObject { ", inlineQuery=" + inlineQuery + ", chosenInlineQuery=" + chosenInlineQuery + ", callbackQuery=" + callbackQuery + + ", editedMessage=" + editedMessage + '}'; } } diff --git a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java index c7ad69ae..74eac9cc 100644 --- a/src/main/java/org/telegram/telegrambots/bots/AbsSender.java +++ b/src/main/java/org/telegram/telegrambots/bots/AbsSender.java @@ -18,13 +18,36 @@ import org.apache.http.util.EntityUtils; import org.json.JSONObject; import org.telegram.telegrambots.Constants; import org.telegram.telegrambots.TelegramApiException; -import org.telegram.telegrambots.api.methods.*; +import org.telegram.telegrambots.api.methods.AnswerCallbackQuery; +import org.telegram.telegrambots.api.methods.AnswerInlineQuery; +import org.telegram.telegrambots.api.methods.BotApiMethod; +import org.telegram.telegrambots.api.methods.ForwardMessage; +import org.telegram.telegrambots.api.methods.GetFile; +import org.telegram.telegrambots.api.methods.GetMe; +import org.telegram.telegrambots.api.methods.GetUserProfilePhotos; +import org.telegram.telegrambots.api.methods.groupadministration.GetChat; +import org.telegram.telegrambots.api.methods.groupadministration.GetChatAdministrators; +import org.telegram.telegrambots.api.methods.groupadministration.GetChatMember; +import org.telegram.telegrambots.api.methods.groupadministration.GetChatMemberCount; import org.telegram.telegrambots.api.methods.groupadministration.KickChatMember; +import org.telegram.telegrambots.api.methods.groupadministration.LeaveChat; import org.telegram.telegrambots.api.methods.groupadministration.UnbanChatMember; -import org.telegram.telegrambots.api.methods.send.*; +import org.telegram.telegrambots.api.methods.send.SendAudio; +import org.telegram.telegrambots.api.methods.send.SendChatAction; +import org.telegram.telegrambots.api.methods.send.SendContact; +import org.telegram.telegrambots.api.methods.send.SendDocument; +import org.telegram.telegrambots.api.methods.send.SendLocation; +import org.telegram.telegrambots.api.methods.send.SendMessage; +import org.telegram.telegrambots.api.methods.send.SendPhoto; +import org.telegram.telegrambots.api.methods.send.SendSticker; +import org.telegram.telegrambots.api.methods.send.SendVenue; +import org.telegram.telegrambots.api.methods.send.SendVideo; +import org.telegram.telegrambots.api.methods.send.SendVoice; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageCaption; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageReplyMarkup; import org.telegram.telegrambots.api.methods.updatingmessages.EditMessageText; +import org.telegram.telegrambots.api.objects.Chat; +import org.telegram.telegrambots.api.objects.ChatMember; import org.telegram.telegrambots.api.objects.File; import org.telegram.telegrambots.api.objects.Message; import org.telegram.telegrambots.api.objects.User; @@ -146,6 +169,41 @@ public abstract class AbsSender { return (Boolean) sendApiMethod(unbanChatMember); } + public Boolean leaveChat(LeaveChat leaveChat) throws TelegramApiException { + if (leaveChat == null) { + throw new TelegramApiException("Parameter leaveChat can not be null"); + } + return (Boolean) sendApiMethod(leaveChat); + } + + public Chat getChat(GetChat getChat) throws TelegramApiException { + if (getChat == null) { + throw new TelegramApiException("Parameter getChat can not be null"); + } + return (Chat) sendApiMethod(getChat); + } + + public List getChatAdministrators(GetChatAdministrators getChatAdministrators) throws TelegramApiException { + if (getChatAdministrators == null) { + throw new TelegramApiException("Parameter getChatAdministrators can not be null"); + } + return (ArrayList) sendApiMethod(getChatAdministrators); + } + + public ChatMember getChatMember(GetChatMember getChatMember) throws TelegramApiException { + if (getChatMember == null) { + throw new TelegramApiException("Parameter getChatMember can not be null"); + } + return (ChatMember) sendApiMethod(getChatMember); + } + + public Integer getChatMemberCount(GetChatMemberCount getChatMemberCount) throws TelegramApiException { + if (getChatMemberCount == null) { + throw new TelegramApiException("Parameter getChatMemberCount can not be null"); + } + return (Integer) sendApiMethod(getChatMemberCount); + } + public Message editMessageText(EditMessageText editMessageText) throws TelegramApiException { if (editMessageText == null) { throw new TelegramApiException("Parameter editMessageText can not be null"); @@ -305,6 +363,58 @@ public abstract class AbsSender { sendApiMethodAsync(unbanChatMember, sentCallback); } + public void leaveChatAsync(LeaveChat leaveChat, SentCallback sentCallback) throws TelegramApiException { + if (leaveChat == null) { + throw new TelegramApiException("Parameter leaveChat can not be null"); + } + if (sentCallback == null) { + throw new TelegramApiException("Parameter sentCallback can not be null"); + } + sendApiMethodAsync(leaveChat, sentCallback); + } + + public void getChatAsync(GetChat getChat, SentCallback sentCallback) throws TelegramApiException { + if (getChat == null) { + throw new TelegramApiException("Parameter getChat can not be null"); + } + if (sentCallback == null) { + throw new TelegramApiException("Parameter sentCallback can not be null"); + } + sendApiMethodAsync(getChat, sentCallback); + } + + public void getChatAdministratorsAsync(GetChatAdministrators getChatAdministrators, SentCallback> sentCallback) throws TelegramApiException { + if (getChatAdministrators == null) { + throw new TelegramApiException("Parameter getChatAdministrators can not be null"); + } + if (sentCallback == null) { + throw new TelegramApiException("Parameter sentCallback can not be null"); + } + sendApiMethodAsync(getChatAdministrators, sentCallback); + } + + public void getChatMemberAsync(GetChatMember getChatMember, SentCallback sentCallback) throws TelegramApiException { + if (getChatMember == null) { + throw new TelegramApiException("Parameter getChatMember can not be null"); + } + if (sentCallback == null) { + throw new TelegramApiException("Parameter sentCallback can not be null"); + } + sendApiMethodAsync(getChatMember, sentCallback); + } + + public void getChatMemberCountAsync(GetChatMemberCount getChatMemberCount, SentCallback sentCallback) throws TelegramApiException { + if (getChatMemberCount == null) { + throw new TelegramApiException("Parameter getChatMemberCount can not be null"); + } + if (sentCallback == null) { + throw new TelegramApiException("Parameter sentCallback can not be null"); + } + + sendApiMethodAsync(getChatMemberCount, sentCallback); + } + + public void editMessageTextAsync(EditMessageText editMessageText, SentCallback sentCallback) throws TelegramApiException { if (editMessageText == null) { throw new TelegramApiException("Parameter editMessageText can not be null"); From f923a978df5ca6709f0ce5e8945649e547bac372 Mon Sep 17 00:00:00 2001 From: Rubenlagus Date: Sun, 22 May 2016 11:50:31 +0200 Subject: [PATCH 17/17] New version Closes #72 --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 629c497f..9044d322 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ I recommend using getUpdates methods. ## Usage -Just import add the library to your project using [Maven, Gradly, ...](https://jitpack.io/#rubenlagus/TelegramBots/v2.3.2) or download the jar(including all dependencies) from [here](https://github.com/rubenlagus/TelegramBots/releases/tag/v2.3.2) +Just import add the library to your project using [Maven, Gradly, ...](https://jitpack.io/#rubenlagus/TelegramBots/v2.3.3) or download the jar(including all dependencies) from [here](https://github.com/rubenlagus/TelegramBots/releases/tag/v2.3.3) In order to use Long Polling mode, just create your own bot extending `org.telegram.telegrambots.bots.TelegramLongPollingBot`. diff --git a/pom.xml b/pom.xml index 2a7f2926..7c91bea0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ jar org.telegram telegrambots - 2.3.2 + 2.3.3 Telegram Bots https://telegram.me/JavaBotsApi