Browse Source

1. Example of bot for channels

master
Rubenlagu 11 years ago
committed by Rubenlagus
parent
commit
3695afe337
  1. 1
      .idea/dataSources.xml
  2. 599
      .idea/workspace.xml
  3. 10
      src/main/java/org/telegram/BotConfig.java
  4. 1
      src/main/java/org/telegram/Main.java
  5. 37
      src/main/java/org/telegram/SenderHelper.java
  6. 2
      src/main/java/org/telegram/api/objects/Message.java
  7. 8
      src/main/java/org/telegram/database/ConectionDB.java
  8. 7
      src/main/java/org/telegram/database/DatabaseManager.java
  9. 356
      src/main/java/org/telegram/services/BotLogger.java
  10. 4
      src/main/java/org/telegram/services/DirectionsService.java
  11. 10
      src/main/java/org/telegram/services/TimerExecutor.java
  12. 32
      src/main/java/org/telegram/services/TransifexService.java
  13. 26
      src/main/java/org/telegram/services/WeatherService.java
  14. 183
      src/main/java/org/telegram/updateshandlers/ChannelHandlers.java
  15. 15
      src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
  16. 29
      src/main/java/org/telegram/updateshandlers/FilesHandlers.java
  17. 10
      src/main/java/org/telegram/updateshandlers/TransifexHandlers.java
  18. 14
      src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
  19. 16
      src/main/java/org/telegram/updatesreceivers/UpdatesThread.java
  20. 6
      src/main/java/org/telegram/updatesreceivers/Webhook.java

1
.idea/dataSources.xml

@ -13,6 +13,7 @@
<property name="characterSetResults" value="utf8" />
<property name="yearIsDateType" value="false" />
</driver-properties>
<libraries />
</data-source>
</component>
</project>

599
.idea/workspace.xml

@ -2,26 +2,25 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="cc3252dd-ba1f-404e-b603-ef880b5c3341" name="Default" comment="1. Webhooks&#10;">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Chat.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Chat.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/ForwardMessage.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/ForwardMessage.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendAudio.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendAudio.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendChatAction.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendChatAction.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendDocument.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendDocument.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendLocation.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendLocation.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendPhoto.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendPhoto.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendSticker.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendSticker.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVideo.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVideo.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVoice.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVoice.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/services/TimerExecutor.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/TimerExecutor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/dataSources.xml" afterPath="$PROJECT_DIR$/.idea/dataSources.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
</list>
@ -67,69 +66,55 @@
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="WeatherHandlers.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java">
<file leaf-file-name="BuildVars.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.21333334">
<caret line="123" column="72" selection-start-line="123" selection-start-column="72" selection-end-line="123" selection-end-column="72" />
<folding>
<element signature="method#getSettingsMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getHelpMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getLanguageMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getUnitsMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getChooseNewAlertSetMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getMainMenuKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getLanguagesKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getUnitsKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getSettingsKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getRecentsKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getRecentsKeyboard#1;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getAlertsKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getAlertsListKeyboard#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getForceReply#0;class#WeatherHandlers#0" expanded="false" />
</folding>
<state vertical-scroll-proportion="0.0">
<caret line="10" column="29" selection-start-line="10" selection-start-column="29" selection-end-line="10" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="DirectionsHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java">
<file leaf-file-name="BotConfig.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="211" column="67" selection-start-line="211" selection-start-column="67" selection-end-line="211" selection-end-column="67" />
<caret line="9" column="4" selection-start-line="9" selection-start-column="4" selection-end-line="9" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="FilesHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java">
<file leaf-file-name="CustomTimerTask.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/CustomTimerTask.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="237" column="67" selection-start-line="237" selection-start-column="67" selection-end-line="237" selection-end-column="67" />
<caret line="8" column="22" selection-start-line="8" selection-start-column="22" selection-end-line="8" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TransifexHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java">
<file leaf-file-name="ChannelHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="93" column="75" selection-start-line="93" selection-start-column="75" selection-end-line="93" selection-end-column="75" />
<state vertical-scroll-proportion="-9.296296">
<caret line="62" column="13" selection-start-line="62" selection-start-column="13" selection-end-line="62" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="SendMessage.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java">
<file leaf-file-name="Message.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="147" column="45" selection-start-line="147" selection-start-column="45" selection-end-line="147" selection-end-column="45" />
<caret line="233" column="0" selection-start-line="233" selection-start-column="0" selection-end-line="233" selection-end-column="0" />
<folding>
<element signature="e#1831#1832#0" expanded="true" />
<element signature="e#1867#1868#0" expanded="true" />
<element signature="e#8853#8854#0" expanded="true" />
<element signature="e#8888#8889#0" expanded="true" />
<element signature="e#9500#9501#0" expanded="true" />
</folding>
</state>
</provider>
@ -139,50 +124,19 @@
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="259" column="0" selection-start-line="259" selection-start-column="0" selection-end-line="259" selection-end-column="0" />
<caret line="265" column="82" selection-start-line="265" selection-start-column="82" selection-end-line="265" selection-end-column="82" />
<folding>
<element signature="docComment;class#SenderHelper#0" expanded="false" />
<element signature="method#SendApiMethodAsync#0;class#SenderHelper#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BuildVars.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="10" column="50" selection-start-line="10" selection-start-column="50" selection-end-line="10" selection-end-column="50" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Main.java" pinned="false" current-in-tab="false">
<file leaf-file-name="Main.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="32" column="44" selection-start-line="32" selection-start-column="44" selection-end-line="32" selection-end-column="44" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BotConfig.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="15" column="96" selection-start-line="15" selection-start-column="96" selection-end-line="15" selection-end-column="96" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Webhook.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="35" column="25" selection-start-line="35" selection-start-column="25" selection-end-line="35" selection-end-column="25" />
<state vertical-scroll-proportion="0.64">
<caret line="36" column="8" selection-start-line="36" selection-start-column="8" selection-end-line="36" selection-end-column="8" />
<folding />
</state>
</provider>
@ -223,16 +177,6 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Document.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/ForceReplyKeyboard.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/PhotoSize.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/ReplyKeyboardHide.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/ReplyKeyboardMarkup.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Sticker.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Update.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/User.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/UserProfilePhotos.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Video.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Voice.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUpdates.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SetWebhook.java" />
@ -252,11 +196,8 @@
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/File.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/GetFile.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Chat.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java" />
<option value="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/lang/Integer.java" />
<option value="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/lang/Number.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendDocument.java" />
@ -268,12 +209,25 @@
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendSticker.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVideo.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendVoice.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/TimerExecutor.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" />
</list>
</option>
</component>
@ -463,8 +417,6 @@
<sortByType />
</navigator>
<panes>
<pane id="Scope" />
<pane id="Scratches" />
<pane id="ProjectPane">
<subPane>
<PATH>
@ -639,81 +591,15 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="api" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="objects" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="BotAPi" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="BotAPi" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="telegram" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="api" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="methods" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="BotAPi" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="BotAPi" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="telegram" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="api" />
<option name="myItemId" value="services" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="PackagesPane" />
<pane id="Scope" />
<pane id="Scratches" />
</panes>
</component>
<component name="PropertiesComponent">
@ -770,11 +656,11 @@
<recent name="org.telegram" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="org.telegram.updateshandlers" />
<recent name="org.telegram.api.objects" />
<recent name="org.telegram.api.methods" />
<recent name="org.telegram.methods" />
<recent name="org.telegram.api" />
<recent name="org.telegram.updateshandlers" />
</key>
</component>
<component name="RunManager" selected="Application.Main">
@ -1216,7 +1102,8 @@
<workItem from="1444255115907" duration="212000" />
<workItem from="1444323303608" duration="5644000" />
<workItem from="1444501308862" duration="423000" />
<workItem from="1444843707388" duration="1293000" />
<workItem from="1444843707388" duration="1497000" />
<workItem from="1444850319963" duration="4636000" />
</task>
<task id="LOCAL-00001" summary="First Commit:&#10;1. Transifex bot&#10;2. Weather bot">
<created>1434854005227</created>
@ -1500,11 +1387,17 @@
<option name="project" value="LOCAL" />
<updated>1441719275787</updated>
</task>
<option name="localTasksCounter" value="48" />
<task id="LOCAL-00048" summary="1. Support for channels&#10;">
<created>1444845084283</created>
<option name="number" value="00048" />
<option name="project" value="LOCAL" />
<updated>1444845084283</updated>
</task>
<option name="localTasksCounter" value="49" />
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="255805000" />
<option name="totallyTimeSpent" value="260645000" />
</component>
<component name="TodoView">
<todo-panel id="selected-file">
@ -1593,7 +1486,6 @@
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="1. Support for webhooks" />
<MESSAGE value="1. Fix JSON deserialization" />
<MESSAGE value="1. Fix webhooks, they only allow port 443" />
<MESSAGE value="1. Fixed loggin levels" />
@ -1618,7 +1510,8 @@
<MESSAGE value="1. Some api updates&#10;" />
<MESSAGE value="1. Certificate&#10;" />
<MESSAGE value="1. Webhooks&#10;" />
<option name="LAST_COMMIT_MESSAGE" value="1. Webhooks&#10;" />
<MESSAGE value="1. Support for channels&#10;" />
<option name="LAST_COMMIT_MESSAGE" value="1. Support for channels&#10;" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
@ -1643,7 +1536,7 @@
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java</url>
<line>119</line>
<line>120</line>
<properties />
<option name="timeStamp" value="178" />
</line-breakpoint>
@ -1655,15 +1548,21 @@
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java</url>
<line>275</line>
<line>278</line>
<properties />
<option name="timeStamp" value="259" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java</url>
<line>136</line>
<properties />
<option name="timeStamp" value="268" />
</line-breakpoint>
</breakpoints>
<breakpoints-dialog>
<breakpoints-dialog />
</breakpoints-dialog>
<option name="time" value="264" />
<option name="time" value="269" />
</breakpoint-manager>
<watches-manager />
</component>
@ -1672,105 +1571,6 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="84" column="0" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="docComment;class#SenderHelper#0" expanded="false" />
<element signature="method#SendApiMethodAsync#0;class#SenderHelper#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Voice.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.39751554">
<caret line="40" column="45" selection-start-line="40" selection-start-column="45" selection-end-line="40" selection-end-column="45" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/ReplyKeyboardHide.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.23065016">
<caret line="37" column="30" selection-start-line="37" selection-start-column="30" selection-end-line="37" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/ReplyKeyboard.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.25541794">
<caret line="11" column="62" selection-start-line="11" selection-start-column="62" selection-end-line="11" selection-end-column="62" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.5.4/jackson-databind-2.5.4.jar!/com/fasterxml/jackson/databind/annotation/JsonDeserialize.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-5.0">
<caret line="20" column="18" selection-start-line="20" selection-start-column="18" selection-end-line="20" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.5.4/jackson-databind-2.5.4-sources.jar!/com/fasterxml/jackson/databind/annotation/JsonDeserialize.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.9771987">
<caret line="31" column="18" selection-start-line="31" selection-start-column="18" selection-end-line="31" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.5.4/jackson-databind-2.5.4-sources.jar!/com/fasterxml/jackson/databind/JsonSerializable.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.8306189">
<caret line="1" column="0" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.5.4/jackson-databind-2.5.4-sources.jar!/com/fasterxml/jackson/databind/ObjectMapper.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-15.2443">
<caret line="393" column="5" selection-start-line="393" selection-start-column="5" selection-end-line="393" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/localisation/strings.properties">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="63" column="56" selection-start-line="63" selection-start-column="56" selection-end-line="63" selection-end-column="56" />
</state>
</provider>
<provider editor-type-id="ResourceBundle">
<state />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Audio.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.14086688">
<caret line="17" column="42" selection-start-line="17" selection-start-column="30" selection-end-line="17" selection-end-column="42" />
</state>
</provider>
</entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/concurrent/CompletableFuture.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.33229813">
<caret line="2161" column="42" selection-start-line="2161" selection-start-column="42" selection-end-line="2161" selection-end-column="42" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/User.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.59574467">
<caret line="49" column="0" selection-start-line="49" selection-start-column="0" selection-end-line="49" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/UserProfilePhotos.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.23466666">
@ -1832,27 +1632,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.41954023">
<caret line="192" column="32" selection-start-line="192" selection-start-column="19" selection-end-line="192" selection-end-column="32" />
<folding>
<element signature="e#8695#8696#0" expanded="false" />
<element signature="e#8735#8736#0" expanded="false" />
<element signature="e#8776#8777#0" expanded="false" />
<element signature="e#8819#8820#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.7413333">
<caret line="22" column="29" selection-start-line="22" selection-start-column="29" selection-end-line="22" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/lang/Number.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.33333334">
@ -1879,7 +1658,6 @@
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="2.24">
<caret line="79" column="38" selection-start-line="79" selection-start-column="38" selection-end-line="79" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
@ -1911,7 +1689,6 @@
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="1.369969">
<caret line="79" column="45" selection-start-line="79" selection-start-column="45" selection-end-line="79" selection-end-column="45" />
<folding />
</state>
</provider>
</entry>
@ -1927,7 +1704,6 @@
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="1.5789474">
<caret line="83" column="31" selection-start-line="83" selection-start-column="31" selection-end-line="83" selection-end-column="31" />
<folding />
</state>
</provider>
</entry>
@ -1967,7 +1743,6 @@
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="17" column="105" selection-start-line="17" selection-start-column="105" selection-end-line="17" selection-end-column="105" />
<folding />
</state>
</provider>
</entry>
@ -1979,112 +1754,112 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/SentCallback.java">
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/lang/NoSuchMethodError.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="22" column="81" selection-start-line="22" selection-start-column="81" selection-end-line="22" selection-end-column="81" />
<folding />
<state vertical-scroll-proportion="0.5340557">
<caret line="46" column="11" selection-start-line="46" selection-start-column="11" selection-end-line="46" selection-end-column="11" />
<folding>
<element signature="e#877#878#0" expanded="false" />
<element signature="e#900#901#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java">
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/io/ObjectStreamException.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="31" column="19" selection-start-line="31" selection-start-column="19" selection-end-line="31" selection-end-column="19" />
<state vertical-scroll-proportion="0.23219815">
<caret line="33" column="22" selection-start-line="33" selection-start-column="22" selection-end-line="33" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java">
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/io/InvalidObjectException.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="84" column="0" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
<folding />
<state vertical-scroll-proportion="0.32507738">
<caret line="37" column="49" selection-start-line="37" selection-start-column="49" selection-end-line="37" selection-end-column="49" />
<folding>
<element signature="e#857#858#0" expanded="false" />
<element signature="e#886#887#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="35" column="25" selection-start-line="35" selection-start-column="25" selection-end-line="35" selection-end-column="25" />
<state vertical-scroll-proportion="-2.1114552">
<caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="15" column="96" selection-start-line="15" selection-start-column="96" selection-end-line="15" selection-end-column="96" />
<state vertical-scroll-proportion="0.071207434">
<caret line="28" column="62" selection-start-line="28" selection-start-column="62" selection-end-line="28" selection-end-column="62" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="10" column="50" selection-start-line="10" selection-start-column="50" selection-end-line="10" selection-end-column="50" />
<state vertical-scroll-proportion="0.25541794">
<caret line="35" column="57" selection-start-line="35" selection-start-column="57" selection-end-line="35" selection-end-column="57" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="211" column="67" selection-start-line="211" selection-start-column="67" selection-end-line="211" selection-end-column="67" />
<state vertical-scroll-proportion="0.25541794">
<caret line="24" column="61" selection-start-line="24" selection-start-column="61" selection-end-line="24" selection-end-column="61" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/SentCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="237" column="67" selection-start-line="237" selection-start-column="67" selection-end-line="237" selection-end-column="67" />
<state vertical-scroll-proportion="0.4876161">
<caret line="22" column="81" selection-start-line="22" selection-start-column="81" selection-end-line="22" selection-end-column="81" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="93" column="75" selection-start-line="93" selection-start-column="75" selection-end-line="93" selection-end-column="75" />
<state vertical-scroll-proportion="0.4876161">
<caret line="22" column="29" selection-start-line="22" selection-start-column="29" selection-end-line="22" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="32" column="44" selection-start-line="32" selection-start-column="44" selection-end-line="32" selection-end-column="44" />
<state vertical-scroll-proportion="0.44272447">
<caret line="58" column="39" selection-start-line="58" selection-start-column="39" selection-end-line="58" selection-end-column="39" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="259" column="0" selection-start-line="259" selection-start-column="0" selection-end-line="259" selection-end-column="0" />
<folding>
<element signature="docComment;class#SenderHelper#0" expanded="false" />
<element signature="method#SendApiMethodAsync#0;class#SenderHelper#0" expanded="false" />
</folding>
<state vertical-scroll-proportion="2.6702785">
<caret line="138" column="36" selection-start-line="138" selection-start-column="36" selection-end-line="138" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/methods/SendMessage.java">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="147" column="45" selection-start-line="147" selection-start-column="45" selection-end-line="147" selection-end-column="45" />
<folding>
<element signature="e#1831#1832#0" expanded="true" />
<element signature="e#1867#1868#0" expanded="true" />
</folding>
<state vertical-scroll-proportion="0.37306502">
<caret line="31" column="19" selection-start-line="31" selection-start-column="19" selection-end-line="31" selection-end-column="19" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.21333334">
<caret line="123" column="72" selection-start-line="123" selection-start-column="72" selection-end-line="123" selection-end-column="72" />
<state vertical-scroll-proportion="24.705883">
<caret line="1258" column="38" selection-start-line="1258" selection-start-column="38" selection-end-line="1258" selection-end-column="38" />
<folding>
<element signature="method#getSettingsMessage#0;class#WeatherHandlers#0" expanded="false" />
<element signature="method#getHelpMessage#0;class#WeatherHandlers#0" expanded="false" />
@ -2104,6 +1879,136 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/TimerExecutor.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.6453901">
<caret line="104" column="29" selection-start-line="104" selection-start-column="29" selection-end-line="104" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Commands.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.28368795">
<caret line="8" column="13" selection-start-line="8" selection-start-column="13" selection-end-line="8" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.56028366">
<caret line="100" column="27" selection-start-line="100" selection-start-column="27" selection-end-line="100" selection-end-column="27" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="7.6950355">
<caret line="227" column="39" selection-start-line="227" selection-start-column="39" selection-end-line="227" selection-end-column="39" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.47517732">
<caret line="83" column="36" selection-start-line="83" selection-start-column="36" selection-end-line="83" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-4.070922">
<caret line="264" column="36" selection-start-line="264" selection-start-column="36" selection-end-line="264" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.61702126">
<caret line="91" column="36" selection-start-line="91" selection-start-column="36" selection-end-line="91" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.48">
<caret line="39" column="34" selection-start-line="39" selection-start-column="34" selection-end-line="39" selection-end-column="34" />
<folding>
<element signature="imports" expanded="true" />
<element signature="e#11493#11494#0" expanded="true" />
<element signature="e#11559#11560#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/CustomTimerTask.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="8" column="22" selection-start-line="8" selection-start-column="22" selection-end-line="8" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/objects/Message.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="233" column="0" selection-start-line="233" selection-start-column="0" selection-end-line="233" selection-end-column="0" />
<folding>
<element signature="e#8853#8854#0" expanded="true" />
<element signature="e#8888#8889#0" expanded="true" />
<element signature="e#9500#9501#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="265" column="82" selection-start-line="265" selection-start-column="82" selection-end-line="265" selection-end-column="82" />
<folding>
<element signature="docComment;class#SenderHelper#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/ChannelHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-9.296296">
<caret line="62" column="13" selection-start-line="62" selection-start-column="13" selection-end-line="62" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="10" column="29" selection-start-line="10" selection-start-column="29" selection-end-line="10" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="9" column="4" selection-start-line="9" selection-start-column="4" selection-end-line="9" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.64">
<caret line="36" column="8" selection-start-line="36" selection-start-column="8" selection-end-line="36" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>

10
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 = "<bot-token>";
public static final String TOKENWEATHER = "<token>";
public static final String USERNAMEWEATHER = "weatherbot";
public static final String TOKENTRANSIFEX = "<bot-token>";
public static final String TOKENTRANSIFEX = "<token>";
public static final String USERNAMETRANSIFEX = "TGlanguagesbot";
public static final String TOKENFILES = "<bot-token>";
public static final String TOKENFILES = "<token>";
public static final String USERNAMEFILES = "filesbot";
public static final String TOKENDIRECTIONS = "<bot-token>";
public static final String TOKENDIRECTIONS = "<token>";
public static final String USERNAMEDIRECTIONS = "directionsbot";
public static final String TOKENCHANNEL = "<token>";
public static final String USERNAMECHANNEL = "channelupdatesbot";
}

1
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);

37
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");
responseContent = EntityUtils.toString(buf, "UTF-8");
} catch (IOException e) {
BotLogger.error(LOGTAG, e);
}
JSONObject jsonObject = new JSONObject(responseContent);
if (!jsonObject.getBoolean("ok")) {
throw new InvalidObjectException(jsonObject.toString());
}
} catch (IOException e) {
log.error(e);
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);
}
});
}

2
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() {

8
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;
}

7
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);
}
}

356
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<String, BotLogger> instances = new ConcurrentHashMap<>();
private final static ConcurrentLinkedQueue<String> logsToFile = new ConcurrentLinkedQueue<>();
private static final ConcurrentLinkedQueue<String> logsToFile = new ConcurrentLinkedQueue<>();
static {
logger.setLevel(Level.ALL);
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;
lastFileDate = LocalDateTime.now();
if ((currentFileName == null) || (currentFileName.compareTo("") == 0)) {
currentFileName = dateFormatterForFileName(lastFileDate) + ".log";
try {
final File file = new File(currentFileName);
if (file.exists()) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} else {
return instances.get(className);
}
}
final boolean created = file.createNewFile();
if (created) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} else {
return instances.get(className);
}
throw new NullPointerException("File for logging error");
}
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";
try {
File file = new File(currentFileName);
if (!file.exists()) {
file.createNewFile();
}
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";
private static void updateAndCreateFile(LocalDateTime dateTime) {
if (!isCurrentDate(dateTime)) {
lastFileDate = LocalDateTime.now();
currentFileName = BuildVars.pathToLogs + dateFormatterForFileName(lastFileDate) + ".log";
try {
logginFile.flush();
logginFile.close();
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)));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} 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");
}
}
private void logToFile(@NotNull Level level, Throwable throwable) {
if (!isLoggable(level)){
return;
} catch (IOException ignored) {
}
}
}
private static void logToFile(@NotNull Level level, @NotNull String tag, @NotNull Throwable throwable) {
if (isLoggable(level)) {
synchronized (lockToWrite) {
Calendar currentDate = new GregorianCalendar();
String dateForLog = dateFormaterForLogs(currentDate);
final LocalDateTime currentDate = LocalDateTime.now();
final String dateForLog = dateFormatterForLogs(currentDate);
updateAndCreateFile(currentDate);
logThrowableToFile(level, throwable, dateForLog);
logThrowableToFile(level, tag, throwable, dateForLog);
}
}
}
private void logToFile(@NotNull Level level, String msg) {
if (!isLoggable(level)){
return;
}
private static void logToFile(@NotNull Level level, @NotNull String tag, @NotNull String msg) {
if (isLoggable(level)) {
synchronized (lockToWrite) {
Calendar currentDate = new GregorianCalendar();
final LocalDateTime currentDate = LocalDateTime.now();
updateAndCreateFile(currentDate);
String dateForLog = dateFormaterForLogs(currentDate);
logMsgToFile(level, msg, dateForLog);
final String dateForLog = dateFormatterForLogs(currentDate);
logMsgToFile(level, tag, msg, dateForLog);
}
}
private void logToFile(Level level, String msg, Throwable throwable) {
if (!isLoggable(level)){
return;
}
private static void logToFile(Level level, @NotNull String tag, @NotNull String msg, @NotNull Throwable throwable) {
if (isLoggable(level)) {
synchronized (lockToWrite) {
Calendar currentDate = new GregorianCalendar();
final LocalDateTime currentDate = LocalDateTime.now();
updateAndCreateFile(currentDate);
String dateForLog = dateFormaterForLogs(currentDate);
logMsgToFile(level, msg, dateForLog);
logThrowableToFile(level, throwable, dateForLog);
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<String> stringsToLog = new ConcurrentLinkedQueue<>();
final ConcurrentLinkedQueue<String> 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();
}
}

4
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;

10
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);
}
}
}

32
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;
}

26
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;

183
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<Integer, Integer> 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);
}
}

15
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) {
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());

29
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) {
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<String, String> 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());

10
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) {
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());

14
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);
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);
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) {
try {
SenderHelper.SendApiMethod(sendMessage, TOKEN);
} catch (InvalidObjectException e) {
BotLogger.severe(LOGTAG, e);
}
}
// endregion Helper Methods

16
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);
}
}
}

6
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);
}
}

Loading…
Cancel
Save