Implemented basics of checking with czech post. Solved ssl problems and user-agent.

This commit is contained in:
Pavel Kachalouski
2018-10-24 23:25:15 +02:00
parent 08fc3f82e1
commit 197c808cfd
8 changed files with 178 additions and 195 deletions

View File

@@ -1,133 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="delivery-checker-bot-build [file:/home/nnm/development/telegram-bot1/]" external.linked.project.path="$MODULE_DIR$/../../delivery-checker-bot/project" external.root.project.path="$MODULE_DIR$/../.." external.system.id="SBT" sbt.imports="SUB:DOLLAR2a7cf0a3aa9f47ee5733.`deliverySUB:DOLLARminuscheckerSUB:DOLLARminusbot`, SUB:DOLLAR2a7cf0a3aa9f47ee5733.`telegramSUB:DOLLARminusbot`, _root_.sbt.Keys._, _root_.sbt.ScriptedPlugin.autoImport._, _root_.sbtassembly.AssemblyPlugin.autoImport._, _root_.sbt._, _root_.sbt.plugins.IvyPlugin, _root_.sbt.plugins.JvmPlugin, _root_.sbt.plugins.CorePlugin, _root_.sbt.ScriptedPlugin, _root_.sbt.plugins.SbtPlugin, _root_.sbt.plugins.JUnitXmlReportPlugin, _root_.sbt.plugins.Giter8TemplatePlugin, _root_.sbtassembly.AssemblyPlugin, _root_.scala.xml.{TopScope=&gt;SUB:DOLLARscope}" sbt.resolvers="https://repo1.maven.org/maven2/|maven|public, file:/home/nnm/.sbt/preloaded/|maven|local-preloaded, /home/nnm/.ivy2/cache|ivy|Local cache" type="SBT_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/../../delivery-checker-bot/project/target/idea-classes" />
<output-test url="file://$MODULE_DIR$/../../delivery-checker-bot/project/target/idea-test-classes" />
<exclude-output />
<content url="file://$MODULE_DIR$/../../delivery-checker-bot/project">
<excludeFolder url="file://$MODULE_DIR$/../../delivery-checker-bot/project/project/target" />
<excludeFolder url="file://$MODULE_DIR$/../../delivery-checker-bot/project/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="telegram-bot1-build" />
<orderEntry type="module-library">
<library name="sbt: sbt-and-plugins">
<CLASSES>
<root url="jar://$USER_HOME$/.ivy2/cache/javax.annotation/jsr250-api/jars/jsr250-api-1.0.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/javax.enterprise/cdi-api/jars/cdi-api-1.0.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/javax.inject/javax.inject/jars/javax.inject-1.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.ant/ant-launcher/jars/ant-launcher-1.9.9.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.ant/ant/jars/ant-1.9.9.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.4.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-artifact/jars/maven-artifact-3.3.9.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-model/jars/maven-model-3.3.9.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-plugin-api/jars/maven-plugin-api-3.3.9.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-classworlds/bundles/plexus-classworlds-2.5.2.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-component-annotations/jars/plexus-component-annotations-1.5.5.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-utils/jars/plexus-utils-3.0.22.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.eclipse.sisu/org.eclipse.sisu.inject/eclipse-plugins/org.eclipse.sisu.inject-0.3.2.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.eclipse.sisu/org.eclipse.sisu.plexus/eclipse-plugins/org.eclipse.sisu.plexus-0.3.2.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm-commons/jars/asm-commons-6.0.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm-tree/jars/asm-tree-6.0.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm/jars/asm-6.0.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.pantsbuild/jarjar/jars/jarjar-1.6.5.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/org.scalactic/scalactic_2.12/bundles/scalactic_2.12-3.0.1.jar!/" />
<root url="jar://$USER_HOME$/.ivy2/cache/scala_2.12/sbt_1.0/com.eed3si9n/sbt-assembly/jars/sbt-assembly-0.14.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/lib/jline.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/lib/scala-library.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/lib/scala-xml_2.12.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/actions_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/apple-file-events-1.3.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/caffeine-2.5.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/collections_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/command_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/compiler-bridge_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/compiler-interface-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/completion_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/config-1.2.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/core-macros_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/disruptor-3.3.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/fastparse-utils_2.12-0.4.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/fastparse_2.12-0.4.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/gigahorse-core_2.12-0.3.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/gigahorse-okhttp_2.12-0.3.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/io_2.12-1.2.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/ipcsocket-1.0.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/ivy-2.3.0-sbt-b18f59ea3bc914a297bb6f1a4f7fb0ace399e310.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/jawn-parser_2.12-0.10.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/jline-2.14.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/jna-4.5.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/jna-platform-4.5.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/jsch-0.1.54.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/launcher-interface-1.0.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/lenses_2.12-0.4.12.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/librarymanagement-core_2.12-1.2.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/librarymanagement-ivy_2.12-1.2.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/log4j-api-2.8.1.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/log4j-core-2.8.1.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/log4j-slf4j-impl-2.8.1.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/logic_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/main-settings_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/main_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/okhttp-3.7.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/okhttp-urlconnection-3.7.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/okio-1.12.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/protobuf-java-3.3.1.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/protocol_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/reactive-streams-1.0.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/run_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sbinary_2.12-0.5.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sbt-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scala-parser-combinators_2.12-1.0.5.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scala-reflect-2.12.7.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scala-xml_2.12-1.0.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scalacache-caffeine_2.12-0.20.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scalacache-core_2.12-0.20.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scalapb-runtime_2.12-0.6.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scripted-plugin_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/scripted-sbt-redux_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/shaded-scalajson_2.12-1.0.0-M4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sjson-new-core_2.12-0.8.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sjson-new-murmurhash_2.12-0.8.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sjson-new-scalajson_2.12-0.8.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/slf4j-api-1.7.25.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/sourcecode_2.12-0.1.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/ssl-config-core_2.12-0.2.2.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/task-system_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/tasks_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/template-resolver-0.1.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/test-agent-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/test-interface-1.0.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/testing_2.12-1.2.6.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-cache_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-control_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-interface-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-logging_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-position_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-relation_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-scripted_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/util-tracking_2.12-1.2.3.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-apiinfo_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-classfile_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-classpath_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-compile-core_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-compile_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-core_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-ivy-integration_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc-persist_2.12-1.2.4.jar!/" />
<root url="jar://$USER_HOME$/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.6/zinc_2.12-1.2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
<component name="SbtModule">
<option name="buildForId" value="delivery-checker-bot" />
<option name="buildForURI" value="file:$MODULE_DIR$/../../" />
<option name="imports" value="SUB:DOLLAR2a7cf0a3aa9f47ee5733.`deliverySUB:DOLLARminuscheckerSUB:DOLLARminusbot`, SUB:DOLLAR2a7cf0a3aa9f47ee5733.`telegramSUB:DOLLARminusbot`, _root_.sbt.Keys._, _root_.sbt.ScriptedPlugin.autoImport._, _root_.sbtassembly.AssemblyPlugin.autoImport._, _root_.sbt._, _root_.sbt.plugins.IvyPlugin, _root_.sbt.plugins.JvmPlugin, _root_.sbt.plugins.CorePlugin, _root_.sbt.ScriptedPlugin, _root_.sbt.plugins.SbtPlugin, _root_.sbt.plugins.JUnitXmlReportPlugin, _root_.sbt.plugins.Giter8TemplatePlugin, _root_.sbtassembly.AssemblyPlugin, _root_.scala.xml.{TopScope=&gt;SUB:DOLLARscope}" />
</component>
</module>

View File

@@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="delivery-checker-bot [file:/home/nnm/development/telegram-bot1/]" external.linked.project.path="$MODULE_DIR$/../../delivery-checker-bot" external.root.project.path="$MODULE_DIR$/../.." external.system.id="SBT" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/../../delivery-checker-bot/target/scala-2.12/classes" />
<output-test url="file://$MODULE_DIR$/../../delivery-checker-bot/target/scala-2.12/test-classes" />
<exclude-output />
<content url="file://$MODULE_DIR$/../../delivery-checker-bot">
<sourceFolder url="file://$MODULE_DIR$/../../delivery-checker-bot/target/scala-2.12/src_managed/main" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/../../delivery-checker-bot/target/scala-2.12/src_managed/test" isTestSource="true" generated="true" />
<excludeFolder url="file://$MODULE_DIR$/../../delivery-checker-bot/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="sbt: com.chuusai:shapeless_2.12:2.3.3:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:machinist_2.12:0.6.5:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:cats-macros_2.12:1.4.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:cats-kernel_2.12:1.4.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:cats-core_2.12:1.4.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.spire-math:jawn-parser_2.12:0.13.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang.modules:scala-parser-combinators_2.12:1.1.1:jar" level="project" />
<orderEntry type="library" name="sbt: io.circe:circe-parser_2.12:0.10.0:jar" level="project" />
<orderEntry type="library" name="sbt: io.circe:circe-numbers_2.12:0.10.0:jar" level="project" />
<orderEntry type="library" name="sbt: io.circe:circe-jawn_2.12:0.10.0:jar" level="project" />
<orderEntry type="library" name="sbt: io.circe:circe-generic_2.12:0.10.0:jar" level="project" />
<orderEntry type="library" name="sbt: io.circe:circe-core_2.12:0.10.0:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-stream_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-protobuf_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-parsing_2.12:10.1.5:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-http_2.12:10.1.5:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-http-core_2.12:10.1.5:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-actor_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-actor-typed_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe:ssl-config-core_2.12:0.2.4:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe:config:1.3.3:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:macro-compat_2.12:1.1.1:jar" level="project" />
<orderEntry type="library" scope="TEST" name="sbt: org.scalatest:scalatest_2.12:3.0.5:jar" level="project" />
<orderEntry type="library" scope="TEST" name="sbt: org.scalactic:scalactic_2.12:3.0.5:jar" level="project" />
<orderEntry type="library" scope="TEST" name="sbt: org.scala-lang.modules:scala-xml_2.12:1.0.6:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang.modules:scala-java8-compat_2.12:0.8.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.reactivestreams:reactive-streams:1.0.2:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang:scala-library:2.12.7:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang:scala-reflect:2.12.7:jar" level="project" />
</component>
</module>

View File

@@ -14,6 +14,7 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="sbt: com.chuusai:shapeless_2.12:2.3.3:jar" level="project" /> <orderEntry type="library" name="sbt: com.chuusai:shapeless_2.12:2.3.3:jar" level="project" />
<orderEntry type="library" name="sbt: org.fusesource.leveldbjni:leveldbjni-all:1.8:jar" level="project" />
<orderEntry type="library" name="sbt: de.heikoseeberger:akka-http-circe_2.12:1.22.0:jar" level="project" /> <orderEntry type="library" name="sbt: de.heikoseeberger:akka-http-circe_2.12:1.22.0:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:machinist_2.12:0.6.5:jar" level="project" /> <orderEntry type="library" name="sbt: org.typelevel:machinist_2.12:0.6.5:jar" level="project" />
<orderEntry type="library" name="sbt: org.typelevel:cats-macros_2.12:1.4.0:jar" level="project" /> <orderEntry type="library" name="sbt: org.typelevel:cats-macros_2.12:1.4.0:jar" level="project" />
@@ -43,5 +44,9 @@
<orderEntry type="library" name="sbt: org.typelevel:macro-compat_2.12:1.1.1:jar" level="project" /> <orderEntry type="library" name="sbt: org.typelevel:macro-compat_2.12:1.1.1:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang:scala-library:2.12.7:jar" level="project" /> <orderEntry type="library" name="sbt: org.scala-lang:scala-library:2.12.7:jar" level="project" />
<orderEntry type="library" name="sbt: org.scala-lang:scala-reflect:2.12.7:jar" level="project" /> <orderEntry type="library" name="sbt: org.scala-lang:scala-reflect:2.12.7:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-actor-testkit-typed_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-persistence-typed_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-persistence_2.12:2.5.17:jar" level="project" />
<orderEntry type="library" name="sbt: com.typesafe.akka:akka-testkit_2.12:2.5.17:jar" level="project" />
</component> </component>
</module> </module>

View File

@@ -17,6 +17,8 @@ lazy val `telegram-bot` = (project in file("telegram-bot"))
akkaTyped, akkaTyped,
akkaHttp, akkaHttp,
akkaStream, akkaStream,
akkaPersistence,
levelDbJni,
circleCore, circleCore,
circleGeneric, circleGeneric,
circleParser, circleParser,
@@ -24,20 +26,6 @@ lazy val `telegram-bot` = (project in file("telegram-bot"))
) )
) )
lazy val `delivery-checker-bot` = (project in file("delivery-checker-bot"))
.settings(
libraryDependencies ++= Seq(
scalaTest % Test,
akka,
akkaTyped,
akkaHttp,
akkaStream,
circleCore,
circleGeneric,
circleParser
)
)
assemblyMergeStrategy in assembly := { assemblyMergeStrategy in assembly := {
case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.first case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.first
case x => case x =>

View File

@@ -5,6 +5,8 @@ object Dependencies {
lazy val akkaTyped = "com.typesafe.akka" %% "akka-actor-typed" % "2.5.17" lazy val akkaTyped = "com.typesafe.akka" %% "akka-actor-typed" % "2.5.17"
lazy val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.5.17" lazy val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.5.17"
lazy val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.5" lazy val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.5"
lazy val akkaPersistence = "com.typesafe.akka" %% "akka-persistence-typed" % "2.5.17"
lazy val levelDbJni = "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.8"
//lazy val vkapi = "com.vk.api" % "sdk" % "0.5.12" //lazy val vkapi = "com.vk.api" % "sdk" % "0.5.12"
lazy val circleCore = "io.circe" %% "circe-core" % "0.10.0" lazy val circleCore = "io.circe" %% "circe-core" % "0.10.0"
lazy val circleGeneric = "io.circe" %% "circe-generic" % "0.10.0" lazy val circleGeneric = "io.circe" %% "circe-generic" % "0.10.0"

View File

@@ -0,0 +1,156 @@
package eu.xeppaka.bot
import java.security.cert.X509Certificate
import akka.actor.ActorSystem
import akka.actor.typed.scaladsl.adapter._
import akka.actor.typed.scaladsl.{Behaviors, TimerScheduler}
import akka.actor.typed.{ActorRef, Behavior, DispatcherSelector}
import akka.http.scaladsl.UseHttp2.Negotiated
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.{Accept, `User-Agent`}
import akka.http.scaladsl.settings.{ClientConnectionSettings, ConnectionPoolSettings}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.http.scaladsl.{Http, HttpsConnectionContext}
import akka.persistence.typed.scaladsl.PersistentBehaviors.{CommandHandler, EventHandler}
import akka.persistence.typed.scaladsl.{Effect, PersistentBehaviors}
import akka.stream.ActorMaterializer
import com.typesafe.sslconfig.akka.AkkaSSLConfig
import de.heikoseeberger.akkahttpcirce.FailFastCirceSupport._
import io.circe.generic.auto._
import javax.net.ssl.{KeyManager, SSLContext, X509TrustManager}
import scala.collection.immutable
import scala.concurrent.ExecutionContextExecutor
import scala.concurrent.duration._
import scala.util.{Failure, Success}
object Entities {
case class Attributes(
parcelType: String,
weight: Double,
currency: String,
)
case class State(
id: String,
date: String,
text: String,
postcode: Option[String],
postoffice: Option[String],
idIcon: Option[String],
publicAccess: Int,
latitude: Option[Double],
longitude: Option[Double],
timeDeliveryAttempt: Option[String]
)
case class States(state: Seq[State])
case class ParcelHistory(id: String, attributes: Attributes, states: States)
}
object CheckCzechPostDelivery {
sealed trait Command
sealed trait Event
case class State(
attributes: Option[Entities.Attributes] = None,
states: Set[Entities.State] = Set.empty
)
private case object CheckParcel extends Command
private case class ParcelHistoryData(data: Entities.ParcelHistory) extends Command
case class DeliveryStateChanged(state: String)
case class HistoryStateAdded(state: Entities.State) extends Event
case class AttributesChanged(attributes: Entities.Attributes) extends Event
private val trustfulSslContext: SSLContext = {
object NoCheckX509TrustManager extends X509TrustManager {
override def checkClientTrusted(chain: Array[X509Certificate], authType: String): Unit = ()
override def checkServerTrusted(chain: Array[X509Certificate], authType: String): Unit = ()
override def getAcceptedIssuers: Array[X509Certificate] = Array[X509Certificate]()
}
val context = SSLContext.getInstance("TLS")
context.init(Array[KeyManager](), Array(NoCheckX509TrustManager), null)
context
}
def behavior(chatId: String, parcelId: String, stateReporter: ActorRef[DeliveryStateChanged]): Behavior[Command] = Behaviors.setup[Command] { ctx =>
Behaviors.withTimers(scheduler => checkParcel(chatId, parcelId, stateReporter, scheduler))
}
private def checkParcel(chatId: String, parcelId: String, stateReporter: ActorRef[DeliveryStateChanged], scheduler: TimerScheduler[Command]): Behavior[Command] = Behaviors.setup { ctx =>
implicit val actorSystem: ActorSystem = ctx.system.toUntyped
implicit val executionContext: ExecutionContextExecutor = ctx.system.dispatchers.lookup(DispatcherSelector.default())
implicit val materializer: ActorMaterializer = ActorMaterializer()
val checkUri = Uri(s"https://b2c.cpost.cz/services/ParcelHistory/getDataAsJson?idParcel=$parcelId&language=en")
val http = Http()
val request = HttpRequest(uri = checkUri, headers = immutable.Seq(Accept(MediaTypes.`application/json`)))
val badSslConfig = AkkaSSLConfig().mapSettings(s => s.withLoose(s.loose
.withAcceptAnyCertificate(true)
.withDisableHostnameVerification(true)))
val originalCtx = http.createClientHttpsContext(badSslConfig)
val sslContext = new HttpsConnectionContext(
trustfulSslContext,
originalCtx.sslConfig,
originalCtx.enabledCipherSuites,
originalCtx.enabledProtocols,
originalCtx.clientAuth,
originalCtx.sslParameters,
Negotiated
)
val clientConnectionSettings = ClientConnectionSettings(actorSystem).withUserAgentHeader(Some(`User-Agent`("Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0")))
val connectionSettings = ConnectionPoolSettings(actorSystem).withConnectionSettings(clientConnectionSettings)
scheduler.startPeriodicTimer("check-delivery-state", CheckParcel, 5.seconds)
val commandHandler: CommandHandler[Command, Event, State] = (state, cmd) => {
cmd match {
case CheckParcel =>
http
.singleRequest(request, connectionContext = sslContext, settings = connectionSettings)
.transform {
case Success(response) => if (response.status.isSuccess()) Success(response) else Failure(new Exception(s"Check parcel returned HTTP status: ${response.status.value}."))
case response: Failure[HttpResponse] => response
}
.flatMap(response => Unmarshal(response).to[Array[Entities.ParcelHistory]])
.andThen {
case Success(parcelHistory) => ctx.self ! ParcelHistoryData(parcelHistory.head)
case Failure(exception) =>
ctx.log.error(exception, "Error checking parcel history.")
}
Effect.none
case ParcelHistoryData(parcelHistory) =>
val attributesEvent = (if (state.attributes.isEmpty)
Some(parcelHistory.attributes)
else
state.attributes.flatMap(oldAttributes => if (oldAttributes != parcelHistory.attributes) Some(parcelHistory.attributes) else None))
.map(AttributesChanged.apply).to[collection.immutable.Seq]
val newStates = parcelHistory.states.state.toSet -- state.states
val stateEvents: Seq[Event] = newStates.map(HistoryStateAdded.apply).to[collection.immutable.Seq]
Effect
.persist(attributesEvent ++ stateEvents)
.thenRun(_ => stateReporter ! DeliveryStateChanged(newStates.toString()))
}
}
val eventHandler: EventHandler[State, Event] = (state, evt) => {
evt match {
case HistoryStateAdded(newState) => state.copy(states = state.states + newState)
case AttributesChanged(newAttributes) => state.copy(attributes = Some(newAttributes))
}
}
PersistentBehaviors.receive[Command, Event, State](
persistenceId = parcelId,
emptyState = State(),
commandHandler = commandHandler,
eventHandler = eventHandler
)
}
}

View File

@@ -19,13 +19,17 @@ object CheckDeliveryDialog {
case object ProcessMessageSuccess extends CommandResult case object ProcessMessageSuccess extends CommandResult
case class ProcessMessageFailure(exception: Throwable) extends CommandResult case class ProcessMessageFailure(exception: Throwable) extends CommandResult
// internal messages
private case class DeliveryStateChanged(state: String) extends Command
def behavior(chatId: Long, botUri: BotUri): Behavior[Command] = Behaviors.setup[Command] { ctx => def behavior(chatId: Long, botUri: BotUri): Behavior[Command] = Behaviors.setup[Command] { ctx =>
implicit val executionContext: ExecutionContext = ctx.system.dispatchers.lookup(DispatcherSelector.default()) implicit val executionContext: ExecutionContext = ctx.system.dispatchers.lookup(DispatcherSelector.default())
val http = Http()(ctx.system.toUntyped) val http = Http()(ctx.system.toUntyped)
val deliveryStateAdapter: ActorRef[CheckCzechPostDelivery.DeliveryStateChanged] = ctx.messageAdapter(stateChanged => DeliveryStateChanged(stateChanged.state))
Behaviors.receiveMessage { Behaviors.receiveMessage {
case ProcessMessage(msg, replyTo) => case ProcessMessage(msg, replyTo) =>
sendResponse(http, botUri, chatId, msg.text.get) sendMessage(http, botUri, chatId, msg.text.get)
.onComplete { .onComplete {
case Success(response) => case Success(response) =>
if (response.status.isSuccess()) { if (response.status.isSuccess()) {
@@ -35,11 +39,16 @@ object CheckDeliveryDialog {
} }
case Failure(exception) => replyTo ! ProcessMessageFailure(exception) case Failure(exception) => replyTo ! ProcessMessageFailure(exception)
} }
ctx.spawnAnonymous(CheckCzechPostDelivery.behavior(chatId.toString, "RR541190869CZ", deliveryStateAdapter))
Behaviors.same
case DeliveryStateChanged(state) =>
sendMessage(http, botUri, chatId, state)
Behaviors.same Behaviors.same
} }
} }
private def sendResponse(http: HttpExt, botUri: BotUri, chatId: Long, text: String): Future[HttpResponse] = { private def sendMessage(http: HttpExt, botUri: BotUri, chatId: Long, text: String): Future[HttpResponse] = {
import io.circe._ import io.circe._
import io.circe.generic.auto._ import io.circe.generic.auto._
import io.circe.syntax._ import io.circe.syntax._

View File

@@ -32,10 +32,10 @@ object DialogManager {
if (update.message.isDefined) { if (update.message.isDefined) {
val chatId = update.message.get.chat.id val chatId = update.message.get.chat.id
val dialogKey = ServiceKey[CheckDeliveryDialog.Command](chatId.toString) val dialogKey = ServiceKey[CheckDeliveryDialog.Command](chatId.toString)
val receptionistMapper: ActorRef[Receptionist.Listing] = ctx.messageAdapter(listing => ReceptionistListingWrapper(chatId, dialogKey, listing, update.message.get, replyTo)) val receptionistAdapter: ActorRef[Receptionist.Listing] = ctx.messageAdapter(listing => ReceptionistListingWrapper(chatId, dialogKey, listing, update.message.get, replyTo))
ctx.log.debug(s"action=find_dialog id=${chatId.toString}") ctx.log.debug(s"action=find_dialog id=${chatId.toString}")
ctx.system.receptionist ! Receptionist.Find(dialogKey, receptionistMapper) ctx.system.receptionist ! Receptionist.Find(dialogKey, receptionistAdapter)
} }
Behaviors.same Behaviors.same