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 @@
1435253672379
-
+
+ 1435262669527
+
+
+ 1435262669527
+
+
-
+
@@ -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 @@
-
- file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java
- 59
-
-
-
file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java
321
@@ -1169,89 +1158,43 @@
- file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
- 47
+ file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
+ 128
-
+
- file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java
- 38
+ file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
+ 113
-
+
- file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java
- 55
+ file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
+ 107
-
+
-
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -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) {