From a8c6a622fcf6557b30b383516ecee5d5b81f9cde Mon Sep 17 00:00:00 2001 From: Rubenlagu Date: Fri, 26 Jun 2015 02:43:48 +0200 Subject: [PATCH] 1. Several fixes --- .idea/workspace.xml | 451 +++++++++--------- src/main/java/org/telegram/SenderHelper.java | 5 + .../java/org/telegram/services/BotLogger.java | 258 ++++++---- .../telegram/services/DirectionsService.java | 45 +- .../org/telegram/services/WeatherService.java | 72 +-- .../updateshandlers/DirectionsHandlers.java | 9 +- .../updateshandlers/WeatherHandlers.java | 25 +- .../updatesreceivers/UpdatesThread.java | 46 +- 8 files changed, 517 insertions(+), 394 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2815a50..5fd8463 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,14 +3,15 @@ + - + - - + + - + @@ -39,75 +40,62 @@ - - - - - + + - - - - - - - - - + + + + - - - - - - + + - - + + - + - - + + - + - - + - - + + - - + + - - + + - - + + @@ -147,9 +135,6 @@ @@ -916,7 +904,7 @@ - + 1434854005227 @@ -1032,11 +1020,17 @@ - - @@ -1062,7 +1056,7 @@ - + @@ -1139,14 +1133,15 @@ - file://$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java - 124 + 130 @@ -1156,12 +1151,6 @@ - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1405,16 +1348,6 @@ - - - - - - - - - - @@ -1450,14 +1383,6 @@ - - - - - - - - @@ -1466,38 +1391,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1523,132 +1416,248 @@ - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + - - + + - + - + - + - - + + - + - - - + + + + + + - + - + + + + + + + + + + + + + + + + + - + - - + - + - + - + - - + + + + + + + + + + - - + - + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + diff --git a/src/main/java/org/telegram/SenderHelper.java b/src/main/java/org/telegram/SenderHelper.java index fa6c770..cd6aa87 100644 --- a/src/main/java/org/telegram/SenderHelper.java +++ b/src/main/java/org/telegram/SenderHelper.java @@ -20,6 +20,7 @@ import org.telegram.methods.Constants; import org.telegram.methods.SendDocument; import org.telegram.methods.SendMessage; import org.telegram.methods.SetWebhook; +import org.telegram.services.BotLogger; import java.io.File; import java.io.IOException; @@ -34,6 +35,8 @@ import java.util.List; * @date 20 of June of 2015 */ public class SenderHelper { + private static volatile BotLogger log = BotLogger.getLogger(SenderHelper.class.getName()); + public static Message SendMessage(SendMessage message, String botToken) { try { CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); @@ -54,6 +57,8 @@ public class SenderHelper { nameValuePairs.add(new BasicNameValuePair(SendMessage.REPLYTOMESSAGEID_FIELD, message.getReplayToMessageId().toString())); } httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); + log.warning(httppost.toString()); + log.warning(nameValuePairs.toString()); CloseableHttpResponse response = httpclient.execute(httppost); HttpEntity ht = response.getEntity(); diff --git a/src/main/java/org/telegram/services/BotLogger.java b/src/main/java/org/telegram/services/BotLogger.java index 84e77ed..7555bf7 100644 --- a/src/main/java/org/telegram/services/BotLogger.java +++ b/src/main/java/org/telegram/services/BotLogger.java @@ -1,79 +1,89 @@ package org.telegram.services; +import com.apple.concurrent.Dispatch; import org.telegram.BuildVars; import javax.validation.constraints.NotNull; import java.io.*; -import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.GregorianCalendar; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; /** * @author Ruben Bermudez - * @version 2.0 - * @brief Logger to file + * @version 1.0 + * @brief Logger * @date 21/01/15 */ public class BotLogger { - private static final Object lockToWrite = new Object(); + private volatile Object lockToWrite = new Object(); + + private final Logger logger; private static volatile PrintWriter logginFile; + private Calendar lastFileDate; private static volatile String currentFileName; + private static LoggerThread loggerThread = new LoggerThread(); private static volatile ConcurrentHashMap instances = new ConcurrentHashMap<>(); - private final Logger logger; - private LocalDateTime lastFileDate; + private final static ConcurrentLinkedQueue logsToFile = new ConcurrentLinkedQueue<>(); - private BotLogger(String classname) { - this.logger = Logger.getLogger(classname); - this.logger.setLevel(Level.ALL); - this.lastFileDate = LocalDateTime.now(); - if (currentFileName == null || currentFileName.compareTo("") == 0) { - currentFileName = BuildVars.pathToLogs + dateFormatterForFileName(this.lastFileDate) + ".log"; - try { - File file = new File(currentFileName); - if (file.exists()) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - boolean created = file.createNewFile(); - if (created) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - throw new NullPointerException("File for loggin error"); - } - } - } catch (IOException ignored) { - } + static { - } + loggerThread.start(); } public static BotLogger getLogger(@NotNull String className) { - BotLogger currentInstance; - if (instances.containsKey(className)) { - currentInstance = instances.get(className); - } else { + if (!instances.containsKey(className)) { synchronized (BotLogger.class) { - if (instances.containsKey(className)) { - currentInstance = instances.get(className); - } else { + if (!instances.containsKey(className)) { BotLogger instance = new BotLogger(className); instances.put(className, instance); - currentInstance = instance; + return instance; + } else { + return instances.get(className); } } + } else { + return instances.get(className); } + } - return currentInstance; + private BotLogger(String classname) { + logger = Logger.getLogger(classname); + logger.setLevel(Level.WARNING); + ConsoleHandler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + lastFileDate = new GregorianCalendar(); + if (currentFileName == null || currentFileName.length() == 0) { + currentFileName = BuildVars.pathToLogs + dateFormaterForFileName(lastFileDate) + ".log"; + try { + File file = new File(currentFileName); + if (!file.exists()) { + file.createNewFile(); + } + logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + } } + public void log(@NotNull Level level, String msg) { - this.logger.log(level, msg); + logger.log(level, msg); logToFile(level, msg); } public void severe(String msg) { - this.logger.severe(msg); + logger.severe(msg); logToFile(Level.SEVERE, msg); } @@ -94,49 +104,49 @@ public class BotLogger { } public void warning(String msg) { - this.logger.warning(msg); + logger.warning(msg); logToFile(Level.WARNING, msg); } public void info(String msg) { - this.logger.info(msg); + logger.info(msg); logToFile(Level.INFO, msg); } public void config(String msg) { - this.logger.config(msg); + logger.config(msg); logToFile(Level.CONFIG, msg); } public void fine(String msg) { - this.logger.fine(msg); + logger.fine(msg); logToFile(Level.FINE, msg); } public void finer(String msg) { - this.logger.finer(msg); + logger.finer(msg); logToFile(Level.FINER, msg); } public void finest(String msg) { - this.logger.finest(msg); + logger.finest(msg); logToFile(Level.FINEST, msg); } public void log(@NotNull Level level, @NotNull Throwable throwable) { - this.logger.log(level, "Exception", throwable); + throwable.printStackTrace(); logToFile(level, throwable); } public void log(@NotNull Level level, String msg, Throwable thrown) { - this.logger.log(level, msg, thrown); - logToFile(level, msg, thrown); + logger.log(level, msg, thrown); + logToFile(level, msg ,thrown); } public void severe(@NotNull Throwable throwable) { @@ -227,84 +237,94 @@ public class BotLogger { log(Level.FINER, msg, throwable); } - private boolean isCurrentDate(LocalDateTime dateTime) { - return dateTime.toLocalDate().isEqual(this.lastFileDate.toLocalDate()); + private boolean isCurrentDate(Calendar calendar) { + if (calendar.get(Calendar.DAY_OF_MONTH) != lastFileDate.get(Calendar.DAY_OF_MONTH)) { + return false; + } + if (calendar.get(Calendar.MONTH) != lastFileDate.get(Calendar.MONTH)) { + return false; + } + if (calendar.get(Calendar.YEAR) != lastFileDate.get(Calendar.YEAR)) { + return false; + } + return true; } - private String dateFormatterForFileName(@NotNull LocalDateTime dateTime) { + private String dateFormaterForFileName(@NotNull Calendar calendar) { String dateString = ""; - dateString += dateTime.getDayOfMonth(); - dateString += dateTime.getMonthValue(); - dateString += dateTime.getYear(); + dateString += calendar.get(Calendar.DAY_OF_MONTH); + dateString += calendar.get(Calendar.MONTH) + 1; + dateString += calendar.get(Calendar.YEAR); return dateString; } - private String dateFormatterForLogs(@NotNull LocalDateTime dateTime) { + private String dateFormaterForLogs(@NotNull Calendar calendar) { String dateString = "["; - dateString += dateTime.getDayOfMonth() + "_"; - dateString += dateTime.getMonthValue() + "_"; - dateString += dateTime.getYear() + "_"; - dateString += dateTime.getHour() + ":"; - dateString += dateTime.getMinute() + ":"; - dateString += dateTime.getSecond(); + dateString += calendar.get(Calendar.DAY_OF_MONTH) + "_"; + dateString += (calendar.get(Calendar.MONTH) + 1) + "_"; + dateString += calendar.get(Calendar.YEAR) + "_"; + dateString += calendar.get(Calendar.HOUR_OF_DAY) + "_"; + dateString += calendar.get(Calendar.MINUTE) + ":"; + dateString += calendar.get(Calendar.SECOND); dateString += "] "; return dateString; } - private void updateAndCreateFile(LocalDateTime dateTime) { - if (!isCurrentDate(dateTime)) { - this.lastFileDate = LocalDateTime.now(); - currentFileName = BuildVars.pathToLogs + dateFormatterForFileName(this.lastFileDate) + ".log"; - try { - logginFile.flush(); - logginFile.close(); - File file = new File(currentFileName); - if (file.exists()) { - logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); - } else { - 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 void updateAndCreateFile(Calendar calendar) { + if (isCurrentDate(calendar)) { + return; + } + lastFileDate = new GregorianCalendar(); + currentFileName = BuildVars.pathToLogs + dateFormaterForFileName(lastFileDate) + ".log"; + try { + logginFile.flush(); + logginFile.close(); + File file = new File(currentFileName); + if (!file.exists()) { + file.createNewFile(); } + logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } } private void logToFile(@NotNull Level level, Throwable throwable) { - if (isLoggable(level)) { - synchronized (lockToWrite) { - LocalDateTime currentDate = LocalDateTime.now(); - String dateForLog = dateFormatterForLogs(currentDate); - updateAndCreateFile(currentDate); - logThrowableToFile(level, throwable, dateForLog); - } + if (!isLoggable(level)){ + return; + } + synchronized (lockToWrite) { + Calendar currentDate = new GregorianCalendar(); + String dateForLog = dateFormaterForLogs(currentDate); + updateAndCreateFile(currentDate); + logThrowableToFile(level, throwable, dateForLog); } } + private void logToFile(@NotNull Level level, String msg) { - if (isLoggable(level)) { - synchronized (lockToWrite) { - LocalDateTime currentDate = LocalDateTime.now(); - updateAndCreateFile(currentDate); - String dateForLog = dateFormatterForLogs(currentDate); - logMsgToFile(level, msg, dateForLog); - } + if (!isLoggable(level)){ + return; + } + synchronized (lockToWrite) { + Calendar currentDate = new GregorianCalendar(); + updateAndCreateFile(currentDate); + String dateForLog = dateFormaterForLogs(currentDate); + logMsgToFile(level, msg, dateForLog); } } private void logToFile(Level level, String msg, Throwable throwable) { - if (!isLoggable(level)) { + if (!isLoggable(level)){ return; } synchronized (lockToWrite) { - LocalDateTime currentDate = LocalDateTime.now(); + Calendar currentDate = new GregorianCalendar(); updateAndCreateFile(currentDate); - String dateForLog = dateFormatterForLogs(currentDate); + String dateForLog = dateFormaterForLogs(currentDate); logMsgToFile(level, msg, dateForLog); logThrowableToFile(level, throwable, dateForLog); } @@ -312,20 +332,25 @@ public class BotLogger { private void logMsgToFile(Level level, String msg, String dateForLog) { dateForLog += level.toString() + " - " + msg; - logginFile.println(dateForLog); - logginFile.flush(); + logsToFile.add(dateForLog); + synchronized (logsToFile) { + logsToFile.notifyAll(); + } } private void logThrowableToFile(Level level, Throwable throwable, String dateForLog) { - logginFile.println(dateForLog + level.getName() + " - " + throwable); + String throwableLog = dateForLog + level.getName() + " - " + throwable + "\n"; for (StackTraceElement element : throwable.getStackTrace()) { - logginFile.println("\tat " + element); + throwableLog += "\tat " + element + "\n"; + } + logsToFile.add(throwableLog); + synchronized (logsToFile) { + logsToFile.notifyAll(); } - logginFile.flush(); } private boolean isLoggable(Level level) { - return this.logger.isLoggable(level) && BuildVars.debug; + return logger.isLoggable(level) && BuildVars.debug; } @Override @@ -334,4 +359,33 @@ public class BotLogger { logginFile.close(); super.finalize(); } + + private static class LoggerThread extends Thread { + @Override + public void run() { + setPriority(Thread.MIN_PRIORITY); + while(true) { + 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(); + } + + for (String stringToLog: stringsToLog) { + logginFile.println(stringToLog); + } + logginFile.flush(); + } + } + } } diff --git a/src/main/java/org/telegram/services/DirectionsService.java b/src/main/java/org/telegram/services/DirectionsService.java index f475eef..b142de7 100644 --- a/src/main/java/org/telegram/services/DirectionsService.java +++ b/src/main/java/org/telegram/services/DirectionsService.java @@ -17,6 +17,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; /** * @author Ruben Bermudez @@ -64,8 +66,8 @@ public class DirectionsService { * @param destination Destination address * @return Destinations */ - public String getDirections(String origin, String destination) { - String responseToUser; + public List getDirections(String origin, String destination) { + final List responseToUser = new ArrayList<>(); try { String completURL = BASEURL + "?origin=" + getQuery(origin) + "&destination=" + getQuery(destination) + PARAMS + APIIDEND; HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); @@ -79,20 +81,22 @@ public class DirectionsService { JSONObject jsonObject = new JSONObject(responseContent); if (jsonObject.getString("status").equals("OK")) { JSONObject route = jsonObject.getJSONArray("routes").getJSONObject(0); - responseToUser = route.getJSONArray("legs").getJSONObject(0).getString("start_address"); - responseToUser += " is "; - responseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"); - responseToUser += " away from "; - responseToUser += route.getJSONArray("legs").getJSONObject(0).getString("end_address"); // TODO Destination - responseToUser += " and it takes "; - responseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text"); - responseToUser += " to arrive there following these directions:\n\n"; - responseToUser += getDirectionsSteps(route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps")); + String partialResponseToUser; + partialResponseToUser = route.getJSONArray("legs").getJSONObject(0).getString("start_address"); + partialResponseToUser += " is "; + partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"); + partialResponseToUser += " away from "; + partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getString("end_address"); // TODO Destination + partialResponseToUser += " and it takes "; + partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text"); + partialResponseToUser += " to arrive there following these directions:\n\n"; + responseToUser.add(partialResponseToUser); + responseToUser.addAll(getDirectionsSteps(route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps"))); } else { - responseToUser = "Directions not found between " + origin + " and " + destination; + responseToUser.add("Directions not found between " + origin + " and " + destination); } } catch (Exception e) { - responseToUser = "Error fetching weather info"; + responseToUser.add("Error fetching weather info"); } return responseToUser; } @@ -101,10 +105,19 @@ public class DirectionsService { return URLEncoder.encode(address, "UTF-8"); } - private String getDirectionsSteps(JSONArray steps) { - String stepsStringify = ""; + private List getDirectionsSteps(JSONArray steps) { + List stepsStringify = new ArrayList<>(); + String partialStepsStringify = ""; for (int i = 0; i < steps.length(); i++) { - stepsStringify += i + ".\t" + getDirectionForStep(steps.getJSONObject(i)) + "\n\n"; + String step = getDirectionForStep(steps.getJSONObject(i)); + if (partialStepsStringify.length() > 1000) { + stepsStringify.add(partialStepsStringify); + partialStepsStringify = ""; + } + partialStepsStringify += i + ".\t" + step + "\n\n"; + } + if (!partialStepsStringify.isEmpty()) { + stepsStringify.add(partialStepsStringify); } return stepsStringify; } diff --git a/src/main/java/org/telegram/services/WeatherService.java b/src/main/java/org/telegram/services/WeatherService.java index d1db4b2..e324843 100644 --- a/src/main/java/org/telegram/services/WeatherService.java +++ b/src/main/java/org/telegram/services/WeatherService.java @@ -1,10 +1,15 @@ package org.telegram.services; +import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.entity.BufferedHttpEntity; +import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; import org.json.JSONObject; import org.telegram.BuildVars; import org.telegram.database.DatabaseManager; @@ -26,6 +31,7 @@ import java.time.format.DateTimeFormatter; * @date 20 of June of 2015 */ public class WeatherService { + private static volatile BotLogger log = BotLogger.getLogger(WeatherService.class.getName()); private static final String BASEURL = "http://api.openweathermap.org/data/2.5/"; ///< Base url for REST private static final String FORECASTPATH = "forecast/daily"; private static final String CURRENTPATH = "weather"; @@ -73,17 +79,17 @@ public class WeatherService { String responseToUser; try { String completURL = BASEURL + FORECASTPATH + "?" + getCityQuery(city) + FORECASTPARAMS + APIIDEND; - HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); HttpGet request = new HttpGet(completURL); - HttpResponse response = client.execute(request); - BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String line; - String responseString = ""; - while ((line = rd.readLine()) != null) { - responseString += line; - } + + CloseableHttpResponse response = client.execute(request); + HttpEntity ht = response.getEntity(); + + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseString = EntityUtils.toString(buf, "UTF-8"); JSONObject jsonObject = new JSONObject(responseString); + log.warning(jsonObject.toString()); if (jsonObject.getInt("cod") == 200) { cityFound = jsonObject.getJSONObject("city").getString("name") + " (" + jsonObject.getJSONObject("city").getString("country") + ")"; @@ -93,9 +99,11 @@ public class WeatherService { responseToUser += "Thank you for using our Weather Bot.\n\n" + "Your Telegram Team"; } else { + log.warning(jsonObject.toString()); responseToUser = "City not found"; } } catch (Exception e) { + log.error(e); responseToUser = "Error fetching weather info"; } return responseToUser; @@ -112,15 +120,13 @@ public class WeatherService { String responseToUser; try { String completURL = BASEURL + FORECASTPATH + "?lat=" + URLEncoder.encode(latitude + "", "UTF-8") + "&lon=" + URLEncoder.encode(longitude + "", "UTF-8") + FORECASTPARAMS + APIIDEND;; - HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); HttpGet request = new HttpGet(completURL); - HttpResponse response = client.execute(request); - BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String line; - String responseString = ""; - while ((line = rd.readLine()) != null) { - responseString += line; - } + CloseableHttpResponse response = client.execute(request); + HttpEntity ht = response.getEntity(); + + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseString = EntityUtils.toString(buf, "UTF-8"); JSONObject jsonObject = new JSONObject(responseString); if (jsonObject.getInt("cod") == 200) { @@ -132,9 +138,11 @@ public class WeatherService { responseToUser += "Thank you for using our Weather Bot.\n\n" + "Your Telegram Team"; } else { + log.warning(jsonObject.toString()); responseToUser = "City not found"; } } catch (Exception e) { + log.error(e); responseToUser = "Error fetching weather info"; } return responseToUser; @@ -152,15 +160,13 @@ public class WeatherService { String responseToUser; try { String completURL = BASEURL + CURRENTPATH + "?" + getCityQuery(city) + CURRENTPARAMS + APIIDEND; - HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); HttpGet request = new HttpGet(completURL); - HttpResponse response = client.execute(request); - BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String line; - String responseString = ""; - while ((line = rd.readLine()) != null) { - responseString += line; - } + CloseableHttpResponse response = client.execute(request); + HttpEntity ht = response.getEntity(); + + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseString = EntityUtils.toString(buf, "UTF-8"); JSONObject jsonObject = new JSONObject(responseString); if (jsonObject.getInt("cod") == 200) { @@ -172,9 +178,11 @@ public class WeatherService { responseToUser += "Thank you for using our Weather Bot.\n\n" + "Your Telegram Team"; } else { + log.warning(jsonObject.toString()); responseToUser = "City not found"; } } catch (Exception e) { + log.error(e); responseToUser = "Error fetching weather info"; } return responseToUser; @@ -191,15 +199,13 @@ public class WeatherService { String responseToUser; try { String completURL = BASEURL + CURRENTPATH + "?q=" + URLEncoder.encode("lat=" + latitude + "&lon=" + longitude, "UTF-8") + CURRENTPARAMS + APIIDEND;; - HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); HttpGet request = new HttpGet(completURL); - HttpResponse response = client.execute(request); - BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String line; - String responseString = ""; - while ((line = rd.readLine()) != null) { - responseString += line; - } + CloseableHttpResponse response = client.execute(request); + HttpEntity ht = response.getEntity(); + + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseString = EntityUtils.toString(buf, "UTF-8"); JSONObject jsonObject = new JSONObject(responseString); if (jsonObject.getInt("cod") == 200) { @@ -211,9 +217,11 @@ public class WeatherService { responseToUser += "Thank you for using our Weather Bot.\n\n" + "Your Telegram Team"; } else { + log.warning(jsonObject.toString()); responseToUser = "City not found"; } } catch (Exception e) { + log.error(e); responseToUser = "Error fetching weather info"; } return responseToUser; diff --git a/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java b/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java index 21f10f3..9c5036d 100644 --- a/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java +++ b/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java @@ -89,15 +89,18 @@ public class DirectionsHandlers implements UpdatesCallback { DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) { String origin = DatabaseManager.getInstance().getUserOrigin(message.getFrom().getId()); String destiny = message.getText(); - String directions = DirectionsService.getInstance().getDirections(origin, destiny); + List directions = DirectionsService.getInstance().getDirections(origin, destiny); SendMessage sendMessageRequest = new SendMessage(); sendMessageRequest.setChatId(message.getChatId()); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); replyKeyboardHide.setSelective(true); sendMessageRequest.setReplayMarkup(replyKeyboardHide); sendMessageRequest.setReplayToMessageId(message.getMessageId()); - sendMessageRequest.setText(directions); - Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); + Message sentMessage = null; + for (String direction: directions) { + sendMessageRequest.setText(direction); + sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); + } if (sentMessage != null) { DatabaseManager.getInstance().deleteUserForDirections(message.getFrom().getId()); } diff --git a/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java b/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java index 0f0ad89..f6dea81 100644 --- a/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java +++ b/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java @@ -1,10 +1,7 @@ package org.telegram.updateshandlers; import org.telegram.*; -import org.telegram.api.ForceReply; -import org.telegram.api.Message; -import org.telegram.api.ReplyKeyboardMarkup; -import org.telegram.api.Update; +import org.telegram.api.*; import org.telegram.database.DatabaseManager; import org.telegram.methods.SendMessage; import org.telegram.services.BotLogger; @@ -64,6 +61,11 @@ public class WeatherHandlers implements UpdatesCallback { String citywithoutdescription = parts[1].split("-->", 2)[0].trim(); String weather = WeatherService.getInstance().fetchWeatherForecast(citywithoutdescription, message.getFrom().getId()); SendMessage sendMessageRequest = new SendMessage(); + ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); + replyKeyboardHide.setSelective(true); + replyKeyboardHide.setHideKeyboard(true); + sendMessageRequest.setReplayMarkup(replyKeyboardHide); + sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId()); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(message.getChatId()); SenderHelper.SendMessage(sendMessageRequest, TOKEN); @@ -105,6 +107,11 @@ public class WeatherHandlers implements UpdatesCallback { String citywithoutdescription = parts[1].split("-->", 2)[0].trim(); String weather = WeatherService.getInstance().fetchWeatherCurrent(citywithoutdescription, message.getFrom().getId()); SendMessage sendMessageRequest = new SendMessage(); + ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); + replyKeyboardHide.setSelective(true); + replyKeyboardHide.setHideKeyboard(true); + sendMessageRequest.setReplayMarkup(replyKeyboardHide); + sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId()); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(message.getChatId()); SenderHelper.SendMessage(sendMessageRequest, TOKEN); @@ -150,6 +157,11 @@ public class WeatherHandlers implements UpdatesCallback { String weather = WeatherService.getInstance().fetchWeatherForecast(message.getText(), message.getFrom().getId()); sendMessageRequest.setText(weather); } + ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); + replyKeyboardHide.setSelective(true); + replyKeyboardHide.setHideKeyboard(true); + sendMessageRequest.setReplayMarkup(replyKeyboardHide); + sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId()); sendMessageRequest.setChatId(message.getChatId()); SenderHelper.SendMessage(sendMessageRequest, TOKEN); } else if (parts[0].startsWith(Commands.help) || @@ -163,6 +175,11 @@ public class WeatherHandlers implements UpdatesCallback { String weather = WeatherService.getInstance().fetchWeatherForecastByLocation(message.getLocation().getLongitude(), message.getLocation().getLatitude(), message.getFrom().getId()); SendMessage sendMessageRequest = new SendMessage(); + ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); + replyKeyboardHide.setSelective(true); + replyKeyboardHide.setHideKeyboard(true); + sendMessageRequest.setReplayMarkup(replyKeyboardHide); + sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId()); sendMessageRequest.setText(weather); sendMessageRequest.setChatId(message.getChatId()); SenderHelper.SendMessage(sendMessageRequest, TOKEN); diff --git a/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java b/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java index 252e3e7..1234107 100644 --- a/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java +++ b/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java @@ -1,12 +1,17 @@ package org.telegram.updatesreceivers; +import jdk.internal.org.objectweb.asm.Handle; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; @@ -15,6 +20,8 @@ import org.telegram.BuildVars; import org.telegram.api.Update; import org.telegram.methods.Constants; import org.telegram.methods.GetUpdates; +import org.telegram.methods.SendMessage; +import org.telegram.services.BotLogger; import org.telegram.updateshandlers.UpdatesCallback; import java.io.IOException; @@ -32,6 +39,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; * @date 20 of June of 2015 */ public class UpdatesThread { + private static volatile BotLogger log = BotLogger.getLogger(UpdatesThread.class.getName()); + private final UpdatesCallback callback; private final ReaderThread readerThread; private final HandlerThread handlerThread; @@ -52,17 +61,27 @@ public class UpdatesThread { private class ReaderThread extends Thread { @Override public void run() { + setPriority(Thread.MIN_PRIORITY); while(true) { GetUpdates request = new GetUpdates(); - request.setOffset(lastReceivedUpdate+1); + request.setLimit(100); + request.setOffset(lastReceivedUpdate + 1); CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); String url = Constants.BASEURL + token + "/" + GetUpdates.PATH; - HttpGet httpGet = new HttpGet(url + request.getUrlParams()); - httpGet.addHeader("Content-type", "application/x-www-form-urlencoded"); - httpGet.addHeader("charset", "UTF-8"); - HttpResponse response; + HttpPost httpPost = new HttpPost(url); + List nameValuePairs = new ArrayList<>(); + nameValuePairs.add(new BasicNameValuePair(GetUpdates.OFFSET_FIELD, "0")); + nameValuePairs.add(new BasicNameValuePair(GetUpdates.LIMIT_FIELD, request.getLimit()+"")); + if (request.getTimeout() != null) { + nameValuePairs.add(new BasicNameValuePair(GetUpdates.TIMEOUT_FIELD, request.getTimeout()+"")); + } try { - response = httpclient.execute(httpGet); + httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); + httpPost.addHeader("Content-type", "application/x-www-form-urlencoded"); + httpPost.addHeader("charset", "UTF-8"); + HttpResponse response; + log.debug(httpPost.toString()); + response = httpclient.execute(httpPost); HttpEntity ht = response.getEntity(); BufferedHttpEntity buf = new BufferedHttpEntity(ht); @@ -74,8 +93,9 @@ public class UpdatesThread { throw new InvalidObjectException(jsonObject.toString()); } JSONArray jsonArray = jsonObject.getJSONArray("result"); + log.debug(jsonArray.toString()); if (jsonArray.length() != 0) { - List updates = new ArrayList(); + List updates = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { Update update = new Update(jsonArray.getJSONObject(i)); if (update.getUpdateId() > lastReceivedUpdate) { @@ -84,8 +104,8 @@ public class UpdatesThread { updates.add(update); } - receivedUpdates.addAll(updates); synchronized (receivedUpdates) { + receivedUpdates.addAll(updates); receivedUpdates.notifyAll(); } } else { @@ -99,14 +119,7 @@ public class UpdatesThread { } } } catch (JSONException e) { - try { - synchronized (this) { - this.wait(500); - } - } catch (InterruptedException e1) { - e.printStackTrace(); - continue; - } + e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); @@ -118,6 +131,7 @@ public class UpdatesThread { private class HandlerThread extends Thread { @Override public void run() { + setPriority(Thread.MIN_PRIORITY); while(true) { Update update = receivedUpdates.poll(); if (update == null) {