Browse Source

1. Several fixes

master
Rubenlagu 11 years ago
committed by Rubenlagus
parent
commit
a8c6a622fc
  1. 451
      .idea/workspace.xml
  2. 5
      src/main/java/org/telegram/SenderHelper.java
  3. 234
      src/main/java/org/telegram/services/BotLogger.java
  4. 45
      src/main/java/org/telegram/services/DirectionsService.java
  5. 72
      src/main/java/org/telegram/services/WeatherService.java
  6. 9
      src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java
  7. 25
      src/main/java/org/telegram/updateshandlers/WeatherHandlers.java
  8. 42
      src/main/java/org/telegram/updatesreceivers/UpdatesThread.java

451
.idea/workspace.xml

@ -3,14 +3,15 @@
<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="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/services/BotLogger.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.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/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/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/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/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/api/Message.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/api/Message.java" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/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/updatesreceivers/UpdatesThread.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/main/java/org/telegram/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/updatesreceivers/Webhook.java" afterPath="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.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" />
@ -39,75 +40,62 @@
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.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="50" column="0" selection-start-line="50" selection-start-column="0" selection-end-line="50" selection-end-column="0" /> <caret line="173" column="0" selection-start-line="173" selection-start-column="0" selection-end-line="173" selection-end-column="0" />
<folding> <folding />
<element signature="e#1815#1816#0" expanded="true" />
<element signature="e#1861#1862#0" expanded="true" />
</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="2662015.log" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Main.java"> <entry file="file://$PROJECT_DIR$/2662015.log">
<provider selected="true" editor-type-id="text-editor"> <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
<state vertical-scroll-proportion="0.0"> <state />
<caret line="8" column="39" selection-start-line="8" selection-start-column="39" selection-end-line="8" selection-end-column="39" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider> </provider>
</entry>
</file>
<file leaf-file-name="UpdatesCallback.java" pinned="false" current-in-tab="false">
<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="0.0"> <state vertical-scroll-proportion="-7.827586">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" /> <caret line="1176" column="36" selection-start-line="1176" selection-start-column="36" selection-end-line="1176" selection-end-column="36" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="TransifexHandlers.java" pinned="false" current-in-tab="false"> <file leaf-file-name="BotConfig.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.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.0"> <state vertical-scroll-proportion="0.0">
<caret line="21" column="59" selection-start-line="21" selection-start-column="59" selection-end-line="21" selection-end-column="59" /> <caret line="9" column="91" selection-start-line="9" selection-start-column="47" selection-end-line="9" selection-end-column="91" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="FilesHandlers.java" pinned="false" current-in-tab="false"> <file leaf-file-name="Main.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.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.0"> <state vertical-scroll-proportion="0.0">
<caret line="25" column="55" selection-start-line="25" selection-start-column="55" selection-end-line="25" selection-end-column="55" /> <caret line="15" column="0" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
<folding> <folding>
<element signature="e#1443#1444#0" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#1483#1484#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="DirectionsHandlers.java" pinned="false" current-in-tab="false"> <file leaf-file-name="UpdatesThread.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.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.0"> <state vertical-scroll-proportion="0.14285715">
<caret line="31" column="51" selection-start-line="31" selection-start-column="51" selection-end-line="31" selection-end-column="51" /> <caret line="107" column="46" selection-start-line="107" selection-start-column="46" selection-end-line="107" selection-end-column="46" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Webhook.java" pinned="false" current-in-tab="true"> <file leaf-file-name="Update.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Update.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.5396419"> <state vertical-scroll-proportion="0.0">
<caret line="54" column="30" selection-start-line="54" selection-start-column="30" selection-end-line="54" selection-end-column="30" /> <caret line="43" column="0" selection-start-line="43" selection-start-column="0" selection-end-line="43" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -147,9 +135,6 @@
<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/services/BotLogger.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/database/ConectionDB.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/UpdatesCallback.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/ReplyKeyboard.java" /> <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/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" />
@ -181,23 +166,26 @@
<option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Chat.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/api/Chat.java" />
<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/SenderHelper.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/CustomMessages.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/WeatherService.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/DirectionsService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.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/BotConfig.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/Main.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/WeatherHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java" /> <option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.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/services/DirectionsService.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$/src/main/java/org/telegram/services/WeatherService.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUpdates.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java" />
<option value="$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java" />
</list> </list>
</option> </option>
</component> </component>
@ -916,7 +904,7 @@
<workItem from="1435083767937" duration="474000" /> <workItem from="1435083767937" duration="474000" />
<workItem from="1435087589530" duration="13495000" /> <workItem from="1435087589530" duration="13495000" />
<workItem from="1435164520307" duration="6553000" /> <workItem from="1435164520307" duration="6553000" />
<workItem from="1435251996845" duration="4274000" /> <workItem from="1435251996845" duration="12801000" />
</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>
@ -1032,11 +1020,17 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1435253672379</updated> <updated>1435253672379</updated>
</task> </task>
<option name="localTasksCounter" value="20" /> <task id="LOCAL-00020" summary="1. Fix webhooks, they only allow port 443">
<created>1435262669527</created>
<option name="number" value="00020" />
<option name="project" value="LOCAL" />
<updated>1435262669527</updated>
</task>
<option name="localTasksCounter" value="21" />
<servers /> <servers />
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="95587000" /> <option name="totallyTimeSpent" value="104114000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
@ -1062,7 +1056,7 @@
<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="true" weight="0.39971346" sideWeight="0.4939577" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Debug" active="false" 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" />
@ -1139,14 +1133,15 @@
<MESSAGE value="1. Support for webhooks" /> <MESSAGE value="1. Support for webhooks" />
<MESSAGE value="1. Fix JSON deserialization" /> <MESSAGE value="1. Fix JSON deserialization" />
<MESSAGE value="1. Several fixes" /> <MESSAGE value="1. Several fixes" />
<option name="LAST_COMMIT_MESSAGE" value="1. Several fixes" /> <MESSAGE value="1. Fix webhooks, they only allow port 443" />
<option name="LAST_COMMIT_MESSAGE" value="1. Fix webhooks, they only allow port 443" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
<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>124</line> <line>130</line>
<properties /> <properties />
<option name="timeStamp" value="36" /> <option name="timeStamp" value="36" />
</line-breakpoint> </line-breakpoint>
@ -1156,12 +1151,6 @@
<properties /> <properties />
<option name="timeStamp" value="68" /> <option name="timeStamp" value="68" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/Webhook.java</url>
<line>59</line>
<properties />
<option name="timeStamp" value="83" />
</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/services/TransifexService.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.java</url>
<line>321</line> <line>321</line>
@ -1169,89 +1158,43 @@
<option name="timeStamp" value="84" /> <option name="timeStamp" value="84" />
</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/DirectionsHandlers.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java</url>
<line>47</line> <line>128</line>
<properties /> <properties />
<option name="timeStamp" value="86" /> <option name="timeStamp" value="101" />
</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/SenderHelper.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java</url>
<line>38</line> <line>113</line>
<properties /> <properties />
<option name="timeStamp" value="87" /> <option name="timeStamp" value="134" />
</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/SenderHelper.java</url> <url>file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/UpdatesThread.java</url>
<line>55</line> <line>107</line>
<properties /> <properties />
<option name="timeStamp" value="88" /> <option name="timeStamp" value="135" />
</line-breakpoint> </line-breakpoint>
</breakpoints> </breakpoints>
<breakpoints-dialog> <breakpoints-dialog>
<breakpoints-dialog /> <breakpoints-dialog />
</breakpoints-dialog> </breakpoints-dialog>
<option name="time" value="89" /> <option name="time" value="136" />
</breakpoint-manager> </breakpoint-manager>
<watches-manager /> <watches-manager>
<configuration name="Application">
<watch expression="" />
<watch expression="message.getFrom()" language="JAVA" custom="" />
<watch expression="jsonArray.length()" language="JAVA" custom="" />
<watch expression="updates.size()" language="JAVA" custom="" />
</configuration>
</watches-manager>
</component> </component>
<component name="antWorkspaceConfiguration"> <component name="antWorkspaceConfiguration">
<option name="IS_AUTOSCROLL_TO_SOURCE" value="false" /> <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
<option name="FILTER_TARGETS" value="false" /> <option name="FILTER_TARGETS" value="false" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/lang/Class.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.33248082">
<caret line="347" column="52" selection-start-line="347" selection-start-column="52" selection-end-line="347" selection-end-column="52" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.6930946">
<caret line="82" column="21" selection-start-line="82" selection-start-column="21" selection-end-line="82" selection-end-column="21" />
<folding />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/glassfish/grizzly/grizzly-framework/2.3.19/grizzly-framework-2.3.19-sources.jar!/org/glassfish/grizzly/ssl/SSLEngineConfigurator.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.83120203">
<caret line="176" column="0" selection-start-line="176" selection-start-column="0" selection-end-line="176" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/net/URI.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="2847" column="0" selection-start-line="2847" selection-start-column="0" selection-end-line="2847" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/Commands.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="41" column="84" selection-start-line="41" selection-start-column="74" selection-end-line="41" selection-end-column="84" />
<folding />
</state>
</provider>
</entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/rt.jar!/sun/nio/ch/KQueueArrayWrapper.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-4.814815">
<caret line="138" column="23" selection-start-line="138" selection-start-column="23" selection-end-line="138" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5/httpclient-4.5.jar!/org/apache/http/impl/client/CloseableHttpClient.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-4.814815">
<caret line="41" column="0" selection-start-line="41" selection-start-column="0" selection-end-line="41" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/methods/Constants.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/methods/Constants.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">
@ -1405,16 +1348,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Update.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.58056265">
<caret line="29" column="31" selection-start-line="29" selection-start-column="31" selection-end-line="29" selection-end-column="31" />
<folding>
<element signature="imports" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/User.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/User.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="1.3810742"> <state vertical-scroll-proportion="1.3810742">
@ -1450,14 +1383,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.03409091">
<caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/CustomMessages.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/CustomMessages.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">
@ -1466,38 +1391,6 @@
</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">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.41964287">
<caret line="198" column="6" selection-start-line="198" selection-start-column="6" selection-end-line="198" selection-end-column="6" />
<folding />
</state>
</provider>
</entry>
<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">
<state vertical-scroll-proportion="-0.29166666">
<caret line="355" column="13" selection-start-line="355" selection-start-column="13" selection-end-line="355" selection-end-column="13" />
<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.58035713">
<caret line="208" column="32" selection-start-line="208" selection-start-column="32" selection-end-line="208" selection-end-column="32" />
<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>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/TransifexService.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.24107143"> <state vertical-scroll-proportion="0.24107143">
@ -1523,132 +1416,248 @@
</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/RestApi.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.12895928"> <state vertical-scroll-proportion="0.0">
<caret line="90" column="0" selection-start-line="90" selection-start-column="0" selection-end-line="90" selection-end-column="0" /> <caret line="14" column="7" selection-start-line="14" selection-start-column="7" selection-end-line="14" selection-end-column="7" />
<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/api/Message.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.2173913">
<caret line="15" column="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="6" /> <caret line="109" column="35" selection-start-line="109" selection-start-column="35" selection-end-line="109" selection-end-column="35" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updatesreceivers/RestApi.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/PhotoSize.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.33248082">
<caret line="14" column="7" selection-start-line="14" selection-start-column="7" selection-end-line="14" selection-end-column="7" /> <caret line="36" column="0" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/Message.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.2173913"> <state vertical-scroll-proportion="0.65473145">
<caret line="109" column="35" selection-start-line="109" selection-start-column="35" selection-end-line="109" selection-end-column="35" /> <caret line="57" column="0" selection-start-line="57" selection-start-column="0" selection-end-line="57" selection-end-column="0" />
<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/updateshandlers/FilesHandlers.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.769821"> <state vertical-scroll-proportion="0.30690536">
<caret line="62" column="13" selection-start-line="62" selection-start-column="13" selection-end-line="62" selection-end-column="13" /> <caret line="25" column="55" selection-start-line="25" selection-start-column="55" selection-end-line="25" selection-end-column="55" />
<folding> <folding>
<element signature="e#1766#1781#0" expanded="true" /> <element signature="e#1443#1444#0" expanded="false" />
<element signature="e#1483#1484#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/TransifexHandlers.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.46035805">
<caret line="21" column="59" selection-start-line="21" selection-start-column="59" selection-end-line="21" selection-end-column="59" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/UpdatesCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.46035805">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/DirectionsService.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.37084398"> <state vertical-scroll-proportion="0.0">
<caret line="69" column="0" selection-start-line="69" selection-start-column="0" selection-end-line="69" selection-end-column="0" /> <caret line="70" column="9" selection-start-line="70" selection-start-column="9" selection-end-line="70" selection-end-column="9" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/api/PhotoSize.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.33248082"> <state vertical-scroll-proportion="0.33248082">
<caret line="36" column="0" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" /> <caret line="198" column="6" selection-start-line="198" selection-start-column="6" selection-end-line="198" selection-end-column="6" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/BuildVars.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.3836317"> <state vertical-scroll-proportion="0.40920717">
<caret line="10" column="50" selection-start-line="10" selection-start-column="50" selection-end-line="10" selection-end-column="50" /> <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://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5/httpclient-4.5.jar!/org/apache/http/impl/client/HttpClientBuilder.class">
<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="-1.0851648">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" /> <caret line="164" column="36" selection-start-line="164" selection-start-column="36" selection-end-line="164" selection-end-column="36" />
<folding /> <folding>
<element signature="e#7865#7866#0" expanded="true" />
<element signature="e#7911#7912#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/DirectionsHandlers.java"> <entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/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="31" column="51" selection-start-line="31" selection-start-column="51" selection-end-line="31" selection-end-column="51" /> <caret line="103" column="46" selection-start-line="103" selection-start-column="46" selection-end-line="103" selection-end-column="46" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/FilesHandlers.java"> <entry file="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5/httpclient-4.5.jar!/org/apache/http/impl/client/CloseableHttpClient.class">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-3.3333333">
<caret line="27" column="22" selection-start-line="27" selection-start-column="22" selection-end-line="27" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5/httpclient-4.5-sources.jar!/org/apache/http/impl/client/CloseableHttpClient.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.3318182">
<caret line="55" column="22" selection-start-line="55" selection-start-column="22" selection-end-line="55" selection-end-column="22" />
<folding />
</state>
</provider>
</entry>
<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.0"> <state vertical-scroll-proportion="0.0">
<caret line="25" column="55" selection-start-line="25" selection-start-column="55" selection-end-line="25" selection-end-column="55" /> <caret line="15" column="0" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
<folding> <folding>
<element signature="e#1443#1444#0" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#1483#1484#0" expanded="true" />
</folding> </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/api/Update.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="21" column="59" selection-start-line="21" selection-start-column="59" selection-end-line="21" selection-end-column="59" /> <caret line="43" column="0" selection-start-line="43" selection-start-column="0" selection-end-line="43" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/updateshandlers/WeatherHandlers.java"> <entry file="jar:///Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/src.zip!/java/util/logging/Level.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.7928389">
<caret line="50" column="0" selection-start-line="50" selection-start-column="0" selection-end-line="50" selection-end-column="0" /> <caret line="156" column="30" selection-start-line="156" selection-start-column="30" selection-end-line="156" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<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">
<state vertical-scroll-proportion="0.33248082">
<caret line="1514" column="0" selection-start-line="1514" selection-start-column="0" selection-end-line="1514" selection-end-column="0" />
<folding> <folding>
<element signature="e#1815#1816#0" expanded="true" /> <element signature="e#65752#65753#0" expanded="false" />
<element signature="e#1861#1862#0" expanded="true" />
</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/BuildVars.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.16624041">
<caret line="9" column="45" selection-start-line="9" selection-start-column="45" selection-end-line="9" selection-end-column="45" />
<folding />
</state>
</provider>
</entry>
<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.0"> <state vertical-scroll-proportion="0.0">
<caret line="8" column="39" selection-start-line="8" selection-start-column="39" selection-end-line="8" selection-end-column="39" /> <caret line="9" column="91" selection-start-line="9" selection-start-column="47" selection-end-line="9" selection-end-column="91" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/services/BotLogger.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.71611255">
<caret line="67" column="33" selection-start-line="67" selection-start-column="33" selection-end-line="67" selection-end-column="33" />
<folding> <folding>
<element signature="imports" expanded="true" /> <element signature="imports" expanded="true" />
<element signature="e#3005#3006#0" expanded="true" />
<element signature="e#3032#3033#0" expanded="true" />
</folding> </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">
<state vertical-scroll-proportion="-7.827586">
<caret line="1176" column="36" selection-start-line="1176" selection-start-column="36" selection-end-line="1176" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/SenderHelper.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-0.4961637">
<caret line="58" column="82" selection-start-line="58" selection-start-column="12" selection-end-line="58" selection-end-column="82" />
<folding>
<element signature="e#1902#1917#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/org/telegram/methods/GetUpdates.java">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.7314578">
<caret line="29" column="27" selection-start-line="29" selection-start-column="27" selection-end-line="29" selection-end-column="27" />
<folding>
<element signature="e#1592#1593#0" expanded="true" />
<element signature="e#1649#1650#0" expanded="true" />
</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.25575447">
<caret line="80" column="0" selection-start-line="80" selection-start-column="0" selection-end-line="80" 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>
</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="173" column="0" selection-start-line="173" selection-start-column="0" selection-end-line="173" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<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.5396419"> <state vertical-scroll-proportion="0.14285715">
<caret line="54" column="30" selection-start-line="54" selection-start-column="30" selection-end-line="54" selection-end-column="30" /> <caret line="107" column="46" selection-start-line="107" selection-start-column="46" selection-end-line="107" selection-end-column="46" />
<folding /> <folding />
</state> </state>
</provider> </provider>

5
src/main/java/org/telegram/SenderHelper.java

@ -20,6 +20,7 @@ import org.telegram.methods.Constants;
import org.telegram.methods.SendDocument; import org.telegram.methods.SendDocument;
import org.telegram.methods.SendMessage; import org.telegram.methods.SendMessage;
import org.telegram.methods.SetWebhook; import org.telegram.methods.SetWebhook;
import org.telegram.services.BotLogger;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -34,6 +35,8 @@ import java.util.List;
* @date 20 of June of 2015 * @date 20 of June of 2015
*/ */
public class SenderHelper { public class SenderHelper {
private static volatile BotLogger log = BotLogger.getLogger(SenderHelper.class.getName());
public static Message SendMessage(SendMessage message, String botToken) { public static Message SendMessage(SendMessage message, String botToken) {
try { try {
CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
@ -54,6 +57,8 @@ public class SenderHelper {
nameValuePairs.add(new BasicNameValuePair(SendMessage.REPLYTOMESSAGEID_FIELD, message.getReplayToMessageId().toString())); nameValuePairs.add(new BasicNameValuePair(SendMessage.REPLYTOMESSAGEID_FIELD, message.getReplayToMessageId().toString()));
} }
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
log.warning(httppost.toString());
log.warning(nameValuePairs.toString());
CloseableHttpResponse response = httpclient.execute(httppost); CloseableHttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity(); HttpEntity ht = response.getEntity();

234
src/main/java/org/telegram/services/BotLogger.java

@ -1,79 +1,89 @@
package org.telegram.services; package org.telegram.services;
import com.apple.concurrent.Dispatch;
import org.telegram.BuildVars; import org.telegram.BuildVars;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.*; import java.io.*;
import java.time.LocalDateTime; import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
/** /**
* @author Ruben Bermudez * @author Ruben Bermudez
* @version 2.0 * @version 1.0
* @brief Logger to file * @brief Logger
* @date 21/01/15 * @date 21/01/15
*/ */
public class BotLogger { public class BotLogger {
private static final Object lockToWrite = new Object(); private volatile Object lockToWrite = new Object();
private final Logger logger;
private static volatile PrintWriter logginFile; private static volatile PrintWriter logginFile;
private Calendar lastFileDate;
private static volatile String currentFileName; private static volatile String currentFileName;
private static LoggerThread loggerThread = new LoggerThread();
private static volatile ConcurrentHashMap<String, BotLogger> instances = new ConcurrentHashMap<>(); private static volatile ConcurrentHashMap<String, BotLogger> instances = new ConcurrentHashMap<>();
private final Logger logger; private final static ConcurrentLinkedQueue<String> logsToFile = new ConcurrentLinkedQueue<>();
private LocalDateTime lastFileDate;
private BotLogger(String classname) { static {
this.logger = Logger.getLogger(classname);
this.logger.setLevel(Level.ALL);
this.lastFileDate = LocalDateTime.now();
if (currentFileName == null || currentFileName.compareTo("") == 0) {
currentFileName = BuildVars.pathToLogs + dateFormatterForFileName(this.lastFileDate) + ".log";
try {
File file = new File(currentFileName);
if (file.exists()) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} else {
boolean created = file.createNewFile();
if (created) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} else {
throw new NullPointerException("File for loggin error");
}
}
} catch (IOException ignored) {
}
} loggerThread.start();
} }
public static BotLogger getLogger(@NotNull String className) { public static BotLogger getLogger(@NotNull String className) {
BotLogger currentInstance; if (!instances.containsKey(className)) {
if (instances.containsKey(className)) {
currentInstance = instances.get(className);
} else {
synchronized (BotLogger.class) { synchronized (BotLogger.class) {
if (instances.containsKey(className)) { if (!instances.containsKey(className)) {
currentInstance = instances.get(className);
} else {
BotLogger instance = new BotLogger(className); BotLogger instance = new BotLogger(className);
instances.put(className, instance); instances.put(className, instance);
currentInstance = instance; return instance;
} else {
return instances.get(className);
} }
} }
} else {
return instances.get(className);
}
} }
return currentInstance; private BotLogger(String classname) {
logger = Logger.getLogger(classname);
logger.setLevel(Level.WARNING);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
lastFileDate = new GregorianCalendar();
if (currentFileName == null || currentFileName.length() == 0) {
currentFileName = BuildVars.pathToLogs + dateFormaterForFileName(lastFileDate) + ".log";
try {
File file = new File(currentFileName);
if (!file.exists()) {
file.createNewFile();
}
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}
}
public void log(@NotNull Level level, String msg) { public void log(@NotNull Level level, String msg) {
this.logger.log(level, msg); logger.log(level, msg);
logToFile(level, msg); logToFile(level, msg);
} }
public void severe(String msg) { public void severe(String msg) {
this.logger.severe(msg); logger.severe(msg);
logToFile(Level.SEVERE, msg); logToFile(Level.SEVERE, msg);
} }
@ -94,48 +104,48 @@ public class BotLogger {
} }
public void warning(String msg) { public void warning(String msg) {
this.logger.warning(msg); logger.warning(msg);
logToFile(Level.WARNING, msg); logToFile(Level.WARNING, msg);
} }
public void info(String msg) { public void info(String msg) {
this.logger.info(msg); logger.info(msg);
logToFile(Level.INFO, msg); logToFile(Level.INFO, msg);
} }
public void config(String msg) { public void config(String msg) {
this.logger.config(msg); logger.config(msg);
logToFile(Level.CONFIG, msg); logToFile(Level.CONFIG, msg);
} }
public void fine(String msg) { public void fine(String msg) {
this.logger.fine(msg); logger.fine(msg);
logToFile(Level.FINE, msg); logToFile(Level.FINE, msg);
} }
public void finer(String msg) { public void finer(String msg) {
this.logger.finer(msg); logger.finer(msg);
logToFile(Level.FINER, msg); logToFile(Level.FINER, msg);
} }
public void finest(String msg) { public void finest(String msg) {
this.logger.finest(msg); logger.finest(msg);
logToFile(Level.FINEST, msg); logToFile(Level.FINEST, msg);
} }
public void log(@NotNull Level level, @NotNull Throwable throwable) { public void log(@NotNull Level level, @NotNull Throwable throwable) {
this.logger.log(level, "Exception", throwable); throwable.printStackTrace();
logToFile(level, throwable); logToFile(level, throwable);
} }
public void log(@NotNull Level level, String msg, Throwable thrown) { public void log(@NotNull Level level, String msg, Throwable thrown) {
this.logger.log(level, msg, thrown); logger.log(level, msg, thrown);
logToFile(level, msg ,thrown); logToFile(level, msg ,thrown);
} }
@ -227,84 +237,94 @@ public class BotLogger {
log(Level.FINER, msg, throwable); log(Level.FINER, msg, throwable);
} }
private boolean isCurrentDate(LocalDateTime dateTime) { private boolean isCurrentDate(Calendar calendar) {
return dateTime.toLocalDate().isEqual(this.lastFileDate.toLocalDate()); if (calendar.get(Calendar.DAY_OF_MONTH) != lastFileDate.get(Calendar.DAY_OF_MONTH)) {
return false;
}
if (calendar.get(Calendar.MONTH) != lastFileDate.get(Calendar.MONTH)) {
return false;
}
if (calendar.get(Calendar.YEAR) != lastFileDate.get(Calendar.YEAR)) {
return false;
}
return true;
} }
private String dateFormatterForFileName(@NotNull LocalDateTime dateTime) { private String dateFormaterForFileName(@NotNull Calendar calendar) {
String dateString = ""; String dateString = "";
dateString += dateTime.getDayOfMonth(); dateString += calendar.get(Calendar.DAY_OF_MONTH);
dateString += dateTime.getMonthValue(); dateString += calendar.get(Calendar.MONTH) + 1;
dateString += dateTime.getYear(); dateString += calendar.get(Calendar.YEAR);
return dateString; return dateString;
} }
private String dateFormatterForLogs(@NotNull LocalDateTime dateTime) { private String dateFormaterForLogs(@NotNull Calendar calendar) {
String dateString = "["; String dateString = "[";
dateString += dateTime.getDayOfMonth() + "_"; dateString += calendar.get(Calendar.DAY_OF_MONTH) + "_";
dateString += dateTime.getMonthValue() + "_"; dateString += (calendar.get(Calendar.MONTH) + 1) + "_";
dateString += dateTime.getYear() + "_"; dateString += calendar.get(Calendar.YEAR) + "_";
dateString += dateTime.getHour() + ":"; dateString += calendar.get(Calendar.HOUR_OF_DAY) + "_";
dateString += dateTime.getMinute() + ":"; dateString += calendar.get(Calendar.MINUTE) + ":";
dateString += dateTime.getSecond(); dateString += calendar.get(Calendar.SECOND);
dateString += "] "; dateString += "] ";
return dateString; return dateString;
} }
private void updateAndCreateFile(LocalDateTime dateTime) { private void updateAndCreateFile(Calendar calendar) {
if (!isCurrentDate(dateTime)) { if (isCurrentDate(calendar)) {
this.lastFileDate = LocalDateTime.now(); return;
currentFileName = BuildVars.pathToLogs + dateFormatterForFileName(this.lastFileDate) + ".log"; }
lastFileDate = new GregorianCalendar();
currentFileName = BuildVars.pathToLogs + dateFormaterForFileName(lastFileDate) + ".log";
try { try {
logginFile.flush(); logginFile.flush();
logginFile.close(); logginFile.close();
File file = new File(currentFileName); File file = new File(currentFileName);
if (file.exists()) { if (!file.exists()) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true))); file.createNewFile();
} else {
boolean created = file.createNewFile();
if (created) {
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} else {
throw new NullPointerException("Error updating log file");
}
}
} catch (IOException ignored) {
} }
logginFile = new PrintWriter(new BufferedWriter(new FileWriter(currentFileName, true)));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
} }
private void logToFile(@NotNull Level level, Throwable throwable) { private void logToFile(@NotNull Level level, Throwable throwable) {
if (isLoggable(level)) { if (!isLoggable(level)){
return;
}
synchronized (lockToWrite) { synchronized (lockToWrite) {
LocalDateTime currentDate = LocalDateTime.now(); Calendar currentDate = new GregorianCalendar();
String dateForLog = dateFormatterForLogs(currentDate); String dateForLog = dateFormaterForLogs(currentDate);
updateAndCreateFile(currentDate); updateAndCreateFile(currentDate);
logThrowableToFile(level, throwable, dateForLog); logThrowableToFile(level, throwable, dateForLog);
} }
} }
}
private void logToFile(@NotNull Level level, String msg) { private void logToFile(@NotNull Level level, String msg) {
if (isLoggable(level)) { if (!isLoggable(level)){
return;
}
synchronized (lockToWrite) { synchronized (lockToWrite) {
LocalDateTime currentDate = LocalDateTime.now(); Calendar currentDate = new GregorianCalendar();
updateAndCreateFile(currentDate); updateAndCreateFile(currentDate);
String dateForLog = dateFormatterForLogs(currentDate); String dateForLog = dateFormaterForLogs(currentDate);
logMsgToFile(level, msg, dateForLog); logMsgToFile(level, msg, dateForLog);
} }
} }
}
private void logToFile(Level level, String msg, Throwable throwable) { private void logToFile(Level level, String msg, Throwable throwable) {
if (!isLoggable(level)){ if (!isLoggable(level)){
return; return;
} }
synchronized (lockToWrite) { synchronized (lockToWrite) {
LocalDateTime currentDate = LocalDateTime.now(); Calendar currentDate = new GregorianCalendar();
updateAndCreateFile(currentDate); updateAndCreateFile(currentDate);
String dateForLog = dateFormatterForLogs(currentDate); String dateForLog = dateFormaterForLogs(currentDate);
logMsgToFile(level, msg, dateForLog); logMsgToFile(level, msg, dateForLog);
logThrowableToFile(level, throwable, dateForLog); logThrowableToFile(level, throwable, dateForLog);
} }
@ -312,20 +332,25 @@ public class BotLogger {
private void logMsgToFile(Level level, String msg, String dateForLog) { private void logMsgToFile(Level level, String msg, String dateForLog) {
dateForLog += level.toString() + " - " + msg; dateForLog += level.toString() + " - " + msg;
logginFile.println(dateForLog); logsToFile.add(dateForLog);
logginFile.flush(); synchronized (logsToFile) {
logsToFile.notifyAll();
}
} }
private void logThrowableToFile(Level level, Throwable throwable, String dateForLog) { private void logThrowableToFile(Level level, Throwable throwable, String dateForLog) {
logginFile.println(dateForLog + level.getName() + " - " + throwable); String throwableLog = dateForLog + level.getName() + " - " + throwable + "\n";
for (StackTraceElement element : throwable.getStackTrace()) { for (StackTraceElement element : throwable.getStackTrace()) {
logginFile.println("\tat " + element); throwableLog += "\tat " + element + "\n";
}
logsToFile.add(throwableLog);
synchronized (logsToFile) {
logsToFile.notifyAll();
} }
logginFile.flush();
} }
private boolean isLoggable(Level level) { private boolean isLoggable(Level level) {
return this.logger.isLoggable(level) && BuildVars.debug; return logger.isLoggable(level) && BuildVars.debug;
} }
@Override @Override
@ -334,4 +359,33 @@ public class BotLogger {
logginFile.close(); logginFile.close();
super.finalize(); super.finalize();
} }
private static class LoggerThread extends Thread {
@Override
public void run() {
setPriority(Thread.MIN_PRIORITY);
while(true) {
ConcurrentLinkedQueue<String> stringsToLog = new ConcurrentLinkedQueue<>();
synchronized (logsToFile) {
if (logsToFile.isEmpty()) {
try {
logsToFile.wait();
} catch (InterruptedException e) {
return;
}
if (logsToFile.isEmpty()) {
continue;
}
}
stringsToLog.addAll(logsToFile);
logsToFile.clear();
}
for (String stringToLog: stringsToLog) {
logginFile.println(stringToLog);
}
logginFile.flush();
}
}
}
} }

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

@ -17,6 +17,8 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/** /**
* @author Ruben Bermudez * @author Ruben Bermudez
@ -64,8 +66,8 @@ public class DirectionsService {
* @param destination Destination address * @param destination Destination address
* @return Destinations * @return Destinations
*/ */
public String getDirections(String origin, String destination) { public List<String> getDirections(String origin, String destination) {
String responseToUser; 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;
HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
@ -79,20 +81,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);
responseToUser = route.getJSONArray("legs").getJSONObject(0).getString("start_address"); String partialResponseToUser;
responseToUser += " is "; partialResponseToUser = route.getJSONArray("legs").getJSONObject(0).getString("start_address");
responseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"); partialResponseToUser += " is ";
responseToUser += " away from "; partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text");
responseToUser += route.getJSONArray("legs").getJSONObject(0).getString("end_address"); // TODO Destination partialResponseToUser += " away from ";
responseToUser += " and it takes "; partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getString("end_address"); // TODO Destination
responseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text"); partialResponseToUser += " and it takes ";
responseToUser += " to arrive there following these directions:\n\n"; partialResponseToUser += route.getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text");
responseToUser += getDirectionsSteps(route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps")); partialResponseToUser += " to arrive there following these directions:\n\n";
responseToUser.add(partialResponseToUser);
responseToUser.addAll(getDirectionsSteps(route.getJSONArray("legs").getJSONObject(0).getJSONArray("steps")));
} else { } else {
responseToUser = "Directions not found between " + origin + " and " + destination; responseToUser.add("Directions not found between " + origin + " and " + destination);
} }
} catch (Exception e) { } catch (Exception e) {
responseToUser = "Error fetching weather info"; responseToUser.add("Error fetching weather info");
} }
return responseToUser; return responseToUser;
} }
@ -101,10 +105,19 @@ public class DirectionsService {
return URLEncoder.encode(address, "UTF-8"); return URLEncoder.encode(address, "UTF-8");
} }
private String getDirectionsSteps(JSONArray steps) { private List<String> getDirectionsSteps(JSONArray steps) {
String stepsStringify = ""; List<String> stepsStringify = new ArrayList<>();
String partialStepsStringify = "";
for (int i = 0; i < steps.length(); i++) { for (int i = 0; i < steps.length(); i++) {
stepsStringify += i + ".\t" + getDirectionForStep(steps.getJSONObject(i)) + "\n\n"; String step = getDirectionForStep(steps.getJSONObject(i));
if (partialStepsStringify.length() > 1000) {
stepsStringify.add(partialStepsStringify);
partialStepsStringify = "";
}
partialStepsStringify += i + ".\t" + step + "\n\n";
}
if (!partialStepsStringify.isEmpty()) {
stepsStringify.add(partialStepsStringify);
} }
return stepsStringify; return stepsStringify;
} }

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

@ -1,10 +1,15 @@
package org.telegram.services; package org.telegram.services;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject; import org.json.JSONObject;
import org.telegram.BuildVars; import org.telegram.BuildVars;
import org.telegram.database.DatabaseManager; import org.telegram.database.DatabaseManager;
@ -26,6 +31,7 @@ import java.time.format.DateTimeFormatter;
* @date 20 of June of 2015 * @date 20 of June of 2015
*/ */
public class WeatherService { public class WeatherService {
private static volatile BotLogger log = BotLogger.getLogger(WeatherService.class.getName());
private static final String BASEURL = "http://api.openweathermap.org/data/2.5/"; ///< Base url for REST private static final String BASEURL = "http://api.openweathermap.org/data/2.5/"; ///< Base url for REST
private static final String FORECASTPATH = "forecast/daily"; private static final String FORECASTPATH = "forecast/daily";
private static final String CURRENTPATH = "weather"; private static final String CURRENTPATH = "weather";
@ -73,17 +79,17 @@ public class WeatherService {
String responseToUser; String responseToUser;
try { try {
String completURL = BASEURL + FORECASTPATH + "?" + getCityQuery(city) + FORECASTPARAMS + APIIDEND; String completURL = BASEURL + FORECASTPATH + "?" + getCityQuery(city) + FORECASTPARAMS + APIIDEND;
HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
HttpGet request = new HttpGet(completURL); HttpGet request = new HttpGet(completURL);
HttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); CloseableHttpResponse response = client.execute(request);
String line; HttpEntity ht = response.getEntity();
String responseString = "";
while ((line = rd.readLine()) != null) { BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseString += line; String responseString = EntityUtils.toString(buf, "UTF-8");
}
JSONObject jsonObject = new JSONObject(responseString); JSONObject jsonObject = new JSONObject(responseString);
log.warning(jsonObject.toString());
if (jsonObject.getInt("cod") == 200) { if (jsonObject.getInt("cod") == 200) {
cityFound = jsonObject.getJSONObject("city").getString("name") + " (" + cityFound = jsonObject.getJSONObject("city").getString("name") + " (" +
jsonObject.getJSONObject("city").getString("country") + ")"; jsonObject.getJSONObject("city").getString("country") + ")";
@ -93,9 +99,11 @@ public class WeatherService {
responseToUser += "Thank you for using our Weather Bot.\n\n" + responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team"; "Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = "City not found";
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = "Error fetching weather info";
} }
return responseToUser; return responseToUser;
@ -112,15 +120,13 @@ public class WeatherService {
String responseToUser; String responseToUser;
try { try {
String completURL = BASEURL + FORECASTPATH + "?lat=" + URLEncoder.encode(latitude + "", "UTF-8") + "&lon=" + URLEncoder.encode(longitude + "", "UTF-8") + FORECASTPARAMS + APIIDEND;; String completURL = BASEURL + FORECASTPATH + "?lat=" + URLEncoder.encode(latitude + "", "UTF-8") + "&lon=" + URLEncoder.encode(longitude + "", "UTF-8") + FORECASTPARAMS + APIIDEND;;
HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
HttpGet request = new HttpGet(completURL); HttpGet request = new HttpGet(completURL);
HttpResponse response = client.execute(request); CloseableHttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); HttpEntity ht = response.getEntity();
String line;
String responseString = ""; BufferedHttpEntity buf = new BufferedHttpEntity(ht);
while ((line = rd.readLine()) != null) { String responseString = EntityUtils.toString(buf, "UTF-8");
responseString += line;
}
JSONObject jsonObject = new JSONObject(responseString); JSONObject jsonObject = new JSONObject(responseString);
if (jsonObject.getInt("cod") == 200) { if (jsonObject.getInt("cod") == 200) {
@ -132,9 +138,11 @@ public class WeatherService {
responseToUser += "Thank you for using our Weather Bot.\n\n" + responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team"; "Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = "City not found";
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = "Error fetching weather info";
} }
return responseToUser; return responseToUser;
@ -152,15 +160,13 @@ public class WeatherService {
String responseToUser; String responseToUser;
try { try {
String completURL = BASEURL + CURRENTPATH + "?" + getCityQuery(city) + CURRENTPARAMS + APIIDEND; String completURL = BASEURL + CURRENTPATH + "?" + getCityQuery(city) + CURRENTPARAMS + APIIDEND;
HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
HttpGet request = new HttpGet(completURL); HttpGet request = new HttpGet(completURL);
HttpResponse response = client.execute(request); CloseableHttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); HttpEntity ht = response.getEntity();
String line;
String responseString = ""; BufferedHttpEntity buf = new BufferedHttpEntity(ht);
while ((line = rd.readLine()) != null) { String responseString = EntityUtils.toString(buf, "UTF-8");
responseString += line;
}
JSONObject jsonObject = new JSONObject(responseString); JSONObject jsonObject = new JSONObject(responseString);
if (jsonObject.getInt("cod") == 200) { if (jsonObject.getInt("cod") == 200) {
@ -172,9 +178,11 @@ public class WeatherService {
responseToUser += "Thank you for using our Weather Bot.\n\n" + responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team"; "Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = "City not found";
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = "Error fetching weather info";
} }
return responseToUser; return responseToUser;
@ -191,15 +199,13 @@ public class WeatherService {
String responseToUser; String responseToUser;
try { try {
String completURL = BASEURL + CURRENTPATH + "?q=" + URLEncoder.encode("lat=" + latitude + "&lon=" + longitude, "UTF-8") + CURRENTPARAMS + APIIDEND;; String completURL = BASEURL + CURRENTPATH + "?q=" + URLEncoder.encode("lat=" + latitude + "&lon=" + longitude, "UTF-8") + CURRENTPARAMS + APIIDEND;;
HttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient client = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
HttpGet request = new HttpGet(completURL); HttpGet request = new HttpGet(completURL);
HttpResponse response = client.execute(request); CloseableHttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); HttpEntity ht = response.getEntity();
String line;
String responseString = ""; BufferedHttpEntity buf = new BufferedHttpEntity(ht);
while ((line = rd.readLine()) != null) { String responseString = EntityUtils.toString(buf, "UTF-8");
responseString += line;
}
JSONObject jsonObject = new JSONObject(responseString); JSONObject jsonObject = new JSONObject(responseString);
if (jsonObject.getInt("cod") == 200) { if (jsonObject.getInt("cod") == 200) {
@ -211,9 +217,11 @@ public class WeatherService {
responseToUser += "Thank you for using our Weather Bot.\n\n" + responseToUser += "Thank you for using our Weather Bot.\n\n" +
"Your Telegram Team"; "Your Telegram Team";
} else { } else {
log.warning(jsonObject.toString());
responseToUser = "City not found"; responseToUser = "City not found";
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e);
responseToUser = "Error fetching weather info"; responseToUser = "Error fetching weather info";
} }
return responseToUser; return responseToUser;

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

@ -89,15 +89,18 @@ public class DirectionsHandlers implements UpdatesCallback {
DatabaseManager.getInstance().getUserDestinationMessageId(message.getFrom().getId()) == message.getReplyToMessage().getMessageId()) { 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();
String directions = DirectionsService.getInstance().getDirections(origin, destiny); List<String> directions = DirectionsService.getInstance().getDirections(origin, destiny);
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide(); ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true); replyKeyboardHide.setSelective(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide); sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(message.getMessageId()); sendMessageRequest.setReplayToMessageId(message.getMessageId());
sendMessageRequest.setText(directions); Message sentMessage = null;
Message sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN); for (String direction: directions) {
sendMessageRequest.setText(direction);
sentMessage = SenderHelper.SendMessage(sendMessageRequest, TOKEN);
}
if (sentMessage != null) { if (sentMessage != null) {
DatabaseManager.getInstance().deleteUserForDirections(message.getFrom().getId()); DatabaseManager.getInstance().deleteUserForDirections(message.getFrom().getId());
} }

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

@ -1,10 +1,7 @@
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.ReplyKeyboardMarkup;
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.BotLogger; import org.telegram.services.BotLogger;
@ -64,6 +61,11 @@ public class WeatherHandlers implements UpdatesCallback {
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());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true);
replyKeyboardHide.setHideKeyboard(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId());
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
@ -105,6 +107,11 @@ public class WeatherHandlers implements UpdatesCallback {
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());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true);
replyKeyboardHide.setHideKeyboard(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId());
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
@ -150,6 +157,11 @@ public class WeatherHandlers implements UpdatesCallback {
String weather = WeatherService.getInstance().fetchWeatherForecast(message.getText(), message.getFrom().getId()); String weather = WeatherService.getInstance().fetchWeatherForecast(message.getText(), message.getFrom().getId());
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
} }
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true);
replyKeyboardHide.setHideKeyboard(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId());
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);
} else if (parts[0].startsWith(Commands.help) || } else if (parts[0].startsWith(Commands.help) ||
@ -163,6 +175,11 @@ public class WeatherHandlers implements UpdatesCallback {
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());
SendMessage sendMessageRequest = new SendMessage(); SendMessage sendMessageRequest = new SendMessage();
ReplyKeyboardHide replyKeyboardHide = new ReplyKeyboardHide();
replyKeyboardHide.setSelective(true);
replyKeyboardHide.setHideKeyboard(true);
sendMessageRequest.setReplayMarkup(replyKeyboardHide);
sendMessageRequest.setReplayToMessageId(update.getMessage().getMessageId());
sendMessageRequest.setText(weather); sendMessageRequest.setText(weather);
sendMessageRequest.setChatId(message.getChatId()); sendMessageRequest.setChatId(message.getChatId());
SenderHelper.SendMessage(sendMessageRequest, TOKEN); SenderHelper.SendMessage(sendMessageRequest, TOKEN);

42
src/main/java/org/telegram/updatesreceivers/UpdatesThread.java

@ -1,12 +1,17 @@
package org.telegram.updatesreceivers; package org.telegram.updatesreceivers;
import jdk.internal.org.objectweb.asm.Handle;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@ -15,6 +20,8 @@ import org.telegram.BuildVars;
import org.telegram.api.Update; import org.telegram.api.Update;
import org.telegram.methods.Constants; import org.telegram.methods.Constants;
import org.telegram.methods.GetUpdates; import org.telegram.methods.GetUpdates;
import org.telegram.methods.SendMessage;
import org.telegram.services.BotLogger;
import org.telegram.updateshandlers.UpdatesCallback; import org.telegram.updateshandlers.UpdatesCallback;
import java.io.IOException; import java.io.IOException;
@ -32,6 +39,8 @@ import java.util.concurrent.ConcurrentLinkedQueue;
* @date 20 of June of 2015 * @date 20 of June of 2015
*/ */
public class UpdatesThread { public class UpdatesThread {
private static volatile BotLogger log = BotLogger.getLogger(UpdatesThread.class.getName());
private final UpdatesCallback callback; private final UpdatesCallback callback;
private final ReaderThread readerThread; private final ReaderThread readerThread;
private final HandlerThread handlerThread; private final HandlerThread handlerThread;
@ -52,17 +61,27 @@ public class UpdatesThread {
private class ReaderThread extends Thread { private class ReaderThread extends Thread {
@Override @Override
public void run() { public void run() {
setPriority(Thread.MIN_PRIORITY);
while(true) { while(true) {
GetUpdates request = new GetUpdates(); GetUpdates request = new GetUpdates();
request.setLimit(100);
request.setOffset(lastReceivedUpdate + 1); request.setOffset(lastReceivedUpdate + 1);
CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); CloseableHttpClient httpclient = HttpClientBuilder.create().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
String url = Constants.BASEURL + token + "/" + GetUpdates.PATH; String url = Constants.BASEURL + token + "/" + GetUpdates.PATH;
HttpGet httpGet = new HttpGet(url + request.getUrlParams()); HttpPost httpPost = new HttpPost(url);
httpGet.addHeader("Content-type", "application/x-www-form-urlencoded"); List<NameValuePair> nameValuePairs = new ArrayList<>();
httpGet.addHeader("charset", "UTF-8"); nameValuePairs.add(new BasicNameValuePair(GetUpdates.OFFSET_FIELD, "0"));
HttpResponse response; nameValuePairs.add(new BasicNameValuePair(GetUpdates.LIMIT_FIELD, request.getLimit()+""));
if (request.getTimeout() != null) {
nameValuePairs.add(new BasicNameValuePair(GetUpdates.TIMEOUT_FIELD, request.getTimeout()+""));
}
try { try {
response = httpclient.execute(httpGet); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
httpPost.addHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.addHeader("charset", "UTF-8");
HttpResponse response;
log.debug(httpPost.toString());
response = httpclient.execute(httpPost);
HttpEntity ht = response.getEntity(); HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht); BufferedHttpEntity buf = new BufferedHttpEntity(ht);
@ -74,8 +93,9 @@ public class UpdatesThread {
throw new InvalidObjectException(jsonObject.toString()); throw new InvalidObjectException(jsonObject.toString());
} }
JSONArray jsonArray = jsonObject.getJSONArray("result"); JSONArray jsonArray = jsonObject.getJSONArray("result");
log.debug(jsonArray.toString());
if (jsonArray.length() != 0) { if (jsonArray.length() != 0) {
List<Update> updates = new ArrayList<Update>(); List<Update> updates = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) { for (int i = 0; i < jsonArray.length(); i++) {
Update update = new Update(jsonArray.getJSONObject(i)); Update update = new Update(jsonArray.getJSONObject(i));
if (update.getUpdateId() > lastReceivedUpdate) { if (update.getUpdateId() > lastReceivedUpdate) {
@ -84,8 +104,8 @@ public class UpdatesThread {
updates.add(update); updates.add(update);
} }
receivedUpdates.addAll(updates);
synchronized (receivedUpdates) { synchronized (receivedUpdates) {
receivedUpdates.addAll(updates);
receivedUpdates.notifyAll(); receivedUpdates.notifyAll();
} }
} else { } else {
@ -99,14 +119,7 @@ public class UpdatesThread {
} }
} }
} catch (JSONException e) { } catch (JSONException e) {
try {
synchronized (this) {
this.wait(500);
}
} catch (InterruptedException e1) {
e.printStackTrace(); e.printStackTrace();
continue;
}
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -118,6 +131,7 @@ public class UpdatesThread {
private class HandlerThread extends Thread { private class HandlerThread extends Thread {
@Override @Override
public void run() { public void run() {
setPriority(Thread.MIN_PRIORITY);
while(true) { while(true) {
Update update = receivedUpdates.poll(); Update update = receivedUpdates.poll();
if (update == null) { if (update == null) {

Loading…
Cancel
Save