diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 00000000..d0c3cbf1
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 00000000..9534b018
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/source/_static/engineer_diagram.drawio b/docs/source/_static/engineer_diagram.drawio
new file mode 100644
index 00000000..127e2942
--- /dev/null
+++ b/docs/source/_static/engineer_diagram.drawio
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/docs/source/_static/engineer_diagram.png b/docs/source/_static/engineer_diagram.png
new file mode 100644
index 00000000..80626ea0
Binary files /dev/null and b/docs/source/_static/engineer_diagram.png differ
diff --git a/docs/source/_static/royalblue.css b/docs/source/_static/royalblue.css
new file mode 100644
index 00000000..d98fc068
--- /dev/null
+++ b/docs/source/_static/royalblue.css
@@ -0,0 +1,3 @@
+.wy-side-nav-search, .wy-nav-top {
+ background-color: #0d193b !important;
+}
diff --git a/docs/source/autodoc/index.rst b/docs/source/autodoc/index.rst
new file mode 100644
index 00000000..811dae91
--- /dev/null
+++ b/docs/source/autodoc/index.rst
@@ -0,0 +1,8 @@
+Autogenerated documentation
+===========================
+
+Welcome to the autogenerated documentation of Royalnet Console!
+
+It may be incomplete or outdated, as it is automatically updated.
+
+.. automodule:: royalnet_console
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 00000000..54895570
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,100 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+import pkg_resources
+
+# -- Project information -----------------------------------------------------
+
+project = 'royalnet_console'
+# noinspection PyShadowingBuiltins
+copyright = '2021, Stefano Pigozzi'
+author = 'Stefano Pigozzi'
+
+# The full version, including alpha/beta/rc tags
+release = pkg_resources.get_distribution("royalnet_console").version
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ 'sphinx.ext.todo',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['Thumbs.db', '.DS_Store']
+
+# Print warnings on the page
+keep_warnings = True
+
+# Display more warnings than usual
+nitpicky = True
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+
+# -- Intersphinx options -----------------------------------------------------
+
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3.8", None),
+ "sqlalchemy": ("https://docs.sqlalchemy.org/en/13/", None),
+ "async_property": ("https://async-property.readthedocs.io/en/latest/", None),
+}
+
+
+# -- Setup function ----------------------------------------------------------
+def setup(app):
+ app.add_css_file('royalblue.css')
+
+
+# -- Substitutions -----------------------------------------------------------
+
+
+rst_prolog = """
+
+"""
+
+# -- Automodule settings -----------------------------------------------------
+
+autodoc_default_options = {
+ 'members': True,
+ 'member-order': 'bysource',
+ 'special-members': '__init__',
+ 'undoc-members': True,
+}
+
+# -- Automodule settings -----------------------------------------------------
+
+todo_include_todos = True
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 00000000..2b367982
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,32 @@
+Royalnet 6
+==========
+
+Welcome to the documentation of Royalnet 6!
+
+
+Table of contents
+-----------------
+
+.. toctree::
+ :maxdepth: 3
+
+ autodoc/index
+
+
+Useful links
+------------
+
+* `Royalnet on GitHub `_
+
+
+Indices and tables
+------------------
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
+To do
+-----
+
+.. todolist::
diff --git a/poetry.lock b/poetry.lock
index fdde81b7..a3cffb5e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -279,7 +279,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
[[package]]
name = "royalnet"
-version = "6.2.1"
+version = "6.3.0"
description = "A multipurpose bot framework"
category = "main"
optional = false
@@ -479,7 +479,7 @@ brotli = ["brotlipy (>=0.6.0)"]
[metadata]
lock-version = "1.1"
python-versions = "^3.8"
-content-hash = "dd03dba3d8cafa05d423d919e0dbda54ac96dddab43573811d49929b468f5d1a"
+content-hash = "b9acdca9d1875f1be11616d4e534d383646f484e92732ee78be19d84077a7888"
[metadata.files]
alabaster = [
@@ -728,8 +728,8 @@ requests = [
{file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
]
royalnet = [
- {file = "royalnet-6.2.1-py3-none-any.whl", hash = "sha256:e5b333fda9e5b0cf34537903e76ce9ffc3ca231df6c6ba28a9b1f9ee94efc843"},
- {file = "royalnet-6.2.1.tar.gz", hash = "sha256:a41bb353840f4b0c4f8fb40d0852d1da9f284af0f525c90f9bfb77d26ccd2c53"},
+ {file = "royalnet-6.3.0-py3-none-any.whl", hash = "sha256:f2f6ea15def33e27ca92a0ba3b7863fab7b7339bcbb99bc83f6be74bd8e805e6"},
+ {file = "royalnet-6.3.0.tar.gz", hash = "sha256:6301ef60a1402ec59e55a206462f5b7296c5f6bbd6ab0bf38851ede42add5b20"},
]
snowballstemmer = [
{file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
diff --git a/pyproject.toml b/pyproject.toml
index dc60f366..3ac0e5df 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "royalnet-console"
-version = "2.0.1"
+version = "2.0.2"
description = "A terminal-based frontend for the royalnet.engineer module."
authors = ["Stefano Pigozzi "]
license = "AGPL-3.0-or-later"
@@ -19,7 +19,7 @@ classifiers = [
[tool.poetry.dependencies]
python = "^3.8"
-royalnet = "~6.2.0"
+royalnet = "~6.3.0"
psutil = "^5.8.0"
click = "^7.1.2"
colorama = "^0.4.4"
diff --git a/royalnet-console.iml b/royalnet-console.iml
index 91d076fe..b6e983e8 100644
--- a/royalnet-console.iml
+++ b/royalnet-console.iml
@@ -2,7 +2,12 @@
-
+
+
+
+
+
+
diff --git a/royalnet_console/pda.py b/royalnet_console/pda.py
index e418343b..5e35a2a1 100644
--- a/royalnet_console/pda.py
+++ b/royalnet_console/pda.py
@@ -46,6 +46,14 @@ class ConsolePDAImplementation(engi.ConversationListImplementation):
if isinstance(cycles, int):
cycles -= 1
+ async def _handle_conversation_exc(
+ self,
+ dispenser: engi.Dispenser,
+ conv: engi.ConversationProtocol,
+ exception: Exception,
+ ) -> None:
+ self.log.error(f"ERROR: {exception}")
+
__all__ = (
"ConsolePDAImplementation",