diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
index f8ce7d9..47e81db 100644
--- a/.idea/dataSources.xml
+++ b/.idea/dataSources.xml
@@ -13,6 +13,7 @@
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 4e50f1c..fd488de 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,26 +2,25 @@
+
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -67,69 +66,55 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
+
@@ -139,50 +124,19 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -223,16 +177,6 @@
@@ -463,8 +417,6 @@
-
-
@@ -639,81 +591,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -770,11 +656,11 @@
+
-
@@ -1216,7 +1102,8 @@
-
+
+
1434854005227
@@ -1500,11 +1387,17 @@
1441719275787
-
+
+ 1444845084283
+
+
+ 1444845084283
+
+
-
+
@@ -1593,7 +1486,6 @@
-
@@ -1618,7 +1510,8 @@
-
+
+
@@ -1643,7 +1536,7 @@
file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java
- 119
+ 120
@@ -1655,15 +1548,21 @@
file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java
- 275
+ 278
+
+ file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java
+ 136
+
+
+
-
+
@@ -1672,105 +1571,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1832,27 +1632,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1879,7 +1658,6 @@
-
@@ -1911,7 +1689,6 @@
-
@@ -1927,7 +1704,6 @@
-
@@ -1967,7 +1743,6 @@
-
@@ -1979,112 +1754,112 @@
-
+
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
+
+
+
-
+
-
-
-
-
-
-
+
+
+
-
-
+
+
@@ -2104,6 +1879,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/telegram/BotConfig.java b/src/main/java/org/telegram/BotConfig.java
index 7c0e841..70e1a83 100644
--- a/src/main/java/org/telegram/BotConfig.java
+++ b/src/main/java/org/telegram/BotConfig.java
@@ -7,12 +7,14 @@ package org.telegram;
* @date 20 of June of 2015
*/
public class BotConfig {
- public static final String TOKENWEATHER = "";
+ public static final String TOKENWEATHER = "";
public static final String USERNAMEWEATHER = "weatherbot";
- public static final String TOKENTRANSIFEX = "";
+ public static final String TOKENTRANSIFEX = "";
public static final String USERNAMETRANSIFEX = "TGlanguagesbot";
- public static final String TOKENFILES = "";
+ public static final String TOKENFILES = "";
public static final String USERNAMEFILES = "filesbot";
- public static final String TOKENDIRECTIONS = "";
+ public static final String TOKENDIRECTIONS = "";
public static final String USERNAMEDIRECTIONS = "directionsbot";
+ public static final String TOKENCHANNEL = "";
+ public static final String USERNAMECHANNEL = "channelupdatesbot";
}
diff --git a/src/main/java/org/telegram/Main.java b/src/main/java/org/telegram/Main.java
index a765cc3..d02e043 100644
--- a/src/main/java/org/telegram/Main.java
+++ b/src/main/java/org/telegram/Main.java
@@ -31,6 +31,7 @@ public class Main {
private static void initBots() {
UpdatesCallback weatherBot = new WeatherHandlers(webhook);
+ UpdatesCallback channelBot = new ChannelHandlers(webhook);
UpdatesCallback transifexBot = new TransifexHandlers(webhook);
UpdatesCallback filesBot = new FilesHandlers(webhook);
UpdatesCallback directionsBot = new DirectionsHandlers(webhook);
diff --git a/src/main/java/org/telegram/SenderHelper.java b/src/main/java/org/telegram/SenderHelper.java
index 2562612..f65eb8b 100644
--- a/src/main/java/org/telegram/SenderHelper.java
+++ b/src/main/java/org/telegram/SenderHelper.java
@@ -38,7 +38,7 @@ import java.util.concurrent.Executors;
* @date 20 of June of 2015
*/
public class SenderHelper {
- private static volatile BotLogger log = BotLogger.getLogger(SenderHelper.class.getName());
+ private static final String LOGTAG = "SENDERHELPER";
private static final ExecutorService exe = Executors.newSingleThreadExecutor();
public static void SendDocument(SendDocument sendDocument, String botToken) {
@@ -77,12 +77,13 @@ public class SenderHelper {
}
CloseableHttpResponse response = httpClient.execute(httppost);
+ } catch (IOException e) {
+ BotLogger.error(LOGTAG, e);
+ } finally {
if (sendDocument.isNewDocument()) {
File fileToDelete = new File(sendDocument.getDocument());
fileToDelete.delete();
}
- } catch (IOException e) {
- log.error(e);
}
}
@@ -125,7 +126,7 @@ public class SenderHelper {
CloseableHttpResponse response = httpClient.execute(httppost);
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
@@ -174,7 +175,7 @@ public class SenderHelper {
CloseableHttpResponse response = httpClient.execute(httppost);
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
@@ -210,14 +211,14 @@ public class SenderHelper {
}
CloseableHttpResponse response = httpClient.execute(httppost);
+ } catch (IOException e) {
+ BotLogger.error(LOGTAG, e);
+ } finally {
if (sendSticker.isNewSticker()) {
File fileToDelete = new File(sendSticker.getSticker());
fileToDelete.delete();
}
- } catch (IOException e) {
- log.error(e);
}
-
}
public static void SendWebhook(String webHookURL, String botToken) {
@@ -237,14 +238,15 @@ public class SenderHelper {
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
String responseContent = EntityUtils.toString(buf, "UTF-8");
- log.debug(responseContent);
+ BotLogger.debug(LOGTAG, responseContent);
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
- public static void SendApiMethod(BotApiMethod method, String botToken) {
+ public static void SendApiMethod(BotApiMethod method, String botToken) throws InvalidObjectException {
+ String responseContent = "{}";
try {
CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
String url = Constants.BASEURL + botToken + "/" + method.getPath();
@@ -254,15 +256,16 @@ public class SenderHelper {
CloseableHttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
- String responseContent = EntityUtils.toString(buf, "UTF-8");
-
- JSONObject jsonObject = new JSONObject(responseContent);
- if (!jsonObject.getBoolean("ok")) {
- throw new InvalidObjectException(jsonObject.toString());
- }
+ responseContent = EntityUtils.toString(buf, "UTF-8");
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
+
+ JSONObject jsonObject = new JSONObject(responseContent);
+ if (!jsonObject.getBoolean("ok")) {
+ throw new InvalidObjectException(jsonObject.getString("description"));
+ }
+
}
public static void SendApiMethodAsync(BotApiMethod method, String botToken, SentCallback callback) {
@@ -284,7 +287,7 @@ public class SenderHelper {
}
callback.onResult(method, jsonObject);
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
});
}
diff --git a/src/main/java/org/telegram/api/objects/Message.java b/src/main/java/org/telegram/api/objects/Message.java
index 9ada2d3..7702c95 100644
--- a/src/main/java/org/telegram/api/objects/Message.java
+++ b/src/main/java/org/telegram/api/objects/Message.java
@@ -227,7 +227,7 @@ public class Message implements BotApiObject {
}
public boolean hasText() {
- return text != null;
+ return text != null && !text.isEmpty();
}
public String getText() {
diff --git a/src/main/java/org/telegram/database/ConectionDB.java b/src/main/java/org/telegram/database/ConectionDB.java
index fa75142..5a98513 100644
--- a/src/main/java/org/telegram/database/ConectionDB.java
+++ b/src/main/java/org/telegram/database/ConectionDB.java
@@ -19,7 +19,7 @@ import java.sql.*;
* @date 3/12/14
*/
public class ConectionDB {
- private static volatile BotLogger log = BotLogger.getLogger(ConectionDB.class.getName());
+ private static final String LOGTAG = "CONNECTIONDB";
private Connection currentConection;
public ConectionDB() {
@@ -32,7 +32,7 @@ public class ConectionDB {
Class.forName(BuildVars.controllerDB).newInstance();
connection = DriverManager.getConnection(BuildVars.linkDB, BuildVars.userDB, BuildVars.password);
} catch (SQLException | ClassNotFoundException | IllegalAccessException | InstantiationException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return connection;
@@ -42,7 +42,7 @@ public class ConectionDB {
try {
this.currentConection.close();
} catch (SQLException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
@@ -81,7 +81,7 @@ public class ConectionDB {
}
}
} catch (SQLException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return max;
}
diff --git a/src/main/java/org/telegram/database/DatabaseManager.java b/src/main/java/org/telegram/database/DatabaseManager.java
index fd5b168..295ee25 100644
--- a/src/main/java/org/telegram/database/DatabaseManager.java
+++ b/src/main/java/org/telegram/database/DatabaseManager.java
@@ -26,7 +26,8 @@ import java.util.List;
* @date 3/12/14
*/
public class DatabaseManager {
- private static volatile BotLogger log = BotLogger.getLogger(DatabaseManager.class.getName()); ///< Logger
+ private static final String LOGTAG = "DATABASEMANAGER";
+
private static volatile DatabaseManager instance;
private static volatile ConectionDB connetion;
@@ -36,7 +37,7 @@ public class DatabaseManager {
private DatabaseManager() {
connetion = new ConectionDB();
final int currentVersion = connetion.checkVersion();
- log.info("Current db version: " + currentVersion);
+ BotLogger.info(LOGTAG, "Current db version: " + currentVersion);
if (currentVersion < CreationStrings.version) {
recreateTable(currentVersion);
}
@@ -88,7 +89,7 @@ public class DatabaseManager {
}
connetion.commitTransaction();
} catch (SQLException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
diff --git a/src/main/java/org/telegram/services/BotLogger.java b/src/main/java/org/telegram/services/BotLogger.java
index 9568050..03380d0 100644
--- a/src/main/java/org/telegram/services/BotLogger.java
+++ b/src/main/java/org/telegram/services/BotLogger.java
@@ -4,67 +4,44 @@ import org.telegram.BuildVars;
import javax.validation.constraints.NotNull;
import java.io.*;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.concurrent.ConcurrentHashMap;
+import java.time.LocalDateTime;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author Ruben Bermudez
- * @version 1.0
- * @brief Logger
+ * @version 2.0
+ * @brief Logger to file
* @date 21/01/15
*/
public class BotLogger {
- private volatile Object lockToWrite = new Object();
-
- private final Logger logger;
+ private static final Object lockToWrite = new Object();
private static volatile PrintWriter logginFile;
- private Calendar lastFileDate;
private static volatile String currentFileName;
+ private static final Logger logger = Logger.getLogger("Tsupport Bot");
+ private static volatile LocalDateTime lastFileDate;
private static LoggerThread loggerThread = new LoggerThread();
- private static volatile ConcurrentHashMap instances = new ConcurrentHashMap<>();
- private final static ConcurrentLinkedQueue logsToFile = new ConcurrentLinkedQueue<>();
+ private static final ConcurrentLinkedQueue logsToFile = new ConcurrentLinkedQueue<>();
static {
-
- loggerThread.start();
- }
-
- public static BotLogger getLogger(@NotNull String className) {
- if (!instances.containsKey(className)) {
- synchronized (BotLogger.class) {
- if (!instances.containsKey(className)) {
- BotLogger instance = new BotLogger(className);
- instances.put(className, instance);
- return instance;
- } else {
- return instances.get(className);
- }
- }
- } else {
- return instances.get(className);
- }
- }
-
- private BotLogger(String classname) {
- logger = Logger.getLogger(classname);
logger.setLevel(Level.ALL);
- 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";
+ loggerThread.start();
+ lastFileDate = LocalDateTime.now();
+ if ((currentFileName == null) || (currentFileName.compareTo("") == 0)) {
+ currentFileName = dateFormatterForFileName(lastFileDate) + ".log";
try {
- File file = new File(currentFileName);
- if (!file.exists()) {
- file.createNewFile();
+ 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");
+ }
}
- logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} catch (IOException e) {
e.printStackTrace();
}
@@ -72,271 +49,261 @@ public class BotLogger {
}
}
-
- public void log(@NotNull Level level, String msg) {
- logger.log(level, msg);
- logToFile(level, msg);
+ public static void log(@NotNull Level level, String tag, String msg) {
+ logger.log(level, String.format("[%s] %s", tag, msg));
+ logToFile(level, tag, msg);
}
- public void severe(String msg) {
- logger.severe(msg);
- logToFile(Level.SEVERE, msg);
+ public static void severe(String tag, String msg) {
+ logger.severe(String.format("[%s] %s", tag, msg));
+ logToFile(Level.SEVERE, tag, msg);
}
- public void warn(String msg) {
- warning(msg);
+ public static void warn(String tag, String msg) {
+ warning(tag, msg);
}
- public void debug(String msg) {
- fine(msg);
+ public static void debug(String tag, String msg) {
+ fine(tag, msg);
}
- public void error(String msg) {
- severe(msg);
+ public static void error(String tag, String msg) {
+ severe(tag, msg);
}
- public void trace(String msg) {
- finer(msg);
+ public static void trace(String tag, String msg) {
+ finer(tag, msg);
}
- public void warning(String msg) {
- logger.warning(msg);
- logToFile(Level.WARNING, msg);
+ public static void warning(String tag, String msg) {
+ logger.warning(String.format("[%s] %s", tag, msg));
+ logToFile(Level.WARNING, tag, msg);
}
- public void info(String msg) {
- logger.info(msg);
- logToFile(Level.INFO, msg);
+ public static void info(String tag, String msg) {
+ logger.info(String.format("[%s] %s", tag, msg));
+ logToFile(Level.INFO, tag, msg);
}
- public void config(String msg) {
- logger.config(msg);
- logToFile(Level.CONFIG, msg);
+ public static void config(String tag, String msg) {
+ logger.config(String.format("[%s] %s", tag, msg));
+ logToFile(Level.CONFIG, tag, msg);
}
- public void fine(String msg) {
- logger.fine(msg);
- logToFile(Level.FINE, msg);
+ public static void fine(String tag, String msg) {
+ logger.fine(String.format("[%s] %s", tag, msg));
+ logToFile(Level.FINE, tag, msg);
}
- public void finer(String msg) {
- logger.finer(msg);
- logToFile(Level.FINER, msg);
+ public static void finer(String tag, String msg) {
+ logger.finer(String.format("[%s] %s", tag, msg));
+ logToFile(Level.FINER, tag, msg);
}
- public void finest(String msg) {
- logger.finest(msg);
- logToFile(Level.FINEST, msg);
+ public static void finest(String tag, String msg) {
+ logger.finest(String.format("[%s] %s", tag, msg));
+ logToFile(Level.FINEST, tag, msg);
}
- public void log(@NotNull Level level, @NotNull Throwable throwable) {
- throwable.printStackTrace();
- logToFile(level, throwable);
+ public static void log(@NotNull Level level, @NotNull String tag, @NotNull Throwable throwable) {
+ logger.log(level, String.format("[%s] Exception", tag), throwable);
+ logToFile(level, tag, throwable);
}
- public void log(@NotNull Level level, String msg, Throwable thrown) {
+ public static void log(@NotNull Level level, @NotNull String tag, @NotNull String msg, @NotNull Throwable thrown) {
logger.log(level, msg, thrown);
- logToFile(level, msg ,thrown);
+ logToFile(level, msg, thrown);
}
- public void severe(@NotNull Throwable throwable) {
- logToFile(Level.SEVERE, throwable);
+ public static void severe(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.SEVERE, tag, throwable);
}
- public void warning(@NotNull Throwable throwable) {
- logToFile(Level.WARNING, throwable);
+ public static void warning(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.WARNING, tag, throwable);
}
- public void info(@NotNull Throwable throwable) {
- logToFile(Level.INFO, throwable);
+ public static void info(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.INFO, tag, throwable);
}
- public void config(@NotNull Throwable throwable) {
- logToFile(Level.CONFIG, throwable);
+ public static void config(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.CONFIG, tag, throwable);
}
- public void fine(@NotNull Throwable throwable) {
- logToFile(Level.FINE, throwable);
+ public static void fine(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.FINE, tag, throwable);
}
- public void finer(@NotNull Throwable throwable) {
- logToFile(Level.FINER, throwable);
+ public static void finer(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.FINER, tag, throwable);
}
- public void finest(@NotNull Throwable throwable) {
- logToFile(Level.FINEST, throwable);
+ public static void finest(@NotNull String tag, @NotNull Throwable throwable) {
+ logToFile(Level.FINEST, tag, throwable);
}
- public void warn(Throwable throwable) {
- warning(throwable);
+ public static void warn(@NotNull String tag, Throwable throwable) {
+ warning(tag, throwable);
}
- public void debug(Throwable throwable) {
- fine(throwable);
+ public static void debug(@NotNull String tag, Throwable throwable) {
+ fine(tag, throwable);
}
- public void error(Throwable throwable) {
- severe(throwable);
+ public static void error(@NotNull String tag, Throwable throwable) {
+ severe(tag, throwable);
}
- public void trace(Throwable throwable) {
- finer(throwable);
+ public static void trace(@NotNull String tag, Throwable throwable) {
+ finer(tag, throwable);
}
- public void severe(String msg, @NotNull Throwable throwable) {
- log(Level.SEVERE, msg, throwable);
+ public static void severe(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.SEVERE, tag, msg, throwable);
}
- public void warning(String msg, @NotNull Throwable throwable) {
- log(Level.WARNING, msg, throwable);
+ public static void warning(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.WARNING, tag, msg, throwable);
}
- public void info(String msg, @NotNull Throwable throwable) {
- log(Level.INFO, msg, throwable);
+ public static void info(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.INFO, tag, msg, throwable);
}
- public void config(String msg, @NotNull Throwable throwable) {
- log(Level.CONFIG, msg, throwable);
+ public static void config(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.CONFIG, tag, msg, throwable);
}
- public void fine(String msg, @NotNull Throwable throwable) {
- log(Level.FINE, msg, throwable);
+ public static void fine(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.FINE, tag, msg, throwable);
}
- public void finer(String msg, @NotNull Throwable throwable) {
- log(Level.FINER, msg, throwable);
+ public static void finer(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.FINER, tag, msg, throwable);
}
- public void finest(String msg, @NotNull Throwable throwable) {
+ public static void finest(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
log(Level.FINEST, msg, throwable);
}
- public void warn(String msg, @NotNull Throwable throwable) {
- log(Level.WARNING, msg, throwable);
+ public static void warn(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.WARNING, tag, msg, throwable);
}
- public void debug(String msg, @NotNull Throwable throwable) {
- log(Level.FINE, msg, throwable);
+ public static void debug(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.FINE, tag, msg, throwable);
}
- public void error(String msg, @NotNull Throwable throwable) {
- log(Level.SEVERE, msg, throwable);
+ public static void error(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.SEVERE, tag, msg, throwable);
}
- public void trace(String msg, @NotNull Throwable throwable) {
- log(Level.FINER, msg, throwable);
+ public static void trace(@NotNull String msg, @NotNull String tag, @NotNull Throwable throwable) {
+ log(Level.FINER, tag, msg, throwable);
}
- 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 static boolean isCurrentDate(LocalDateTime dateTime) {
+ return dateTime.toLocalDate().isEqual(lastFileDate.toLocalDate());
}
- private String dateFormaterForFileName(@NotNull Calendar calendar) {
+ private static String dateFormatterForFileName(@NotNull LocalDateTime dateTime) {
String dateString = "";
- dateString += calendar.get(Calendar.DAY_OF_MONTH);
- dateString += calendar.get(Calendar.MONTH) + 1;
- dateString += calendar.get(Calendar.YEAR);
+ dateString += dateTime.getDayOfMonth();
+ dateString += dateTime.getMonthValue();
+ dateString += dateTime.getYear();
return dateString;
}
- private String dateFormaterForLogs(@NotNull Calendar calendar) {
+ private static String dateFormatterForLogs(@NotNull LocalDateTime dateTime) {
String dateString = "[";
- 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 += dateTime.getDayOfMonth() + "_";
+ dateString += dateTime.getMonthValue() + "_";
+ dateString += dateTime.getYear() + "_";
+ dateString += dateTime.getHour() + ":";
+ dateString += dateTime.getMinute() + ":";
+ dateString += dateTime.getSecond();
dateString += "] ";
return dateString;
}
- 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();
+ private static void updateAndCreateFile(LocalDateTime dateTime) {
+ if (!isCurrentDate(dateTime)) {
+ lastFileDate = LocalDateTime.now();
+ currentFileName = BuildVars.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) {
}
- 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)){
- return;
- }
- synchronized (lockToWrite) {
- Calendar currentDate = new GregorianCalendar();
- String dateForLog = dateFormaterForLogs(currentDate);
- updateAndCreateFile(currentDate);
- logThrowableToFile(level, throwable, dateForLog);
+
+ private static void logToFile(@NotNull Level level, @NotNull String tag, @NotNull 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 void logToFile(@NotNull Level level, String msg) {
- if (!isLoggable(level)){
- return;
- }
- synchronized (lockToWrite) {
- Calendar currentDate = new GregorianCalendar();
- updateAndCreateFile(currentDate);
- String dateForLog = dateFormaterForLogs(currentDate);
- logMsgToFile(level, msg, dateForLog);
+ private static void logToFile(@NotNull Level level, @NotNull String tag, @NotNull 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 void logToFile(Level level, String msg, Throwable throwable) {
- if (!isLoggable(level)){
- return;
- }
- synchronized (lockToWrite) {
- Calendar currentDate = new GregorianCalendar();
- updateAndCreateFile(currentDate);
- String dateForLog = dateFormaterForLogs(currentDate);
- logMsgToFile(level, msg, dateForLog);
- logThrowableToFile(level, throwable, dateForLog);
+ private static void logToFile(Level level, @NotNull String tag, @NotNull String msg, @NotNull 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 void logMsgToFile(Level level, String msg, String dateForLog) {
- dateForLog += " [" + logger.getName() + "]" + level.toString() + " - " + msg;
- logsToFile.add(dateForLog);
+ private static void logMsgToFile(@NotNull Level level, @NotNull String tag, @NotNull String msg, @NotNull String dateForLog) {
+ final String logMessage = String.format("%s{%s} %s - %s", dateForLog, level.toString(), tag, msg);
+ logsToFile.add(logMessage);
synchronized (logsToFile) {
logsToFile.notifyAll();
}
}
- private void logThrowableToFile(Level level, Throwable throwable, String dateForLog) {
- String throwableLog = dateForLog + level.getName() + " - " + throwable + "\n";
+ private static void logThrowableToFile(@NotNull Level level, @NotNull String tag, @NotNull Throwable throwable, @NotNull 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";
}
@@ -346,23 +313,16 @@ public class BotLogger {
}
}
- private boolean isLoggable(Level level) {
+ private static boolean isLoggable(Level level) {
return logger.isLoggable(level) && BuildVars.debug;
}
- @Override
- protected void finalize() throws Throwable {
- logginFile.flush();
- logginFile.close();
- super.finalize();
- }
-
private static class LoggerThread extends Thread {
+
@Override
public void run() {
- setPriority(Thread.MIN_PRIORITY);
while(true) {
- ConcurrentLinkedQueue stringsToLog = new ConcurrentLinkedQueue<>();
+ final ConcurrentLinkedQueue stringsToLog = new ConcurrentLinkedQueue<>();
synchronized (logsToFile) {
if (logsToFile.isEmpty()) {
try {
@@ -378,9 +338,7 @@ public class BotLogger {
logsToFile.clear();
}
- for (String stringToLog: stringsToLog) {
- logginFile.println(stringToLog);
- }
+ stringsToLog.stream().forEach(logginFile::println);
logginFile.flush();
}
}
diff --git a/src/main/java/org/telegram/services/DirectionsService.java b/src/main/java/org/telegram/services/DirectionsService.java
index 20f750b..57a0821 100644
--- a/src/main/java/org/telegram/services/DirectionsService.java
+++ b/src/main/java/org/telegram/services/DirectionsService.java
@@ -27,7 +27,7 @@ import java.util.List;
* @date 20 of June of 2015
*/
public class DirectionsService {
- private static volatile BotLogger log = BotLogger.getLogger(DirectionsService.class.getName());
+ private static final String LOGTAG = "DIRECTIONSSERVICE";
private static final String BASEURL = "https://maps.googleapis.com/maps/api/directions/json"; ///< Base url for REST
private static final String APIIDEND = "&key=" + BuildVars.DirectionsApiKey;
@@ -98,7 +98,7 @@ public class DirectionsService {
responseToUser.add(LocalisationService.getInstance().getString("directionsNotFound", language));
}
} catch (Exception e) {
- log.warning(e);
+ BotLogger.warn(LOGTAG, e);
responseToUser.add(LocalisationService.getInstance().getString("errorFetchingDirections", language));
}
return responseToUser;
diff --git a/src/main/java/org/telegram/services/TimerExecutor.java b/src/main/java/org/telegram/services/TimerExecutor.java
index 1f87ce4..2346d7b 100644
--- a/src/main/java/org/telegram/services/TimerExecutor.java
+++ b/src/main/java/org/telegram/services/TimerExecutor.java
@@ -12,7 +12,7 @@ import java.util.concurrent.TimeUnit;
* @date 27/01/25
*/
public class TimerExecutor {
- private static volatile BotLogger log = BotLogger.getLogger(TimerExecutor.class.getName());
+ private static final String LOGTAG = "TIMEREXECUTOR";
private static volatile TimerExecutor instance; ///< Instance
private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); ///< Thread to execute operations
@@ -52,14 +52,14 @@ public class TimerExecutor {
* @param targetSec Second to execute it
*/
public void startExecutionEveryDayAt(CustomTimerTask task, int targetHour, int targetMin, int targetSec) {
- log.warn("Posting new task" + task.getTaskName());
+ BotLogger.warn(LOGTAG, "Posting new task" + task.getTaskName());
final Runnable taskWrapper = () -> {
try {
task.execute();
task.reduceTimes();
startExecutionEveryDayAt(task, targetHour, targetMin, targetSec);
} catch (Exception e) {
- log.severe("Bot threw an unexpected exception at TimerExecutor", e);
+ BotLogger.severe(LOGTAG, "Bot threw an unexpected exception at TimerExecutor", e);
}
};
if (task.getTimes() != 0) {
@@ -100,9 +100,9 @@ public class TimerExecutor {
try {
executorService.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException ex) {
- log.severe(ex);
+ BotLogger.severe(LOGTAG, ex);
} catch (Exception e) {
- log.severe("Bot threw an unexpected exception at TimerExecutor", e);
+ BotLogger.severe(LOGTAG, "Bot threw an unexpected exception at TimerExecutor", e);
}
}
}
diff --git a/src/main/java/org/telegram/services/TransifexService.java b/src/main/java/org/telegram/services/TransifexService.java
index 1c7e2bb..3f9883c 100644
--- a/src/main/java/org/telegram/services/TransifexService.java
+++ b/src/main/java/org/telegram/services/TransifexService.java
@@ -19,7 +19,7 @@ import java.io.*;
* @date 21 of June of 2015
*/
public class TransifexService {
- private static volatile BotLogger log = BotLogger.getLogger(TransifexService.class.getName());
+ private static final String LOGTAG = "TRANSIFEXSERVICE";
private static final String BASEURLAndroid = "http://" + BuildVars.TRANSIFEXUSER + ":" + BuildVars.TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/telegram/resource/stringsxml-48/translation/@language?file"; ///< Base url for REST
private static final String BASEURLiOS = "http://" + BuildVars.TRANSIFEXUSER + ":" + BuildVars.TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/iphone-1/resource/localizablestrings/translation/@language?file"; ///< Base url for REST
@@ -76,7 +76,7 @@ public class TransifexService {
result = responseString;
}
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -89,7 +89,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-16LE"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -102,7 +102,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-16LE"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -115,7 +115,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-16LE"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -128,7 +128,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -141,7 +141,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-16LE"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -154,7 +154,7 @@ public class TransifexService {
HttpResponse response = client.execute(request);
result = IOUtils.toByteArray(new InputStreamReader(response.getEntity().getContent(), "UTF-16LE"));
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return result;
}
@@ -194,11 +194,11 @@ public class TransifexService {
sendDocument = new SendDocument();
sendDocument.setNewDocument(fileToUpload.getAbsolutePath(), fileName);
} catch (FileNotFoundException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
return sendDocument;
}
@@ -221,11 +221,11 @@ public class TransifexService {
sendDocument = new SendDocument();
sendDocument.setNewDocument(fileToUpload.getAbsolutePath(), fileName);
} catch (FileNotFoundException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
} catch (Exception e) {
- e.printStackTrace();
+ BotLogger.error(LOGTAG, e);
}
return sendDocument;
}
@@ -249,11 +249,11 @@ public class TransifexService {
sendDocument = new SendDocument();
sendDocument.setNewDocument(fileToUpload.getAbsolutePath(), fileName);
} catch (IOException e) {
- e.printStackTrace();
+ BotLogger.error(LOGTAG, e);
}
}
} catch (Exception e) {
- e.printStackTrace();
+ BotLogger.error(LOGTAG, e);
}
return sendDocument;
}
@@ -276,11 +276,11 @@ public class TransifexService {
sendDocument = new SendDocument();
sendDocument.setNewDocument(fileToUpload.getAbsolutePath(), fileName);
} catch (IOException e) {
- e.printStackTrace();
+ BotLogger.error(LOGTAG, e);
}
}
} catch (Exception e) {
- e.printStackTrace();
+ BotLogger.error(LOGTAG, e);
}
return sendDocument;
}
diff --git a/src/main/java/org/telegram/services/WeatherService.java b/src/main/java/org/telegram/services/WeatherService.java
index d96c1d0..880a92a 100644
--- a/src/main/java/org/telegram/services/WeatherService.java
+++ b/src/main/java/org/telegram/services/WeatherService.java
@@ -26,7 +26,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 LOGTAG = "WEATHERSERVICE";
public static final String METRICSYSTEM = "metric";
public static final String IMPERIALSYSTEM = "imperial";
@@ -90,7 +90,7 @@ public class WeatherService {
String responseString = EntityUtils.toString(buf, "UTF-8");
JSONObject jsonObject = new JSONObject(responseString);
- log.warning(jsonObject.toString());
+ BotLogger.info(LOGTAG, jsonObject.toString());
if (jsonObject.getInt("cod") == 200) {
cityFound = jsonObject.getJSONObject("city").getString("name") + " (" +
jsonObject.getJSONObject("city").getString("country") + ")";
@@ -98,11 +98,11 @@ public class WeatherService {
responseToUser = String.format(LocalisationService.getInstance().getString("weatherAlert", language),
cityFound, convertListOfForecastToString(jsonObject, language, units, false));
} else {
- log.warning(jsonObject.toString());
+ BotLogger.warn(LOGTAG, jsonObject.toString());
responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
}
return responseToUser;
@@ -131,7 +131,7 @@ public class WeatherService {
String responseString = EntityUtils.toString(buf, "UTF-8");
JSONObject jsonObject = new JSONObject(responseString);
- log.warning(jsonObject.toString());
+ BotLogger.info(LOGTAG, jsonObject.toString());
if (jsonObject.getInt("cod") == 200) {
cityFound = jsonObject.getJSONObject("city").getString("name") + " (" +
jsonObject.getJSONObject("city").getString("country") + ")";
@@ -139,11 +139,11 @@ public class WeatherService {
responseToUser = String.format(LocalisationService.getInstance().getString("weatherForcast", language),
cityFound, convertListOfForecastToString(jsonObject, language, units, true));
} else {
- log.warning(jsonObject.toString());
+ BotLogger.warn(LOGTAG, jsonObject.toString());
responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
}
return responseToUser;
@@ -178,11 +178,11 @@ public class WeatherService {
responseToUser = String.format(LocalisationService.getInstance().getString("weatherForcast", language),
cityFound, convertListOfForecastToString(jsonObject, language, units, true));
} else {
- log.warning(jsonObject.toString());
+ BotLogger.warn(LOGTAG, jsonObject.toString());
responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
}
return responseToUser;
@@ -219,11 +219,11 @@ public class WeatherService {
responseToUser = String.format(LocalisationService.getInstance().getString("weatherCurrent", language),
cityFound, convertCurrentWeatherToString(jsonObject, language, units, emoji));
} else {
- log.warning(jsonObject.toString());
+ BotLogger.warn(LOGTAG, jsonObject.toString());
responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
}
return responseToUser;
@@ -258,11 +258,11 @@ public class WeatherService {
responseToUser = String.format(LocalisationService.getInstance().getString("weatherCurrent", language),
cityFound, convertCurrentWeatherToString(jsonObject, language, units, null));
} else {
- log.warning(jsonObject.toString());
+ BotLogger.warn(LOGTAG, jsonObject.toString());
responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
}
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
}
return responseToUser;
diff --git a/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java b/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java
new file mode 100644
index 0000000..f8272fa
--- /dev/null
+++ b/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java
@@ -0,0 +1,183 @@
+package org.telegram.updateshandlers;
+
+import org.telegram.BotConfig;
+import org.telegram.BuildVars;
+import org.telegram.SenderHelper;
+import org.telegram.api.methods.BotApiMethod;
+import org.telegram.api.methods.SendMessage;
+import org.telegram.api.objects.*;
+import org.telegram.services.BotLogger;
+import org.telegram.updatesreceivers.UpdatesThread;
+import org.telegram.updatesreceivers.Webhook;
+
+import java.io.InvalidObjectException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author Ruben Bermudez
+ * @version 1.0
+ * @brief Handler for updates to channel updates bot
+ * This is a use case that will send a message to a channel if it is added as an admin to it.
+ * @date 24 of June of 2015
+ */
+public class ChannelHandlers implements UpdatesCallback {
+ private static final String LOGTAG = "CHANNELHANDLERS";
+ private static final String TOKEN = BotConfig.TOKENCHANNEL;
+ private static final String BOTNAME = BotConfig.USERNAMECHANNEL;
+ private static final boolean USEWEBHOOK = false;
+
+ private static final int WAITINGCHANNEL = 1;
+
+ private static final String HELP_TEXT = "Send me the channel username where you added me as admin.";
+ private static final String CANCEL_COMMAND = "/stop";
+ private static final String AFTER_CHANNEL_TEXT = "A message to provided channel will be sent if the bot was added to it as admin.";
+ private static final String WRONG_CHANNEL_TEXT = "Wrong username, please remember to add *@* before the username and send only the username.";
+ private static final String CHANNEL_MESSAGE_TEXT = "This message was sent by *@updateschannelbot*. Enjoy!";
+ private static final String ERROR_MESSAGE_TEXT = "There was an error sending the message to channel *%s*, the error was: ```%s```";
+
+ private final ConcurrentHashMap userState = new ConcurrentHashMap<>();
+
+ private final Object webhookLock = new Object();
+
+ public ChannelHandlers(Webhook webhook) {
+ if (USEWEBHOOK && BuildVars.useWebHook) {
+ webhook.registerWebhook(this, BOTNAME);
+ SenderHelper.SendWebhook(Webhook.getExternalURL(BOTNAME), TOKEN);
+ } else {
+ SenderHelper.SendWebhook("", TOKEN);
+ new UpdatesThread(TOKEN, this);
+ }
+ }
+
+ @Override
+ public void onUpdateReceived(Update update) {
+ Message message = update.getMessage();
+ if (message != null && message.hasText()) {
+ try {
+ BotApiMethod botApiMethod = handleIncomingMessage(message);
+ if (botApiMethod != null) {
+ SenderHelper.SendApiMethod(botApiMethod, TOKEN);
+ }
+ } catch (InvalidObjectException e) {
+ BotLogger.severe(LOGTAG, e);
+ }
+ }
+ }
+
+ @Override
+ public BotApiMethod onWebhookUpdateReceived(Update update) {
+ throw new NoSuchMethodError();
+ }
+
+
+ // region Incoming messages handlers
+
+ private BotApiMethod handleIncomingMessage(Message message) throws InvalidObjectException {
+ int state = userState.getOrDefault(message.getFrom().getId(), 0);
+ BotApiMethod botApiMethod;
+ switch(state) {
+ case WAITINGCHANNEL:
+ botApiMethod = onWaitingChannelMessage(message);
+ break;
+ default:
+ botApiMethod = sendHelpMessage(message.getChatId().toString(), message.getMessageId(), null);
+ userState.put(message.getFrom().getId(), WAITINGCHANNEL);
+ break;
+ }
+ return botApiMethod;
+ }
+
+ private BotApiMethod onWaitingChannelMessage(Message message) throws InvalidObjectException {
+ BotApiMethod sendMessage = null;
+ if (message.getText().equals(CANCEL_COMMAND)) {
+ userState.remove(message.getFrom().getId());
+ sendMessage = sendHelpMessage(message.getChatId().toString(), message.getMessageId(), null);
+ } else {
+ if (message.getText().startsWith("@") && !message.getText().trim().contains(" ")) {
+ sendBuiltMessage(getMessageToChannelSent(message));
+ sendMessageToChannel(message.getText(), message);
+ userState.remove(message.getFrom().getId());
+ } else {
+ sendMessage = getWrongUsernameMessage(message);
+ }
+ }
+
+ return sendMessage;
+ }
+
+ private static void sendMessageToChannel(String username, Message message) {
+ SendMessage sendMessage = new SendMessage();
+ sendMessage.enableMarkdown(true);
+ sendMessage.setChatId(username.trim());
+
+ sendMessage.setText(CHANNEL_MESSAGE_TEXT);
+ sendMessage.enableMarkdown(true);
+
+ try {
+ sendBuiltMessage(sendMessage);
+ } catch (InvalidObjectException e) {
+ sendErrorMessage(message, e.getMessage());
+ }
+ }
+
+ private static void sendErrorMessage(Message message, String errorText) {
+ SendMessage sendMessage = new SendMessage();
+ sendMessage.enableMarkdown(true);
+ sendMessage.setChatId(message.getChatId().toString());
+ sendMessage.setReplayToMessageId(message.getMessageId());
+
+ sendMessage.setText(String.format(ERROR_MESSAGE_TEXT, message.getText().trim(), errorText.replace("\"", "\\\"")));
+ sendMessage.enableMarkdown(true);
+
+ try {
+ sendBuiltMessage(sendMessage);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
+ }
+
+ private static BotApiMethod getWrongUsernameMessage(Message message) {
+ SendMessage sendMessage = new SendMessage();
+ sendMessage.enableMarkdown(true);
+ sendMessage.setChatId(message.getChatId().toString());
+ sendMessage.setReplayToMessageId(message.getMessageId());
+
+ ForceReplyKeyboard forceReplyKeyboard = new ForceReplyKeyboard();
+ forceReplyKeyboard.setSelective(true);
+ forceReplyKeyboard.setForceReply(true);
+ sendMessage.setReplayMarkup(forceReplyKeyboard);
+
+ sendMessage.setText(WRONG_CHANNEL_TEXT);
+ sendMessage.enableMarkdown(true);
+ return sendMessage;
+ }
+
+ private static SendMessage getMessageToChannelSent(Message message) {
+ SendMessage sendMessage = new SendMessage();
+ sendMessage.enableMarkdown(true);
+ sendMessage.setChatId(message.getChatId().toString());
+ sendMessage.setReplayToMessageId(message.getMessageId());
+
+ sendMessage.setText(AFTER_CHANNEL_TEXT);
+ return sendMessage;
+ }
+
+ private static BotApiMethod sendHelpMessage(String chatId, Integer messageId, ReplyKeyboardMarkup replyKeyboardMarkup) {
+ SendMessage sendMessage = new SendMessage();
+ sendMessage.enableMarkdown(true);
+ sendMessage.setChatId(chatId);
+ sendMessage.setReplayToMessageId(messageId);
+ if (replyKeyboardMarkup != null) {
+ sendMessage.setReplayMarkup(replyKeyboardMarkup);
+ }
+
+ sendMessage.setText(HELP_TEXT);
+ return sendMessage;
+ }
+
+ private static void sendBuiltMessage(SendMessage sendMessage) throws InvalidObjectException {
+ SenderHelper.SendApiMethod(sendMessage, TOKEN);
+ }
+}
diff --git a/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java b/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
index 7af5165..cbb867e 100644
--- a/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
+++ b/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
@@ -6,11 +6,13 @@ import org.telegram.api.objects.*;
import org.telegram.database.DatabaseManager;
import org.telegram.api.methods.BotApiMethod;
import org.telegram.api.methods.SendMessage;
+import org.telegram.services.BotLogger;
import org.telegram.services.DirectionsService;
import org.telegram.services.LocalisationService;
import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook;
+import java.io.InvalidObjectException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -24,6 +26,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
* @date 24 of June of 2015
*/
public class DirectionsHandlers implements UpdatesCallback {
+ private static final String LOGTAG = "DIRECTIONSHANDLERS";
private static final String TOKEN = BotConfig.TOKENDIRECTIONS;
private static final String BOTNAME = BotConfig.USERNAMEDIRECTIONS;
private static final boolean USEWEBHOOK = false;
@@ -44,7 +47,11 @@ public class DirectionsHandlers implements UpdatesCallback {
@Override
public void onUpdateReceived(Update update) {
- handleDirections(update);
+ try {
+ handleDirections(update);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
}
@Override
@@ -53,7 +60,7 @@ public class DirectionsHandlers implements UpdatesCallback {
return null;
}
- public void handleDirections(Update update) {
+ public void handleDirections(Update update) throws InvalidObjectException {
Message message = update.getMessage();
if (message != null && message.hasText()) {
if (languageMessages.contains(message.getFrom().getId())) {
@@ -149,7 +156,7 @@ public class DirectionsHandlers implements UpdatesCallback {
}
- private void sendHelpMessage(Message message, String language) {
+ private void sendHelpMessage(Message message, String language) throws InvalidObjectException {
SendMessage sendMessageRequest = new SendMessage();
String helpDirectionsFormated = String.format(
LocalisationService.getInstance().getString("helpDirections", language),
@@ -185,7 +192,7 @@ public class DirectionsHandlers implements UpdatesCallback {
}
- private void onSetLanguageCommand(Message message, String language) {
+ private void onSetLanguageCommand(Message message, String language) throws InvalidObjectException {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId().toString());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
@@ -206,7 +213,7 @@ public class DirectionsHandlers implements UpdatesCallback {
languageMessages.add(message.getFrom().getId());
}
- private void onLanguageSelected(Message message) {
+ private void onLanguageSelected(Message message) throws InvalidObjectException {
String[] parts = message.getText().split("-->", 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId().toString());
diff --git a/src/main/java/org/telegram/updateshandlers/FilesHandlers.java b/src/main/java/org/telegram/updateshandlers/FilesHandlers.java
index 433ce9c..fce8398 100644
--- a/src/main/java/org/telegram/updateshandlers/FilesHandlers.java
+++ b/src/main/java/org/telegram/updateshandlers/FilesHandlers.java
@@ -12,11 +12,13 @@ import org.telegram.database.DatabaseManager;
import org.telegram.api.methods.BotApiMethod;
import org.telegram.api.methods.SendDocument;
import org.telegram.api.methods.SendMessage;
+import org.telegram.services.BotLogger;
import org.telegram.services.Emoji;
import org.telegram.services.LocalisationService;
import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook;
+import java.io.InvalidObjectException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -31,6 +33,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
* @date 24 of June of 2015
*/
public class FilesHandlers implements UpdatesCallback {
+ private static final String LOGTAG = "FILESHANDLERS";
private static final String TOKEN = BotConfig.TOKENFILES;
private static final String BOTNAME = BotConfig.USERNAMEFILES;
private static final boolean USEWEBHOOK = false;
@@ -51,7 +54,11 @@ public class FilesHandlers implements UpdatesCallback {
@Override
public void onUpdateReceived(Update update) {
- handleFileUpdate(update);
+ try {
+ handleFileUpdate(update);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
}
@Override
@@ -60,7 +67,7 @@ public class FilesHandlers implements UpdatesCallback {
return null;
}
- public void handleFileUpdate(Update update) {
+ public void handleFileUpdate(Update update) throws InvalidObjectException {
Message message = update.getMessage();
if (message != null && message.hasText()) {
if (languageMessages.contains(message.getFrom().getId())) {
@@ -104,7 +111,7 @@ public class FilesHandlers implements UpdatesCallback {
}
}
- private void onListCommand(Message message, String language) {
+ private void onListCommand(Message message, String language) throws InvalidObjectException {
HashMap files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage();
if (files.size() > 0) {
@@ -124,7 +131,7 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendApiMethod(sendMessageRequest, TOKEN);
}
- private void onDeleteCommand(Message message, String language, String[] parts) {
+ private void onDeleteCommand(Message message, String language, String[] parts) throws InvalidObjectException {
if (DatabaseManager.getInstance().getUserStatusForFile(message.getFrom().getId()) == DELETE_UPLOADED_STATUS &&
parts.length == 2) {
onDeleteCommandWithParameters(message, language, parts[1]);
@@ -133,7 +140,7 @@ public class FilesHandlers implements UpdatesCallback {
}
}
- private void onDeleteCommandWithoutParameters(Message message, String language) {
+ private void onDeleteCommandWithoutParameters(Message message, String language) throws InvalidObjectException {
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), DELETE_UPLOADED_STATUS);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getInstance().getString("deleteUploadedFile", language));
@@ -156,7 +163,7 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendApiMethod(sendMessageRequest, TOKEN);
}
- private void onDeleteCommandWithParameters(Message message, String language, String part) {
+ private void onDeleteCommandWithParameters(Message message, String language, String part) throws InvalidObjectException {
String[] innerParts = part.split(Emoji.LEFT_RIGHT_ARROW.toString(), 2);
boolean removed = DatabaseManager.getInstance().deleteFile(innerParts[0].trim());
SendMessage sendMessageRequest = new SendMessage();
@@ -170,7 +177,7 @@ public class FilesHandlers implements UpdatesCallback {
DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId());
}
- private void onCancelCommand(Message message, String language) {
+ private void onCancelCommand(Message message, String language) throws InvalidObjectException {
DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getInstance().getString("processFinished", language));
@@ -178,7 +185,7 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendApiMethod(sendMessageRequest, TOKEN);
}
- private void onUploadCommand(Message message, String language) {
+ private void onUploadCommand(Message message, String language) throws InvalidObjectException {
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), INITIAL_UPLOAD_STATUS);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(LocalisationService.getInstance().getString("sendFileToUpload", language));
@@ -186,7 +193,7 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendApiMethod(sendMessageRequest, TOKEN);
}
- private void sendHelpMessage(Message message, String language) {
+ private void sendHelpMessage(Message message, String language) throws InvalidObjectException {
SendMessage sendMessageRequest = new SendMessage();
String formatedString = String.format(
LocalisationService.getInstance().getString("helpFiles", language),
@@ -197,7 +204,7 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendApiMethod(sendMessageRequest, TOKEN);
}
- private void onStartWithParameters(Message message, String language, String part) {
+ private void onStartWithParameters(Message message, String language, String part) throws InvalidObjectException {
if (DatabaseManager.getInstance().doesFileExists(part.trim())) {
SendDocument sendDocumentRequest = new SendDocument();
sendDocumentRequest.setDocument(part.trim());
@@ -211,7 +218,7 @@ public class FilesHandlers implements UpdatesCallback {
}
}
- private void onSetLanguageCommand(Message message, String language) {
+ private void onSetLanguageCommand(Message message, String language) throws InvalidObjectException {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId().toString());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
@@ -232,7 +239,7 @@ public class FilesHandlers implements UpdatesCallback {
languageMessages.add(message.getFrom().getId());
}
- private void onLanguageReceived(Message message) {
+ private void onLanguageReceived(Message message) throws InvalidObjectException {
String[] parts = message.getText().split(Emoji.LEFT_RIGHT_ARROW.toString(), 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId().toString());
diff --git a/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java b/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java
index 01d29f4..56b3297 100644
--- a/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java
+++ b/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java
@@ -7,11 +7,14 @@ import org.telegram.database.DatabaseManager;
import org.telegram.api.methods.BotApiMethod;
import org.telegram.api.methods.SendDocument;
import org.telegram.api.methods.SendMessage;
+import org.telegram.services.BotLogger;
import org.telegram.services.LocalisationService;
import org.telegram.services.TransifexService;
import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook;
+import java.io.InvalidObjectException;
+
/**
* @author Ruben Bermudez
* @version 1.0
@@ -19,6 +22,7 @@ import org.telegram.updatesreceivers.Webhook;
* @date 24 of June of 2015
*/
public class TransifexHandlers implements UpdatesCallback {
+ private static final String LOGTAG = "TRANSIFEXHANDLERS";
private static final String TOKEN = BotConfig.TOKENTRANSIFEX;
private static final String BOTNAME = BotConfig.USERNAMETRANSIFEX;
private static final boolean USEWEBHOOK = false;
@@ -35,7 +39,11 @@ public class TransifexHandlers implements UpdatesCallback {
@Override
public void onUpdateReceived(Update update) {
- sendTransifexFile(update);
+ try {
+ sendTransifexFile(update);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
}
@Override
@@ -44,7 +52,7 @@ public class TransifexHandlers implements UpdatesCallback {
return null;
}
- public void sendTransifexFile(Update update) {
+ public void sendTransifexFile(Update update) throws InvalidObjectException {
Message message = update.getMessage();
if (message != null && message.hasText()) {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
diff --git a/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java b/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
index 7793479..dcec189 100644
--- a/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
+++ b/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
@@ -13,6 +13,7 @@ import org.telegram.structure.WeatherAlert;
import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook;
+import java.io.InvalidObjectException;
import java.util.ArrayList;
import java.util.List;
@@ -24,6 +25,7 @@ import java.util.List;
* @date 24 of June of 2015
*/
public class WeatherHandlers implements UpdatesCallback {
+ private static final String LOGTAG = "WEATHERHANDLERS";
private static final String TOKEN = BotConfig.TOKENWEATHER;
private static final String BOTNAME = BotConfig.USERNAMEWEATHER;
private static final boolean USEWEBHOOK = true;
@@ -91,7 +93,11 @@ public class WeatherHandlers implements UpdatesCallback {
Message message = update.getMessage();
if (message != null) {
BotApiMethod botApiMethod = handleIncomingMessage(message);
- SenderHelper.SendApiMethod(botApiMethod, TOKEN);
+ try {
+ SenderHelper.SendApiMethod(botApiMethod, TOKEN);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
}
}
@@ -180,8 +186,12 @@ public class WeatherHandlers implements UpdatesCallback {
replyKeyboardHide.setHideKeyboard(true);
sendMessage.setReplayMarkup(replyKeyboardHide);
- SenderHelper.SendApiMethod(sendMessage, TOKEN);
- DatabaseManager.getInstance().insertWeatherState(userId, chatId, STARTSTATE);
+ try {
+ SenderHelper.SendApiMethod(sendMessage, TOKEN);
+ DatabaseManager.getInstance().insertWeatherState(userId, chatId, STARTSTATE);
+ } catch (InvalidObjectException e) {
+ BotLogger.error(LOGTAG, e);
+ }
}
@@ -1243,7 +1253,11 @@ public class WeatherHandlers implements UpdatesCallback {
// region Helper Methods
private static void sendBuiltMessage(SendMessage sendMessage) {
- SenderHelper.SendApiMethod(sendMessage, TOKEN);
+ try {
+ SenderHelper.SendApiMethod(sendMessage, TOKEN);
+ } catch (InvalidObjectException e) {
+ BotLogger.severe(LOGTAG, e);
+ }
}
// endregion Helper Methods
diff --git a/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java b/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
index 1562242..051b8f9 100644
--- a/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
+++ b/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
@@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit;
* @date 20 of June of 2015
*/
public class UpdatesThread {
- private static volatile BotLogger log = BotLogger.getLogger(UpdatesThread.class.getName());
+ private static final String LOGTAG = "UPDATESTHREAD";
private final UpdatesCallback callback;
private final ReaderThread readerThread;
@@ -67,7 +67,7 @@ public class UpdatesThread {
httpPost.addHeader("charset", "UTF-8");
httpPost.setEntity(new StringEntity(request.toJson().toString(), ContentType.APPLICATION_JSON));
HttpResponse response;
- log.debug(httpPost.toString());
+ BotLogger.debug(LOGTAG, httpPost.toString());
response = httpclient.execute(httpPost);
HttpEntity ht = response.getEntity();
@@ -80,7 +80,7 @@ public class UpdatesThread {
throw new InvalidObjectException(jsonObject.toString());
}
JSONArray jsonArray = jsonObject.getJSONArray("result");
- log.debug(jsonArray.toString());
+ BotLogger.debug(LOGTAG, jsonArray.toString());
if (jsonArray.length() != 0) {
for (int i = 0; i < jsonArray.length(); i++) {
Update update = new Update(jsonArray.getJSONObject(i));
@@ -98,15 +98,15 @@ public class UpdatesThread {
this.wait(500);
}
} catch (InterruptedException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
continue;
}
}
} catch (JSONException e) {
- log.warning(e);
+ BotLogger.warn(LOGTAG, e);
}
} catch (IOException e) {
- log.warning(e);
+ BotLogger.warn(LOGTAG, e);
}
}
}
@@ -124,7 +124,7 @@ public class UpdatesThread {
try {
receivedUpdates.wait();
} catch (InterruptedException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
continue;
}
update = receivedUpdates.pollLast();
@@ -136,7 +136,7 @@ public class UpdatesThread {
DatabaseManager.getInstance().putLastUpdate(token, update.getUpdateId());
callback.onUpdateReceived(update);
} catch (Exception e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}
}
diff --git a/src/main/java/org/telegram/updatesreceivers/Webhook.java b/src/main/java/org/telegram/updatesreceivers/Webhook.java
index f1a1036..e9a97a0 100644
--- a/src/main/java/org/telegram/updatesreceivers/Webhook.java
+++ b/src/main/java/org/telegram/updatesreceivers/Webhook.java
@@ -21,7 +21,7 @@ import java.net.URI;
* @date 20 of June of 2015
*/
public class Webhook {
- private static volatile BotLogger log = BotLogger.getLogger(Webhook.class.getName());
+ private static final String LOGTAG = "WEBHOOK";
private static final String KEYSTORE_SERVER_FILE = "./keystore_server";
private static final String KEYSTORE_SERVER_PWD = "asdfgh";
@@ -47,7 +47,7 @@ public class Webhook {
rc.register(restApi);
rc.register(JacksonFeature.class);
rc.property(JSONConfiguration.FEATURE_POJO_MAPPING, true);
- log.error("Internal webhook: " + getBaseURI().toString());
+ BotLogger.info(LOGTAG, "Internal webhook: " + getBaseURI().toString());
final HttpServer grizzlyServer = GrizzlyHttpServerFactory.createHttpServer(
getBaseURI(),
rc,
@@ -56,7 +56,7 @@ public class Webhook {
try {
grizzlyServer.start();
} catch (IOException e) {
- log.error(e);
+ BotLogger.error(LOGTAG, e);
}
}