Browse Source

1. Localization

master
Rubenlagu 11 years ago
committed by Rubenlagus
parent
commit
7bc030901e
  1. 441
      .idea/workspace.xml
  2. 2
      src/main/java/org/telegram/Commands.java
  3. 52
      src/main/java/org/telegram/CustomMessages.java
  4. 74
      src/main/java/org/telegram/database/CreationStrings.java
  5. 38
      src/main/java/org/telegram/database/DatabaseManager.java
  6. 38
      src/main/java/org/telegram/services/DirectionsService.java
  7. 201
      src/main/java/org/telegram/services/LocalisationService.java
  8. 71
      src/main/java/org/telegram/services/WeatherService.java
  9. 77
      src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
  10. 89
      src/main/java/org/telegram/updateshandlers/FilesHandlers.java
  11. 17
      src/main/java/org/telegram/updateshandlers/TransifexHandlers.java
  12. 76
      src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
  13. 30
      src/main/resources/localisation/strings.properties

441
.idea/workspace.xml

@ -2,10 +2,21 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="cc3252dd-ba1f-404e-b603-ef880b5c3341" name="Default" comment="1. Several fixes"> <list default="true" id="cc3252dd-ba1f-404e-b603-ef880b5c3341" name="Default" comment="1. Several fixes">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/LocalisationService.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/main/resources/localisation/strings.properties" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/CustomMessages.java" afterPath="" />
<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/BotConfig.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.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/BuildVars.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/Commands.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/Commands.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.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/Main.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/Main.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/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/TransifexHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.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$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
</list> </list>
<ignored path="BotAPi.iws" /> <ignored path="BotAPi.iws" />
@ -30,11 +41,11 @@
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf>
<file leaf-file-name="UpdatesThread.java" pinned="false" current-in-tab="true"> <file leaf-file-name="Main.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.64772725"> <state vertical-scroll-proportion="0.0">
<caret line="28" column="0" selection-start-line="28" selection-start-column="0" selection-end-line="28" selection-end-column="0" /> <caret line="18" column="8" selection-start-line="18" selection-start-column="8" selection-end-line="18" selection-end-column="8" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
@ -42,21 +53,31 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="DatabaseManager.java" pinned="false" current-in-tab="false"> <file leaf-file-name="WeatherHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0"> <state vertical-scroll-proportion="0.0">
<caret line="339" column="31" selection-start-line="339" selection-start-column="31" selection-end-line="339" selection-end-column="31" /> <caret line="228" column="49" selection-start-line="228" selection-start-column="49" selection-end-line="228" selection-end-column="49" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Main.java" pinned="false" current-in-tab="false"> <file leaf-file-name="DirectionsHandlers.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0"> <state vertical-scroll-proportion="0.0">
<caret line="15" column="34" selection-start-line="15" selection-start-column="34" selection-end-line="15" selection-end-column="34" /> <caret line="136" column="121" selection-start-line="136" selection-start-column="121" selection-end-line="136" selection-end-column="121" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="UpdatesThread.java" pinned="false" current-in-tab="true">
<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.4579832">
<caret line="99" column="0" selection-start-line="99" selection-start-column="0" selection-end-line="99" selection-end-column="0" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>
@ -64,13 +85,23 @@
</provider> </provider>
</entry> </entry>
</file> </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="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="6" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf> </leaf>
</component> </component>
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="Class" />
<option value="Interface" /> <option value="Interface" />
<option value="Class" />
</list> </list>
</option> </option>
</component> </component>
@ -98,13 +129,10 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/ReplyKeyboard.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/ForwardMessage.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendPhoto.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendPhoto.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUserProfilePhotos.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUserProfilePhotos.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendMessage.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendMessage.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/games/FivesTools.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/games/FivesTools.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Commands.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/UpdatesThread.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/UpdatesThread.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Server.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/Server.java" />
<option value="$PROJECT_DIR$/pom.xml" /> <option value="$PROJECT_DIR$/pom.xml" />
@ -128,27 +156,30 @@
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/User.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/api/User.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendChatAction.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/SendChatAction.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/CustomMessages.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Message.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Message.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/DirectionsHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" />
<option value="$PROJECT_DIR$/2662015.log" /> <option value="$PROJECT_DIR$/2662015.log" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUpdates.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUpdates.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.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/services/TransifexService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.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/services/BotLogger.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/LocalisationService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Commands.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/CustomMessages.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java" />
<option value="$PROJECT_DIR$/src/main/resources/localisation/strings.properties" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Main.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java" />
</list> </list>
</option> </option>
</component> </component>
@ -280,9 +311,6 @@
<sortByType /> <sortByType />
</navigator> </navigator>
<panes> <panes>
<pane id="PackagesPane" />
<pane id="Scope" />
<pane id="Scratches" />
<pane id="ProjectPane"> <pane id="ProjectPane">
<subPane> <subPane>
<PATH> <PATH>
@ -315,24 +343,6 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </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>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="BotAPi" /> <option name="myItemId" value="BotAPi" />
@ -351,11 +361,11 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="java" /> <option name="myItemId" value="resources" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="telegram" /> <option name="myItemId" value="localisation" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
@ -384,10 +394,6 @@
<option name="myItemId" value="telegram" /> <option name="myItemId" value="telegram" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="updatesreceivers" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH> </PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
@ -481,6 +487,9 @@
</PATH> </PATH>
</subPane> </subPane>
</pane> </pane>
<pane id="Scratches" />
<pane id="Scope" />
<pane id="PackagesPane" />
</panes> </panes>
</component> </component>
<component name="PropertiesComponent"> <component name="PropertiesComponent">
@ -516,6 +525,7 @@
</key> </key>
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/main/java/org/telegram/services" /> <recent name="$PROJECT_DIR$/src/main/java/org/telegram/services" />
<recent name="$PROJECT_DIR$/src/main/resources" />
<recent name="$PROJECT_DIR$/src/main/java/org/telegram" /> <recent name="$PROJECT_DIR$/src/main/java/org/telegram" />
</key> </key>
<key name="MoveClassesOrPackagesDialog.RECENTS_KEY"> <key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
@ -900,7 +910,8 @@
<workItem from="1435251996845" duration="12896000" /> <workItem from="1435251996845" duration="12896000" />
<workItem from="1435324180717" duration="607000" /> <workItem from="1435324180717" duration="607000" />
<workItem from="1435326170366" duration="240000" /> <workItem from="1435326170366" duration="240000" />
<workItem from="1435347109974" duration="3155000" /> <workItem from="1435347109974" duration="3390000" />
<workItem from="1435513506044" duration="7815000" />
</task> </task>
<task id="LOCAL-00001" summary="First Commit:&#10;1. Transifex bot&#10;2. Weather bot"> <task id="LOCAL-00001" summary="First Commit:&#10;1. Transifex bot&#10;2. Weather bot">
<created>1434854005227</created> <created>1434854005227</created>
@ -1046,11 +1057,17 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1435351149105</updated> <updated>1435351149105</updated>
</task> </task>
<option name="localTasksCounter" value="25" /> <task id="LOCAL-00025" summary="1. Several fixes">
<created>1435352969379</created>
<option name="number" value="00025" />
<option name="project" value="LOCAL" />
<updated>1435352969379</updated>
</task>
<option name="localTasksCounter" value="26" />
<servers /> <servers />
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="108211000" /> <option name="totallyTimeSpent" value="116261000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
@ -1063,7 +1080,7 @@
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="0" y="0" width="1366" height="768" extended-state="0" /> <frame x="0" y="0" width="1366" height="768" extended-state="0" />
<editor active="true" /> <editor active="false" />
<layout> <layout>
<window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
@ -1072,11 +1089,11 @@
<window_info id="Bean Validation" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Bean Validation" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3295129" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32857144" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Java Enterprise" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Java Enterprise" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.27793697" sideWeight="0.4939577" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Debug" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.27793697" sideWeight="0.4939577" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39971346" sideWeight="0.5060423" order="7" side_tool="true" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39971346" sideWeight="0.5060423" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.19561933" sideWeight="0.1718377" order="2" side_tool="true" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.19561933" sideWeight="0.1718377" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
@ -1094,19 +1111,19 @@
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
</layout> </layout>
<layout-to-restore> <layout-to-restore>
<window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Statistic" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Statistic" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Java Enterprise" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Java Enterprise" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="13" side_tool="false" content_ui="tabs" /> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="13" side_tool="false" content_ui="tabs" />
<window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19561933" sideWeight="0.5" order="3" side_tool="false" content_ui="combo" /> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19561933" sideWeight="0.5" order="3" side_tool="false" content_ui="combo" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="7" side_tool="false" content_ui="combo" /> <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="7" side_tool="false" content_ui="combo" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" /> <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
@ -1118,8 +1135,8 @@
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3295129" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="12" side_tool="false" content_ui="tabs" /> <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="12" side_tool="false" content_ui="tabs" />
</layout-to-restore> </layout-to-restore>
</component> </component>
@ -1162,7 +1179,7 @@
<breakpoints> <breakpoints>
<line-breakpoint enabled="true" type="java-line"> <line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java</url>
<line>131</line> <line>129</line>
<properties /> <properties />
<option name="timeStamp" value="36" /> <option name="timeStamp" value="36" />
</line-breakpoint> </line-breakpoint>
@ -1180,7 +1197,7 @@
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="java-line"> <line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java</url>
<line>128</line> <line>171</line>
<properties /> <properties />
<option name="timeStamp" value="101" /> <option name="timeStamp" value="101" />
</line-breakpoint> </line-breakpoint>
@ -1200,7 +1217,7 @@
<breakpoints-dialog> <breakpoints-dialog>
<breakpoints-dialog /> <breakpoints-dialog />
</breakpoints-dialog> </breakpoints-dialog>
<option name="time" value="136" /> <option name="time" value="137" />
</breakpoint-manager> </breakpoint-manager>
<watches-manager> <watches-manager>
<configuration name="Application"> <configuration name="Application">
@ -1215,48 +1232,6 @@
<option name="FILTER_TARGETS" value="false" /> <option name="FILTER_TARGETS" value="false" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.5.1/jackson-annotations-2.5.1.jar!/com/fasterxml/jackson/annotation/JsonProperty.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.32687652">
<caret line="16" column="30" selection-start-line="16" selection-start-column="18" selection-end-line="16" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/glassfish/jersey/core/jersey-server/2.18/jersey-server-2.18.jar!/org/glassfish/jersey/server/ResourceConfig.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.94430995">
<caret line="65" column="11" selection-start-line="65" selection-start-column="11" selection-end-line="65" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Audio.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.7928389">
<caret line="23" column="32" selection-start-line="23" selection-start-column="32" selection-end-line="23" selection-end-column="32" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Contact.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.7928389">
<caret line="23" column="30" selection-start-line="23" selection-start-column="30" selection-end-line="23" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Document.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.9079284">
<caret line="27" column="32" selection-start-line="27" selection-start-column="32" selection-end-line="27" selection-end-column="32" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/ForceReply.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.67774934">
<caret line="29" column="33" selection-start-line="29" selection-start-column="33" selection-end-line="29" selection-end-column="33" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Location.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Location.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.56265986"> <state vertical-scroll-proportion="0.56265986">
@ -1327,13 +1302,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/CustomMessages.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="50" column="100" selection-start-line="50" selection-start-column="100" selection-end-line="50" selection-end-column="100" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Message.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Message.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.2173913"> <state vertical-scroll-proportion="0.2173913">
@ -1404,224 +1372,267 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.4047619"> <state vertical-scroll-proportion="0.6671642">
<caret line="224" column="6" selection-start-line="223" selection-start-column="20" selection-end-line="223" selection-end-column="33" /> <caret line="133" column="58" selection-start-line="133" selection-start-column="58" selection-end-line="133" selection-end-column="63" />
<folding>
<element signature="docComment;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#TransifexService#0;class#TransifexService#0" expanded="false" />
<element signature="method#TransifexService#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#getInstance#0;class#TransifexService#0" expanded="false" />
<element signature="method#getInstance#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#fixCaseCompositedLanguages#0;class#TransifexService#0" expanded="false" />
<element signature="method#fixCaseCompositedLanguages#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#getAndroidSupportLanguageFile#0;class#TransifexService#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.25581396"> <state vertical-scroll-proportion="-0.049253732">
<caret line="29" column="81" selection-start-line="29" selection-start-column="81" selection-end-line="29" selection-end-column="81" /> <caret line="23" column="71" selection-start-line="23" selection-start-column="71" selection-end-line="23" selection-end-column="71" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.20089285"> <state vertical-scroll-proportion="0.2238806">
<caret line="9" column="91" selection-start-line="9" selection-start-column="47" selection-end-line="9" selection-end-column="91" /> <caret line="14" column="7" selection-start-line="14" selection-start-column="7" selection-end-line="14" selection-end-column="7" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-17.222221"> <state vertical-scroll-proportion="0.26865673">
<caret line="292" column="15" selection-start-line="292" selection-start-column="10" selection-end-line="292" selection-end-column="15" /> <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
<folding>
<element signature="docComment;method#fetchWeatherForecast#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherForecastByLocation#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherCurrent#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherCurrentByLocation#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#convertListOfForecastToString#0;class#WeatherService#0" expanded="false" />
<element signature="method#convertListOfForecastToString#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#convertInternalInformationToString#0;class#WeatherService#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.33437014"> <state vertical-scroll-proportion="0.8214286">
<caret line="25" column="10" selection-start-line="25" selection-start-column="9" selection-end-line="25" selection-end-column="10" /> <caret line="320" column="4" selection-start-line="320" selection-start-column="4" selection-end-line="320" selection-end-column="4" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.6671642"> <state vertical-scroll-proportion="0.15625">
<caret line="133" column="58" selection-start-line="133" selection-start-column="58" selection-end-line="133" selection-end-column="63" /> <caret line="22" column="40" selection-start-line="22" selection-start-column="40" selection-end-line="22" selection-end-column="40" />
<folding> <folding />
<element signature="e#1902#1917#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java"> <entry file="file://$PROJECT_DIR$/2662015.log">
<provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
<state />
</provider>
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.049253732"> <state vertical-scroll-proportion="56.517857">
<caret line="23" column="71" selection-start-line="23" selection-start-column="71" selection-end-line="23" selection-end-column="71" /> <caret line="2" column="49" selection-start-line="2" selection-start-column="49" selection-end-line="2" selection-end-column="49" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </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/util/logging/Logger.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.2238806"> <state vertical-scroll-proportion="0.9434389">
<caret line="14" column="7" selection-start-line="14" selection-start-column="7" selection-end-line="14" selection-end-column="7" /> <caret line="490" column="25" selection-start-line="490" selection-start-column="25" selection-end-line="490" selection-end-column="25" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.25821596"> <state vertical-scroll-proportion="0.072289154">
<caret line="25" column="21" selection-start-line="25" selection-start-column="0" selection-end-line="26" selection-end-column="0" /> <caret line="2" column="16" selection-start-line="2" selection-start-column="16" selection-end-line="2" selection-end-column="16" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/Queue.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.41990668"> <state vertical-scroll-proportion="0.3318182">
<caret line="104" column="50" selection-start-line="104" selection-start-column="49" selection-end-line="104" selection-end-column="50" /> <caret line="198" column="6" selection-start-line="198" selection-start-column="6" selection-end-line="198" selection-end-column="6" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/concurrent/ConcurrentLinkedQueue.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.33437014"> <state vertical-scroll-proportion="0.3318182">
<caret line="79" column="58" selection-start-line="79" selection-start-column="56" selection-end-line="79" selection-end-column="58" /> <caret line="355" column="13" selection-start-line="355" selection-start-column="13" selection-end-line="355" selection-end-column="13" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/Deque.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.26865673"> <state vertical-scroll-proportion="4.254237">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" /> <caret line="303" column="6" selection-start-line="303" selection-start-column="6" selection-end-line="303" selection-end-column="6" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/concurrent/ConcurrentLinkedDeque.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.8214286"> <state vertical-scroll-proportion="-2.8045454">
<caret line="320" column="4" selection-start-line="320" selection-start-column="4" selection-end-line="320" selection-end-column="4" /> <caret line="974" column="13" selection-start-line="974" selection-start-column="13" selection-end-line="974" selection-end-column="13" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/Locale.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.15625"> <state vertical-scroll-proportion="0.64626867">
<caret line="22" column="40" selection-start-line="22" selection-start-column="40" selection-end-line="22" selection-end-column="40" /> <caret line="675" column="11" selection-start-line="675" selection-start-column="11" selection-end-line="675" selection-end-column="11" />
<folding>
<element signature="e#28232#28233#0" expanded="true" />
<element signature="e#28275#28276#0" expanded="true" />
</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.4671642">
<caret line="75" column="38" selection-start-line="75" selection-start-column="38" selection-end-line="75" selection-end-column="38" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/CreationStrings.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.27149323"> <state vertical-scroll-proportion="0.4477612">
<caret line="11" column="42" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="51" /> <caret line="20" column="166" selection-start-line="20" selection-start-column="166" selection-end-line="20" selection-end-column="166" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/2662015.log"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Commands.java">
<provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
<state />
</provider>
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="56.517857"> <state vertical-scroll-proportion="0.8432836">
<caret line="2" column="49" selection-start-line="2" selection-start-column="49" selection-end-line="2" selection-end-column="49" /> <caret line="42" column="4" selection-start-line="42" selection-start-column="4" selection-end-line="42" selection-end-column="4" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/logging/Logger.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.9434389"> <state vertical-scroll-proportion="0.40298507">
<caret line="490" column="25" selection-start-line="490" selection-start-column="25" selection-end-line="490" selection-end-column="25" /> <caret line="37" column="56" selection-start-line="37" selection-start-column="56" selection-end-line="37" selection-end-column="56" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Commands.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.072289154"> <state vertical-scroll-proportion="0.0">
<caret line="2" column="16" selection-start-line="2" selection-start-column="16" selection-end-line="2" selection-end-column="16" /> <caret line="43" column="61" selection-start-line="43" selection-start-column="61" selection-end-line="43" selection-end-column="61" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/database/DatabaseManager.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0"> <state vertical-scroll-proportion="0.0">
<caret line="339" column="31" selection-start-line="339" selection-start-column="31" selection-end-line="339" selection-end-column="31" /> <caret line="69" column="98" selection-start-line="69" selection-start-column="28" selection-end-line="69" selection-end-column="98" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0"> <state vertical-scroll-proportion="2.5298507">
<caret line="15" column="34" selection-start-line="15" selection-start-column="34" selection-end-line="15" selection-end-column="34" /> <caret line="131" column="0" selection-start-line="131" selection-start-column="0" selection-end-line="131" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/LocalisationService.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-1.5">
<caret line="95" column="21" selection-start-line="95" selection-start-column="21" selection-end-line="95" selection-end-column="21" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="class#CustomClassLoader#0;class#LocalisationService#0" expanded="false" />
<element signature="docComment;method#getInstance#0;class#LocalisationService#0" expanded="false" />
<element signature="method#getInstance#0;class#LocalisationService#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/Queue.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.3318182"> <state vertical-scroll-proportion="3.8955224">
<caret line="198" column="6" selection-start-line="198" selection-start-column="6" selection-end-line="198" selection-end-column="6" /> <caret line="224" column="6" selection-start-line="223" selection-start-column="20" selection-end-line="223" selection-end-column="33" />
<folding>
<element signature="docComment;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#TransifexService#0;class#TransifexService#0" expanded="false" />
<element signature="method#TransifexService#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#getInstance#0;class#TransifexService#0" expanded="false" />
<element signature="method#getInstance#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#fixCaseCompositedLanguages#0;class#TransifexService#0" expanded="false" />
<element signature="method#fixCaseCompositedLanguages#0;class#TransifexService#0" expanded="false" />
<element signature="docComment;method#getAndroidSupportLanguageFile#0;class#TransifexService#0" expanded="false" />
</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="0.23880596">
<caret line="259" column="27" selection-start-line="259" selection-start-column="27" selection-end-line="259" selection-end-column="27" />
<folding>
<element signature="docComment;method#fetchWeatherForecast#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherForecastByLocation#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherCurrent#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#fetchWeatherCurrentByLocation#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#convertListOfForecastToString#0;class#WeatherService#0" expanded="false" />
<element signature="docComment;method#convertInternalInformationToString#0;class#WeatherService#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/localisation/strings.properties">
<provider editor-type-id="ResourceBundle">
<state />
</provider>
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.16380656">
<caret line="7" column="23" selection-start-line="7" selection-start-column="23" selection-end-line="7" selection-end-column="23" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/concurrent/ConcurrentLinkedQueue.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BotConfig.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.3318182"> <state vertical-scroll-proportion="0.0">
<caret line="355" column="13" selection-start-line="355" selection-start-column="13" selection-end-line="355" selection-end-column="13" /> <caret line="15" column="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="6" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/Deque.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="4.254237"> <state vertical-scroll-proportion="0.0">
<caret line="303" column="6" selection-start-line="303" selection-start-column="6" selection-end-line="303" selection-end-column="6" /> <caret line="18" column="8" selection-start-line="18" selection-start-column="8" selection-end-line="18" selection-end-column="8" />
<folding>
<element signature="imports" expanded="true" />
</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.0">
<caret line="228" column="49" selection-start-line="228" selection-start-column="49" selection-end-line="228" selection-end-column="49" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/concurrent/ConcurrentLinkedDeque.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-2.8045454"> <state vertical-scroll-proportion="0.0">
<caret line="974" column="13" selection-start-line="974" selection-start-column="13" selection-end-line="974" selection-end-column="13" /> <caret line="136" column="121" selection-start-line="136" selection-start-column="121" selection-end-line="136" selection-end-column="121" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.64772725"> <state vertical-scroll-proportion="0.4579832">
<caret line="28" column="0" selection-start-line="28" selection-start-column="0" selection-end-line="28" selection-end-column="0" /> <caret line="99" column="0" selection-start-line="99" selection-start-column="0" selection-end-line="99" selection-end-column="0" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
</folding> </folding>

2
src/main/java/org/telegram/Commands.java

@ -40,4 +40,6 @@ public class Commands {
public static final String listCommand = commandInitChar + "list"; public static final String listCommand = commandInitChar + "list";
/// Start directions command /// Start directions command
public static final String startDirectionCommand = commandInitChar + "directions"; public static final String startDirectionCommand = commandInitChar + "directions";
/// Set Language command
public static final String setLanguageCommand = "language";
} }

52
src/main/java/org/telegram/CustomMessages.java

@ -1,52 +0,0 @@
package org.telegram;
/**
* @author Ruben Bermudez
* @version 1.0
* @brief Custom messages to be sent to the user
* @date 21 of June of 2015
*/
public class CustomMessages {
public static final String helpWeather = "Curious about the weather?\nJust send me these commands and you'll know a lot better.\n\n" +
"|-- " + Commands.WEATHERCOMMAND + " CITY,COUNTRY : Get a 3-day weather forecast for a city.\n" +
"|-- " + Commands.CURRENTWEATHERCOMMAND + " CITY,COUNTRY : Get the current weather of a city.\n" +
"|-- Send a location to get the forecast for it.";
public static final String helpTransifex = "Tricks with words is the game that I play, give it a shot, I might make your day.\n\n" +
"To get the latest Telegram localization file for a language: \n" +
"|-- " + Commands.transifexiOSCommand + " LANG_CODE : Get the latest iOS language.\n" +
"|-- " + Commands.transifexAndroidCommand + " LANG_CODE : Get the latest android language.\n" +
"|-- " + Commands.transifexWebogram + " LANG_CODE : Get the latest webogram language.\n" +
"|-- " + Commands.transifexiOSCommand + " LANG_CODE : Get the latest iOS language.\n" +
"|-- " + Commands.transifexAndroidCommand + " LANG_CODE : Get the latest android language.\n" +
"|-- " + Commands.transifexWebogram + " LANG_CODE : Get the latest webogram language.\n" +
"|-- " + Commands.transifexTDesktop + " LANG_CODE : Get the latest Tdesktop language.\n" +
"|-- " + Commands.transifexOSX + " LANG_CODE : Get the latest OSX-App language.\n" +
"|-- " + Commands.transifexWP + " LANG_CODE : Get the latest Windows Phone language.\n\n" +
"2. To get an updated localization file for your Android beta-app: \n" +
"|-- " + Commands.transifexAndroidSupportCommand + " LANG_CODE : Get the latest Android-beta language.\n\n";
public static final String helpFiles = "Leaving a file for some others to find? Just dock your boat here and a bay comes to mind.\n\n"+
"Share files through a custom link: \n" +
"|-- " + Commands.startCommand + " FILEID : Get a file by id.\n" +
"|-- " + Commands.uploadCommand + " : Start your file upload.\n" +
"|-- " + Commands.deleteCommand + " : Choose one of your files to delete it.\n" +
"|-- " + Commands.listCommand + " : Show a list of your shared files.\n\n";
public static final String helpDirections = "The road ahead, paved with good intentions, the right path ahead however is what I tend to mention.\n\n" +
"To get directions between two locations: \n" +
"|-- " + Commands.startDirectionCommand + " : Start to get directions\n";
public static final String sendFileToUpload = "Please send me a file you want to share. Make sure you attach it as file, not as an image or video.";
public static final String fileUploaded = "Great, your file has been uploaded. Send this link to anyone you want and they will be able to download the file:\n\n";
public static final String deleteUploadedFile = "Please select the file you want to delete:";
public static final String fileDeleted = "The file was deleted";
public static final String wrongFileId = "Sorry, we can't find a file with that ID. Either a typo was made or it was deleted already.";
public static final String listOfFiles = "This your currently shared files list:";
public static final String noFiles = "You haven't shared any file yet.";
public static final String processFinished = "The current process was cancelled.";
public static final String uploadedFileURL = "https://telegram.me/filesbot?start=";
public static final String chooseFromRecentWeather = "Please choose an option from your recent requests:";
public static final String initDirections = "Please reply with your departing location.";
public static final String sendDestination = "Please reply with your destination.";
public static final String youNeedReplyDirections = "I'm sorry, I can't help you unless you reply to the message I sent you.";
public static final String pleaseSendMeCityWeather = "Send me the city and country you are interested in, use this format: CITY,COUNTRY";
}

74
src/main/java/org/telegram/database/CreationStrings.java

@ -18,77 +18,5 @@ public class CreationStrings {
public static final String createDirectionsDatabase = "CREATE TABLE IF NOT EXISTS Directions (userId INTEGER PRIMARY KEY, status INTEGER NOT NULL, " + public static final String createDirectionsDatabase = "CREATE TABLE IF NOT EXISTS Directions (userId INTEGER PRIMARY KEY, status INTEGER NOT NULL, " +
"messageId INTEGER NOT NULL DEFAULT 0, origin VARCHAR(100));"; "messageId INTEGER NOT NULL DEFAULT 0, origin VARCHAR(100));";
public static final String createLastUpdateDatabase = "CREATE TABLE IF NOT EXISTS LastUpdate (token STRING PRIMARY KEY, updateId INTEGER NOT NULL DEFAULT -1);"; public static final String createLastUpdateDatabase = "CREATE TABLE IF NOT EXISTS LastUpdate (token STRING PRIMARY KEY, updateId INTEGER NOT NULL DEFAULT -1);";
public static final String createUserLanguageDatabase = "CREATE TABLE IF NOT EXISTS UserLanguage (userId INTEGER PRIMARY KEY, languageCode VARCHAR(10) NOT NULL)";
/*public static final String createOperatingSystemsVersion = "CREATE TABLE IF NOT EXISTS OperatingSystems (operatingSystem VARCHAR(20) PRIMARY KEY);";
public static final String createLanguagesTable = "CREATE TABLE IF NOT EXISTS Languages(languageCode VARCHAR(6) PRIMARY KEY, languageName VARCHAR(30) NOT NULL);";
public static final String insertEnglishLanguage = "INSERT IGNORE INTO Languages (languageCode, languageName) VALUES('en', 'English');";
public static final String insertPortugueseLanguage = "INSERT IGNORE INTO Languages (languageCode, languageName) VALUES('pt', 'Portuguese');";
public static final String insertItalianLanguage = "INSERT IGNORE INTO Languages (languageCode, languageName) VALUES('it', 'Italian');";
public static final String createCountriesTable = "CREATE TABLE IF NOT EXISTS Countries(countryCode VARCHAR(6) PRIMARY KEY, name VARCHAR(20) NOT NULL);";
public static final String createLoginTable = "CREATE TABLE IF NOT EXISTS Logins(username VARCHAR(30) PRIMARY KEY, password VARCHAR(30) NOT NULL, " +
"hash VARCHAR(130) NOT NULL, securityLevel INTEGER DEFAULT 0);";
public static final String createLanguagesPerCountryTable = "CREATE TABLE IF NOT EXISTS LanguagesPerCountry( countryCode VARCHAR(6) PRIMARY KEY, firstLanguage VARCHAR(6) NOT NULL, " +
"secondLanguage VARCHAR(6) DEFAULT NULL, FOREIGN KEY (firstLanguage) REFERENCES Languages (languageCode) ON UPDATE CASCADE ON DELETE CASCADE, " +
"FOREIGN KEY (secondLanguage) REFERENCES Languages (languageCode) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String createUsersTable = "CREATE TABLE IF NOT EXISTS Users(userId INTEGER NOT NULL, bot INTEGER NOT NULL, needVolunteer BOOLEAN NOT NULL, phone VARCHAR(15) DEFAULT NULL, firstName VARCHAR(100) NOT NULL, " +
"lastName VARCHAR(100) NOT NULL, userName VARCHAR(100) DEFAULT NULL, isContact BOOLEAN NOT NULL, lastAnswer DATETIME, userHash VARCHAR(40) NOT NULL, lastScore FLOAT, hashtag VARCHAR(15), countryCode VARCHAR(6), denied INTEGER NOT NULL DEFAULT 0, " +
"customCommand VARCHAR(60) DEFAULT NULL, deleted BOOLEAN NOT NULL DEFAULT FALSE, " +
"CONSTRAINT `usersCountryCode` FOREIGN KEY (countryCode) REFERENCES Countries(countryCode) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `userPrimaryKey` PRIMARY KEY(userId,bot));";
public static final String createAnswersTable = "CREATE TABLE IF NOT EXISTS AnswersXXXX (ID INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(250) NOT NULL," +
"content VARCHAR(2000) NOT NULL, operatingSystem VARCHAR(20) NOT NULL, appVersion VARCHAR(10)," +
"CONSTRAINT `answersOSXXXX` FOREIGN KEY (operatingSystem) REFERENCES OperatingSystems(operatingSystem) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String insertEmptyAnswer = "INSERT IGNORE INTO AnswersXXXX (name, content, operatingSystem, appVersion, ID) VALUES ('Empty Answer','','All','',100);";
public static final String insertNotFoundAnswer = "INSERT IGNORE INTO AnswersXXXX (name, content, operatingSystem, appVersion, ID) VALUES ('Not found','','All','',99);";
public static final String createHistoryTable = "CREATE TABLE IF NOT EXISTS History( ID INTEGER PRIMARY KEY AUTO_INCREMENT, userId INTEGER NOT NULL, date DATETIME NOT NULL, answerId INTEGER NOT NULL, " +
"languageCode VARCHAR(6) NOT NULL, CONSTRAINT `historyUserId` FOREIGN KEY (userId) REFERENCES Users(userId) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `historyLanguageCode` FOREIGN KEY (languageCode) REFERENCES Languages(languageCode) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String createQuestionsTable = "CREATE TABLE IF NOT EXISTS QuestionsXXXX (ID INTEGER PRIMARY KEY AUTO_INCREMENT, content VARCHAR(300) NOT NULL, " +
"languageCode VARCHAR(6) NOT NULL, answerAll INTEGER DEFAULT NULL, answerIos INTEGER DEFAULT NULL, answerWebogram INTEGER DEFAULT NULL, answerAndroid INTEGER DEFAULT NULL, " +
"answerOsx INTEGER DEFAULT NULL, answerDesktop INTEGER DEFAULT NULL, answerWP INTEGER DEFAULT NULL, " +
"CONSTRAINT `questionsAnswerAllXXXX` FOREIGN KEY (answerAll) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerIosXXXX` FOREIGN KEY (answerIos) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerWebogramXXXX` FOREIGN KEY (answerWebogram) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerAndroidXXXX` FOREIGN KEY (answerAndroid) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerOsxXXXX` FOREIGN KEY (answerOsx) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerDesktopXXXX` FOREIGN KEY (answerDesktop) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `questionsAnswerWPXXXX` FOREIGN KEY (answerWP) REFERENCES AnswersXXXX(ID) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String createTrelloTable = "CREATE TABLE IF NOT EXISTS trello (shortLink VARCHAR(10) PRIMARY KEY NOT NULL, listName VARCHAR(20) NOT NULL, listId VARCHAR(30), " +
"closed BOOLEAN NOT NULL, creationDate DATETIME NOT NULL, notificationDate DATETIME NOT NULL, affectedUserCount INTEGER NOT NULL DEFAULT 0, tittle VARCHAR(100) NOT NULL, " +
"description TEXT NOT NULL);";
public static final String createTemplatesTable = "CREATE TABLE IF NOT EXISTS Templates (id INTEGER PRIMARY KEY AUTO_INCREMENT, hash VARCHAR(130) NOT NULL, " +
"languageCode VARCHAR(8), content TEXT);";
public static final String createTemplatesLogTable = "CREATE TABLE IF NOT EXISTS TemplatesLog (id INTEGER PRIMARY KEY AUTO_INCREMENT, hash VARCHAR(130) NOT NULL, type INTEGER, content TEXT);";
public static final String createTemplatesFileTable = "CREATE TABLE IF NOT EXISTS TemplatesFile (id INTEGER PRIMARY KEY AUTO_INCREMENT, hash VARCHAR(130) NOT NULL, date DATETIME, languageCode VARCHAR(8)," +
" CONSTRAINT unique_filelanguage UNIQUE (hash,languageCode));";
public static final String createFiltersTable = "create table if not exists Filters (filterId INTEGER PRIMARY KEY AUTO_INCREMENT," +
" words VARCHAR(300) NOT NULL, languageCode VARCHAR(6) NOT NULL," +
" CONSTRAINT `filtersLanguageCode` FOREIGN KEY (languageCode) REFERENCES Languages(languageCode) ON UPDATE CASCADE ON DELETE CASCADE" +
");";
public static final String createMessagesDiscardedTable = "create table if not exists MessagesDiscarded (id INTEGER PRIMARY KEY AUTO_INCREMENT," +
" userId INTEGER NOT NULL, filterId INTEGER NOT NULL, message TEXT NOT NULL, date TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
" partial BOOLEAN NOT NULL DEFAULT false, CONSTRAINT `messagesDiscardedUserId` FOREIGN KEY (userId) REFERENCES Users(userId) ON UPDATE CASCADE ON DELETE CASCADE," +
" CONSTRAINT `messageDiscardedFilterId` FOREIGN KEY (filterId) REFERENCES Filters(filterId) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String createMessagesAnsweredTable = "create table if not exists MessagesAnswered (id INTEGER PRIMARY KEY AUTO_INCREMENT," +
" userId INTEGER NOT NULL, answer INTEGER NOT NULL, message TEXT NOT NULL, matchValue FLOAT NOT NULL, date TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
" partial BOOLEAN NOT NULL DEFAULT false, CONSTRAINT `messagesAnswerdUserId` FOREIGN KEY (userId) REFERENCES Users(userId) ON UPDATE CASCADE ON DELETE CASCADE);";
public static final String createChatListTable = "create table if not exists Chats (chatId INTEGER PRIMARY KEY NOT NULL, " +
"title VARCHAR(50) NOT NULL);";
public static final String createChatsStatsTable = "create table if not exists ChatStats (id INTEGER PRIMARY KEY AUTO_INCREMENT," +
" userId INTEGER NOT NULL, chatId INTEGER NOT NULL, date TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
" forwarded BOOLEAN NOT NULL DEFAULT false, type INTEGER NOT NULL," +
"CONSTRAINT `chatsStatsUserId` FOREIGN KEY (userId) REFERENCES Users(userId) ON UPDATE CASCADE ON DELETE CASCADE, " +
"CONSTRAINT `chatsStatsChatId` FOREIGN KEY (chatId) REFERENCES Chats(chatId) ON UPDATE CASCADE ON DELETE CASCADE);";
public static volatile List<String> operatingSystems = new ArrayList<>();
static {
operatingSystems.add("All");
operatingSystems.add("iOS");
operatingSystems.add("Webogram");
operatingSystems.add("Android");
operatingSystems.add("OSX");
operatingSystems.add("Desktop");
operatingSystems.add("WP");
}*/
} }

38
src/main/java/org/telegram/database/DatabaseManager.java

@ -76,6 +76,9 @@ public class DatabaseManager {
if (currentVersion == 3) { if (currentVersion == 3) {
currentVersion = updateToVersion4(); currentVersion = updateToVersion4();
} }
if (currentVersion == 4) {
currentVersion = updateToVersion5();
}
connetion.commitTransaction(); connetion.commitTransaction();
} catch (SQLException e) { } catch (SQLException e) {
log.error(e); log.error(e);
@ -100,6 +103,12 @@ public class DatabaseManager {
return 4; return 4;
} }
private int updateToVersion5() throws SQLException {
connetion.executeQuery(CreationStrings.createUserLanguageDatabase);
connetion.executeQuery(String.format(CreationStrings.insertCurrentVersion, 5));
return 5;
}
private int createNewTables() throws SQLException { private int createNewTables() throws SQLException {
connetion.executeQuery(CreationStrings.createVersionTable); connetion.executeQuery(CreationStrings.createVersionTable);
connetion.executeQuery(CreationStrings.createFilesTable); connetion.executeQuery(CreationStrings.createFilesTable);
@ -107,6 +116,7 @@ public class DatabaseManager {
connetion.executeQuery(CreationStrings.createUsersForFilesTable); connetion.executeQuery(CreationStrings.createUsersForFilesTable);
connetion.executeQuery(CreationStrings.createRecentWeatherTable); connetion.executeQuery(CreationStrings.createRecentWeatherTable);
connetion.executeQuery(CreationStrings.createDirectionsDatabase); connetion.executeQuery(CreationStrings.createDirectionsDatabase);
connetion.executeQuery(CreationStrings.createUserLanguageDatabase);
return CreationStrings.version; return CreationStrings.version;
} }
@ -354,4 +364,32 @@ public class DatabaseManager {
} }
return updateId; return updateId;
} }
public String getUserLanguage(Integer userId) {
String languageCode = "en";
try {
final PreparedStatement preparedStatement = connetion.getPreparedStatement("SELECT languageCode FROM UserLanguage WHERE userId = ?");
preparedStatement.setInt(1, userId);
final ResultSet result = preparedStatement.executeQuery();
if (result.next()) {
languageCode = result.getString("languageCode");
}
} catch (SQLException e) {
e.printStackTrace();
}
return languageCode;
}
public boolean putUserLanguage(Integer userId, String language) {
int updatedRows = 0;
try {
final PreparedStatement preparedStatement = connetion.getPreparedStatement("REPLACE INTO UserLanguage (userId, languageCode) VALUES(?, ?)");
preparedStatement.setInt(1, userId);
preparedStatement.setString(2, language);
updatedRows = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return updatedRows > 0;
}
} }

38
src/main/java/org/telegram/services/DirectionsService.java

@ -68,7 +68,7 @@ public class DirectionsService {
* @param destination Destination address * @param destination Destination address
* @return Destinations * @return Destinations
*/ */
public List<String> getDirections(String origin, String destination) { public List<String> getDirections(String origin, String destination, String language) {
final List<String> responseToUser = new ArrayList<>(); final List<String> responseToUser = new ArrayList<>();
try { try {
String completURL = BASEURL + "?origin=" + getQuery(origin) + "&destination=" + getQuery(destination) + PARAMS + APIIDEND; String completURL = BASEURL + "?origin=" + getQuery(origin) + "&destination=" + getQuery(destination) + PARAMS + APIIDEND;
@ -83,23 +83,22 @@ public class DirectionsService {
JSONObject jsonObject = new JSONObject(responseContent); JSONObject jsonObject = new JSONObject(responseContent);
if (jsonObject.getString("status").equals("OK")) { if (jsonObject.getString("status").equals("OK")) {
JSONObject route = jsonObject.getJSONArray("routes").getJSONObject(0); JSONObject route = jsonObject.getJSONArray("routes").getJSONObject(0);
String partialResponseToUser; String startOfAddress = LocalisationService.getInstance().getString("directionsInit", language);
partialResponseToUser = route.getJSONArray("legs").getJSONObject(0).getString("start_address"); String partialResponseToUser = String.format(startOfAddress,
partialResponseToUser += " is "; route.getJSONArray("legs").getJSONObject(0).getString("start_address"),
partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"); route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"),
partialResponseToUser += " away from "; route.getJSONArray("legs").getJSONObject(0).getString("end_address"),
partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getString("end_address"); // TODO Destination route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text")
partialResponseToUser += " and it takes "; );
partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text");
partialResponseToUser += " to arrive there following these directions:\n\n";
responseToUser.add(partialResponseToUser); responseToUser.add(partialResponseToUser);
responseToUser.addAll(getDirectionsSteps(route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps"))); responseToUser.addAll(getDirectionsSteps(
route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps"), language));
} else { } else {
responseToUser.add("Directions not found between " + origin + " and " + destination); responseToUser.add(LocalisationService.getInstance().getString("directionsNotFound", language));
} }
} catch (Exception e) { } catch (Exception e) {
log.warning(e); log.warning(e);
responseToUser.add("Error fetching weather info"); responseToUser.add(LocalisationService.getInstance().getString("errorFetchingDirections", language));
} }
return responseToUser; return responseToUser;
} }
@ -108,11 +107,11 @@ public class DirectionsService {
return URLEncoder.encode(address, "UTF-8"); return URLEncoder.encode(address, "UTF-8");
} }
private List<String> getDirectionsSteps(JSONArray steps) { private List<String> getDirectionsSteps(JSONArray steps, String language) {
List<String> stepsStringify = new ArrayList<>(); List<String> stepsStringify = new ArrayList<>();
String partialStepsStringify = ""; String partialStepsStringify = "";
for (int i = 0; i < steps.length(); i++) { for (int i = 0; i < steps.length(); i++) {
String step = getDirectionForStep(steps.getJSONObject(i)); String step = getDirectionForStep(steps.getJSONObject(i), language);
if (partialStepsStringify.length() > 1000) { if (partialStepsStringify.length() > 1000) {
stepsStringify.add(partialStepsStringify); stepsStringify.add(partialStepsStringify);
partialStepsStringify = ""; partialStepsStringify = "";
@ -125,16 +124,13 @@ public class DirectionsService {
return stepsStringify; return stepsStringify;
} }
private String getDirectionForStep(JSONObject jsonObject) { private String getDirectionForStep(JSONObject jsonObject, String language) {
String direction = ""; String direction = LocalisationService.getInstance().getString("directionsStep", language);
String htmlIntructions = Jsoup.parse(jsonObject.getString("html_instructions")).text(); String htmlIntructions = Jsoup.parse(jsonObject.getString("html_instructions")).text();
String duration = jsonObject.getJSONObject("duration").getString("text"); String duration = jsonObject.getJSONObject("duration").getString("text");
String distance = jsonObject.getJSONObject("distance").getString("text"); String distance = jsonObject.getJSONObject("distance").getString("text");
direction += htmlIntructions + " "; direction = String.format(direction, htmlIntructions, duration, distance);
direction += " during ";
direction += duration;
direction += " (" + distance + ")";
return direction; return direction;
} }

201
src/main/java/org/telegram/services/LocalisationService.java

@ -0,0 +1,201 @@
package org.telegram.services;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* @author Ruben Bermudez
* @version 1.0
* @brief Localisation
* @date 25/01/15
*/
public class LocalisationService {
private static LocalisationService instance = null;
public HashMap<String, String> supportedLanguages = new HashMap<>();
private ResourceBundle english;
private ResourceBundle spanish;
private ResourceBundle dutch;
private ResourceBundle german;
private ResourceBundle italian;
private ResourceBundle french;
private ResourceBundle malayalam;
private ResourceBundle hindi;
private ResourceBundle portuguese;
private ResourceBundle portuguesebr;
private ResourceBundle russian;
private ResourceBundle arabic;
private ResourceBundle catalan;
private ResourceBundle galician;
private ResourceBundle persian;
private ResourceBundle turkish;
private class CustomClassLoader extends ClassLoader {
public CustomClassLoader(ClassLoader parent) {
super(parent);
}
public InputStream getResourceAsStream(String name) {
InputStream utf8in = getParent().getResourceAsStream(name);
if (utf8in != null) {
try {
byte[] utf8Bytes = new byte[utf8in.available()];
utf8in.read(utf8Bytes, 0, utf8Bytes.length);
byte[] iso8859Bytes = new String(utf8Bytes, "UTF-8").getBytes("ISO-8859-1");
return new ByteArrayInputStream(iso8859Bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
utf8in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
/**
* Singleton
*
* @return Instance of localisation service
*/
public static LocalisationService getInstance() {
if (instance == null) {
synchronized (LocalisationService.class) {
if (instance == null) {
instance = new LocalisationService();
}
}
}
return instance;
}
/**
* Private constructor due to singleton
*/
private LocalisationService() {
CustomClassLoader loader = new CustomClassLoader(Thread.currentThread().getContextClassLoader());
english = ResourceBundle.getBundle("localisation.strings", new Locale("en", "US"), loader);
supportedLanguages.put("en", "English");
/*spanish = ResourceBundle.getBundle("localisation.strings", new Locale("es", "ES"), loader);
supportedLanguages.put("es", "Español");
dutch = ResourceBundle.getBundle("localisation.strings", new Locale("nl", "NL"), loader);
supportedLanguages.put("nl", "Dutch");
german = ResourceBundle.getBundle("localisation.strings", new Locale("de", "DE"), loader);
supportedLanguages.put("de", "Deutsch");
italian = ResourceBundle.getBundle("localisation.strings", new Locale("it", "IT"), loader);
supportedLanguages.put("it", "Italian");
french = ResourceBundle.getBundle("localisation.strings", new Locale("fr", "FR"), loader);
supportedLanguages.put("fr", "French");
portuguese = ResourceBundle.getBundle("localisation.strings", new Locale("pt", "PT"), loader);
supportedLanguages.put("pt_pt", "Portuguese PT");
portuguesebr = ResourceBundle.getBundle("localisation.strings", new Locale("pt", "BR"), loader);
supportedLanguages.put("pt_br", "Portuguese BR");*/
/**
malayalam = ResourceBundle.getBundle("localisation.strings", new Locale("ml", "ML"), loader);
hindi = ResourceBundle.getBundle("localisation.strings", new Locale("hi", "HI"), loader);
russian = ResourceBundle.getBundle("localisation.strings", new Locale("ru", "RU"), loader);
arabic = ResourceBundle.getBundle("localisation.strings", new Locale("ar", "AR"), loader);
catalan = ResourceBundle.getBundle("localisation.strings", new Locale("ca", "CA"), loader);
galician = ResourceBundle.getBundle("localisation.strings", new Locale("gl", "ES"), loader);
persian = ResourceBundle.getBundle("localisation.strings", new Locale("fa", "FA"), loader);
turkish = ResourceBundle.getBundle("localisation.strings", new Locale("tr", "TR"), loader);
*/
}
/**
* Get a string in default language (en)
*
* @param key key of the resource to fetch
* @return fetched string or error message otherwise
*/
public String getString(String key) {
String result;
try {
result = english.getString(key);
} catch (MissingResourceException e) {
result = "String not found";
}
return result;
}
/**
* Get a string in default language
*
* @param key key of the resource to fetch
* @return fetched string or error message otherwise
*/
public String getString(String key, String language) {
String result;
try {
switch (language.toLowerCase()) {
case "en":
result = english.getString(key);
break;
/*case "es":
result = spanish.getString(key);
break;
case "nl":
result = dutch.getString(key);
break;
case "de":
result = german.getString(key);
break;
case "it":
result = italian.getString(key);
break;
case "fr":
result = french.getString(key);
break;
case "ml":
result = malayalam.getString(key);
break;
case "hi":
result = hindi.getString(key);
break;
case "pt":
result = portuguese.getString(key);
break;
case "pt-BR":
result = portuguesebr.getString(key);
break;
case "ru":
result = russian.getString(key);
break;
case "ar":
result = arabic.getString(key);
break;
case "ca":
result = catalan.getString(key);
break;
case "gl":
result = galician.getString(key);
break;
case "fa":
result = persian.getString(key);
break;
case "tr":
result = turkish.getString(key);
break;*/
default:
result = english.getString(key);
break;
}
} catch (MissingResourceException e) {
result = english.getString(key);
}
return result;
}
}

71
src/main/java/org/telegram/services/WeatherService.java

@ -75,7 +75,7 @@ public class WeatherService {
* @return userHash to be send to use * @return userHash to be send to use
* @note Forecast for the following 3 days * @note Forecast for the following 3 days
*/ */
public String fetchWeatherForecast(String city, Integer userId) { public String fetchWeatherForecast(String city, Integer userId, String language) {
String cityFound; String cityFound;
String responseToUser; String responseToUser;
try { try {
@ -95,17 +95,15 @@ public class WeatherService {
cityFound = jsonObject.getJSONObject("city").getString("name") + " (" + cityFound = jsonObject.getJSONObject("city").getString("name") + " (" +
jsonObject.getJSONObject("city").getString("country") + ")"; jsonObject.getJSONObject("city").getString("country") + ")";
saveRecentWeather(userId, cityFound, jsonObject.getJSONObject("city").getInt("id")); saveRecentWeather(userId, cityFound, jsonObject.getJSONObject("city").getInt("id"));
responseToUser = "The weather for " + cityFound + " will be:\n\n"; responseToUser = String.format(LocalisationService.getInstance().getString("weatherForcast", language),
responseToUser += convertListOfForecastToString(jsonObject); cityFound, convertListOfForecastToString(jsonObject, language));
responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString()); log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
} }
return responseToUser; return responseToUser;
} }
@ -116,7 +114,7 @@ public class WeatherService {
* @return userHash to be send to use * @return userHash to be send to use
* @note Forecast for the following 3 days * @note Forecast for the following 3 days
*/ */
public String fetchWeatherForecastByLocation(Double longitude, Double latitude, Integer userId) { public String fetchWeatherForecastByLocation(Double longitude, Double latitude, Integer userId, String language) {
String cityFound; String cityFound;
String responseToUser; String responseToUser;
try { try {
@ -134,17 +132,15 @@ public class WeatherService {
cityFound = jsonObject.getJSONObject("city").getString("name") + " (" + cityFound = jsonObject.getJSONObject("city").getString("name") + " (" +
jsonObject.getJSONObject("city").getString("country") + ")"; jsonObject.getJSONObject("city").getString("country") + ")";
saveRecentWeather(userId, cityFound, jsonObject.getJSONObject("city").getInt("id")); saveRecentWeather(userId, cityFound, jsonObject.getJSONObject("city").getInt("id"));
responseToUser = "The weather for " + cityFound + " will be:\n\n"; responseToUser = String.format(LocalisationService.getInstance().getString("weatherForcast", language),
responseToUser += convertListOfForecastToString(jsonObject); cityFound, convertListOfForecastToString(jsonObject, language));
responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString()); log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
} }
return responseToUser; return responseToUser;
} }
@ -156,7 +152,7 @@ public class WeatherService {
* @return userHash to be send to use * @return userHash to be send to use
* @note Forecast for the following 3 days * @note Forecast for the following 3 days
*/ */
public String fetchWeatherCurrent(String city, Integer userId) { public String fetchWeatherCurrent(String city, Integer userId, String language) {
String cityFound; String cityFound;
String responseToUser; String responseToUser;
try { try {
@ -174,17 +170,15 @@ public class WeatherService {
cityFound = jsonObject.getString("name") + " (" + cityFound = jsonObject.getString("name") + " (" +
jsonObject.getJSONObject("sys").getString("country") + ")"; jsonObject.getJSONObject("sys").getString("country") + ")";
saveRecentWeather(userId, cityFound, jsonObject.getInt("id")); saveRecentWeather(userId, cityFound, jsonObject.getInt("id"));
responseToUser = "The weather for " + cityFound + " is:\n\n"; responseToUser = String.format(LocalisationService.getInstance().getString("weatherCurrent", language),
responseToUser += convertCurrentWeatherToString(jsonObject); cityFound, convertCurrentWeatherToString(jsonObject, language));
responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString()); log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
} }
return responseToUser; return responseToUser;
} }
@ -195,7 +189,7 @@ public class WeatherService {
* @return userHash to be send to use * @return userHash to be send to use
* @note Forecast for the following 3 days * @note Forecast for the following 3 days
*/ */
public String fetchWeatherCurrentByLocation(Double longitude, Double latitude, Integer userId) { public String fetchWeatherCurrentByLocation(Double longitude, Double latitude, Integer userId, String language) {
String cityFound; String cityFound;
String responseToUser; String responseToUser;
try { try {
@ -213,31 +207,26 @@ public class WeatherService {
cityFound = jsonObject.getString("name") + " (" + cityFound = jsonObject.getString("name") + " (" +
jsonObject.getJSONObject("sys").getString("country") + ")"; jsonObject.getJSONObject("sys").getString("country") + ")";
saveRecentWeather(userId, cityFound, jsonObject.getInt("id")); saveRecentWeather(userId, cityFound, jsonObject.getInt("id"));
responseToUser = "The weather for " + cityFound + " is:\n\n"; responseToUser = String.format(LocalisationService.getInstance().getString("weatherCurrent", language),
responseToUser += convertCurrentWeatherToString(jsonObject); cityFound, convertCurrentWeatherToString(jsonObject, language));
responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString()); log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = LocalisationService.getInstance().getString("cityNotFound", language);
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = LocalisationService.getInstance().getString("errorFetchingWeather", language);
} }
return responseToUser; return responseToUser;
} }
private String convertCurrentWeatherToString(JSONObject jsonObject) { private String convertCurrentWeatherToString(JSONObject jsonObject, String language) {
String temp = jsonObject.getJSONObject("main").getDouble("temp")+""; String temp = jsonObject.getJSONObject("main").getDouble("temp")+"";
String cloudiness = jsonObject.getJSONObject("clouds").getInt("all") + "%"; String cloudiness = jsonObject.getJSONObject("clouds").getInt("all") + "%";
String weatherDesc = jsonObject.getJSONArray("weather").getJSONObject(0).getString("description"); String weatherDesc = jsonObject.getJSONArray("weather").getJSONObject(0).getString("description");
String responseToUser = ""; String responseToUser = LocalisationService.getInstance().getString("currentWeatherPart", language);
responseToUser += responseToUser = String.format(responseToUser, weatherDesc, cloudiness, temp);
" |-- Weather: " + weatherDesc + "\n" +
" |-- Cloudiness: " + cloudiness + "\n" +
" |-- Temperature: " + temp + "ºC\n\n";
return responseToUser; return responseToUser;
} }
@ -248,11 +237,11 @@ public class WeatherService {
* @param jsonObject JSONObject contining the list * @param jsonObject JSONObject contining the list
* @return String to be sent to the user * @return String to be sent to the user
*/ */
private String convertListOfForecastToString(JSONObject jsonObject) { private String convertListOfForecastToString(JSONObject jsonObject, String language) {
String responseToUser = ""; String responseToUser = "";
for (int i = 0; i < jsonObject.getJSONArray("list").length(); i++) { for (int i = 0; i < jsonObject.getJSONArray("list").length(); i++) {
JSONObject internalJSON = jsonObject.getJSONArray("list").getJSONObject(i); JSONObject internalJSON = jsonObject.getJSONArray("list").getJSONObject(i);
responseToUser += convertInternalInformationToString(internalJSON); responseToUser += convertInternalInformationToString(internalJSON, language);
} }
return responseToUser; return responseToUser;
} }
@ -263,7 +252,7 @@ public class WeatherService {
* @param internalJSON JSONObject containing the part to convert * @param internalJSON JSONObject containing the part to convert
* @return String to be sent to the user * @return String to be sent to the user
*/ */
private String convertInternalInformationToString(JSONObject internalJSON) { private String convertInternalInformationToString(JSONObject internalJSON, String language) {
String responseToUser = ""; String responseToUser = "";
LocalDate date; LocalDate date;
String tempMax; String tempMax;
@ -275,10 +264,10 @@ public class WeatherService {
JSONObject weatherObject = internalJSON.getJSONArray("weather").getJSONObject(0); JSONObject weatherObject = internalJSON.getJSONArray("weather").getJSONObject(0);
weatherDesc = weatherObject.getString("description"); weatherDesc = weatherObject.getString("description");
responseToUser += "*On " + dateFormaterFromDate.format(date) + "\n" + responseToUser = LocalisationService.getInstance().getString("forecastWeatherPart", language);
" |--Forecast: " + weatherDesc + "\n" + responseToUser = String.format(responseToUser, dateFormaterFromDate.format(date), weatherDesc,
" |--High temperature: " + tempMax + "ºC\n" + tempMax, tempMin);
" |--Low temperature: " + tempMin + "ºC\n\n";
return responseToUser; return responseToUser;
} }

77
src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java

@ -1,17 +1,20 @@
package org.telegram.updateshandlers; package org.telegram.updateshandlers;
import org.telegram.*; import org.telegram.*;
import org.telegram.api.ForceReply; import org.telegram.api.*;
import org.telegram.api.Message;
import org.telegram.api.ReplyKeyboardHide;
import org.telegram.api.Update;
import org.telegram.database.DatabaseManager; import org.telegram.database.DatabaseManager;
import org.telegram.methods.SendMessage; import org.telegram.methods.SendMessage;
import org.telegram.services.DirectionsService; import org.telegram.services.DirectionsService;
import org.telegram.services.LocalisationService;
import org.telegram.updatesreceivers.UpdatesThread; import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook; import org.telegram.updatesreceivers.Webhook;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
/** /**
* @author Ruben Bermudez * @author Ruben Bermudez
@ -26,6 +29,7 @@ public class DirectionsHandlers implements UpdatesCallback {
private final UpdatesThread updatesThread; private final UpdatesThread updatesThread;
private static final int WATING_ORIGIN_STATUS = 0; private static final int WATING_ORIGIN_STATUS = 0;
private static final int WATING_DESTINY_STATUS = 1; private static final int WATING_DESTINY_STATUS = 1;
private final ConcurrentLinkedQueue<Integer> languageMessages = new ConcurrentLinkedQueue<>();
public DirectionsHandlers() { public DirectionsHandlers() {
if (BuildVars.useWebHook) { if (BuildVars.useWebHook) {
@ -47,27 +51,68 @@ public class DirectionsHandlers implements UpdatesCallback {
public void handleDirections(Update update) { public void handleDirections(Update update) {
Message message = update.getMessage(); Message message = update.getMessage();
if (message != null && message.hasText()) { if (message != null && message.hasText()) {
if (message.getText().startsWith(Commands.startDirectionCommand)) { if (languageMessages.contains(message.getFrom().getId())) {
String[] parts = message.getText().split("-->", 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
if (LocalisationService.getInstance().supportedLanguages.containsKey(parts[0].trim())) {
DatabaseManager.getInstance().putUserLanguage(message.getFrom().getId(), parts[0].trim());
sendMessageRequest.setText(LocalisationService.getInstance().getString("languageModified", parts[0].trim()));
} else {
sendMessageRequest.setText(LocalisationService.getInstance().getString("errorLanguage"));
}
sendMessageRequest.setReplayToMessageId(message.getMessageId());
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setHideKeyboard(true);
replyKeyboardHide.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.remove(message.getFrom().getId());
} else {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
if (message.getText().startsWith(Commands.setLanguageCommand)) {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
HashMap<String, String> languages = LocalisationService.getInstance().supportedLanguages;
List<List<String>> commands = new ArrayList<>();
for (Map.Entry<String, String> entry : languages.entrySet()) {
List<String> commandRow = new ArrayList<>();
commandRow.add(entry.getKey() + " --> " + entry.getValue());
commands.add(commandRow);
}
replyKeyboardMarkup.setResizeKeyboard(true);
replyKeyboardMarkup.setOneTimeKeyboad(true);
replyKeyboardMarkup.setKeyboard(commands);
replyKeyboardMarkup.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(LocalisationService.getInstance().getString("chooselanguage", language));
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.add(message.getFrom().getId());
} else if (message.getText().startsWith(Commands.startDirectionCommand)) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setReplayToMessageId(message.getMessageId());
ForceReply forceReply = new ForceReply(); ForceReply forceReply = new ForceReply();
forceReply.setSelective(true); forceReply.setSelective(true);
sendMessageRequest.setReplayMarkup(forceReply); sendMessageRequest.setReplayMarkup(forceReply);
sendMessageRequest.setText(CustomMessages.initDirections); sendMessageRequest.setText(LocalisationService.getInstance().getString("initDirections", language));
Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
if (sentMessage != null) { if (sentMessage != null) {
DatabaseManager.getInstance().addUserForDirection(message.getFrom().getId(), WATING_ORIGIN_STATUS, DatabaseManager.getInstance().addUserForDirection(message.getFrom().getId(), WATING_ORIGIN_STATUS,
sentMessage.getMessageId(),null); sentMessage.getMessageId(), null);
} }
} else if ((message.getText().startsWith(Commands.help) || } else if ((message.getText().startsWith(Commands.help) ||
(message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) && (message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) &&
DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == -1) { DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == -1) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpDirections); String helpDirectionsFormated = String.format(
LocalisationService.getInstance().getString("helpDirections", language),
Commands.startDirectionCommand);
sendMessageRequest.setText(helpDirectionsFormated);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else if (!message.getText().startsWith("/")){ } else if (!message.getText().startsWith("/")) {
if (DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == WATING_ORIGIN_STATUS && if (DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == WATING_ORIGIN_STATUS &&
message.hasReplayMessage() && message.hasReplayMessage() &&
DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) { DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) {
@ -77,7 +122,7 @@ public class DirectionsHandlers implements UpdatesCallback {
ForceReply forceReply = new ForceReply(); ForceReply forceReply = new ForceReply();
forceReply.setSelective(true); forceReply.setSelective(true);
sendMessageRequest.setReplayMarkup(forceReply); sendMessageRequest.setReplayMarkup(forceReply);
sendMessageRequest.setText(CustomMessages.sendDestination); sendMessageRequest.setText(LocalisationService.getInstance().getString("sendDestination", language));
Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
if (sentMessage != null) { if (sentMessage != null) {
DatabaseManager.getInstance().addUserForDirection(message.getFrom().getId(), WATING_DESTINY_STATUS, DatabaseManager.getInstance().addUserForDirection(message.getFrom().getId(), WATING_DESTINY_STATUS,
@ -89,7 +134,7 @@ public class DirectionsHandlers implements UpdatesCallback {
DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) { DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) {
String origin = DatabaseManager.getInstance().getUserOrigin(message.getFrom().getId()); String origin = DatabaseManager.getInstance().getUserOrigin(message.getFrom().getId());
String destiny = message.getText(); String destiny = message.getText();
List<String> directions = DirectionsService.getInstance().getDirections(origin, destiny); List<String> directions = DirectionsService.getInstance().getDirections(origin, destiny, language);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
@ -97,7 +142,7 @@ public class DirectionsHandlers implements UpdatesCallback {
sendMessageRequest.setReplayMarkup(replyKeyboardHide); sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setReplayToMessageId(message.getMessageId());
Message sentMessage = null; Message sentMessage = null;
for (String direction: directions) { for (String direction : directions) {
sendMessageRequest.setText(direction); sendMessageRequest.setText(direction);
sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
@ -107,12 +152,15 @@ public class DirectionsHandlers implements UpdatesCallback {
} else if (!message.hasReplayMessage()) { } else if (!message.hasReplayMessage()) {
if (DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == -1) { if (DatabaseManager.getInstance().getUserDestinationStatus(message.getFrom().getId()) == -1) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpDirections); String helpDirectionsFormated = String.format(
LocalisationService.getInstance().getString("helpDirections", language),
Commands.startDirectionCommand);
sendMessageRequest.setText(helpDirectionsFormated);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else { } else {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.youNeedReplyDirections); sendMessageRequest.setText(LocalisationService.getInstance().getString("youNeedReplyDirections", language));
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
@ -120,4 +168,5 @@ public class DirectionsHandlers implements UpdatesCallback {
} }
} }
} }
}
} }

89
src/main/java/org/telegram/updateshandlers/FilesHandlers.java

@ -1,12 +1,17 @@
package org.telegram.updateshandlers; package org.telegram.updateshandlers;
import org.telegram.*; import org.telegram.BotConfig;
import org.telegram.BuildVars;
import org.telegram.Commands;
import org.telegram.SenderHelper;
import org.telegram.api.Message; import org.telegram.api.Message;
import org.telegram.api.ReplyKeyboardHide;
import org.telegram.api.ReplyKeyboardMarkup; import org.telegram.api.ReplyKeyboardMarkup;
import org.telegram.api.Update; import org.telegram.api.Update;
import org.telegram.database.DatabaseManager; import org.telegram.database.DatabaseManager;
import org.telegram.methods.SendDocument; import org.telegram.methods.SendDocument;
import org.telegram.methods.SendMessage; import org.telegram.methods.SendMessage;
import org.telegram.services.LocalisationService;
import org.telegram.updatesreceivers.UpdatesThread; import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook; import org.telegram.updatesreceivers.Webhook;
@ -14,6 +19,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
/** /**
* @author Ruben Bermudez * @author Ruben Bermudez
@ -29,6 +35,7 @@ public class FilesHandlers implements UpdatesCallback {
private static final int DELETE_UPLOADED_STATUS = 1; private static final int DELETE_UPLOADED_STATUS = 1;
private final Webhook webhook; private final Webhook webhook;
private final UpdatesThread updatesThread; private final UpdatesThread updatesThread;
private final ConcurrentLinkedQueue<Integer> languageMessages = new ConcurrentLinkedQueue<>();
public FilesHandlers() { public FilesHandlers() {
if (BuildVars.useWebHook) { if (BuildVars.useWebHook) {
@ -50,6 +57,45 @@ public class FilesHandlers implements UpdatesCallback {
public void handleFileUpdate(Update update) { public void handleFileUpdate(Update update) {
Message message = update.getMessage(); Message message = update.getMessage();
if (message != null && message.hasText()) { if (message != null && message.hasText()) {
if (languageMessages.contains(message.getFrom().getId())) {
String[] parts = message.getText().split("-->", 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
if (LocalisationService.getInstance().supportedLanguages.containsKey(parts[0].trim())) {
DatabaseManager.getInstance().putUserLanguage(message.getFrom().getId(), parts[0].trim());
sendMessageRequest.setText(LocalisationService.getInstance().getString("languageModified", parts[0].trim()));
} else {
sendMessageRequest.setText(LocalisationService.getInstance().getString("errorLanguage"));
}
sendMessageRequest.setReplayToMessageId(message.getMessageId());
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setHideKeyboard(true);
replyKeyboardHide.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.remove(message.getFrom().getId());
} else {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
if (message.getText().startsWith(Commands.setLanguageCommand)) {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
HashMap<String, String> languages = LocalisationService.getInstance().supportedLanguages;
List<List<String>> commands = new ArrayList<>();
for (Map.Entry<String, String> entry : languages.entrySet()) {
List<String> commandRow = new ArrayList<>();
commandRow.add(entry.getKey() + " --> " + entry.getValue());
commands.add(commandRow);
}
replyKeyboardMarkup.setResizeKeyboard(true);
replyKeyboardMarkup.setOneTimeKeyboad(true);
replyKeyboardMarkup.setKeyboard(commands);
replyKeyboardMarkup.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(LocalisationService.getInstance().getString("chooselanguage", language));
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.add(message.getFrom().getId());
} else {
String[] parts = message.getText().split(" ", 2); String[] parts = message.getText().split(" ", 2);
if (parts[0].startsWith(Commands.startCommand)) { if (parts[0].startsWith(Commands.startCommand)) {
if (parts.length == 2) { if (parts.length == 2) {
@ -60,27 +106,31 @@ public class FilesHandlers implements UpdatesCallback {
SenderHelper.SendDocument(sendDocumentRequest, TOKEN); SenderHelper.SendDocument(sendDocumentRequest, TOKEN);
} else { } else {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.wrongFileId); sendMessageRequest.setText(LocalisationService.getInstance().getString("wrongFileId", language));
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
} else { } else {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpFiles); String formatedString = String.format(
LocalisationService.getInstance().getString("helpFiles", language),
Commands.startCommand, Commands.uploadCommand, Commands.deleteCommand,
Commands.listCommand);
sendMessageRequest.setText(formatedString);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
} else if (!message.isGroupMessage()){ } else if (!message.isGroupMessage()) {
if (parts[0].startsWith(Commands.uploadCommand)) { // Open upload for user if (parts[0].startsWith(Commands.uploadCommand)) { // Open upload for user
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), INITIAL_UPLOAD_STATUS); DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), INITIAL_UPLOAD_STATUS);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.sendFileToUpload); sendMessageRequest.setText(LocalisationService.getInstance().getString("sendFileToUpload", language));
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else if (parts[0].startsWith(Commands.cancelCommand)) { } else if (parts[0].startsWith(Commands.cancelCommand)) {
DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId()); DatabaseManager.getInstance().deleteUserForFile(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.processFinished); sendMessageRequest.setText(LocalisationService.getInstance().getString("processFinished", language));
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else if (parts[0].startsWith(Commands.deleteCommand)) { } else if (parts[0].startsWith(Commands.deleteCommand)) {
@ -90,9 +140,9 @@ public class FilesHandlers implements UpdatesCallback {
boolean removed = DatabaseManager.getInstance().deleteFile(innerParts[0].trim()); boolean removed = DatabaseManager.getInstance().deleteFile(innerParts[0].trim());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
if (removed) { if (removed) {
sendMessageRequest.setText(CustomMessages.fileDeleted); sendMessageRequest.setText(LocalisationService.getInstance().getString("fileDeleted", language));
} else { } else {
sendMessageRequest.setText(CustomMessages.wrongFileId); sendMessageRequest.setText(LocalisationService.getInstance().getString("wrongFileId", language));
} }
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
@ -100,7 +150,7 @@ public class FilesHandlers implements UpdatesCallback {
} else { } else {
DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), DELETE_UPLOADED_STATUS); DatabaseManager.getInstance().addUserForFile(message.getFrom().getId(), DELETE_UPLOADED_STATUS);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.deleteUploadedFile); sendMessageRequest.setText(LocalisationService.getInstance().getString("deleteUploadedFile", language));
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId()); HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
@ -122,28 +172,37 @@ public class FilesHandlers implements UpdatesCallback {
HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId()); HashMap<String, String> files = DatabaseManager.getInstance().getFilesByUser(message.getFrom().getId());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
if (files.size() > 0) { if (files.size() > 0) {
String text = CustomMessages.listOfFiles + ":\n\n"; String text = LocalisationService.getInstance().getString("listOfFiles", language) + ":\n\n";
for (Map.Entry<String, String> entry : files.entrySet()) { for (Map.Entry<String, String> entry : files.entrySet()) {
text += CustomMessages.uploadedFileURL + entry.getKey() + " --> " + entry.getValue() + "\n"; text += LocalisationService.getInstance().getString("uploadedFileURL", language)
+ entry.getKey() + " --> " + entry.getValue() + "\n";
} }
sendMessageRequest.setText(text); sendMessageRequest.setText(text);
} else { } else {
sendMessageRequest.setText(CustomMessages.noFiles); sendMessageRequest.setText(LocalisationService.getInstance().getString("noFiles", language));
} }
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else { } else {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpFiles); String formatedString = String.format(
LocalisationService.getInstance().getString("helpFiles", language),
Commands.startCommand, Commands.uploadCommand, Commands.deleteCommand,
Commands.listCommand);
sendMessageRequest.setText(formatedString);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
} }
} else if ( message != null && message.hasDocument() }
}
} else if (message != null && message.hasDocument()
&& DatabaseManager.getInstance().getUserStatusForFile(message.getFrom().getId()) == INITIAL_UPLOAD_STATUS) { && DatabaseManager.getInstance().getUserStatusForFile(message.getFrom().getId()) == INITIAL_UPLOAD_STATUS) {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
DatabaseManager.getInstance().addFile(message.getDocument().getFileId(), message.getFrom().getId(), message.getDocument().getFileName()); DatabaseManager.getInstance().addFile(message.getDocument().getFileId(), message.getFrom().getId(), message.getDocument().getFileName());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.fileUploaded + CustomMessages.uploadedFileURL + message.getDocument().getFileId()); sendMessageRequest.setText(LocalisationService.getInstance().getString("fileUploaded", language) +
LocalisationService.getInstance().getString("uploadedFileURL", language) + message.getDocument().getFileId());
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }

17
src/main/java/org/telegram/updateshandlers/TransifexHandlers.java

@ -3,8 +3,10 @@ package org.telegram.updateshandlers;
import org.telegram.*; import org.telegram.*;
import org.telegram.api.Message; import org.telegram.api.Message;
import org.telegram.api.Update; import org.telegram.api.Update;
import org.telegram.database.DatabaseManager;
import org.telegram.methods.SendDocument; import org.telegram.methods.SendDocument;
import org.telegram.methods.SendMessage; import org.telegram.methods.SendMessage;
import org.telegram.services.LocalisationService;
import org.telegram.services.TransifexService; import org.telegram.services.TransifexService;
import org.telegram.updatesreceivers.UpdatesThread; import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook; import org.telegram.updatesreceivers.Webhook;
@ -43,6 +45,7 @@ public class TransifexHandlers implements UpdatesCallback {
public void sendTransifexFile(Update update) { public void sendTransifexFile(Update update) {
Message message = update.getMessage(); Message message = update.getMessage();
if (message != null && message.hasText()) { if (message != null && message.hasText()) {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
String text = message.getText(); String text = message.getText();
String[] parts = text.split(" ", 2); String[] parts = text.split(" ", 2);
SendDocument sendDocument = null; SendDocument sendDocument = null;
@ -63,7 +66,12 @@ public class TransifexHandlers implements UpdatesCallback {
sendDocument = TransifexService.getInstance().getAndroidSupportLanguageFile(parts[1].trim()); sendDocument = TransifexService.getInstance().getAndroidSupportLanguageFile(parts[1].trim());
} else if (parts[0].startsWith(Commands.help)) { } else if (parts[0].startsWith(Commands.help)) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpTransifex); String helpFormated = String.format(
LocalisationService.getInstance().getString("helpTransifex", language),
Commands.transifexiOSCommand, Commands.transifexAndroidCommand, Commands.transifexWebogram,
Commands.transifexTDesktop, Commands.transifexOSX, Commands.transifexWP,
Commands.transifexAndroidSupportCommand);
sendMessageRequest.setText(helpFormated);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
@ -75,7 +83,12 @@ public class TransifexHandlers implements UpdatesCallback {
} else if (parts[0].startsWith(Commands.help) || } else if (parts[0].startsWith(Commands.help) ||
(message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) { (message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpTransifex); String helpFormated = String.format(
LocalisationService.getInstance().getString("helpTransifex", language),
Commands.transifexiOSCommand, Commands.transifexAndroidCommand, Commands.transifexWebogram,
Commands.transifexTDesktop, Commands.transifexOSX, Commands.transifexWP,
Commands.transifexAndroidSupportCommand);
sendMessageRequest.setText(helpFormated);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }

76
src/main/java/org/telegram/updateshandlers/WeatherHandlers.java

@ -3,8 +3,10 @@ package org.telegram.updateshandlers;
import org.telegram.*; import org.telegram.*;
import org.telegram.api.*; import org.telegram.api.*;
import org.telegram.database.DatabaseManager; import org.telegram.database.DatabaseManager;
import org.telegram.methods.ForwardMessage;
import org.telegram.methods.SendMessage; import org.telegram.methods.SendMessage;
import org.telegram.services.BotLogger; import org.telegram.services.BotLogger;
import org.telegram.services.LocalisationService;
import org.telegram.services.WeatherService; import org.telegram.services.WeatherService;
import org.telegram.updatesreceivers.UpdatesThread; import org.telegram.updatesreceivers.UpdatesThread;
import org.telegram.updatesreceivers.Webhook; import org.telegram.updatesreceivers.Webhook;
@ -33,6 +35,7 @@ public class WeatherHandlers implements UpdatesCallback {
private final Webhook webhook; private final Webhook webhook;
private final UpdatesThread updatesThread; private final UpdatesThread updatesThread;
private ConcurrentHashMap<Integer, Integer> listOfSentMessages = new ConcurrentHashMap<>(); private ConcurrentHashMap<Integer, Integer> listOfSentMessages = new ConcurrentHashMap<>();
private final ConcurrentLinkedQueue<Integer> languageMessages = new ConcurrentLinkedQueue<>();
public WeatherHandlers() { public WeatherHandlers() {
if (BuildVars.useWebHook) { if (BuildVars.useWebHook) {
@ -54,12 +57,51 @@ public class WeatherHandlers implements UpdatesCallback {
public void sendWeatherInformation(Update update) { public void sendWeatherInformation(Update update) {
Message message = update.getMessage(); Message message = update.getMessage();
if (message != null && message.hasText()) { if (message != null && message.hasText()) {
if (languageMessages.contains(message.getFrom().getId())) {
String[] parts = message.getText().split("-->", 2);
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
if (LocalisationService.getInstance().supportedLanguages.containsKey(parts[0].trim())) {
DatabaseManager.getInstance().putUserLanguage(message.getFrom().getId(), parts[0].trim());
sendMessageRequest.setText(LocalisationService.getInstance().getString("languageModified", parts[0].trim()));
} else {
sendMessageRequest.setText(LocalisationService.getInstance().getString("errorLanguage"));
}
sendMessageRequest.setReplayToMessageId(message.getMessageId());
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setHideKeyboard(true);
replyKeyboardHide.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.remove(message.getFrom().getId());
} else {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
String text = message.getText(); String text = message.getText();
String[] parts = text.split(" ", 2); String[] parts = text.split(" ", 2);
if (parts[0].startsWith(Commands.WEATHERCOMMAND)) { if (message.getText().startsWith(Commands.setLanguageCommand)) {
SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId());
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
HashMap<String, String> languages = LocalisationService.getInstance().supportedLanguages;
List<List<String>> commands = new ArrayList<>();
for (Map.Entry<String, String> entry : languages.entrySet()) {
List<String> commandRow = new ArrayList<>();
commandRow.add(entry.getKey() + " --> " + entry.getValue());
commands.add(commandRow);
}
replyKeyboardMarkup.setResizeKeyboard(true);
replyKeyboardMarkup.setOneTimeKeyboad(true);
replyKeyboardMarkup.setKeyboard(commands);
replyKeyboardMarkup.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(LocalisationService.getInstance().getString("chooselanguage", language));
SenderHelper.SendMessage(sendMessageRequest, TOKEN);
languageMessages.add(message.getFrom().getId());
} else if (parts[0].startsWith(Commands.WEATHERCOMMAND)) {
if (parts.length == 2) { if (parts.length == 2) {
String citywithoutdescription = parts[1].split("-->", 2)[0].trim(); String citywithoutdescription = parts[1].split("-->", 2)[0].trim();
String weather = WeatherService.getInstance().fetchWeatherForecast(citywithoutdescription, message.getFrom().getId()); String weather = WeatherService.getInstance().fetchWeatherForecast(citywithoutdescription,
message.getFrom().getId(), language);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true); replyKeyboardHide.setSelective(true);
@ -85,9 +127,9 @@ public class WeatherHandlers implements UpdatesCallback {
replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setSelective(true);
replyKeyboardMarkup.setKeyboard(commands); replyKeyboardMarkup.setKeyboard(commands);
sendMessageRequest.setReplayMarkup(replyKeyboardMarkup); sendMessageRequest.setReplayMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(CustomMessages.chooseFromRecentWeather); sendMessageRequest.setText(LocalisationService.getInstance().getString("chooseFromRecentWeather", language));
} else { } else {
sendMessageRequest.setText(CustomMessages.pleaseSendMeCityWeather); sendMessageRequest.setText(LocalisationService.getInstance().getString("pleaseSendMeCityWeather", language));
ForceReply forceReply = new ForceReply(); ForceReply forceReply = new ForceReply();
forceReply.setForceReply(true); forceReply.setForceReply(true);
forceReply.setSelective(true); forceReply.setSelective(true);
@ -98,14 +140,15 @@ public class WeatherHandlers implements UpdatesCallback {
Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
try { try {
listOfSentMessages.put(sentMessage.getMessageId(), FORECASTWEATHERID); listOfSentMessages.put(sentMessage.getMessageId(), FORECASTWEATHERID);
} catch(NullPointerException e) { } catch (NullPointerException e) {
log.error(e); log.error(e);
} }
} }
} else if (parts[0].startsWith(Commands.CURRENTWEATHERCOMMAND)) { } else if (parts[0].startsWith(Commands.CURRENTWEATHERCOMMAND)) {
if (parts.length == 2) { if (parts.length == 2) {
String citywithoutdescription = parts[1].split("-->", 2)[0].trim(); String citywithoutdescription = parts[1].split("-->", 2)[0].trim();
String weather = WeatherService.getInstance().fetchWeatherCurrent(citywithoutdescription, message.getFrom().getId()); String weather = WeatherService.getInstance().fetchWeatherCurrent(citywithoutdescription,
message.getFrom().getId(), language);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true); replyKeyboardHide.setSelective(true);
@ -131,9 +174,9 @@ public class WeatherHandlers implements UpdatesCallback {
replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setSelective(true);
replyKeyboardMarkup.setKeyboard(commands); replyKeyboardMarkup.setKeyboard(commands);
sendMessageRequest.setReplayMarkup(replyKeyboardMarkup); sendMessageRequest.setReplayMarkup(replyKeyboardMarkup);
sendMessageRequest.setText(CustomMessages.chooseFromRecentWeather); sendMessageRequest.setText(LocalisationService.getInstance().getString("chooseFromRecentWeather", language));
} else { } else {
sendMessageRequest.setText(CustomMessages.pleaseSendMeCityWeather); sendMessageRequest.setText(LocalisationService.getInstance().getString("pleaseSendMeCityWeather", language));
ForceReply forceReply = new ForceReply(); ForceReply forceReply = new ForceReply();
forceReply.setForceReply(true); forceReply.setForceReply(true);
forceReply.setSelective(true); forceReply.setSelective(true);
@ -144,17 +187,19 @@ public class WeatherHandlers implements UpdatesCallback {
Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
try { try {
listOfSentMessages.put(sentMessage.getMessageId(), CURRENTWEATHERID); listOfSentMessages.put(sentMessage.getMessageId(), CURRENTWEATHERID);
} catch(NullPointerException e) { } catch (NullPointerException e) {
log.error(e); log.error(e);
} }
} }
} else if (message.isReply() && listOfSentMessages.contains(message.getReplyToMessage().getMessageId())) { } else if (message.isReply() && listOfSentMessages.contains(message.getReplyToMessage().getMessageId())) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
if (listOfSentMessages.remove(message.getReplyToMessage().getMessageId()) == CURRENTWEATHERID) { if (listOfSentMessages.remove(message.getReplyToMessage().getMessageId()) == CURRENTWEATHERID) {
String weather = WeatherService.getInstance().fetchWeatherCurrent(message.getText(), message.getFrom().getId()); String weather = WeatherService.getInstance().fetchWeatherCurrent(message.getText(),
message.getFrom().getId(), language);
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
} else { } else {
String weather = WeatherService.getInstance().fetchWeatherForecast(message.getText(), message.getFrom().getId()); String weather = WeatherService.getInstance().fetchWeatherForecast(message.getText(),
message.getFrom().getId(), language);
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
} }
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
@ -167,13 +212,18 @@ public class WeatherHandlers implements UpdatesCallback {
} else if (parts[0].startsWith(Commands.help) || } else if (parts[0].startsWith(Commands.help) ||
(message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) { (message.getText().startsWith(Commands.startCommand) || !message.isGroupMessage())) {
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setText(CustomMessages.helpWeather); String formatedHelp = String.format(
LocalisationService.getInstance().getString("helpWeather", language),
Commands.WEATHERCOMMAND, Commands.CURRENTWEATHERCOMMAND);
sendMessageRequest.setText(formatedHelp);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} }
}
} else if (message != null && message.hasLocation()) { } else if (message != null && message.hasLocation()) {
String language = DatabaseManager.getInstance().getUserLanguage(update.getMessage().getFrom().getId());
String weather = WeatherService.getInstance().fetchWeatherForecastByLocation(message.getLocation().getLongitude(), String weather = WeatherService.getInstance().fetchWeatherForecastByLocation(message.getLocation().getLongitude(),
message.getLocation().getLatitude(), message.getFrom().getId()); message.getLocation().getLatitude(), message.getFrom().getId(), language);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true); replyKeyboardHide.setSelective(true);

30
src/main/resources/localisation/strings.properties

@ -0,0 +1,30 @@
helpWeather= Curious about the weather?\nJust send me these commands and you'll know a lot better.\n\n|-- %s CITY,COUNTRY : Get a 3-day weather forecast for a city.\n|-- %s CITY,COUNTRY : Get the current weather of a city.\n\n|-- Send a location to get the forecast for it.
helpTransifex= Tricks with words is the game that I play, give it a shot, I might make your day.\n\nTo get the latest Telegram localization file for a language: \n|-- %s LANG_CODE : Get the latest iOS language.\n|-- %s LANG_CODE : Get the latest android language.\n|-- %s LANG_CODE : Get the latest webogram language.\n|-- %s LANG_CODE : Get the latest Tdesktop language.\n|-- %s LANG_CODE : Get the latest OSX-App language.\n|-- %s LANG_CODE : Get the latest Windows Phone language.\n\n2. To get an updated localization file for your Android beta-app: \n|-- %s LANG_CODE : Get the latest Android-beta language.
helpFiles= Leaving a file for some others to find? Just dock your boat here and a bay comes to mind.\n\nShare files through a custom link: \n|-- %s FILEID : Get a file by id.\n|-- %s : Start your file upload.\n|-- %s : Choose one of your files to delete it.\n|-- %s : Show a list of your shared files.
helpDirections= The road ahead, paved with good intentions, the right path ahead however is what I tend to mention.\n\nTo get directions between two locations: \n|-- %s : Start to get directions
sendFileToUpload= Please send me a file you want to share. Make sure you attach it as file, not as an image or video.
fileUploaded= Great, your file has been uploaded. Send this link to anyone you want and they will be able to download the file:\n\n
deleteUploadedFile= Please select the file you want to delete:
fileDeleted= The file was deleted
wrongFileId= Sorry, we can't find a file with that ID. Either a typo was made or it was deleted already.
listOfFiles= This your currently shared files list:
noFiles= You haven't shared any file yet.
processFinished= The current process was cancelled.
uploadedFileURL= https://telegram.me/filesbot?start=
chooseFromRecentWeather= Please choose an option from your recent requests:
initDirections= Please reply with your departing location.
sendDestination= Please reply with your destination.
youNeedReplyDirections= I'm sorry, I can't help you unless you reply to the message I sent you.
pleaseSendMeCityWeather= Send me the city and country you are interested in, use this format: CITY,COUNTRY
chooselanguage= Please, choose a language from the list to change to that language
errorLanguage= We don't support that language or you didn't wrote it correclty. The process has been cancelled.
directionsInit= %s is %s away from %s and it takes %s to arrive there following these directions:\n\n
directionsNotFound= Directions not found between %s and %s
errorFetchingDirections= Error fetching weather info
directionsStep= %s during %s (%s)
weatherForcast= The weather for %s will be:\n %s Thank you for using our Weather Bot.
weatherCurrent= The weather for %s will be:\n %s Thank you for using our Weather Bot.
cityNotFound= City not found
errorFetchingWeather= We are sorry, there was an error fetching the weather.
currentWeatherPart= |-- Weather: %s\n|-- Cloudiness: %s\n |-- Temperature: %s ºC\n\n
forecastWeatherPart= * On %s \n\t|--Forecast: %s\n\t|--High temperature: %s ºC\n\t|--Low temperature: %s ºC\n\n
Loading…
Cancel
Save