python-trueconf-bot 1.1.2__tar.gz → 1.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. python_trueconf_bot-1.1.4/.github/workflows/release.yml +44 -0
  2. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/PKG-INFO +1 -1
  3. python_trueconf_bot-1.1.4/docs/ru/img/router_scheme_ru.svg +5 -0
  4. python_trueconf_bot-1.1.4/docs/ru/learn/parse-messages.md +212 -0
  5. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/examples/README-ru.md +5 -1
  6. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/examples/filters.py +1 -1
  7. python_trueconf_bot-1.1.4/examples/report_bot.py +94 -0
  8. python_trueconf_bot-1.1.4/examples/webhook.py +39 -0
  9. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/mkdocs.yml +2 -0
  10. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/python_trueconf_bot.egg-info/PKG-INFO +1 -1
  11. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/python_trueconf_bot.egg-info/SOURCES.txt +3 -0
  12. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/_version.py +3 -3
  13. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/dispatcher/dispatcher.py +12 -5
  14. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/dispatcher/router.py +89 -89
  15. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/command.py +2 -1
  16. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/remove_chat_response.py +1 -1
  17. python_trueconf_bot-1.1.2/.github/workflows/release.yml +0 -76
  18. python_trueconf_bot-1.1.2/docs/ru/learn/parse-messages.md +0 -97
  19. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/.github/workflows/docs.yml +0 -0
  20. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/.github/workflows/release-test.yml +0 -0
  21. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/.gitignore +0 -0
  22. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/LICENSE +0 -0
  23. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/README-PyPI.md +0 -0
  24. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/README-ru.md +0 -0
  25. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/README.md +0 -0
  26. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/assets/head_en.png +0 -0
  27. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/assets/head_ru.png +0 -0
  28. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/assets/logo.svg +0 -0
  29. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/examples/echo_bot.md +0 -0
  30. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/examples/multibot.md +0 -0
  31. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/features.md +0 -0
  32. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/img/head.png +0 -0
  33. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/index.md +0 -0
  34. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/enums.md +0 -0
  35. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/files.md +0 -0
  36. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/filters.md +0 -0
  37. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/getting-started.md +0 -0
  38. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/parse-messages.md +0 -0
  39. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/learn/types.md +0 -0
  40. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/Bot.md +0 -0
  41. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/Dispatcher.md +0 -0
  42. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/Enums.md +0 -0
  43. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/Router.md +0 -0
  44. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/Types.md +0 -0
  45. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/reference/index.md +0 -0
  46. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/en/release_notes.md +0 -0
  47. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/img/chatbot.svg +0 -0
  48. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/img/favicon.ico +0 -0
  49. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/img/logo.svg +0 -0
  50. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/overrides/main.html +0 -0
  51. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/examples/echo_bot.md +0 -0
  52. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/examples/multibot.md +0 -0
  53. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/features.md +0 -0
  54. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/img/head.png +0 -0
  55. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/index.md +0 -0
  56. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/learn/enums.md +0 -0
  57. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/learn/files.md +0 -0
  58. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/learn/filters.md +0 -0
  59. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/learn/getting-started.md +0 -0
  60. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/learn/types.md +0 -0
  61. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/ru/release_notes.md +0 -0
  62. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/docs/stylesheets/extra.css +0 -0
  63. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/examples/README.md +0 -0
  64. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/examples/update_token.py +0 -0
  65. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/pyproject.toml +0 -0
  66. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/python_trueconf_bot.egg-info/dependency_links.txt +0 -0
  67. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/python_trueconf_bot.egg-info/requires.txt +0 -0
  68. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/python_trueconf_bot.egg-info/top_level.txt +0 -0
  69. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/requirements-docs.txt +0 -0
  70. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/requirements.txt +0 -0
  71. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/setup.cfg +0 -0
  72. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/__init__.py +0 -0
  73. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/client/__init__.py +0 -0
  74. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/client/bot.py +0 -0
  75. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/client/context_controller.py +0 -0
  76. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/client/session.py +0 -0
  77. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/dispatcher/__init__.py +0 -0
  78. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/__init__.py +0 -0
  79. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/aouth_error.py +0 -0
  80. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/chat_participant_role.py +0 -0
  81. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/chat_type.py +0 -0
  82. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/envelope_author_type.py +0 -0
  83. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/file_ready_state.py +0 -0
  84. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/incoming_update_method.py +0 -0
  85. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/message_type.py +0 -0
  86. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/parse_mode.py +0 -0
  87. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/survey_type.py +0 -0
  88. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/enums/update_type.py +0 -0
  89. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/exceptions.py +0 -0
  90. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/__init__.py +0 -0
  91. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/base.py +0 -0
  92. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/instance_of.py +0 -0
  93. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/message.py +0 -0
  94. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/filters/method.py +0 -0
  95. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/loggers.py +0 -0
  96. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/__init__.py +0 -0
  97. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/add_participant_to_chat.py +0 -0
  98. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/auth.py +0 -0
  99. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/base.py +0 -0
  100. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/change_participant_role.py +0 -0
  101. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/create_channel.py +0 -0
  102. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/create_favorites_chat.py +0 -0
  103. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/create_group_chat.py +0 -0
  104. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/create_p2p_chat.py +0 -0
  105. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/edit_message.py +0 -0
  106. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/edit_survey.py +0 -0
  107. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/forward_message.py +0 -0
  108. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_chat_by_id.py +0 -0
  109. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_chat_history.py +0 -0
  110. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_chat_participants.py +0 -0
  111. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_chats.py +0 -0
  112. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_file_info.py +0 -0
  113. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_message_by_id.py +0 -0
  114. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/get_user_display_name.py +0 -0
  115. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/has_chat_participant.py +0 -0
  116. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/remove_chat.py +0 -0
  117. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/remove_message.py +0 -0
  118. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/remove_participant_from_chat.py +0 -0
  119. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/send_file.py +0 -0
  120. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/send_message.py +0 -0
  121. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/send_survey.py +0 -0
  122. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/subscribe_file_progress.py +0 -0
  123. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/unsubscribe_file_progress.py +0 -0
  124. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/methods/upload_file.py +0 -0
  125. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/py.typed +0 -0
  126. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/__init__.py +0 -0
  127. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/author_box.py +0 -0
  128. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/chat_participant.py +0 -0
  129. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/__init__.py +0 -0
  130. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/attachment.py +0 -0
  131. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/base.py +0 -0
  132. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/chat_created.py +0 -0
  133. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/document.py +0 -0
  134. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/forward_message.py +0 -0
  135. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/photo.py +0 -0
  136. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/remove_participant.py +0 -0
  137. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/sticker.py +0 -0
  138. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/survey.py +0 -0
  139. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/text.py +0 -0
  140. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/content/video.py +0 -0
  141. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/input_file.py +0 -0
  142. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/last_message.py +0 -0
  143. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/message.py +0 -0
  144. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/parser.py +0 -0
  145. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/__init__.py +0 -0
  146. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/added_chat_participant.py +0 -0
  147. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/changed_participant_role.py +0 -0
  148. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/created_channel.py +0 -0
  149. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/created_favorites_chat.py +0 -0
  150. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/created_group_chat.py +0 -0
  151. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/created_personal_chat.py +0 -0
  152. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/edited_message.py +0 -0
  153. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/removed_chat.py +0 -0
  154. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/removed_chat_participant.py +0 -0
  155. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/removed_message.py +0 -0
  156. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/requests/uploading_progress.py +0 -0
  157. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/__init__.py +0 -0
  158. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/add_chat_participant_response.py +0 -0
  159. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/api_error.py +0 -0
  160. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/auth_response_payload.py +0 -0
  161. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/change_participant_role_response.py +0 -0
  162. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/create_channel_response.py +0 -0
  163. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/create_favorites_chat_response.py +0 -0
  164. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/create_group_chat_response.py +0 -0
  165. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/create_p2p_chat_response.py +0 -0
  166. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/edit_message_response.py +0 -0
  167. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/edit_survey_response.py +0 -0
  168. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/forward_message_response.py +0 -0
  169. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_chat_by_id_response.py +0 -0
  170. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_chat_history_response.py +0 -0
  171. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_chat_participants_response.py +0 -0
  172. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_chats_response.py +0 -0
  173. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_file_info_response.py +0 -0
  174. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_message_by_id_response.py +0 -0
  175. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/get_user_display_name_response.py +0 -0
  176. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/has_chat_participant_response.py +0 -0
  177. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/remove_chat_participant_response.py +0 -0
  178. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/remove_message_response.py +0 -0
  179. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/send_file_response.py +0 -0
  180. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/send_message_response.py +0 -0
  181. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/send_survey_response.py +0 -0
  182. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/subscribe_file_progress_response.py +0 -0
  183. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/unsubscribe_file_progress_response.py +0 -0
  184. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/responses/upload_file_response.py +0 -0
  185. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/types/update.py +0 -0
  186. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/utils/__init__.py +0 -0
  187. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/utils/generate_secret_for_survey.py +0 -0
  188. {python_trueconf_bot-1.1.2 → python_trueconf_bot-1.1.4}/trueconf/utils/token.py +0 -0
@@ -0,0 +1,44 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+ id-token: write
10
+
11
+ jobs:
12
+ build-and-publish:
13
+ runs-on: ubuntu-latest
14
+ environment: pypi
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+ ref: ${{ github.event.release.tag_name }}
20
+
21
+ - name: Set version from tag
22
+ run: |
23
+ TAG="${{ github.event.release.tag_name }}"
24
+ VERSION="${TAG#v}"
25
+ sed -i "s/^version = .*/version = \"${VERSION}\"/" pyproject.toml
26
+
27
+ - name: Set up Python
28
+ uses: actions/setup-python@v5
29
+ with:
30
+ python-version: "3.11"
31
+
32
+ - name: Build package
33
+ run: |
34
+ pip install build
35
+ python -m build
36
+
37
+ - name: Upload artifacts to Actions
38
+ uses: actions/upload-artifact@v4
39
+ with:
40
+ name: dist
41
+ path: dist/*
42
+
43
+ - name: Publish to PyPI
44
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-trueconf-bot
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Lightweight and powerful framework for the TrueConf Server Chatbot API
5
5
  Author-email: TrueConf LLC <info@trueconf.com>, Anton Baadzhi <baadzhianton@gmail.com>
6
6
  License-Expression: BSD-3-Clause-Clear
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1226.253143571635 539.5874894594053" width="2452.50628714327" height="1079.1749789188107"><!-- svg-source:excalidraw --><metadata></metadata><defs><style class="style-fonts">
4
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,d09GMgABAAAAAAVUAA4AAAAACPQAAAUAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhQbgTYcNAZgAEwRCAqHbIYOCxIAATYCJAMgBCAFgxgHIBsRB1FUb2JkH4txTJGHrCjEiQyiTZu9OyTiQCCkyUXUITUjVBRInBpJ3Y6KATEh1MyQN5EG+J8KePz91EVplNYjWYtPKOp+DqMEMsU2seEaOyjScAP2mWeGkRpll1ce1VdUZHVmr9lMEACeAACAgJFlAHekohSjqBylQpBuqUHfFHWGmiaFXtMyNwkMAPwaw5pqDHMhBEABIBBhLvggHCBsuGRRGI1gmt4TJBDMQBlOUmXL7GCUjEhQJICT7mB0pBy0JCGWpiNdV0gUADUT0xlKRXaBByHFUZMBjPRmyEyk4y/AnGCo4kPH4AZYZNCL/uPA6weQRSzQAwBkEzUZAPsauTQAEWgQFzLIxd2fqKTAIg4yWACDGctIa+H/D3srZ/Z9Z4D8HygAgBAA4AuAD5ARggNRMFgss/WTU/xTJl+g0thuSV45I5yTXJNeuzxMg22ifbisyPrkhcjOquxVsrabbQdNB8VHu4L3HajizIcIWWuxBFouP5cfd6md6nanRMDcBravla/dv9/j7EuHI00+oeq0J9qrrNG20J7AwwX3ZaY2k7gt94CGk3Bm0k7Whq59O5RY7Q8irdfkxwMtrhhLx2nF/TyMUaY2QKWSqtpirVXWc4cCD7mGGi+LJ1muHz4dOnArn7OesR6QtjL6uH1mGyKyXgo6VnL98cj7HsY408Vou2VfcOuJFwdij9hFDvFZR9TgQ6kpljvjztnOSZxOVeQVDee03TsXfSfc0nHj/zhw0CF2eBify3uc2Y/UZpvZLGkfiLG4XPKOR2qbOzcs+lhCR47l/nnx4FnHxYdHpa1HDjyw2kWDWWdHm662He2S9qrsY+6Xv/nZMPNvVe4j/TaVXJkwxlIWFeU3c10RXSQapla0zNJfLFYa3cq9ZisGfz3he2vUE1/z3Q1bPddi3n3Br/wAIRnKkcjuxg8PyPsE5X4doeoFau6q4h/4+b5/UQb+3AYy762MGUMU+jCdzOw2eUjKkZOqOhij1nTPCZeMJEt1n0XvHesxa9ZtSP0CviYKciOEUsd48BPqtiuSE9Y3Cxf2nv9zbXHixFMTdX9V7+W5Z6XuEbwrGM+M9aDvDl/KYLvQ/N0k8dFsASrPUft2DWzBPuM/Zds/+0HeZ+t6uGd6BJGQKJLBTigrzbwclaIxFLxSs3kfnP3y7m81U1ZqCi/Ff//WD2W5i+fydpunhQR85pM+dxezl+d7b8eeSpHOaxRlGI8kilYyWnWD5EMtHcUvUW/Rrpsc/vF40XBZ6oNZueXP+4cLNMoJXH5fnadBLx8R+Xbw3GG0VjbiWHHyhz8Xzf5y74c/iYZ79ntOdW+4VF+Qq5Rqb3gYvlYu/mhRgzBBXaEMAgCAACDA+lnTpLN8Cn8VetBfAMCHS+MVAPBR/9fL/9/w33LmKyYPgBAUAIAAX9bL8w8E//5TBwS4h5DWQrldALmIRLIHscQf5TsMCXUFEmo2ZCBVQhf4OCqZJAqU5mcJMBUNwrgB0Hs1EIEI1xAFb5xANOKxCTGIhBbxUIxI4Ou9AaUldDT0GtSaZ64WSZigRp2F9DQM1GoYNGuIYlmkIRmptloBhtJbar56zVhkIBnpDrEHM71xDuLKtbCVZe0rTDTUGAWpSq0dQoX751saxDaoU6+F5bc6cWCRjlSkIxMstJZis9+sZqCxWDJYlNHTY/N48wQ1zqyBRRpTLRk0YOn//8ADAAA=); }
5
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><rect x="0" y="0" width="1226.253143571635" height="539.5874894594053" fill="#ffffff"></rect><g stroke-linecap="round" transform="translate(59.53528790829614 50.502233812009734) rotate(0 104.6917614071645 36.06634771550273)"><path d="M18.03 0 C80.84 -1.66, 141.36 0.17, 191.35 0 M18.03 0 C72.98 0.65, 126.34 0.97, 191.35 0 M191.35 0 C202.27 -0.14, 210.21 4.71, 209.38 18.03 M191.35 0 C201.84 -1.48, 209.43 4.16, 209.38 18.03 M209.38 18.03 C208.97 31.61, 209.69 45.26, 209.38 54.1 M209.38 18.03 C210.26 29.73, 210.24 39.98, 209.38 54.1 M209.38 54.1 C207.58 67.56, 203.31 71.77, 191.35 72.13 M209.38 54.1 C209.45 65.12, 202.7 72.86, 191.35 72.13 M191.35 72.13 C137.28 71.22, 79.25 69.69, 18.03 72.13 M191.35 72.13 C147.4 73.7, 104.87 73.87, 18.03 72.13 M18.03 72.13 C6.4 71.41, 1.74 67.32, 0 54.1 M18.03 72.13 C4.22 71.19, 0.88 64.95, 0 54.1 M0 54.1 C-1.65 46.5, 2.13 35.77, 0 18.03 M0 54.1 C-0.8 40.67, -0.63 27.73, 0 18.03 M0 18.03 C-0.58 5.72, 5.94 -0.32, 18.03 0 M0 18.03 C-0.79 3.79, 5.38 -1.71, 18.03 0" stroke="#e03131" stroke-width="2" fill="none"></path></g><g transform="translate(112.26820652850677 79.0153570308373) rotate(0 49.179962158203125 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#e03131" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Диспетчер</text></g><g stroke-linecap="round" transform="translate(57.8691678499423 313.00001644293025) rotate(0 106.77059392843637 40.03049379973234)"><path d="M20.02 0 C87.24 1.62, 152.73 -2.29, 193.53 0 M20.02 0 C88.18 -1.25, 156.44 0.46, 193.53 0 M193.53 0 C208.39 1.27, 215.31 6.21, 213.54 20.02 M193.53 0 C205.36 -0.56, 213.34 7.28, 213.54 20.02 M213.54 20.02 C211.51 31.54, 213.6 47.15, 213.54 60.05 M213.54 20.02 C213.08 31.03, 213.42 40.92, 213.54 60.05 M213.54 60.05 C212.49 75.07, 206.01 79.38, 193.53 80.06 M213.54 60.05 C214.73 75.47, 206.54 81.7, 193.53 80.06 M193.53 80.06 C133.58 81.66, 76.2 80.58, 20.02 80.06 M193.53 80.06 C135.4 79.95, 74.65 80.56, 20.02 80.06 M20.02 80.06 C5.41 81.14, -0.06 75.09, 0 60.05 M20.02 80.06 C8.74 80.69, 1.31 72.96, 0 60.05 M0 60.05 C-0.44 45.93, -2.04 27.27, 0 20.02 M0 60.05 C0.52 47.61, -0.49 35.5, 0 20.02 M0 20.02 C-0.2 6.3, 5.31 -1.99, 20.02 0 M0 20.02 C1.26 8, 8.86 -0.45, 20.02 0" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g transform="translate(128.91354827128828 338.7796453534962) rotate(0 41.67997741699219 12.499999999999972)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Роутер 1</text></g><g stroke-linecap="round"><g transform="translate(164.24805201779736 128.6349292430152) rotate(0 0.47783916105498747 89.4800619905609)"><path d="M0.93 -0.12 C1.09 29.78, 0.9 148.93, 0.85 178.55 M-0.04 -1.22 C0 28.97, 0.14 150.23, 0.14 180.18" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(164.24805201779736 128.6349292430152) rotate(0 0.47783916105498747 89.4800619905609)"><path d="M-8.43 156.7 C-6.26 164.3, -3.23 170.86, 0.14 180.18 M-8.43 156.7 C-6.81 162.2, -5.39 166.87, 0.14 180.18" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(164.24805201779736 128.6349292430152) rotate(0 0.47783916105498747 89.4800619905609)"><path d="M8.68 156.68 C5.81 164.43, 3.79 170.99, 0.14 180.18 M8.68 156.68 C6.26 162.17, 3.65 166.84, 0.14 180.18" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(594.6005750522919 47.58082808678827) rotate(0 106.77059392843637 40.03049379973237)"><path d="M20.02 0 C62.53 1.17, 107.45 2.51, 193.53 0 M20.02 0 C64.06 0.25, 108.06 -0.14, 193.53 0 M193.53 0 C207.27 -0.99, 214.37 5.07, 213.54 20.02 M193.53 0 C208.4 -1.46, 215.4 5.99, 213.54 20.02 M213.54 20.02 C212.65 31.36, 212.96 42.23, 213.54 60.05 M213.54 20.02 C213.32 31.84, 213.12 45.59, 213.54 60.05 M213.54 60.05 C212.23 73.59, 205.31 78.13, 193.53 80.06 M213.54 60.05 C211.26 71.4, 204.8 80.28, 193.53 80.06 M193.53 80.06 C139.66 79.66, 87.95 80.31, 20.02 80.06 M193.53 80.06 C132.1 79.5, 73.12 79.6, 20.02 80.06 M20.02 80.06 C4.78 79.79, -1.51 72.57, 0 60.05 M20.02 80.06 C4.46 79.04, -0.58 72.3, 0 60.05 M0 60.05 C0.56 50.23, -0.68 42.09, 0 20.02 M0 60.05 C-0.17 52.64, -1.16 43.73, 0 20.02 M0 20.02 C1.23 6.31, 8.52 0.28, 20.02 0 M0 20.02 C-0.49 7.07, 8.65 1.96, 20.02 0" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(592.9609612492314 220.3070213606692) rotate(0 106.77059392843637 40.03049379973237)"><path d="M20.02 0 C86.75 1.56, 158.1 2.74, 193.53 0 M20.02 0 C57.32 0.28, 92.75 1.11, 193.53 0 M193.53 0 C207.64 0.04, 213 7.42, 213.54 20.02 M193.53 0 C208.99 -1.85, 211.4 6.84, 213.54 20.02 M213.54 20.02 C215.36 31.01, 215.36 46.4, 213.54 60.05 M213.54 20.02 C214.07 30.75, 213.73 42.76, 213.54 60.05 M213.54 60.05 C213.19 74.71, 207.73 81.6, 193.53 80.06 M213.54 60.05 C213.11 73.51, 207.47 79.88, 193.53 80.06 M193.53 80.06 C157.27 83.29, 117.94 81.65, 20.02 80.06 M193.53 80.06 C148.75 79.54, 104.71 79.84, 20.02 80.06 M20.02 80.06 C4.85 81.36, 0.34 74.46, 0 60.05 M20.02 80.06 C8.92 79.92, 0.87 71.58, 0 60.05 M0 60.05 C-2.13 48, -2.05 40.55, 0 20.02 M0 60.05 C-0.41 45.87, 0.22 31.45, 0 20.02 M0 20.02 C1.2 5.74, 6.53 1.09, 20.02 0 M0 20.02 C0.94 6.94, 6.47 -0.9, 20.02 0" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(589.7532938130795 394.32894522772096) rotate(0 106.77059392843637 40.03049379973237)"><path d="M20.02 0 C78.2 -0.03, 133.8 -0.48, 193.53 0 M20.02 0 C60.43 0.42, 100.02 1.01, 193.53 0 M193.53 0 C207.37 -0.71, 211.65 5.78, 213.54 20.02 M193.53 0 C205.32 -1.63, 215.21 6.15, 213.54 20.02 M213.54 20.02 C211.79 33.13, 213.92 44.38, 213.54 60.05 M213.54 20.02 C214.56 36.11, 213.34 51.06, 213.54 60.05 M213.54 60.05 C213.21 72.94, 205.22 80.77, 193.53 80.06 M213.54 60.05 C212.88 73.26, 207.89 79.26, 193.53 80.06 M193.53 80.06 C126.25 79.89, 55.83 78.68, 20.02 80.06 M193.53 80.06 C145.15 80.73, 98.68 81.43, 20.02 80.06 M20.02 80.06 C5.49 81.82, 1.95 72.24, 0 60.05 M20.02 80.06 C7.15 81.46, -0.33 72.93, 0 60.05 M0 60.05 C0.66 49.99, 0.44 40.04, 0 20.02 M0 60.05 C-0.1 46.99, -1.08 35.31, 0 20.02 M0 20.02 C-1.63 7.95, 6.92 -1.22, 20.02 0 M0 20.02 C-1.35 8.66, 8.82 -0.45, 20.02 0" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g transform="translate(657.2280113747837 77.89716212615755) rotate(0 44.40998077392578 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Роутер 2</text></g><g transform="translate(655.7201667845881 250.6233554000385) rotate(0 54.14997863769531 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Роутер 2.2</text></g><g transform="translate(652.5124993484361 424.64527926709036) rotate(0 53.22997283935547 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Роутер 2.3</text></g><g stroke-linecap="round"><g transform="translate(274.91881072262515 86.59501969637464) rotate(0 156.98026561693965 0.6648247044535225)"><path d="M0.78 -0.84 C53.32 -0.34, 262.18 2.03, 314.23 2.17 M-0.27 1.33 C52.25 1.6, 261.53 0.76, 313.57 0.66" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(274.91881072262515 86.59501969637464) rotate(0 156.98026561693965 0.6648247044535225)"><path d="M290.1 9.28 C293.85 8.17, 302.28 4.36, 313.57 0.66 M290.1 9.28 C295.11 6.41, 299.22 4.74, 313.57 0.66" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(274.91881072262515 86.59501969637464) rotate(0 156.98026561693965 0.6648247044535225)"><path d="M290.05 -7.82 C293.69 -5.22, 302.13 -5.33, 313.57 0.66 M290.05 -7.82 C295.16 -7.02, 299.28 -5.02, 313.57 0.66" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(10 471.9905524758607) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C61.05 2.53, 102.33 3.73, 132.42 0 C144.04 -1.62, 147.51 7.42, 146.82 14.4 C149.45 20.53, 146.48 34.83, 146.82 43.2 C149.18 52.61, 141.94 56.79, 132.42 57.6 C103.95 58.55, 75.44 60.86, 14.4 57.6 C4.73 59.68, -1.29 55.75, 0 43.2 C2.27 36.32, 2.98 25.78, 0 14.4 C3.23 7.07, 3.52 0.73, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C52.76 0.4, 88.67 3.05, 132.42 0 M14.4 0 C44.06 0.6, 75.51 0.38, 132.42 0 M132.42 0 C143.82 -0.11, 147.87 5.14, 146.82 14.4 M132.42 0 C143.36 0.59, 145.18 5.82, 146.82 14.4 M146.82 14.4 C145.77 26.23, 146.31 34.24, 146.82 43.2 M146.82 14.4 C146.39 22.28, 145.67 30.35, 146.82 43.2 M146.82 43.2 C148.25 54.59, 140.55 56.72, 132.42 57.6 M146.82 43.2 C146.45 52.91, 143.7 57.67, 132.42 57.6 M132.42 57.6 C109.6 57.26, 82.1 57.45, 14.4 57.6 M132.42 57.6 C100.36 56.19, 68.37 57.8, 14.4 57.6 M14.4 57.6 C5.7 55.82, -1.51 54.34, 0 43.2 M14.4 57.6 C6.24 58.53, -1.39 50.96, 0 43.2 M0 43.2 C0.27 38.19, -0.98 28.32, 0 14.4 M0 43.2 C-0.51 36.16, 0.99 30.45, 0 14.4 M0 14.4 C-0.27 5.5, 5.62 -0.49, 14.4 0 M0 14.4 C1.33 3.64, 2.63 -1.44, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(36.528031909357196 488.28902096763284) rotate(0 46.879974365234375 12.5)"><text x="46.879974365234375" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 1</text></g><g stroke-linecap="round" transform="translate(179.6680684034909 470.91835432786195) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C58.99 -3.61, 100.21 0.62, 132.42 0 C142.68 -0.05, 144.47 7.44, 146.82 14.4 C149.14 20.42, 146.69 26, 146.82 43.2 C144.58 55, 143.95 57.21, 132.42 57.6 C97.56 60.94, 61.57 61.81, 14.4 57.6 C5.35 56.41, 3.6 54.89, 0 43.2 C2.83 35.07, -1.68 23.13, 0 14.4 C-1.93 3.23, 1.83 -1.77, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C45.03 -0.65, 77.44 -2.48, 132.42 0 M14.4 0 C58.21 -0.55, 100.74 -0.33, 132.42 0 M132.42 0 C143.19 0.51, 145.4 5.69, 146.82 14.4 M132.42 0 C143.15 -0.25, 145.27 3.64, 146.82 14.4 M146.82 14.4 C146.03 24.03, 147.46 36.41, 146.82 43.2 M146.82 14.4 C147.27 24.75, 145.82 32.86, 146.82 43.2 M146.82 43.2 C146.5 52.89, 143.48 57.66, 132.42 57.6 M146.82 43.2 C144.73 53.64, 141.09 59.79, 132.42 57.6 M132.42 57.6 C95.62 55.83, 58.88 57.59, 14.4 57.6 M132.42 57.6 C106.32 57.72, 78.57 59.39, 14.4 57.6 M14.4 57.6 C6.05 58.41, -1.21 51.2, 0 43.2 M14.4 57.6 C3.45 59.49, -1.66 53.38, 0 43.2 M0 43.2 C-1.68 31.01, 1.46 19.1, 0 14.4 M0 43.2 C-0.39 37.71, 0.16 31.28, 0 14.4 M0 14.4 C1.15 3.79, 2.91 -1.25, 14.4 0 M0 14.4 C1.91 4.7, 4.42 0.92, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(203.4660969559145 487.2168228196341) rotate(0 49.60997772216797 12.5)"><text x="49.60997772216797" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 2</text></g><g stroke-linecap="round" transform="translate(899.7690626189604 58.09748907155986) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C59.23 3.18, 102.23 5.02, 132.42 0 C143.09 -1.33, 144.3 7.9, 146.82 14.4 C146.86 24.46, 147.83 39.92, 146.82 43.2 C148.25 49.76, 143.81 54.06, 132.42 57.6 C96.02 58.03, 59.14 57.08, 14.4 57.6 C8.03 58.23, 2.81 54.75, 0 43.2 C-2.07 29.25, 2.48 19.16, 0 14.4 C1.06 2.43, 2.08 2.54, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C59 -0.57, 100.65 1.24, 132.42 0 M14.4 0 C38.27 -0.46, 62.67 -1.55, 132.42 0 M132.42 0 C142.78 1.68, 148.44 3.53, 146.82 14.4 M132.42 0 C144.21 0.09, 147.53 4.02, 146.82 14.4 M146.82 14.4 C145.13 24.24, 148.59 36.27, 146.82 43.2 M146.82 14.4 C146.32 21.54, 147 29.43, 146.82 43.2 M146.82 43.2 C146.2 52.59, 142.43 56.37, 132.42 57.6 M146.82 43.2 C146.49 51.2, 143.57 57.99, 132.42 57.6 M132.42 57.6 C95.29 59.07, 58.73 58.98, 14.4 57.6 M132.42 57.6 C86.68 57.69, 41 57.78, 14.4 57.6 M14.4 57.6 C3.66 57.24, -0.26 54.1, 0 43.2 M14.4 57.6 C5 55.42, -0.62 52.03, 0 43.2 M0 43.2 C-0.74 34.18, -1.02 26.15, 0 14.4 M0 43.2 C-0.39 37.19, 1.17 31.69, 0 14.4 M0 14.4 C-1.66 3.24, 4.61 1.19, 14.4 0 M0 14.4 C-1.61 2.54, 6.47 1.52, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(926.2970945283176 74.39595756333225) rotate(0 46.879974365234375 12.5)"><text x="46.879974365234375" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 1</text></g><g stroke-linecap="round" transform="translate(898.1294488159 230.82368234544074) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C62.34 -1.91, 107.76 1.57, 132.42 0 C142.8 -0.1, 144.68 3.39, 146.82 14.4 C147.45 21.2, 145.25 25.37, 146.82 43.2 C146.38 49.59, 140.3 54.98, 132.42 57.6 C105.24 59.29, 79.19 60.06, 14.4 57.6 C4.19 59.1, 2.77 55.92, 0 43.2 C-2.21 36.47, 0.89 32.28, 0 14.4 C-1.38 2.02, 5.74 -3.54, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C48.91 -0.11, 85.48 0.14, 132.42 0 M14.4 0 C38.62 0.2, 61.8 0.55, 132.42 0 M132.42 0 C143.86 -1.6, 144.96 4.95, 146.82 14.4 M132.42 0 C142.5 1.62, 146.66 6.57, 146.82 14.4 M146.82 14.4 C146.75 20.4, 148.43 27.39, 146.82 43.2 M146.82 14.4 C146.7 21.69, 147.3 28.43, 146.82 43.2 M146.82 43.2 C146.44 52.91, 142.53 57.44, 132.42 57.6 M146.82 43.2 C144.97 50.94, 143.97 59.77, 132.42 57.6 M132.42 57.6 C85.73 59.49, 39.69 56.47, 14.4 57.6 M132.42 57.6 C90.25 59.19, 50.07 59.07, 14.4 57.6 M14.4 57.6 C6.75 57.48, 0.76 51.22, 0 43.2 M14.4 57.6 C3.91 58.47, 2.11 50.52, 0 43.2 M0 43.2 C1.63 38.13, -1.47 30.19, 0 14.4 M0 43.2 C0.47 32.51, -0.21 23.29, 0 14.4 M0 14.4 C0.82 5.03, 4.63 -0.78, 14.4 0 M0 14.4 C2.03 3.33, 4.79 -1.09, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(924.6574807252572 247.12215083721313) rotate(0 46.879974365234375 12.5)"><text x="46.879974365234375" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 1</text></g><g stroke-linecap="round" transform="translate(894.921781379748 404.8456062124925) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C41.61 0.73, 69.51 3.84, 132.42 0 C143.15 3.41, 149.8 1.76, 146.82 14.4 C150.01 18.74, 146.11 27.7, 146.82 43.2 C145.66 54.91, 141.69 59.3, 132.42 57.6 C88.3 56.22, 44.58 58.45, 14.4 57.6 C1.49 56.49, 2.77 55.7, 0 43.2 C-2.22 34.73, -0.33 30.31, 0 14.4 C-0.01 1.88, 3.05 3.04, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C54.62 -0.22, 96.42 0.45, 132.42 0 M14.4 0 C42.74 -0.31, 69.64 -0.4, 132.42 0 M132.42 0 C140.67 -1.42, 148.27 4.35, 146.82 14.4 M132.42 0 C142.69 -2.1, 147.07 3.21, 146.82 14.4 M146.82 14.4 C148.75 23.68, 147.09 33.24, 146.82 43.2 M146.82 14.4 C146.55 24.05, 145.89 34.51, 146.82 43.2 M146.82 43.2 C146.24 52.69, 142.91 56.9, 132.42 57.6 M146.82 43.2 C149.06 52.82, 142.38 59.55, 132.42 57.6 M132.42 57.6 C99.18 58.49, 67.93 55.67, 14.4 57.6 M132.42 57.6 C99.01 59.05, 67.76 57.59, 14.4 57.6 M14.4 57.6 C5.22 58.81, -0.29 52.4, 0 43.2 M14.4 57.6 C3.58 55.51, -2.07 53.14, 0 43.2 M0 43.2 C0.18 35.67, -0.54 26.55, 0 14.4 M0 43.2 C-0.55 37.12, 0.38 29.16, 0 14.4 M0 14.4 C-1.18 6.53, 6.67 -0.39, 14.4 0 M0 14.4 C1.44 4.68, 2.75 -0.26, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(921.4498132891052 421.1440747042649) rotate(0 46.879974365234375 12.5)"><text x="46.879974365234375" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 1</text></g><g stroke-linecap="round" transform="translate(1069.437131022452 57.02529092356113) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C55.18 -3.19, 91.3 1.24, 132.42 0 C145.56 -0.35, 148.47 4.9, 146.82 14.4 C148.4 18.87, 148.76 25.88, 146.82 43.2 C147.1 52.03, 141.22 57.53, 132.42 57.6 C97.28 58.2, 58.5 59.52, 14.4 57.6 C7.42 58.29, 1.15 50.82, 0 43.2 C0.69 34.76, -3.09 33.59, 0 14.4 C-2.78 2.67, 2.45 2.72, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C48.6 -0.4, 88.3 -2.16, 132.42 0 M14.4 0 C57.06 1.43, 99.77 -0.04, 132.42 0 M132.42 0 C143.92 0.08, 147.44 4.12, 146.82 14.4 M132.42 0 C143.37 -1.01, 145.73 3, 146.82 14.4 M146.82 14.4 C146.18 24.29, 148.94 28.7, 146.82 43.2 M146.82 14.4 C146.48 22.41, 147 30.02, 146.82 43.2 M146.82 43.2 C146.53 51.41, 143.37 57.94, 132.42 57.6 M146.82 43.2 C147.21 53.34, 142.39 57.92, 132.42 57.6 M132.42 57.6 C91.21 58.04, 48.13 58.28, 14.4 57.6 M132.42 57.6 C106.74 56.5, 82.07 57.33, 14.4 57.6 M14.4 57.6 C4.98 55.7, -0.54 52.13, 0 43.2 M14.4 57.6 C5.27 55.49, 1.18 51.64, 0 43.2 M0 43.2 C-1.73 32.63, -0.84 24.07, 0 14.4 M0 43.2 C-1.1 34.16, -0.37 27.28, 0 14.4 M0 14.4 C-1.4 2.84, 6.25 1.32, 14.4 0 M0 14.4 C1.32 6.75, 2.78 1.7, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(1093.2351595748755 73.32375941533346) rotate(0 49.60997772216797 12.5)"><text x="49.60997772216797" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 2</text></g><g stroke-linecap="round" transform="translate(1067.7975172193915 229.751484197442) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C40.25 -0.29, 62.4 -1.6, 132.42 0 C139.65 -1.27, 148.7 5.62, 146.82 14.4 C146.18 19.87, 144.9 29.15, 146.82 43.2 C143.82 51.24, 142.67 55.99, 132.42 57.6 C92.11 60.33, 55.79 61.94, 14.4 57.6 C2.55 57.4, 2.88 50.56, 0 43.2 C-1.5 31.68, 0.82 22.18, 0 14.4 C-2.69 8.26, 3.52 -0.15, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C51.76 -2.45, 92.75 0.23, 132.42 0 M14.4 0 C50.96 -1.24, 84.75 -0.37, 132.42 0 M132.42 0 C142.43 1.41, 146.68 6.34, 146.82 14.4 M132.42 0 C139.89 1.77, 147.62 4.47, 146.82 14.4 M146.82 14.4 C145.62 23.44, 146.77 31.4, 146.82 43.2 M146.82 14.4 C146.75 24.99, 147.2 35.4, 146.82 43.2 M146.82 43.2 C145.21 51.18, 143.72 59.49, 132.42 57.6 M146.82 43.2 C148.84 53.62, 142.15 56.55, 132.42 57.6 M132.42 57.6 C87.2 55.98, 41.6 55.07, 14.4 57.6 M132.42 57.6 C90.32 58.17, 46.64 57.44, 14.4 57.6 M14.4 57.6 C4.02 58.35, 1.84 50.82, 0 43.2 M14.4 57.6 C2.97 55.42, 1.63 54.36, 0 43.2 M0 43.2 C1.35 33.66, 1.95 23.44, 0 14.4 M0 43.2 C0.43 36.02, -0.07 28.21, 0 14.4 M0 14.4 C1.77 3.52, 4.79 -0.95, 14.4 0 M0 14.4 C1.85 4.6, 3.45 1.95, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(1091.595545771815 246.0499526892144) rotate(0 49.60997772216797 12.5)"><text x="49.60997772216797" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 2</text></g><g stroke-linecap="round" transform="translate(1064.5898497832395 403.77340806449376) rotate(0 73.40800627459157 28.798468491772326)"><path d="M14.4 0 C49.1 1.9, 84.51 -4.54, 132.42 0 C141.1 -2.78, 144.01 8.4, 146.82 14.4 C145.61 22.29, 146.45 27.67, 146.82 43.2 C149.71 51.17, 144.83 58.37, 132.42 57.6 C103.66 56.01, 84.3 60.02, 14.4 57.6 C3.76 59.52, -3.42 50.86, 0 43.2 C0 32.17, -1.74 30.01, 0 14.4 C1.26 7.32, 7.54 3.04, 14.4 0" stroke="none" stroke-width="0" fill="#b2f2bb"></path><path d="M14.4 0 C49.35 -0.51, 86.72 0.03, 132.42 0 M14.4 0 C44.94 -0.18, 77.56 0.3, 132.42 0 M132.42 0 C142.6 -1.83, 147.04 3.41, 146.82 14.4 M132.42 0 C141.95 0.86, 144.53 6.9, 146.82 14.4 M146.82 14.4 C147.7 23.4, 146.27 33.46, 146.82 43.2 M146.82 14.4 C146.29 22.34, 147.02 30.04, 146.82 43.2 M146.82 43.2 C148.77 52.82, 142.33 59.29, 132.42 57.6 M146.82 43.2 C146.3 53.08, 140.12 57.05, 132.42 57.6 M132.42 57.6 C85.55 58.92, 40.52 55.85, 14.4 57.6 M132.42 57.6 C86.83 57.53, 40.69 56.72, 14.4 57.6 M14.4 57.6 C3.74 55.78, -1.8 53.1, 0 43.2 M14.4 57.6 C4.61 57.69, -0.25 53.01, 0 43.2 M0 43.2 C-1.26 31.49, 0.15 21.78, 0 14.4 M0 43.2 C-0.62 33.59, 0.9 22.06, 0 14.4 M0 14.4 C1.25 4.7, 3.01 -0.23, 14.4 0 M0 14.4 C-1.46 4.57, 3.4 -0.45, 14.4 0" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(1088.3878783356631 420.07187655626615) rotate(0 49.60997772216797 12.5)"><text x="49.60997772216797" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#2f9e44" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Хендлер 2</text></g><g stroke-linecap="round"><g transform="translate(164.53976177837865 399.061004042395) rotate(0 -41.00045960868238 33.46477421673279)"><path d="M0 0 C0.39 8.2, -0.8 11.99, 0 17.46 M0 0 C-0.47 6.08, -0.05 12.84, 0 17.46 M0 17.46 C0.93 27.01, -4.11 32.43, -16 33.46 M0 17.46 C-1.56 29.53, -4.35 33.42, -16 33.46 M-16 33.46 C-28.23 33.17, -42.36 35.3, -65.23 33.46 M-16 33.46 C-32.28 33.13, -47.85 34.2, -65.23 33.46 M-65.23 33.46 C-76.92 33.96, -83.02 37.57, -81.23 49.46 M-65.23 33.46 C-76.7 34.62, -82.7 40.21, -81.23 49.46 M-81.23 49.46 C-82.78 54.57, -81.95 57.88, -81.23 66.93 M-81.23 49.46 C-81.38 54.52, -80.52 58.06, -81.23 66.93" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(164.53976177837865 399.061004042395) rotate(0 -41.00045960868238 33.46477421673279)"><path d="M-86.28 50.98 C-83.96 58.48, -83.16 61.82, -81.23 66.93 M-86.28 50.98 C-84.81 56.48, -82.49 62.66, -81.23 66.93" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(164.53976177837865 399.061004042395) rotate(0 -41.00045960868238 33.46477421673279)"><path d="M-74.85 51.46 C-76.93 58.89, -80.53 62.04, -81.23 66.93 M-74.85 51.46 C-77.71 56.84, -79.74 62.84, -81.23 66.93" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(164.53976177837865 399.061004042395) rotate(0 44.175158104233276 32.92867514273337)"><path d="M0 0 C1.41 5.98, -0.31 9.36, 0 16.93 M0 0 C0.54 3.39, -0.04 8.14, 0 16.93 M0 16.93 C0.35 26.8, 6.65 33.29, 16 32.93 M0 16.93 C-1.18 26.7, 4.69 31.49, 16 32.93 M16 32.93 C28.51 30.88, 38.58 32.49, 72.44 32.93 M16 32.93 C28 32.66, 39.39 33.06, 72.44 32.93 M72.44 32.93 C83.75 31.25, 87.43 38.57, 88.44 48.93 M72.44 32.93 C80.81 35.05, 86.18 37.88, 88.44 48.93 M88.44 48.93 C87.45 53.45, 88.79 62.33, 88.44 65.86 M88.44 48.93 C88.07 53.33, 88.69 59.39, 88.44 65.86" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(164.53976177837865 399.061004042395) rotate(0 44.175158104233276 32.92867514273337)"><path d="M82.92 50.34 C85.97 55.86, 85.98 58.86, 88.44 65.86 M82.92 50.34 C84.65 53.47, 85.29 57.88, 88.44 65.86" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(164.53976177837865 399.061004042395) rotate(0 44.175158104233276 32.92867514273337)"><path d="M94.18 50.43 C93.8 55.93, 90.38 58.91, 88.44 65.86 M94.18 50.43 C93.46 53.46, 91.64 57.85, 88.44 65.86" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(814.1417629091646 81.57689098656999) rotate(0 79.64766757033175 -34.791612681065615)"><path d="M0 0 C8.36 0.48, 19.58 -0.91, 23.81 0 M0 0 C10.04 -0.25, 18.92 0.8, 23.81 0 M23.81 0 C35.18 1.93, 39.39 -5.84, 39.81 -16 M23.81 0 C32.94 -1.11, 41.82 -3.15, 39.81 -16 M39.81 -16 C40.28 -27.32, 39.91 -38.44, 39.81 -53.48 M39.81 -16 C39.72 -26.65, 39.01 -37.84, 39.81 -53.48 M39.81 -53.48 C39.52 -65.67, 46.54 -71.33, 55.81 -69.48 M39.81 -53.48 C39.5 -63.82, 45.78 -68.75, 55.81 -69.48 M55.81 -69.48 C79.2 -67.85, 106.67 -70.28, 142.94 -69.48 M55.81 -69.48 C86.51 -70.28, 118.6 -69.7, 142.94 -69.48 M142.94 -69.48 C154.85 -68.78, 160.88 -64.94, 158.94 -53.48 M142.94 -69.48 C154.95 -70.2, 160.1 -63.92, 158.94 -53.48 M158.94 -53.48 C158.71 -49.85, 159.02 -44.4, 158.94 -29.48 M158.94 -53.48 C158.11 -44.56, 159.03 -37.19, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(814.1417629091646 81.57689098656999) rotate(0 79.64766757033175 -34.791612681065615)"><path d="M151.79 -48.16 C153.69 -40.44, 158.44 -34.59, 158.94 -29.48 M151.79 -48.16 C155.24 -40.93, 157.49 -32.44, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(814.1417629091646 81.57689098656999) rotate(0 79.64766757033175 -34.791612681065615)"><path d="M165.46 -48.38 C162.06 -40.59, 161.5 -34.65, 158.94 -29.48 M165.46 -48.38 C163.48 -41.03, 160.27 -32.45, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(812.5021491061042 254.3030842604509) rotate(0 79.68929478188005 -34.5597027805853)"><path d="M0 0 C4.91 -0.64, 10.48 1.75, 23.81 0 M0 0 C5.44 0.69, 10.4 0.75, 23.81 0 M23.81 0 C32.63 1.54, 40.51 -5.62, 39.81 -16 M23.81 0 C34.51 1.6, 41.01 -6.94, 39.81 -16 M39.81 -16 C41.18 -27.08, 41.4 -40.25, 39.81 -53.48 M39.81 -16 C38.92 -28.25, 40.57 -37.95, 39.81 -53.48 M39.81 -53.48 C41.57 -63.43, 45.26 -70.39, 55.81 -69.48 M39.81 -53.48 C41.92 -65.49, 43.78 -68.34, 55.81 -69.48 M55.81 -69.48 C79.28 -68.34, 101.21 -66.73, 142.94 -69.48 M55.81 -69.48 C81.04 -68.41, 107.97 -69.78, 142.94 -69.48 M142.94 -69.48 C152.01 -71.38, 160.35 -62.79, 158.94 -53.48 M142.94 -69.48 C155.07 -71.49, 158.59 -62.88, 158.94 -53.48 M158.94 -53.48 C158.21 -45.28, 160.23 -35.99, 158.94 -29.48 M158.94 -53.48 C159.8 -46.64, 158.91 -39, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(812.5021491061042 254.3030842604509) rotate(0 79.68929478188005 -34.5597027805853)"><path d="M152.45 -48.4 C153.79 -45.1, 155.82 -38.85, 158.94 -29.48 M152.45 -48.4 C153.91 -43.54, 155.06 -39.32, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(812.5021491061042 254.3030842604509) rotate(0 79.68929478188005 -34.5597027805853)"><path d="M166.13 -48.14 C164.67 -44.84, 163.9 -38.64, 158.94 -29.48 M166.13 -48.14 C164.58 -43.33, 162.73 -39.16, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(809.2944816699522 428.32500812750266) rotate(0 79.65637285899481 -34.830484682720396)"><path d="M0 0 C6.4 -1.95, 13.33 -1.4, 23.81 0 M0 0 C5.75 -0.86, 11.02 -0.64, 23.81 0 M23.81 0 C34.42 0.75, 37.82 -3.51, 39.81 -16 M23.81 0 C35.32 0.19, 41.81 -4.34, 39.81 -16 M39.81 -16 C39.47 -27.59, 40.62 -36.46, 39.81 -53.48 M39.81 -16 C40.62 -27.03, 39.81 -37.23, 39.81 -53.48 M39.81 -53.48 C39.36 -63.9, 43.49 -69.96, 55.81 -69.48 M39.81 -53.48 C41.96 -62.97, 44.05 -69.98, 55.81 -69.48 M55.81 -69.48 C91.94 -67.02, 123.4 -68.55, 142.94 -69.48 M55.81 -69.48 C86.72 -70.21, 117.79 -69.16, 142.94 -69.48 M142.94 -69.48 C153.44 -69.4, 158.72 -63.96, 158.94 -53.48 M142.94 -69.48 C154.61 -70.09, 159.11 -65.68, 158.94 -53.48 M158.94 -53.48 C160.22 -48.21, 157.72 -44.61, 158.94 -29.48 M158.94 -53.48 C159.78 -44.25, 158.27 -35.04, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(809.2944816699522 428.32500812750266) rotate(0 79.65637285899481 -34.830484682720396)"><path d="M151.67 -48.11 C153.12 -44.46, 155.11 -38.35, 158.94 -29.48 M151.67 -48.11 C153.76 -44.74, 155.24 -40.25, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(809.2944816699522 428.32500812750266) rotate(0 79.65637285899481 -34.830484682720396)"><path d="M165.35 -48.42 C162.72 -44.64, 160.62 -38.44, 158.94 -29.48 M165.35 -48.42 C164.31 -45.01, 162.66 -40.45, 158.94 -29.48" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(814.1417629091646 81.6164217504294) rotate(0 164.77423799563226 -35.70550516677581)"><path d="M0 0 C6.86 -1.27, 12.97 0.51, 23.75 0 M0 0 C8.71 0.55, 18.65 -0.77, 23.75 0 M23.75 0 C35.77 0.83, 37.82 -5.25, 39.75 -16 M23.75 0 C35.97 1.49, 40.64 -5.3, 39.75 -16 M39.75 -16 C38.5 -27.32, 41.05 -41.07, 39.75 -54.06 M39.75 -16 C39.82 -26.84, 38.86 -37.63, 39.75 -54.06 M39.75 -54.06 C39.15 -63.08, 46.49 -71.45, 55.75 -70.06 M39.75 -54.06 C40.08 -65.03, 46.78 -71.51, 55.75 -70.06 M55.75 -70.06 C146.77 -71.23, 239.43 -72.88, 312.6 -70.06 M55.75 -70.06 C112.77 -68.36, 169.59 -68.46, 312.6 -70.06 M312.6 -70.06 C323.21 -68.43, 329.77 -66.13, 328.6 -54.06 M312.6 -70.06 C321.08 -69.22, 327.28 -66.92, 328.6 -54.06 M328.6 -54.06 C329.46 -44.91, 330.21 -39.92, 328.6 -30.59 M328.6 -54.06 C328.3 -46.03, 329.14 -36.61, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(814.1417629091646 81.6164217504294) rotate(0 164.77423799563226 -35.70550516677581)"><path d="M322.39 -49.32 C324.82 -45.55, 326.37 -38.93, 328.6 -30.59 M322.39 -49.32 C324.17 -41.69, 327.34 -35.77, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(814.1417629091646 81.6164217504294) rotate(0 164.77423799563226 -35.70550516677581)"><path d="M335.88 -48.94 C334.8 -45.15, 332.84 -38.62, 328.6 -30.59 M335.88 -48.94 C332.46 -41.56, 330.42 -35.79, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(812.5021491061042 254.34261502431033) rotate(0 164.55031121943415 -35.33620142811242)"><path d="M0 0 C8.79 1.9, 14.48 -1.79, 23.75 0 M0 0 C7.23 0.6, 13.67 0.6, 23.75 0 M23.75 0 C35.12 -0.29, 39.78 -3.94, 39.75 -16 M23.75 0 C35.62 -1.6, 40.18 -5.62, 39.75 -16 M39.75 -16 C41.04 -27.13, 39.61 -36.99, 39.75 -54.06 M39.75 -16 C40.91 -26.17, 40.94 -37.87, 39.75 -54.06 M39.75 -54.06 C39.87 -65.64, 46.92 -71.23, 55.75 -70.06 M39.75 -54.06 C38.38 -63.59, 44.04 -68.22, 55.75 -70.06 M55.75 -70.06 C110.24 -68.84, 162.91 -69.81, 312.6 -70.06 M55.75 -70.06 C113.29 -71.64, 168.72 -71.61, 312.6 -70.06 M312.6 -70.06 C324.69 -68.71, 329.88 -66.47, 328.6 -54.06 M312.6 -70.06 C322.92 -68.8, 329.69 -62.77, 328.6 -54.06 M328.6 -54.06 C329.58 -44.79, 328.73 -37.32, 328.6 -30.59 M328.6 -54.06 C328.8 -48.41, 329.61 -41.9, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(812.5021491061042 254.34261502431033) rotate(0 164.55031121943415 -35.33620142811242)"><path d="M322.86 -49.47 C325.54 -41.25, 325.17 -38.5, 328.6 -30.59 M322.86 -49.47 C324.6 -42.95, 325.52 -37.15, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(812.5021491061042 254.34261502431033) rotate(0 164.55031121943415 -35.33620142811242)"><path d="M336.34 -48.75 C334.46 -40.8, 329.52 -38.3, 328.6 -30.59 M336.34 -48.75 C333.94 -42.35, 330.71 -36.78, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(809.2944816699522 428.36453889136203) rotate(0 164.62280435903875 -35.49515902485962)"><path d="M0 0 C6.83 -1.12, 14.03 1.67, 23.75 0 M0 0 C6.7 -0.48, 13.15 0.59, 23.75 0 M23.75 0 C32.43 1.83, 40.48 -5.16, 39.75 -16 M23.75 0 C36.42 0.99, 38.95 -5.98, 39.75 -16 M39.75 -16 C40.54 -27.37, 39.73 -36.69, 39.75 -54.06 M39.75 -16 C39.54 -25.24, 39.16 -36.06, 39.75 -54.06 M39.75 -54.06 C38.1 -65.21, 46.95 -69.04, 55.75 -70.06 M39.75 -54.06 C38.65 -65.23, 47.26 -68.95, 55.75 -70.06 M55.75 -70.06 C116.69 -71.74, 180.45 -72.31, 312.6 -70.06 M55.75 -70.06 C126.95 -68.07, 199.53 -68.15, 312.6 -70.06 M312.6 -70.06 C323.05 -69.87, 329.48 -65.26, 328.6 -54.06 M312.6 -70.06 C323.45 -71.6, 326.52 -64.64, 328.6 -54.06 M328.6 -54.06 C327.53 -50.11, 330.48 -41.93, 328.6 -30.59 M328.6 -54.06 C327.86 -47.59, 328.11 -40.99, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(809.2944816699522 428.36453889136203) rotate(0 164.62280435903875 -35.49515902485962)"><path d="M321.08 -48.83 C322.58 -44.16, 324.51 -35.47, 328.6 -30.59 M321.08 -48.83 C323.33 -44.39, 325.28 -38.27, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g><g transform="translate(809.2944816699522 428.36453889136203) rotate(0 164.62280435903875 -35.49515902485962)"><path d="M334.56 -49.4 C331.68 -44.67, 329.22 -35.8, 328.6 -30.59 M334.56 -49.4 C333.08 -44.92, 331.28 -38.65, 328.6 -30.59" stroke="#2f9e44" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(701.2711689807284 133.641815686253) rotate(0 -1.0507049348689463 40.3326028372081)"><path d="M0 0 C-1.07 26.42, -2.98 51.97, -1.64 80.67" stroke="#1971c2" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(701.2711689807284 133.641815686253) rotate(0 -1.0507049348689463 40.3326028372081)"><path d="M-10.6 57.33 C-8.37 65.94, -6.96 73.58, -1.64 80.67" stroke="#1971c2" stroke-width="2.5" fill="none"></path></g><g transform="translate(701.2711689807284 133.641815686253) rotate(0 -1.0507049348689463 40.3326028372081)"><path d="M6.5 57.03 C3.39 65.57, -0.55 73.3, -1.64 80.67" stroke="#1971c2" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(518.4799576815216 156.878603831728) rotate(0 81.37995147705078 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Дочерний роутер</text></g><g transform="translate(515.2722902453696 330.9005276987798) rotate(0 81.37995147705078 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Дочерний роутер</text></g><g stroke-linecap="round"><g transform="translate(699.5480794450128 306.36800896013403) rotate(0 -1.3990038666353257 40.980468133793465)"><path d="M0 0 C-0.52 28.13, -0.92 53.71, -2.8 81.96" stroke="#1971c2" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(699.5480794450128 306.36800896013403) rotate(0 -1.3990038666353257 40.980468133793465)"><path d="M-10.07 58.04 C-7.18 67.27, -4.28 73.86, -2.8 81.96" stroke="#1971c2" stroke-width="2.5" fill="none"></path></g><g transform="translate(699.5480794450128 306.36800896013403) rotate(0 -1.3990038666353257 40.980468133793465)"><path d="M7 58.96 C4.32 67.74, 1.63 74.03, -2.8 81.96" stroke="#1971c2" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(544.3203753468287 120.16206713731063) rotate(0 -174.67481466628516 88.06419106075873)"><path d="M0 0 C-135.77 68.37, -273.67 139.03, -349.35 176.13" stroke="#f08c00" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(544.3203753468287 120.16206713731063) rotate(0 -174.67481466628516 88.06419106075873)"><path d="M-17.1 18.23 C-9.42 9.6, -5.53 5.85, 0 0" stroke="#f08c00" stroke-width="2.5" fill="none"></path></g><g transform="translate(544.3203753468287 120.16206713731063) rotate(0 -174.67481466628516 88.06419106075873)"><path d="M-24.82 2.97 C-14.14 0.28, -7.23 2.48, 0 0" stroke="#f08c00" stroke-width="2.5" fill="none"></path></g><g transform="translate(544.3203753468287 120.16206713731063) rotate(0 -174.67481466628516 88.06419106075873)"><path d="M-332.14 157.99 C-337.87 163.63, -347.36 174.07, -349.35 176.13" stroke="#f08c00" stroke-width="2.5" fill="none"></path></g><g transform="translate(544.3203753468287 120.16206713731063) rotate(0 -174.67481466628516 88.06419106075873)"><path d="M-324.51 173.29 C-333.2 172.99, -345.67 177.45, -349.35 176.13" stroke="#f08c00" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(192.80943648337075 177.1951366266006) rotate(333.3754198088162 166.22091439302633 11.301402844416856)"><text x="0" y="15.930457449490007" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="18.082244551066978px" fill="#f08c00" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Параллельные (независимые) роутеры</text></g></svg>
@@ -0,0 +1,212 @@
1
+ ---
2
+ title: Обработка запросов
3
+ icon:
4
+ ---
5
+
6
+ # Обработка запросов
7
+
8
+ ## Роутер
9
+
10
+ При любом взаимодействии с ботом — например, при личном сообщении, добавлении в групповой чат или канал — бот получает **обновление (update)** от сервера.
11
+
12
+ Для обработки этих событий используется `Router`. Он определяет, какие функции нужно вызвать при получении конкретного типа апдейта. Это позволяет централизованно управлять логикой обработки различных типов сообщений:
13
+
14
+ === "Без имени"
15
+ ```python
16
+ from trueconf import Router
17
+
18
+ r = Router()
19
+ ```
20
+
21
+ === "С именем"
22
+ ```python
23
+ from trueconf import Router
24
+
25
+ r = Router(name="Router1")
26
+ ```
27
+
28
+ Чтобы отловить обновление функцию-обработчик оборачивают в декоратор, например, для события [`SendMessage`](https://trueconf.ru/docs/chatbot-connector/ru/messages/#newMessage) необходимо использовать декоратор `@<router>.message()`:
29
+
30
+ ```python hl_lines="1"
31
+ @r.message()
32
+ async def on_message(message): ...
33
+ ```
34
+
35
+ ### Поддержка фильтров
36
+
37
+ Роутеры поддерживают фильтры на основе библиотеки [magic-filter](https://github.com/aiogram/magic-filter). Для этого используется объект `F`:
38
+
39
+ ```python
40
+ from trueconf import F
41
+ ```
42
+
43
+ Фильтры позволяют обрабатывать только те события (входящие обновления), которые соответствуют заданным условиям. Например:
44
+
45
+
46
+ === "Текстовое сообщение"
47
+ ```python hl_lines="4"
48
+ from trueconf import Router, F
49
+ r = Router()
50
+
51
+ @r.message(F.text)
52
+ async def on_message(message): ...
53
+ ```
54
+
55
+ === "Изображение"
56
+ ```python hl_lines="4"
57
+ from trueconf import Router, F
58
+ r = Router()
59
+
60
+ @r.message(F.photo)
61
+ async def on_photo(message): ...
62
+ ```
63
+
64
+ === "Сообщение от пользователя"
65
+ ```python hl_lines="4"
66
+ from trueconf import Router, F
67
+ r = Router()
68
+
69
+ @r.message(F.from_user.id == "elisa")
70
+ async def on_elisa(message): ...
71
+ ```
72
+
73
+ !!! Tip
74
+ Более подробные примеры использования фильтров вы можете найти в [разделе Фильтры](filters.md).
75
+
76
+ ### Регистрация роутеров в диспетчере
77
+
78
+ Все созданные роутеры необходимо зарегистрировать в главном обработчике событий — диспетчере (Dispatcher).
79
+ Именно он объединяет обработчики и управляет маршрутизацией входящих обновлений (апдейтов):
80
+
81
+ ```python
82
+ from trueconf import Dispatcher
83
+
84
+ dp = Dispatcher()
85
+ dp.include_router(r)
86
+ ```
87
+
88
+ Как правило, роутеров может быть очень много, а диспетчер один:
89
+
90
+ ```python hl_lines="7 14"
91
+ from trueconf import Bot, Router, Dispatcher
92
+ r1 = Router()
93
+ r2 = Router()
94
+ r3 = Router()
95
+ r4 = Router()
96
+
97
+ dp = Dispatcher()
98
+
99
+ dp.include_router(r1)
100
+ dp.include_router(r2)
101
+ dp.include_router(r3)
102
+ dp.include_router(r4)
103
+
104
+ bot = Bot(token="JWT-token", dispatcher=dp)
105
+ ```
106
+
107
+ ### Динамические роутеры
108
+
109
+ Мы рассмотрели пример создания простого роутера, который заранее описан в коде:
110
+
111
+ ```python
112
+ from trueconf import Router, F
113
+ r = Router()
114
+
115
+ @r.message(F.from_user.id == "elisa")
116
+ async def on_elisa(message): ...
117
+ ```
118
+
119
+ Но, что делать, если нужно отлавливать событие условие которого заранее не определено?
120
+ На помощь приходит **динамическая регистрация роутеров** (или динамические роутеры).
121
+ Как вы уже видели регистрация обработчика происходит с помощью декоратора (`@<router>`).
122
+
123
+ !!! Note
124
+ **Декоратор** — это функция-обертка, которая связывает программный код с конкретным событием.
125
+ Он «оборачивает» функцию-обработчик и регистрирует её в системе, чтобы при наступлении события (триггера) система знала, какой именно код нужно запустить.
126
+
127
+ Для динамической регистрации роутера нужно использовать функциональный вызов декоратора — способ применения без использования синтаксического сахара `@decorator`.
128
+
129
+ ```python hl_lines="7"
130
+ async def handle_message() ...
131
+
132
+ @r.message(Command("start"))
133
+ async def on_report(msg: Message):
134
+ dynamic_r = Router()
135
+ dp.include_router(dynamic_r)
136
+ dynamic_r.message(F.from_user.id == msg.from_user.id)(handle_message)
137
+ ```
138
+
139
+ !!! Example
140
+ Подробный пример кода с динамическим роутером вы найдете в [нашем GitHub](https://github.com/TrueConf/python-trueconf-bot/blob/master/examples/report_bot.py).
141
+
142
+ ### Удаление роутера из диспетчера
143
+
144
+ Удаление роутера (его деактивация) зачастую нужно в случаях, когда для пользователя создавался динамический роутер и он больше не нужен.
145
+ Диспетчер хранит в себе список всех зарегистрированных роутеров `dp.routers`.
146
+ Соответственно, если вы задали имя `Router(name="Cool")`, то его легко можно удалить следующим образом:
147
+
148
+ ```python
149
+ for router in dp.routers[:]:# (1)!
150
+ if router.name == "Cool"
151
+ dp.routers.remove(router)
152
+ ```
153
+
154
+ 1. Используем копию списка через срез, чтобы цикл **for** не сломался при удалении элемента.
155
+
156
+ ### Параллельные и дочерние роутеры
157
+
158
+ Роутеры также могут быть:
159
+
160
+ - параллельные, которые обрабатываются независимо друг от друга.
161
+ - дочерние (зависимые), которые обрабатываются по цепочке.
162
+
163
+ ![router_scheme_ru.svg](../img/router_scheme_ru.svg)
164
+
165
+ Взляните на схему! Когда придет новое событие от сервера, то диспетчер обработает его так:
166
+
167
+ 1. Отправит на обработку в **Роутер 1**.
168
+ 2. Проверит условие первого обработчика **Хендлер 1**. Если он сработал, переходит к **Роутер 2**.
169
+ Если нет, то проверяет следующий обработчик **Хендлер 2**.
170
+ 3. В независимости от срабатывания обработчиков в **Роутере 1**, диспетчер переходит к выполнению **Роутер 2**.
171
+
172
+ В **Роутер 2**, как мы видим, два дочерних роутера: **Роутер 2.3** является потомком **Роутер 2.2**, а **Роутер 2.2** является потомком **Роутер 2**.
173
+
174
+ Здесь событие будет обрабатываться следующим образом:
175
+
176
+ 1. Если ничего не сработало в **Роутер 2**, тогда перейти к **Роутер 2.2**.
177
+ 2. Если ничего не сработало в **Роутер 2.2**, тогда перейти к **Роутер 2.3**.
178
+
179
+ Таким образом обработчик **Хендлер 2** из **Роутера 2.3** сработает только в том случае, если никакой до него не сработал.
180
+
181
+ ## Приоритеты обработчиков
182
+
183
+ * Роутеры и их обработчики проверяются в порядке подключения через Dispatcher.include_router().
184
+ * Внутри одного роутера обработчики также идут по порядку объявления.
185
+ * При первом совпадении фильтров обработчик выполняется, и дальнейшие совпадения не проверяются (поведение по умолчанию).
186
+
187
+ Это означает, что если у вас есть несколько обработчиков с одинаковыми фильтрами:
188
+
189
+ ```python
190
+ @r.message(F.text == "Hello")
191
+ async def handler1(message):
192
+ await message.answer("Первый")
193
+
194
+ @r.message(F.text == "Hello")
195
+ async def handler2(message):
196
+ await message.answer("Второй")
197
+ ```
198
+
199
+ То сработает **только handler1**, а до handler2 исполнение уже не дойдёт.
200
+
201
+ Чтобы задействовать оба обработчика, используйте разные фильтры или объедините их в один с дополнительной логикой внутри функции.
202
+
203
+ !!! Tip
204
+ Для разделения логики рекомендуется создавать несколько роутеров (например, commands_router, messages_router, admin_router) и подключать их в диспетчере в нужном порядке. Такой подход помогает структурировать код и упрощает поддержку бота.
205
+
206
+ ## Рекомендации по организации кода
207
+
208
+ - Обычно роутеры выносят в отдельные модули (например, handlers/messages.py), а затем подключают их в главном модуле бота через include_router.
209
+ - Это позволяет разделять обработчики по областям ответственности: сообщения, фото, командыа и т. д.
210
+ - Диспетчер (Dispatcher) можно рассматривать как центральный управляющий компонент, объединяющий логику обработки всех событий.
211
+
212
+
@@ -1,6 +1,10 @@
1
1
  # Примеры
2
2
 
3
- В [этой директории](../examples) вы найдете набор готовых примеров, подготовленных командой разработчиков `python-trueconf-bot`.
3
+ В [этой директории](../examples) вы найдете набор готовых примеров, подготовленных командой разработчиков `python-trueconf-bot`:
4
+
5
+ - `update_token.py` — пример автообновления JWT-токена, который нееобходим для "жизни" бота.
6
+ - `report_bot.py` — пример бота, который собирает обращения в тех. поддержку (с использованием [динамических роутеров](https://trueconf.github.io/python-trueconf-bot/latest/ru/learn/parse-messages/#_5)).
7
+ - `webhook.py` — пример интеграции с внешней системой, например Zabbix, которая может отправить событие на webhook с дальнейшей обработкой этого события чат-ботом (с использованием FastAPI).
4
8
 
5
9
  Ниже приведён список публичных проектов и скриптов, реализованных с использованием нашей библиотеки:
6
10
 
@@ -110,7 +110,7 @@ async def handle_id(message: Message):
110
110
  await bot.send_message(chat_id=message.chat_id, text=f"Your ID: {message.author.id}")
111
111
 
112
112
  try:
113
- asyncio.run(bot.start())
113
+ asyncio.run(bot.run())
114
114
  except KeyboardInterrupt:
115
115
  sys.exit(0)
116
116
  except asyncio.CancelledError:
@@ -0,0 +1,94 @@
1
+ """
2
+ Below is the initial scaffold for a bot that collects support reports.
3
+
4
+ - /report creates a router/state to capture and parse messages from a specific user.
5
+ - /cancel cancels the ticket and removes the user from this state.
6
+ - /send emails the collected messages — this is where you implement the logic to assemble the email (body + attachments) and send it.
7
+ You can use built-in modules, and third-party libraries if needed.
8
+ """
9
+
10
+ import asyncio
11
+ import uuid
12
+ import trueconf
13
+ from trueconf import *
14
+ from trueconf.filters import Command
15
+
16
+ r1 = Router()
17
+ dp = Dispatcher()
18
+ dp.include_router(r1)
19
+
20
+ router_list_for_report = {}
21
+ list_message_for_report = {}
22
+
23
+ bot = trueconf.Bot.from_credentials(
24
+ server="10.110.2.241",
25
+ username="report_bot",
26
+ password="123tr",
27
+ dispatcher=dp,
28
+ https=True,
29
+ verify_ssl=False)
30
+
31
+ async def handle_report(msg: Message):
32
+ if msg.from_user.id in router_list_for_report.keys():
33
+ list_message_for_report[msg.from_user.id].append(msg)
34
+ await msg.answer("The message has been added to the report.")
35
+
36
+
37
+ @r1.message(Command("report"))
38
+ async def on_report(msg: Message):
39
+ number = uuid.uuid4() # генерация номера обращения с помощью uuid
40
+ await msg.answer(f"Your ticket number is {number}. All subsequent messages will be added to this ticket.")
41
+ r = Router(name=str(number))
42
+ dp.include_router(r)
43
+ r.message(F.from_user.id == msg.from_user.id)(handle_report)
44
+ router_list_for_report.update({msg.from_user.id: r})
45
+ list_message_for_report.update({msg.from_user.id: []})
46
+
47
+
48
+ @r1.message(Command("cancel"))
49
+ async def on_cancel(msg: Message):
50
+ if msg.from_user.id in router_list_for_report.keys():
51
+ for router in dp.routers:
52
+ if router.name == router_list_for_report[msg.from_user.id].name:
53
+ dp.routers.remove(router)
54
+ router_list_for_report.pop(msg.from_user.id)
55
+ list_message_for_report.pop(msg.from_user.id)
56
+ await msg.answer("The report has been cancelled.")
57
+ break
58
+ else:
59
+ await msg.answer("You don’t have an active report.")
60
+
61
+
62
+ def build_message_and_send_email(messages:list):
63
+ """
64
+ In Python, there are built-in libraries for working with email messages:
65
+ https://docs.python.org/3/library/email.examples.html
66
+
67
+ Here, you need to take the data from list_message_for_report[msg.from_user.id]
68
+ and build an email-ready representation:
69
+
70
+ for msg in message:
71
+ match msg.content_type:
72
+ case MessageType.TEXT:
73
+ # You can put the text into the email body
74
+ case MessageType.ATTACHMENT:
75
+ # Download the files from TrueConf Server via:
76
+ # msg.download(dest_path="path/to/file")
77
+
78
+ Once the email is assembled correctly, send it using the smtplib module:
79
+ https://docs.python.org/3/library/smtplib.html#smtp-example
80
+ """
81
+
82
+ @r1.message(Command("send"))
83
+ async def send_report(msg: Message):
84
+ if msg.from_user.id in router_list_for_report.keys():
85
+ if build_message_and_send_email(list_message_for_report[msg.from_user.id]):
86
+ await msg.answer("Your request has been successfully submitted to Technical Support.")
87
+ else:
88
+ await msg.answer("An error occurred. Please contact the bot developer.")
89
+ else:
90
+ await msg.answer("You don’t have an active report.")
91
+ return
92
+
93
+ if __name__ == "__main__":
94
+ asyncio.run(bot.run())
@@ -0,0 +1,39 @@
1
+ import asyncio
2
+ import logging
3
+ import os
4
+ from typing import Any
5
+ from trueconf import Bot
6
+ from contextlib import asynccontextmanager
7
+ from fastapi import FastAPI
8
+ import uvicorn
9
+
10
+ os.makedirs("logs", exist_ok=True)
11
+
12
+ logging.basicConfig(
13
+ level=logging.DEBUG,
14
+ format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
15
+ filename="logs/bot.log",
16
+ encoding="utf-8",
17
+ )
18
+
19
+ @asynccontextmanager
20
+ async def lifespan(app: FastAPI):
21
+ bot_task = asyncio.create_task(bot.run())
22
+ yield
23
+
24
+ app = FastAPI(lifespan=lifespan)
25
+ bot = Bot.from_credentials(
26
+ server="10.140.1.255",
27
+ username="echo_bot",
28
+ password="123tr",
29
+ verify_ssl=False)
30
+
31
+
32
+ @app.post("/send")
33
+ async def read_root(data: dict[str, Any]):
34
+ r = await bot.create_personal_chat(user_id="user")
35
+ r = await bot.send_message(chat_id = r.chat_id, text=str(data))
36
+ print(r.message_id)
37
+
38
+ if __name__ == "__main__":
39
+ uvicorn.run(app, host="0.0.0.0", port=8000)
@@ -186,7 +186,9 @@ markdown_extensions:
186
186
  - pymdownx.inlinehilite
187
187
  - pymdownx.snippets
188
188
  - pymdownx.superfences
189
+ - pymdownx.critic
189
190
  - pymdownx.tabbed:
191
+ alternate_style: true
190
192
  slugify: !!python/object/apply:pymdownx.slugs.slugify
191
193
  kwds:
192
194
  case: lower
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-trueconf-bot
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Lightweight and powerful framework for the TrueConf Server Chatbot API
5
5
  Author-email: TrueConf LLC <info@trueconf.com>, Anton Baadzhi <baadzhianton@gmail.com>
6
6
  License-Expression: BSD-3-Clause-Clear
@@ -41,6 +41,7 @@ docs/ru/release_notes.md
41
41
  docs/ru/examples/echo_bot.md
42
42
  docs/ru/examples/multibot.md
43
43
  docs/ru/img/head.png
44
+ docs/ru/img/router_scheme_ru.svg
44
45
  docs/ru/learn/enums.md
45
46
  docs/ru/learn/files.md
46
47
  docs/ru/learn/filters.md
@@ -51,7 +52,9 @@ docs/stylesheets/extra.css
51
52
  examples/README-ru.md
52
53
  examples/README.md
53
54
  examples/filters.py
55
+ examples/report_bot.py
54
56
  examples/update_token.py
57
+ examples/webhook.py
55
58
  python_trueconf_bot.egg-info/PKG-INFO
56
59
  python_trueconf_bot.egg-info/SOURCES.txt
57
60
  python_trueconf_bot.egg-info/dependency_links.txt
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.1.2'
32
- __version_tuple__ = version_tuple = (1, 1, 2)
31
+ __version__ = version = '1.1.4'
32
+ __version_tuple__ = version_tuple = (1, 1, 4)
33
33
 
34
- __commit_id__ = commit_id = 'g3a483a550'
34
+ __commit_id__ = commit_id = 'ga315deca1'
@@ -49,8 +49,15 @@ class Dispatcher:
49
49
  Returns:
50
50
  None
51
51
  """
52
- for root in self.routers:
53
- for r in root._iter_all():
54
- handled = await r._feed(event)
55
- if handled:
56
- return
52
+
53
+ async def progress_router(router, count = 0):
54
+ handled = await router._feed(event)
55
+ if count < 0 or count >= len(router._subrouters):
56
+ return
57
+ if (not handled) or (handled and router.allow_child_on_event):
58
+ subrouter = router._subrouters[count]
59
+ return await progress_router(subrouter, count=len(router._subrouters) - 1)
60
+ return
61
+
62
+ for router in self.routers:
63
+ await progress_router(router)