diff --git a/README.md b/README.md index 16e8b70..b178219 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ - Роутеры (Blueprints) - Машина состояний (Finite State Machine) - Мидлвари (для входящих событий и вызовов API) -- Использует мощные [магические фильтры](https://github.com/aiogram/magic-filter) +- Мощные [магические фильтры](https://github.com/aiogram/magic-filter) ### Важно! diff --git a/aliceio/types/directives.py b/aliceio/types/directives.py index 86edba9..d85ec6d 100644 --- a/aliceio/types/directives.py +++ b/aliceio/types/directives.py @@ -13,7 +13,7 @@ class Directives(MutableAliceObject): Директивы. [Source 1](https://yandex.ru/dev/dialogs/alice/doc/response-audio-player.html) - [Source 2](https://yandex.ru/dev/dialogs/alice/doc/response-start-account-linking.html_ + [Source 2](https://yandex.ru/dev/dialogs/alice/doc/response-start-account-linking.html) """ # noqa: E501 audio_player: Optional[AudioPlayerDirective] = None diff --git a/aliceio/types/media_button.py b/aliceio/types/media_button.py index 1d66ba5..a169cc7 100644 --- a/aliceio/types/media_button.py +++ b/aliceio/types/media_button.py @@ -6,7 +6,7 @@ class MediaButton(MutableAliceObject): """ - Кнопка на изображении для :class:`ImageGallery` и :class:[`ItemsList`] + Кнопка на изображении для :class:`ImageGallery` и :class:`ItemsList` [Source 1](https://yandex.ru/dev/dialogs/alice/doc/response-card-imagegallery.html#response-card-imagegallery__items-button-desc) [Source 2](https://yandex.ru/dev/dialogs/alice/doc/response-card-itemslist.html#response-card-itemslist__items-button-desc) diff --git a/aliceio/types/space_status.py b/aliceio/types/space_status.py index 5dbf544..c66d2ed 100644 --- a/aliceio/types/space_status.py +++ b/aliceio/types/space_status.py @@ -8,7 +8,7 @@ class SpaceStatus(AliceObject): """ Оставшееся место в байтах для изображений и звуков. - [Source]https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__quota + [Source](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__quota) """ # noqa: E501 images: PreQuota diff --git a/aliceio/types/uploaded_image.py b/aliceio/types/uploaded_image.py index 010aafa..c1c2b49 100644 --- a/aliceio/types/uploaded_image.py +++ b/aliceio/types/uploaded_image.py @@ -15,14 +15,14 @@ class UploadedImage(AliceObject): """ # noqa: E501 id: str + size: int origUrl: Optional[str] = None # origUrl будет None если изображение загружено через файл, то есть не через url. - size: int createdAt: str if TYPE_CHECKING: orig_url: ClassVar[Optional[str]] - created_at: ClassVar[Optional[str]] + created_at: ClassVar[str] def __init__( __pydantic_self__, diff --git a/docs/_css/style.css b/docs/_css/style.css index 415d649..3641229 100644 --- a/docs/_css/style.css +++ b/docs/_css/style.css @@ -67,6 +67,10 @@ html { } } +.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item>.md-nav__link{ + color: var(--md-typeset-a-color) !important; +} + @media screen and (max-width:76.1875em) { [data-md-color-scheme="slate"] .md-nav--primary .md-nav__title { background-color: var(--vkbottle-bg-darker); @@ -92,3 +96,10 @@ html { .injected { display: none; } + +.md-typeset h1 { + color: var(--md-default-fg-color--light); + font-size: 2em; + line-height: 1.3; + margin: 1em 0 0.5em +} diff --git a/docs/_static/middleware_dark.png b/docs/_static/middleware_dark.png new file mode 100644 index 0000000..b36a5a5 Binary files /dev/null and b/docs/_static/middleware_dark.png differ diff --git a/docs/_static/middleware_light.png b/docs/_static/middleware_light.png new file mode 100644 index 0000000..b4165e2 Binary files /dev/null and b/docs/_static/middleware_light.png differ diff --git a/docs/client/alice.md b/docs/aliceio/client/alice.md similarity index 100% rename from docs/client/alice.md rename to docs/aliceio/client/alice.md diff --git a/docs/client/context_controller.md b/docs/aliceio/client/context-controller.md similarity index 100% rename from docs/client/context_controller.md rename to docs/aliceio/client/context-controller.md diff --git a/docs/client/session/aiohttp.md b/docs/aliceio/client/session/aiohttp.md similarity index 100% rename from docs/client/session/aiohttp.md rename to docs/aliceio/client/session/aiohttp.md diff --git a/docs/client/session/base.md b/docs/aliceio/client/session/base.md similarity index 100% rename from docs/client/session/base.md rename to docs/aliceio/client/session/base.md diff --git a/docs/client/session/middlewares/base.md b/docs/aliceio/client/session/middlewares/base.md similarity index 100% rename from docs/client/session/middlewares/base.md rename to docs/aliceio/client/session/middlewares/base.md diff --git a/docs/client/session/middlewares/manager.md b/docs/aliceio/client/session/middlewares/manager.md similarity index 100% rename from docs/client/session/middlewares/manager.md rename to docs/aliceio/client/session/middlewares/manager.md diff --git a/docs/client/session/middlewares/request_logging.md b/docs/aliceio/client/session/middlewares/request-logging.md similarity index 100% rename from docs/client/session/middlewares/request_logging.md rename to docs/aliceio/client/session/middlewares/request-logging.md diff --git a/docs/aliceio/client/skill.md b/docs/aliceio/client/skill.md new file mode 100644 index 0000000..c9180f1 --- /dev/null +++ b/docs/aliceio/client/skill.md @@ -0,0 +1,17 @@ +::: aliceio.client.skill.Skill + handler: python + options: + members: + - id + - skill_id + - token + - oauth_token + - __init__ + - __call__ + - context + - upload_image + - get_images + - delete_image + - upload_sound + - get_sounds + - delete_sound diff --git a/docs/dispatcher/dispatcher.md b/docs/aliceio/dispatcher/dispatcher.md similarity index 100% rename from docs/dispatcher/dispatcher.md rename to docs/aliceio/dispatcher/dispatcher.md diff --git a/docs/dispatcher/event/alice.md b/docs/aliceio/dispatcher/event/alice.md similarity index 100% rename from docs/dispatcher/event/alice.md rename to docs/aliceio/dispatcher/event/alice.md diff --git a/docs/dispatcher/event/bases.md b/docs/aliceio/dispatcher/event/bases.md similarity index 100% rename from docs/dispatcher/event/bases.md rename to docs/aliceio/dispatcher/event/bases.md diff --git a/docs/dispatcher/event/event.md b/docs/aliceio/dispatcher/event/event.md similarity index 100% rename from docs/dispatcher/event/event.md rename to docs/aliceio/dispatcher/event/event.md diff --git a/docs/dispatcher/event/handler.md b/docs/aliceio/dispatcher/event/handler.md similarity index 100% rename from docs/dispatcher/event/handler.md rename to docs/aliceio/dispatcher/event/handler.md diff --git a/docs/dispatcher/flags.md b/docs/aliceio/dispatcher/flags.md similarity index 89% rename from docs/dispatcher/flags.md rename to docs/aliceio/dispatcher/flags.md index f701238..d0dccb1 100644 --- a/docs/dispatcher/flags.md +++ b/docs/aliceio/dispatcher/flags.md @@ -47,3 +47,8 @@ handler: python options: members: true + + +## Источники + +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/flags.html) diff --git a/docs/dispatcher/middlewares/base.md b/docs/aliceio/dispatcher/middlewares/base.md similarity index 99% rename from docs/dispatcher/middlewares/base.md rename to docs/aliceio/dispatcher/middlewares/base.md index 3eebb4a..a88f1a8 100644 --- a/docs/dispatcher/middlewares/base.md +++ b/docs/aliceio/dispatcher/middlewares/base.md @@ -3,4 +3,3 @@ options: merge_init_into_class: true members: true - diff --git a/docs/dispatcher/middlewares/error.md b/docs/aliceio/dispatcher/middlewares/error.md similarity index 100% rename from docs/dispatcher/middlewares/error.md rename to docs/aliceio/dispatcher/middlewares/error.md diff --git a/docs/dispatcher/middlewares/manager.md b/docs/aliceio/dispatcher/middlewares/manager.md similarity index 100% rename from docs/dispatcher/middlewares/manager.md rename to docs/aliceio/dispatcher/middlewares/manager.md diff --git a/docs/dispatcher/middlewares/response_convert.md b/docs/aliceio/dispatcher/middlewares/response-convert.md similarity index 54% rename from docs/dispatcher/middlewares/response_convert.md rename to docs/aliceio/dispatcher/middlewares/response-convert.md index cbcf494..01fe8ad 100644 --- a/docs/dispatcher/middlewares/response_convert.md +++ b/docs/aliceio/dispatcher/middlewares/response-convert.md @@ -1,4 +1,4 @@ -::: aliceio.dispatcher.middlewares.response_convert +::: aliceio.dispatcher.middlewares.response_convert.ResponseConvertMiddleware handler: python options: members: diff --git a/docs/dispatcher/middlewares/user_context.md b/docs/aliceio/dispatcher/middlewares/user-context.md similarity index 100% rename from docs/dispatcher/middlewares/user_context.md rename to docs/aliceio/dispatcher/middlewares/user-context.md diff --git a/docs/aliceio/dispatcher/router.md b/docs/aliceio/dispatcher/router.md new file mode 100644 index 0000000..7519dba --- /dev/null +++ b/docs/aliceio/dispatcher/router.md @@ -0,0 +1,77 @@ +::: aliceio.dispatcher.router.Router + handler: python + options: + merge_init_into_class: false + members: + - __init__ + - include_router + - include_routers + + +## Наблюдатели + +!!! warning "Важно" + Все хэндлеры всегда должны быть асинхронными. Имя функции-обработчика не имеет значения. + Имя аргумента события также не важно, но рекомендуется не перекрывать имя контекстными данными, поскольку функция не может принимать два аргумента с одинаковым именем. + +Вот список всех доступных наблюдателей и примеры регистрации хэндлеров. + +В этих примерах используется только регистрация через декоратор, но вы всегда можете использовать метод `..register(...)` + +### Сообщение (SimpleUtterance) +```python +@router.message() +async def message_handler(message: Message) -> Any: pass +``` + +### Нажатие на кнопку +```python +@router.button_pressed() +async def button_pressed_handler(button: ButtonPressed) -> Any: pass +``` + +### Аудиоплеер +```python +@router.audio_player() +async def audio_player_handler(audio_player: AudioPlayer) -> Any: pass +``` + + +### Покупка +```python +@router.purchase() +async def purchase_handler(purchase: Purchase) -> Any: pass +``` + +### Показ шоу +```python +@router.show_pull() +async def show_pull_handler(pull: ShowPull) -> Any: pass +``` + +## Вложенные роутеры + +Событие будет распространять по роутерам и хэндлерам согласно порядку их добавления. + +!!! warning "Важно" + Роутеры могут быть включены в другие роутеры с некоторыми ограничениями: + + 1. Роутер не может подключить сам себя + 2. Роутеры не могут составлять цикл (р1 содержит р2, р2 содержит р3, р3 содерит р1) + +## Update +```python +@dispatcher.update() +async def update_handler(update: Update) -> Any: pass +``` + +!!! warning "Предупреждение" + Только диспетчер может обрабатывать события с типом `Update`. + +!!! note "Примечание" + В диспетчере уже есть обработчик этого типа событий, поэтому вы можете использовать его для обработки всех обновлений, которые не обработались другими хэндлерами. + + +## Источники + +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/router.html) diff --git a/docs/enums/all_enums.md b/docs/aliceio/enums/all-enums.md similarity index 92% rename from docs/enums/all_enums.md rename to docs/aliceio/enums/all-enums.md index 153d1e4..7a0669c 100644 --- a/docs/enums/all_enums.md +++ b/docs/aliceio/enums/all-enums.md @@ -3,14 +3,16 @@ ::: aliceio.enums.base.ValuesEnum handler: python options: - members: true + members: + - values
::: aliceio.enums.base.StrEnum handler: python options: - members: true + members: + - __str__
diff --git a/docs/filters/base.md b/docs/aliceio/filters/base.md similarity index 100% rename from docs/filters/base.md rename to docs/aliceio/filters/base.md diff --git a/docs/filters/exception.md b/docs/aliceio/filters/exception.md similarity index 100% rename from docs/filters/exception.md rename to docs/aliceio/filters/exception.md diff --git a/docs/filters/logic.md b/docs/aliceio/filters/logic.md similarity index 100% rename from docs/filters/logic.md rename to docs/aliceio/filters/logic.md diff --git a/docs/filters/magic_data.md b/docs/aliceio/filters/magic-data.md similarity index 100% rename from docs/filters/magic_data.md rename to docs/aliceio/filters/magic-data.md diff --git a/docs/aliceio/filters/magic-filter.md b/docs/aliceio/filters/magic-filter.md new file mode 100644 index 0000000..1eb036b --- /dev/null +++ b/docs/aliceio/filters/magic-filter.md @@ -0,0 +1,86 @@ +# Магический фильтр + +!!! note "Примечание" + В aliceio есть небольшая надстройка над магическим фильтром. + Если импортировать его из [magic-filter](https://pypi.org/project/magic-filter/), то метод `.as_()` не будет доступен (о нём в главе про DI). + +`MagicFilter` можно вызвать как функцию, он поддерживает некоторые действия и запоминает цепочку атрибутов и действий, которые следует проверить. + +Это означает, что вы можете связать методы получения атрибутов в цепочку, описать простые проверки данных, а затем вызвать полученный объект, передав один объект в качестве аргумента. +Например, можно создать цепочку атрибутов `F.foo.bar.baz`, затем добавить действие `F.foo.bar.baz == 'spam'`, а затем вызвать полученный объект `(F.foo.bar.baz == 'spam').resolve(obj)` + +### Возможные действия + +Магический фильтр поддерживает некоторые логические операции над атрбитуами объекта. + +#### Существует ли +```python +F.text # эквивалент `lambda message: message.text` +``` + +#### Входит ли в коллекцию +```python +F.from_user.id.in_({42, 1000, 123123}) # lambda event: event.from_user.id in {42, 1000, 123123} +F.event_type.in_({'foo', 'bar', 'baz'}) # lambda update: update.event_type in {'foo', 'bar', 'baz'} +``` + +#### Содержит ли +```python +F.text.contains('foo') # lambda message: 'foo' in message.text +``` + +#### Regexp +```python +F.text.regexp(r'Hello, .+') # lambda message: re.match(r'Hello, .+', message.text) +``` + +#### Свои функции + +Принимает любой вызываемый объект. Объект будет вызван когда фильтр проверяет результат. +```python +F.chat.func(lambda chat: chat.id == -42) # lambda message: (lambda chat: chat.id == -42)(message.chat) +``` + +#### Инверсия +Любая доступная операция может быть инвертирована с помощью оператора `~` +```python +~(F.text == 'spam') # lambda message: message.text != 'spam' +~F.text.startswith('spam') # lambda message: not message.text.startswith('spam') +``` + +#### Комбинация +Все операции могут быть скомбинированы с помощью `&`и `|` +```python +(F.from_user.id == 42) & (F.text == 'admin') +F.text.startswith('a') | F.text.endswith('b') +(F.from_user.id.in_({42, 777, 911})) & (F.text.startswith('!') | F.text.startswith('/')) & F.text.contains('ban') +``` + +#### Строковые методы +Могут быть использованы только с строковыми атрибутами +```python +F.text.startswith('foo') # lambda message: message.text.startswith('foo') +F.text.endswith('bar') # lambda message: message.text.startswith('bar') +F.text.lower() == 'test' # lambda message: message.text.lower() == 'test' +F.text.upper().in_({'FOO', 'BAR'}) # lambda message: message.text.upper() in {'FOO', 'BAR'} +F.text.len() == 5 # lambda message: len(message.text) == 5 +``` + +### Использование в aliceio +```python +@router.message(F.text == "привет") +@router.button_pressed(F.payload["yes"]) +... +``` + +::: aliceio.utils.magic_filter.MagicFilter + handler: python + options: + members: true + +
+ +::: aliceio.utils.magic_filter.AsFilterResultOperation + handler: python + options: + members: true diff --git a/docs/filters/state.md b/docs/aliceio/filters/state.md similarity index 100% rename from docs/filters/state.md rename to docs/aliceio/filters/state.md diff --git a/docs/fsm/context.md b/docs/aliceio/fsm/context.md similarity index 100% rename from docs/fsm/context.md rename to docs/aliceio/fsm/context.md diff --git a/docs/fsm/middlewares/api_storage.md b/docs/aliceio/fsm/middlewares/api-storage.md similarity index 100% rename from docs/fsm/middlewares/api_storage.md rename to docs/aliceio/fsm/middlewares/api-storage.md diff --git a/docs/fsm/middlewares/fsm_context.md b/docs/aliceio/fsm/middlewares/fsm-context.md similarity index 100% rename from docs/fsm/middlewares/fsm_context.md rename to docs/aliceio/fsm/middlewares/fsm-context.md diff --git a/docs/fsm/state.md b/docs/aliceio/fsm/state.md similarity index 100% rename from docs/fsm/state.md rename to docs/aliceio/fsm/state.md diff --git a/docs/fsm/storage/api.md b/docs/aliceio/fsm/storage/api.md similarity index 100% rename from docs/fsm/storage/api.md rename to docs/aliceio/fsm/storage/api.md diff --git a/docs/fsm/storage/base.md b/docs/aliceio/fsm/storage/base.md similarity index 100% rename from docs/fsm/storage/base.md rename to docs/aliceio/fsm/storage/base.md diff --git a/docs/fsm/storage/memory.md b/docs/aliceio/fsm/storage/memory.md similarity index 100% rename from docs/fsm/storage/memory.md rename to docs/aliceio/fsm/storage/memory.md diff --git a/docs/fsm/storage/redis/default_key_builder.md b/docs/aliceio/fsm/storage/redis/default-key-builder.md similarity index 100% rename from docs/fsm/storage/redis/default_key_builder.md rename to docs/aliceio/fsm/storage/redis/default-key-builder.md diff --git a/docs/fsm/storage/redis/key_builder.md b/docs/aliceio/fsm/storage/redis/key-builder.md similarity index 100% rename from docs/fsm/storage/redis/key_builder.md rename to docs/aliceio/fsm/storage/redis/key-builder.md diff --git a/docs/fsm/storage/redis/redis.md b/docs/aliceio/fsm/storage/redis/redis.md similarity index 100% rename from docs/fsm/storage/redis/redis.md rename to docs/aliceio/fsm/storage/redis/redis.md diff --git a/docs/fsm/strategy.md b/docs/aliceio/fsm/strategy.md similarity index 100% rename from docs/fsm/strategy.md rename to docs/aliceio/fsm/strategy.md diff --git a/docs/handlers/audio_player.md b/docs/aliceio/handlers/audio-player.md similarity index 100% rename from docs/handlers/audio_player.md rename to docs/aliceio/handlers/audio-player.md diff --git a/docs/handlers/base.md b/docs/aliceio/handlers/base.md similarity index 100% rename from docs/handlers/base.md rename to docs/aliceio/handlers/base.md diff --git a/docs/handlers/button_pressed.md b/docs/aliceio/handlers/button-pressed.md similarity index 100% rename from docs/handlers/button_pressed.md rename to docs/aliceio/handlers/button-pressed.md diff --git a/docs/handlers/error.md b/docs/aliceio/handlers/error.md similarity index 100% rename from docs/handlers/error.md rename to docs/aliceio/handlers/error.md diff --git a/docs/handlers/message.md b/docs/aliceio/handlers/message.md similarity index 100% rename from docs/handlers/message.md rename to docs/aliceio/handlers/message.md diff --git a/docs/handlers/purchase.md b/docs/aliceio/handlers/purchase.md similarity index 100% rename from docs/handlers/purchase.md rename to docs/aliceio/handlers/purchase.md diff --git a/docs/handlers/show_pull.md b/docs/aliceio/handlers/show-pull.md similarity index 100% rename from docs/handlers/show_pull.md rename to docs/aliceio/handlers/show-pull.md diff --git a/docs/handlers/timeout.md b/docs/aliceio/handlers/timeout.md similarity index 100% rename from docs/handlers/timeout.md rename to docs/aliceio/handlers/timeout.md diff --git a/docs/methods/base.md b/docs/aliceio/methods/base.md similarity index 100% rename from docs/methods/base.md rename to docs/aliceio/methods/base.md diff --git a/docs/methods/images/delete_image.md b/docs/aliceio/methods/images/delete-image.md similarity index 100% rename from docs/methods/images/delete_image.md rename to docs/aliceio/methods/images/delete-image.md diff --git a/docs/methods/images/get_images.md b/docs/aliceio/methods/images/get-images.md similarity index 100% rename from docs/methods/images/get_images.md rename to docs/aliceio/methods/images/get-images.md diff --git a/docs/methods/images/upload_image.md b/docs/aliceio/methods/images/upload-image.md similarity index 100% rename from docs/methods/images/upload_image.md rename to docs/aliceio/methods/images/upload-image.md diff --git a/docs/methods/sounds/delete_sound.md b/docs/aliceio/methods/sounds/delete-sound.md similarity index 100% rename from docs/methods/sounds/delete_sound.md rename to docs/aliceio/methods/sounds/delete-sound.md diff --git a/docs/methods/sounds/get_sounds.md b/docs/aliceio/methods/sounds/get-sounds.md similarity index 100% rename from docs/methods/sounds/get_sounds.md rename to docs/aliceio/methods/sounds/get-sounds.md diff --git a/docs/methods/sounds/upload_sound.md b/docs/aliceio/methods/sounds/upload-sound.md similarity index 100% rename from docs/methods/sounds/upload_sound.md rename to docs/aliceio/methods/sounds/upload-sound.md diff --git a/docs/methods/status.md b/docs/aliceio/methods/status.md similarity index 100% rename from docs/methods/status.md rename to docs/aliceio/methods/status.md diff --git a/docs/types/alice_event.md b/docs/aliceio/types/alice-event.md similarity index 52% rename from docs/types/alice_event.md rename to docs/aliceio/types/alice-event.md index add469c..6f84b40 100644 --- a/docs/types/alice_event.md +++ b/docs/aliceio/types/alice-event.md @@ -1,4 +1,7 @@ ::: aliceio.types.alice_event.AliceEvent handler: python options: - members: true + members: + - user + - from_user + - session diff --git a/docs/aliceio/types/alice-request.md b/docs/aliceio/types/alice-request.md new file mode 100644 index 0000000..96f4de9 --- /dev/null +++ b/docs/aliceio/types/alice-request.md @@ -0,0 +1,19 @@ +::: aliceio.types.alice_request.AliceRequest + handler: python + options: + members: + - type + - payload + - command + - original_utterance + - markup + - nlu + - error + - purchase_request_id + - purchase_token + - order_id + - purchase_timestamp + - purchase_payload + - signed_data + - signature + - show_type diff --git a/docs/aliceio/types/alice-response.md b/docs/aliceio/types/alice-response.md new file mode 100644 index 0000000..9d229c2 --- /dev/null +++ b/docs/aliceio/types/alice-response.md @@ -0,0 +1,10 @@ +::: aliceio.types.alice_response.AliceResponse + handler: python + options: + members: + - response + - session_state + - user_state_update + - application_state + - analytics + - version diff --git a/docs/types/analytic_event.md b/docs/aliceio/types/analytic-event.md similarity index 63% rename from docs/types/analytic_event.md rename to docs/aliceio/types/analytic-event.md index 1fdeb42..ee28d49 100644 --- a/docs/types/analytic_event.md +++ b/docs/aliceio/types/analytic-event.md @@ -1,4 +1,6 @@ ::: aliceio.types.analytic_event.AnalyticEvent handler: python options: - members: true + members: + - name + - value diff --git a/docs/types/analytics.md b/docs/aliceio/types/analytics.md similarity index 68% rename from docs/types/analytics.md rename to docs/aliceio/types/analytics.md index ff9e979..5edebef 100644 --- a/docs/types/analytics.md +++ b/docs/aliceio/types/analytics.md @@ -1,4 +1,5 @@ ::: aliceio.types.analytics.Analytics handler: python options: - members: true + members: + - events diff --git a/docs/types/api_state.md b/docs/aliceio/types/api-state.md similarity index 82% rename from docs/types/api_state.md rename to docs/aliceio/types/api-state.md index b7a3851..3a3bb54 100644 --- a/docs/types/api_state.md +++ b/docs/aliceio/types/api-state.md @@ -12,4 +12,7 @@ ApplicationState = StateDict ::: aliceio.types.api_state.ApiState handler: python options: - members: true + members: + - user + - session + - application diff --git a/docs/types/application.md b/docs/aliceio/types/application.md similarity index 65% rename from docs/types/application.md rename to docs/aliceio/types/application.md index dba00b1..640b184 100644 --- a/docs/types/application.md +++ b/docs/aliceio/types/application.md @@ -1,4 +1,5 @@ ::: aliceio.types.application.Application handler: python options: - members: true + members: + - application_id diff --git a/docs/types/audio_player_directive.md b/docs/aliceio/types/audio-player-directive.md similarity index 81% rename from docs/types/audio_player_directive.md rename to docs/aliceio/types/audio-player-directive.md index 04f4cae..374c950 100644 --- a/docs/types/audio_player_directive.md +++ b/docs/aliceio/types/audio-player-directive.md @@ -1,7 +1,9 @@ ::: aliceio.types.audio_player_directive.AudioPlayerDirective handler: python options: - members: true + members: + - action + - item
diff --git a/docs/types/audio_player_error.md b/docs/aliceio/types/audio-player-error.md similarity index 64% rename from docs/types/audio_player_error.md rename to docs/aliceio/types/audio-player-error.md index b558a52..d9d806d 100644 --- a/docs/types/audio_player_error.md +++ b/docs/aliceio/types/audio-player-error.md @@ -1,4 +1,6 @@ ::: aliceio.types.audio_player_error.AudioPlayerError handler: python options: - members: true + members: + - message + - type diff --git a/docs/types/audio_player_item.md b/docs/aliceio/types/audio-player-item.md similarity index 62% rename from docs/types/audio_player_item.md rename to docs/aliceio/types/audio-player-item.md index 1b55934..e37b7af 100644 --- a/docs/types/audio_player_item.md +++ b/docs/aliceio/types/audio-player-item.md @@ -1,4 +1,6 @@ ::: aliceio.types.audio_player_item.AudioPlayerItem handler: python options: - members: true + members: + - stream + - metadata diff --git a/docs/types/audio_player.md b/docs/aliceio/types/audio-player.md similarity index 62% rename from docs/types/audio_player.md rename to docs/aliceio/types/audio-player.md index bcfedfc..3c3ea9b 100644 --- a/docs/types/audio_player.md +++ b/docs/aliceio/types/audio-player.md @@ -1,4 +1,6 @@ ::: aliceio.types.audio_player.AudioPlayer handler: python options: - members: true + members: + - type + - error diff --git a/docs/types/base.md b/docs/aliceio/types/base.md similarity index 100% rename from docs/types/base.md rename to docs/aliceio/types/base.md diff --git a/docs/aliceio/types/big-image.md b/docs/aliceio/types/big-image.md new file mode 100644 index 0000000..9eea9ee --- /dev/null +++ b/docs/aliceio/types/big-image.md @@ -0,0 +1,9 @@ +::: aliceio.types.big_image.BigImage + handler: python + options: + members: + - type + - image_id + - title + - description + - button diff --git a/docs/types/button_pressed.md b/docs/aliceio/types/button-pressed.md similarity index 50% rename from docs/types/button_pressed.md rename to docs/aliceio/types/button-pressed.md index 18ffb1c..d3bf21e 100644 --- a/docs/types/button_pressed.md +++ b/docs/aliceio/types/button-pressed.md @@ -1,4 +1,8 @@ ::: aliceio.types.button_pressed.ButtonPressed handler: python options: - members: true + members: + - type + - payload + - markup + - nlu diff --git a/docs/types/card_footer.md b/docs/aliceio/types/card-footer.md similarity index 61% rename from docs/types/card_footer.md rename to docs/aliceio/types/card-footer.md index d666e79..0dd31c2 100644 --- a/docs/types/card_footer.md +++ b/docs/aliceio/types/card-footer.md @@ -1,4 +1,6 @@ ::: aliceio.types.card_footer.CardFooter handler: python options: - members: true + members: + - text + - button diff --git a/docs/types/card_header.md b/docs/aliceio/types/card-header.md similarity index 71% rename from docs/types/card_header.md rename to docs/aliceio/types/card-header.md index 1672ebf..85f59d5 100644 --- a/docs/types/card_header.md +++ b/docs/aliceio/types/card-header.md @@ -1,4 +1,5 @@ ::: aliceio.types.card_header.CardHeader handler: python options: - members: true + members: + - text diff --git a/docs/types/card.md b/docs/aliceio/types/card.md similarity index 100% rename from docs/types/card.md rename to docs/aliceio/types/card.md diff --git a/docs/aliceio/types/datetime.md b/docs/aliceio/types/datetime.md new file mode 100644 index 0000000..3adb01b --- /dev/null +++ b/docs/aliceio/types/datetime.md @@ -0,0 +1,14 @@ +::: aliceio.types.datetime.DateTimeEntity + handler: python + options: + members: + - year + - month + - day + - hour + - minute + - year_is_relative + - month_is_relative + - day_is_relative + - hour_is_relative + - minute_is_relative diff --git a/docs/types/directives.md b/docs/aliceio/types/directives.md similarity index 51% rename from docs/types/directives.md rename to docs/aliceio/types/directives.md index ec8cf9f..0ac6568 100644 --- a/docs/types/directives.md +++ b/docs/aliceio/types/directives.md @@ -1,4 +1,6 @@ ::: aliceio.types.directives.Directives handler: python options: - members: true + members: + - audio_player + - start_account_linking diff --git a/docs/types/entity.md b/docs/aliceio/types/entity.md similarity index 50% rename from docs/types/entity.md rename to docs/aliceio/types/entity.md index 7d5fc97..626366d 100644 --- a/docs/types/entity.md +++ b/docs/aliceio/types/entity.md @@ -1,4 +1,7 @@ ::: aliceio.types.entity.Entity handler: python options: - members: true + members: + - type + - tokens + - value diff --git a/docs/types/error_event.md b/docs/aliceio/types/error-event.md similarity index 58% rename from docs/types/error_event.md rename to docs/aliceio/types/error-event.md index b6852c0..9bb696c 100644 --- a/docs/types/error_event.md +++ b/docs/aliceio/types/error-event.md @@ -1,4 +1,6 @@ ::: aliceio.types.error_event.ErrorEvent handler: python options: - members: true + members: + - update + - exception diff --git a/docs/types/error_result.md b/docs/aliceio/types/error-result.md similarity index 69% rename from docs/types/error_result.md rename to docs/aliceio/types/error-result.md index 2858e2a..231d0d6 100644 --- a/docs/types/error_result.md +++ b/docs/aliceio/types/error-result.md @@ -1,4 +1,5 @@ ::: aliceio.types.error_result.ErrorResult handler: python options: - members: true + members: + - message diff --git a/docs/aliceio/types/fio-entity.md b/docs/aliceio/types/fio-entity.md new file mode 100644 index 0000000..78ae317 --- /dev/null +++ b/docs/aliceio/types/fio-entity.md @@ -0,0 +1,7 @@ +::: aliceio.types.fio_entity.FIOEntity + handler: python + options: + members: + - first_name + - patronymic_name + - last_name diff --git a/docs/aliceio/types/geo-entity.md b/docs/aliceio/types/geo-entity.md new file mode 100644 index 0000000..00f203d --- /dev/null +++ b/docs/aliceio/types/geo-entity.md @@ -0,0 +1,9 @@ +::: aliceio.types.geo_entity.GeoEntity + handler: python + options: + members: + - country + - city + - street + - house_number + - airport diff --git a/docs/types/image_gallery_item.md b/docs/aliceio/types/image-gallery-item.md similarity index 56% rename from docs/types/image_gallery_item.md rename to docs/aliceio/types/image-gallery-item.md index cfc1e06..3c0e808 100644 --- a/docs/types/image_gallery_item.md +++ b/docs/aliceio/types/image-gallery-item.md @@ -1,4 +1,7 @@ ::: aliceio.types.image_gallery_item.ImageGalleryItem handler: python options: - members: true + members: + - image_id + - title + - button diff --git a/docs/types/image_gallery.md b/docs/aliceio/types/image-gallery.md similarity index 62% rename from docs/types/image_gallery.md rename to docs/aliceio/types/image-gallery.md index eaf2579..e8e5235 100644 --- a/docs/types/image_gallery.md +++ b/docs/aliceio/types/image-gallery.md @@ -1,4 +1,6 @@ ::: aliceio.types.image_gallery.ImageGallery handler: python options: - members: true + members: + - type + - items diff --git a/docs/types/input_file.md b/docs/aliceio/types/input-file.md similarity index 59% rename from docs/types/input_file.md rename to docs/aliceio/types/input-file.md index fbeefb5..9d28360 100644 --- a/docs/types/input_file.md +++ b/docs/aliceio/types/input-file.md @@ -1,18 +1,25 @@ ::: aliceio.types.input_file.InputFile handler: python options: - members: true + members: + - __init__ + - read
::: aliceio.types.input_file.BufferedInputFile handler: python options: - members: true + members: + - __init__ + - from_file + - read
::: aliceio.types.input_file.FSInputFile handler: python options: - members: true + members: + - __init__ + - read diff --git a/docs/aliceio/types/interfaces.md b/docs/aliceio/types/interfaces.md new file mode 100644 index 0000000..f62c527 --- /dev/null +++ b/docs/aliceio/types/interfaces.md @@ -0,0 +1,15 @@ +```python +AccountLinking = Dict[str, Any] +Screen = Dict[str, Any] +AudioPlayer = Dict[str, Any] +``` + +
+ +::: aliceio.types.interfaces.Interfaces + handler: python + options: + members: + - account_linking + - screen + - audio_player diff --git a/docs/aliceio/types/item-image.md b/docs/aliceio/types/item-image.md new file mode 100644 index 0000000..1f0e617 --- /dev/null +++ b/docs/aliceio/types/item-image.md @@ -0,0 +1,8 @@ +::: aliceio.types.item_image.ItemImage + handler: python + options: + members: + - image_id + - title + - description + - button diff --git a/docs/aliceio/types/items-list.md b/docs/aliceio/types/items-list.md new file mode 100644 index 0000000..6ed4ce0 --- /dev/null +++ b/docs/aliceio/types/items-list.md @@ -0,0 +1,8 @@ +::: aliceio.types.items_list.ItemsList + handler: python + options: + members: + - type + - items + - header + - footer diff --git a/docs/types/markup.md b/docs/aliceio/types/markup.md similarity index 60% rename from docs/types/markup.md rename to docs/aliceio/types/markup.md index 5533ef6..6f1e0c6 100644 --- a/docs/types/markup.md +++ b/docs/aliceio/types/markup.md @@ -1,4 +1,5 @@ ::: aliceio.types.markup.Markup handler: python options: - members: true + members: + - dangerous_context diff --git a/docs/types/media_button.md b/docs/aliceio/types/media-button.md similarity index 55% rename from docs/types/media_button.md rename to docs/aliceio/types/media-button.md index 787d65b..9b9758a 100644 --- a/docs/types/media_button.md +++ b/docs/aliceio/types/media-button.md @@ -1,4 +1,7 @@ ::: aliceio.types.media_button.MediaButton handler: python options: - members: true + members: + - text + - url + - payload diff --git a/docs/aliceio/types/message.md b/docs/aliceio/types/message.md new file mode 100644 index 0000000..5a9fa68 --- /dev/null +++ b/docs/aliceio/types/message.md @@ -0,0 +1,10 @@ +::: aliceio.types.message.Message + handler: python + options: + members: + - type + - command + - original_utterance + - payload + - markup + - nlu diff --git a/docs/aliceio/types/meta.md b/docs/aliceio/types/meta.md new file mode 100644 index 0000000..c13fd4d --- /dev/null +++ b/docs/aliceio/types/meta.md @@ -0,0 +1,8 @@ +::: aliceio.types.meta.Meta + handler: python + options: + members: + - locale + - timezone + - client_id + - interfaces diff --git a/docs/aliceio/types/metadata.md b/docs/aliceio/types/metadata.md new file mode 100644 index 0000000..adcbdab --- /dev/null +++ b/docs/aliceio/types/metadata.md @@ -0,0 +1,8 @@ +::: aliceio.types.metadata.Metadata + handler: python + options: + members: + - title + - sub_title + - art + - background_image diff --git a/docs/types/nlu_entity.md b/docs/aliceio/types/nlu-entity.md similarity index 75% rename from docs/types/nlu_entity.md rename to docs/aliceio/types/nlu-entity.md index b2bd989..de3628d 100644 --- a/docs/types/nlu_entity.md +++ b/docs/aliceio/types/nlu-entity.md @@ -1,4 +1,4 @@ ::: aliceio.types.nlu_entity.NLUEntity handler: python options: - members: true + show_source: true diff --git a/docs/aliceio/types/nlu.md b/docs/aliceio/types/nlu.md new file mode 100644 index 0000000..3f0a167 --- /dev/null +++ b/docs/aliceio/types/nlu.md @@ -0,0 +1,7 @@ +::: aliceio.types.nlu.NLU + handler: python + options: + members: + - tokens + - entities + - intents diff --git a/docs/types/number_entity.md b/docs/aliceio/types/number-entity.md similarity index 100% rename from docs/types/number_entity.md rename to docs/aliceio/types/number-entity.md diff --git a/docs/types/payload.md b/docs/aliceio/types/payload.md similarity index 87% rename from docs/types/payload.md rename to docs/aliceio/types/payload.md index 3881a7c..04eb4bc 100644 --- a/docs/types/payload.md +++ b/docs/aliceio/types/payload.md @@ -1,6 +1,7 @@ ## Payload -Произвольный [JSON-объект](https://yandex.ru/dev/dialogs/alice/doc/request-buttonpressed.html#request-buttonpressed__request-desc), который Яндекс Диалоги должны отправить обработчику, если данная кнопка будет нажата.\ +Произвольный [JSON-объект](https://yandex.ru/dev/dialogs/alice/doc/request-buttonpressed.html#request-buttonpressed__request-desc), который Яндекс Диалоги должны отправить обработчику, если данная кнопка будет нажата. + Максимум 4096 байт. ```python diff --git a/docs/aliceio/types/purchase.md b/docs/aliceio/types/purchase.md new file mode 100644 index 0000000..69d742d --- /dev/null +++ b/docs/aliceio/types/purchase.md @@ -0,0 +1,12 @@ +::: aliceio.types.purchase.Purchase + handler: python + options: + members: + - type + - purchase_request_id + - purchase_token + - order_id + - purchase_timestamp + - purchase_payload + - signed_data + - signature diff --git a/docs/types/quota.md b/docs/aliceio/types/quota.md similarity index 58% rename from docs/types/quota.md rename to docs/aliceio/types/quota.md index df730a1..8b6a20b 100644 --- a/docs/types/quota.md +++ b/docs/aliceio/types/quota.md @@ -1,11 +1,15 @@ ::: aliceio.types.quota.Quota handler: python options: - members: true + members: + - total + - used + - available
::: aliceio.types.quota.PreQuota handler: python options: - members: true + members: + - quota diff --git a/docs/aliceio/types/response.md b/docs/aliceio/types/response.md new file mode 100644 index 0000000..5e13f81 --- /dev/null +++ b/docs/aliceio/types/response.md @@ -0,0 +1,12 @@ +::: aliceio.types.response.Response + handler: python + options: + members: + - text + - tts + - card + - buttons + - directives + - show_item_meta + - should_listen + - end_session diff --git a/docs/types/result.md b/docs/aliceio/types/result.md similarity index 67% rename from docs/types/result.md rename to docs/aliceio/types/result.md index c6f0892..a5dc1f3 100644 --- a/docs/types/result.md +++ b/docs/aliceio/types/result.md @@ -1,4 +1,5 @@ ::: aliceio.types.result.Result handler: python options: - members: true + members: + - result diff --git a/docs/aliceio/types/session.md b/docs/aliceio/types/session.md new file mode 100644 index 0000000..7b9fc1a --- /dev/null +++ b/docs/aliceio/types/session.md @@ -0,0 +1,10 @@ +::: aliceio.types.session.Session + handler: python + options: + members: + - message_id + - session_id + - skill_id + - application + - new + - user diff --git a/docs/aliceio/types/show-item-meta.md b/docs/aliceio/types/show-item-meta.md new file mode 100644 index 0000000..9e520a7 --- /dev/null +++ b/docs/aliceio/types/show-item-meta.md @@ -0,0 +1,9 @@ +::: aliceio.types.show_item_meta.ShowItemMeta + handler: python + options: + members: + - content_id + - publication_date + - title + - title_tts + - expiration_date diff --git a/docs/types/show_pull.md b/docs/aliceio/types/show-pull.md similarity index 58% rename from docs/types/show_pull.md rename to docs/aliceio/types/show-pull.md index c95a61b..9d2322e 100644 --- a/docs/types/show_pull.md +++ b/docs/aliceio/types/show-pull.md @@ -1,4 +1,6 @@ ::: aliceio.types.show_pull.ShowPull handler: python options: - members: true + members: + - type + - show_type diff --git a/docs/types/space_status.md b/docs/aliceio/types/space-status.md similarity index 60% rename from docs/types/space_status.md rename to docs/aliceio/types/space-status.md index fee9335..87e81e0 100644 --- a/docs/types/space_status.md +++ b/docs/aliceio/types/space-status.md @@ -1,4 +1,6 @@ ::: aliceio.types.space_status.SpaceStatus handler: python options: - members: true + members: + - images + - sounds diff --git a/docs/types/stream.md b/docs/aliceio/types/stream.md similarity index 50% rename from docs/types/stream.md rename to docs/aliceio/types/stream.md index ca51caa..1adaa77 100644 --- a/docs/types/stream.md +++ b/docs/aliceio/types/stream.md @@ -1,4 +1,7 @@ ::: aliceio.types.stream.Stream handler: python options: - members: true + members: + - url + - offset_ms + - token diff --git a/docs/aliceio/types/text-button.md b/docs/aliceio/types/text-button.md new file mode 100644 index 0000000..621b113 --- /dev/null +++ b/docs/aliceio/types/text-button.md @@ -0,0 +1,8 @@ +::: aliceio.types.text_button.TextButton + handler: python + options: + members: + - title + - url + - payload + - hide diff --git a/docs/types/timeout_event.md b/docs/aliceio/types/timeout-event.md similarity index 100% rename from docs/types/timeout_event.md rename to docs/aliceio/types/timeout-event.md diff --git a/docs/types/tokens_entity.md b/docs/aliceio/types/tokens-entity.md similarity index 63% rename from docs/types/tokens_entity.md rename to docs/aliceio/types/tokens-entity.md index ea91142..d442671 100644 --- a/docs/types/tokens_entity.md +++ b/docs/aliceio/types/tokens-entity.md @@ -1,4 +1,6 @@ ::: aliceio.types.tokens_entity.TokensEntity handler: python options: - members: true + members: + - start + - end diff --git a/docs/aliceio/types/update.md b/docs/aliceio/types/update.md new file mode 100644 index 0000000..bb90e74 --- /dev/null +++ b/docs/aliceio/types/update.md @@ -0,0 +1,22 @@ +::: aliceio.types.update.Update + handler: python + options: + members: + - __init__ + - event + - event_type + - meta + - request + - session + - version + - message + - audio_player + - button_pressed + - purchase + - show_pull + - state + +
+ +::: aliceio.types.update.UpdateTypeLookupError + handler: python diff --git a/docs/types/uploaded_image.md b/docs/aliceio/types/uploaded-image.md similarity index 58% rename from docs/types/uploaded_image.md rename to docs/aliceio/types/uploaded-image.md index 57f5865..92f8807 100644 --- a/docs/types/uploaded_image.md +++ b/docs/aliceio/types/uploaded-image.md @@ -1,18 +1,26 @@ ::: aliceio.types.uploaded_image.UploadedImage handler: python options: - members: true + members: + - id + - size + - origUrl + - orig_url + - createdAt + - created_at
::: aliceio.types.uploaded_image.PreUploadedImage handler: python options: - members: true + members: + - image
::: aliceio.types.uploaded_image.UploadedImagesList handler: python options: - members: true + members: + - images diff --git a/docs/aliceio/types/uploaded-sound.md b/docs/aliceio/types/uploaded-sound.md new file mode 100644 index 0000000..49bddc6 --- /dev/null +++ b/docs/aliceio/types/uploaded-sound.md @@ -0,0 +1,31 @@ +::: aliceio.types.uploaded_sound.UploadedSound + handler: python + options: + members: + - id + - skillId + - skill_id + - size + - originalName + - original_name + - createdAt + - created_at + - isProcessed + - is_processed + - error + +
+ +::: aliceio.types.uploaded_sound.PreUploadedSound + handler: python + options: + members: + - sound + +
+ +::: aliceio.types.uploaded_sound.UploadedSoundsList + handler: python + options: + members: + - sounds diff --git a/docs/types/url.md b/docs/aliceio/types/url.md similarity index 67% rename from docs/types/url.md rename to docs/aliceio/types/url.md index 08259ee..7795512 100644 --- a/docs/types/url.md +++ b/docs/aliceio/types/url.md @@ -1,4 +1,5 @@ ::: aliceio.types.url.URL handler: python options: - members: true + members: + - url diff --git a/docs/types/user.md b/docs/aliceio/types/user.md similarity index 52% rename from docs/types/user.md rename to docs/aliceio/types/user.md index 1f4b549..53b7d6f 100644 --- a/docs/types/user.md +++ b/docs/aliceio/types/user.md @@ -1,4 +1,6 @@ ::: aliceio.types.user.User handler: python options: - members: true + members: + - user_id + - access_token diff --git a/docs/utils/builders.md b/docs/aliceio/utils/builders.md similarity index 62% rename from docs/utils/builders.md rename to docs/aliceio/utils/builders.md index e9e4136..d452263 100644 --- a/docs/utils/builders.md +++ b/docs/aliceio/utils/builders.md @@ -1,20 +1,8 @@ ## Билдеры - [`Builder`](builders/builder.md) - Объект клавиатуры. -- [`ImageGalleryBuilder`](builders/image_gallery_builder.md) - Билдер альбомов. -- [`ItemsListBuilder`](builders/items_list_builder.md) - Билдер элементов списка. -- [`TextButtonBuilder`](builders/text_button_builder.md) - Билдер текстовых кнопок. +- [`ImageGalleryBuilder`](builders/image-gallery-builder.md) - Билдер альбомов. +- [`ItemsListBuilder`](builders/items-list-builder.md) - Билдер элементов списка. +- [`TextButtonBuilder`](builders/text-button-builder.md) - Билдер текстовых кнопок. ### [Примеры](https://github.com/K1rL3s/aliceio/blob/examples/examples/builders.py) использования билдеров - - - - - - - - - - - - diff --git a/docs/aliceio/utils/builders/builder.md b/docs/aliceio/utils/builders/builder.md new file mode 100644 index 0000000..996e008 --- /dev/null +++ b/docs/aliceio/utils/builders/builder.md @@ -0,0 +1,8 @@ +::: aliceio.utils.builders.Builder + handler: python + options: + members: + - __init__ + - add + - to_collection + - __len__ diff --git a/docs/utils/builders/image_gallery_builder.md b/docs/aliceio/utils/builders/image-gallery-builder.md similarity index 100% rename from docs/utils/builders/image_gallery_builder.md rename to docs/aliceio/utils/builders/image-gallery-builder.md diff --git a/docs/utils/builders/items_list_builder.md b/docs/aliceio/utils/builders/items-list-builder.md similarity index 100% rename from docs/utils/builders/items_list_builder.md rename to docs/aliceio/utils/builders/items-list-builder.md diff --git a/docs/utils/builders/text_button_builder.md b/docs/aliceio/utils/builders/text-button-builder.md similarity index 100% rename from docs/utils/builders/text_button_builder.md rename to docs/aliceio/utils/builders/text-button-builder.md diff --git a/docs/utils/funcs.md b/docs/aliceio/utils/funcs.md similarity index 100% rename from docs/utils/funcs.md rename to docs/aliceio/utils/funcs.md diff --git a/docs/utils/mixins.md b/docs/aliceio/utils/mixins.md similarity index 100% rename from docs/utils/mixins.md rename to docs/aliceio/utils/mixins.md diff --git a/docs/utils/warnings.md b/docs/aliceio/utils/warnings.md similarity index 100% rename from docs/utils/warnings.md rename to docs/aliceio/utils/warnings.md diff --git a/docs/webhook/aiohttp_server.md b/docs/aliceio/webhook/aiohttp-server.md similarity index 97% rename from docs/webhook/aiohttp_server.md rename to docs/aliceio/webhook/aiohttp-server.md index b2c9f42..5cb43d6 100644 --- a/docs/webhook/aiohttp_server.md +++ b/docs/aliceio/webhook/aiohttp-server.md @@ -28,6 +28,7 @@ - close - resolve_skill - handle + - __call__
diff --git a/docs/aliceio/webhook/security.md b/docs/aliceio/webhook/security.md new file mode 100644 index 0000000..53c3dc7 --- /dev/null +++ b/docs/aliceio/webhook/security.md @@ -0,0 +1,34 @@ +[IP-адреса Яндекса](https://yandex.ru/ips) +```python +from ipaddress import IPv4Network + +DEFAULT_YANDEX_NETWORKS = [ + IPv4Network("5.45.192.0/18"), + IPv4Network("5.255.192.0/18"), + IPv4Network("37.9.64.0/18"), + IPv4Network("37.140.128.0/18"), + IPv4Network("77.88.0.0/18"), + IPv4Network("84.252.160.0/19"), + IPv4Network("87.250.224.0/19"), + IPv4Network("90.156.176.0/22"), + IPv4Network("93.158.128.0/18"), + IPv4Network("95.108.128.0/17"), + IPv4Network("141.8.128.0/18"), + IPv4Network("178.154.128.0/18"), + IPv4Network("185.32.187.0/24"), + IPv4Network("213.180.192.0/19"), + # IPv6Network("2a02:6b8::/29"), # ? :( +] +``` + + +::: aliceio.webhook.security.IPFilter + handler: python + options: + members: + - __init__ + - default + - allow + - allow_ip + - check + - __contains__ diff --git a/docs/client/skill.md b/docs/client/skill.md deleted file mode 100644 index a373236..0000000 --- a/docs/client/skill.md +++ /dev/null @@ -1,5 +0,0 @@ -::: aliceio.client.skill.Skill - handler: python - options: - merge_init_into_class: false - members: true diff --git a/docs/dispatcher/router.md b/docs/dispatcher/router.md deleted file mode 100644 index e8878a9..0000000 --- a/docs/dispatcher/router.md +++ /dev/null @@ -1,10 +0,0 @@ -::: aliceio.dispatcher.router.Router - handler: python - options: - merge_init_into_class: false - members: - - __init__ - - parent_router - - propagate_event - - include_routers - - include_router diff --git a/docs/index.md b/docs/index.md index 97c931c..cffde8b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,9 +2,14 @@ Добро пожаловать в документацию AliceIO! -Начинающим рекомендуется ознакомиться с [туториалом](tutorial/index.md) и [FAQ](tutorial/faq.md), а после них с технической документацией: +Начинающим рекомендуется ознакомиться с [туториалом](tutorial/start.md) и [FAQ](tutorial/faq.md), а после них с технической документацией: -* [Клиент](client.md) -* [Хендлинг](handling.md) -* [Tools](tools.md) -* [Кастомизация зависимостей](modules.md) +* [Клиент](https://ya.ru) +* [Хендлинг](https://ya.ru) +* [Tools](https://ya.ru) +* [Установка](install.md) + + +> Проект написан с использованием исходного кода [aiogram](https://github.com/aiogram/aiogram/), [vkbottle](https://github.com/vkbottle/vkbottle/) и [aioalice](https://github.com/mahenzon/aioalice) +> +> Спасибо авторам и участникам этих замечательных библиотек diff --git a/docs/modules.md b/docs/modules.md deleted file mode 100644 index 0a603a5..0000000 --- a/docs/modules.md +++ /dev/null @@ -1,17 +0,0 @@ -# Dependencies customisation - -## Logging - -Только `logging` - -!!! info "Примечание" - - По умолчанию уровень логирования выставлен на `DEBUG`. - Изменить это вы можете так: - - === "logging" - - ```python - import logging - logging.getLogger("aliceio").setLevel(logging.INFO) - ``` diff --git a/docs/tools.md b/docs/tutorial/builders.md similarity index 100% rename from docs/tools.md rename to docs/tutorial/builders.md diff --git a/docs/tutorial/code-separation.md b/docs/tutorial/code-separation.md new file mode 100644 index 0000000..6b1bbf9 --- /dev/null +++ b/docs/tutorial/code-separation.md @@ -0,0 +1,118 @@ +# Разделение кода + +!!! info "Примечание" + Разделение кода - очень важная вещь для создания структуры проекта. Не старайтесь сделать всё в одном файле, это вредит не только вам. + +Чтобы сделать это, в aliceio можно использовать такой инструмент как `Router`. +Его применение даёт возможность добавлять фильтры и мидлвари для конкретных групп обработчиков и групп роутеров. + +## Стандартная иерархия файлов + +Для удобства разработки рекомендуется разделять хэндлеры по их функционалу и логике. Например, так: + +```text +/src/ +├── handlers +│ ├── __init__.py +│ ├── start.py +│ ├── ping.py +│ └── echo.py +├── skill.py +``` + +### `start.py` + +Cоздадим файл `start.py` в папке `handlers`, в котором будет простой хендлер, обрабатывающий начало диалога: + +```python +from aliceio import F, Router +from aliceio.types import AliceResponse, Message, Response + +start_router = Router() + +@start_router.message(F.session.new) # О фильтрах в следующей главе +async def start_handler(message: Message) -> AliceResponse: + return AliceResponse(response=Response(text="Привет! Внимательно слушаю")) +``` + +### `ping.py` + +В файле `ping.py` сделаем особый ответ на сообщение с текстом `ping` или `пинг`: + +```python +from aliceio import F, Router +from aliceio.types import Message, Response + +ping_router = Router() + +@ping_router.message(F.command == "ping") +@ping_router.message(F.command == "пинг") +async def echo_handler(message: Message) -> Response: + return Response(text="понг") +``` + +### `echo.py` + +А в `echo.py` реализуем функционал из прошлой главы, но уже без ветвления: + +```python +from aliceio import Router +from aliceio.types import Message + +echo_router = Router() + +@echo_router.message() +async def echo_handler(message: Message) -> str: + return message.original_text +``` + + +### `skill.py` (или `main.py`) + +Теперь осталось создать файл, в котором мы сделаем бота с диспетчером и зарегистрируем роутеры: + +```python +import logging +import sys + +from aiohttp import web +from handlers.echo import echo_router +from handlers.ping import ping_router +from handlers.start import start_router + +from aliceio import Dispatcher, Skill +from aliceio.webhook.aiohttp_server import OneSkillRequestHandler, setup_application + + +def main() -> None: + dp = Dispatcher() + # Важно добавить ping_router перед echo_router, + # иначе эхо будет перехватывать все сообщения и до пинга ничего не дойдёт + dp.include_routers(start_router, ping_router, echo_router) + + skill = Skill(skill_id="...", oauth_token="...",) + + app = web.Application() + webhook_requests_handler = OneSkillRequestHandler( + dispatcher=dp, + skill=skill, + ) + + WEB_SERVER_HOST = "127.0.0.1" + WEB_SERVER_PORT = 80 + WEBHOOK_PATH = "/alice" + + webhook_requests_handler.register(app, path=WEBHOOK_PATH) + setup_application(app, dp, skill=skill) + web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, stream=sys.stdout) + main() +``` + +## Примеры + +* [multi_file_skill](https://ya.ru) +* [vkbottle](https://vkbottle.readthedocs.io/ru/latest/tutorial/code-separation/) diff --git a/docs/tutorial/dependency-injection.md b/docs/tutorial/dependency-injection.md new file mode 100644 index 0000000..ab27387 --- /dev/null +++ b/docs/tutorial/dependency-injection.md @@ -0,0 +1,98 @@ +# Внедрение зависимостей + +DI - это метод программирования, который делает класс независимым от его зависимостей. +Это достигается путем отделения использования объекта от его создания. +Это поможет вам следовать принципу инверсии зависимостей [SOLID](https://en.wikipedia.org/wiki/SOLID) и принципу единой ответственности. + +## Как это работает в aliceio + +Для каждого события в `aliceio.dispatcher.dispatcher.Dispatcher` проходит обработка контекстных данных. Фильтры и мидлвари также могут вносить изменения в контекст. + +Для доступа к контекстным данным необходимо указать соответствующий ключевой параметр в хэндлере или фильтре. +Например, чтобы получить `aliceio.fsm.context.FSMContext`, надо сделать так: + +```python +@router.message(...) +async def some_message(message: Message, skill: Skill, state: FSMContext) -> Any: + ... # do something +``` + +## Внедрение собственных зависимостей + +Aliceio предоставляет несколько способов дополнения и изменения контекстных данных. + +### Инициализация + +Первый и самый простой способ - просто указать именованные аргументы при иницализации `aliceio.dispatcher.dispatcher.Dispatcher` или `aliceio.webhook.aiohttp_server.OneSkillRequestHandler`. + +```python +def main() -> None: + dp = Dispatcher(..., foo=42) + ... +``` +```python +def main() -> None: + dp = Dispatcher(..., foo=42) + handler = OneSkillRequestHandler(dispatcher=dp, skill=skill, bar="Bazz") + ... +``` + +Также можно изменять workflow_data в `aliceio.dispatcher.dispatcher.Dispatcher` как словарь: + +```python +dp = Dispatcher(...) +dp["eggs"] = Spam() +``` + +### Мидлвари + +Мидлвари также могут изменять контекст: + +```python +class RandomFloatMiddleware(BaseMiddleware[Message]): + def __init__(self, start: float = 0.01, end: float = 100.0) -> None: + self.start = start + self.end = end + + async def __call__( + self, + handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], + event: Message, + data: Dict[str, Any], + ) -> Any: + # Добаляем значение в контекст + data["float_num"] = round(random.uniform(self.start, self.end), 3) + return await handler(event, data) +``` + +### Фильтры + +Фильтры могут дополнять контекстные данные: + +```python +class RandomNumberFilter(BaseFilter): + async def __call__( + self, + message: Message, + event_from_user: User + # Фильтры также могут принимать данные из контекста как обработчики + ) -> Union[bool, Dict[str, Any]]: + if message.command == "число": + # Возврат словаря обновит контекст + return {"int_num": random.randint(1_000, 10_000)} + return False +``` + +Или через `MagicFilter` с помощью метода `.as_(...)`: + +```python +@router.message(F.text.as_("real_text"), ~F.session.new) +async def start_handler(message: Message, real_text: str) -> str: + assert real_text == message.text + return real_text +``` + +## Примеры + +* [context_addition.py](https://ya.ru) +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/dependency_injection.html) diff --git a/docs/tutorial/error-handling.md b/docs/tutorial/error-handling.md new file mode 100644 index 0000000..7819e28 --- /dev/null +++ b/docs/tutorial/error-handling.md @@ -0,0 +1,77 @@ +# Обработка исключений + +Рекомендуемый способ обработки ошибок - это блок `try except` внутри хэндлера, +но для общих случаев вы можете добавить обработчик ошибок на уровень роутера или диспетчера. + +```python +@router.error(ExceptionTypeFilter(MyCustomException), F.update.message.as_("message")) +async def handle_my_custom_exception(event: ErrorEvent, message: Message): + # do something with error + await message.answer("Oops, something went wrong!") + + +@router.error() +async def error_handler(event: ErrorEvent): + logger.critical("Critical error caused by %s", event.exception, exc_info=True) + # do something with error + ... +``` + +## Событие исключения + +::: aliceio.types.error_event.ErrorEvent + handler: python + options: + show_source: false + members: + - event + - exception + - update + +## Исключения библиотеки + +### ::: aliceio.exceptions.AliceioError + handler: python + options: + show_source: false + +### ::: aliceio.exceptions.DetailedAliceioError + handler: python + options: + show_source: false + members: + - url + - message + +### ::: aliceio.exceptions.AliceAPIError + handler: python + options: + show_source: false + +### ::: aliceio.exceptions.AliceNetworkError + handler: python + options: + show_source: false + +### ::: aliceio.exceptions.AliceNoCredentialsError + handler: python + options: + show_source: false + +### ::: aliceio.exceptions.AliceWrongFieldError + handler: python + options: + show_source: false + +### ::: aliceio.exceptions.ClientDecodeError + handler: python + options: + show_source: false + members: + - message + - original + - data + +## Примеры + +* [error_handling.py](https://ya.ru) diff --git a/docs/tutorial/faq.md b/docs/tutorial/faq.md new file mode 100644 index 0000000..da2fc56 --- /dev/null +++ b/docs/tutorial/faq.md @@ -0,0 +1,5 @@ +# ЧаВо + +## Маруся? +Разработчики узнали про существование [скиллов Маруси](https://dev.vk.com/ru/guide) только во время написания туториала по aliceio. +Вероятно, есть возможность переделать эту библиотеку для работы с Марусей без значительных затрат по времени :) diff --git a/docs/tutorial/filters.md b/docs/tutorial/filters.md new file mode 100644 index 0000000..fadb948 --- /dev/null +++ b/docs/tutorial/filters.md @@ -0,0 +1,140 @@ +# Фильтры + +Чтобы не городить сотни if'ов в одном хэндлере, были придуманы фильтры (правила). + +Фильтры необходимы для маршрутизации событий конкретным хэндлерам. Поиск обработчика всегда останавливается при прохождении первого соответствующего набора фильтров. +По умолчанию все хэндлеры не имеют фильтров, поэтому все события будут передаваться первому обработчику без фильтров. + +Основной и самый удобный фильтр - [магический](https://github.com/aiogram/magic-filter) `F`-фильтр. +Пользоваться им крайне легко - просто представьте, что вместо него стоит обрабатываемое событие, и обращайтесь к его атрибутам. + +## Кастомный фильтр + +Если мы хотим реализовать какую-то сложную проверку (например, с запросом в бд или к какому-то апи), то надо создать свой фильтр. + +Фильтры могут быть: + +* Асинхронными функциями (`#!python async def my_filter(*args, **kwargs): pass`) +* Синхронными функциями (`#!python def my_filter(*args, **kwargs): pass`) +* Анонимными функциями (`#!python lambda event: True`) +* Любым awaitable объектом +* Подклассом [`aliceio.filters.base.Filter`](https://ya.ru) +* Экземпляром [`Магического фильтра`](https://ya.ru) + +И они должны возвращать `bool` или `dict`. +Если возвращается словарь, полученные данные будут переданы следующим фильтрам и обработчику в качестве ключевых аргументов. + +Сделаем простой class-based фильтр: + +```python +from typing import List +from aliceio.filters import BaseFilter +from aliceio.types import Message + +class InWordsFilter(BaseFilter): # Кастомный фильтр + def __init__(self, words: List[str]) -> None: + self.words = words + + async def __call__(self, message: Message) -> bool: + return message.command in self.words +``` + +Теперь напишем хэндлеры, которые ловят согласие и отказ - слова "да", "нет" и похожие: + +```python +@router.message(InWordsFilter(["да", "ок", "хорошо"])) +async def yes_message_handler(message: Message) -> str: + return "Ну да так да, чё бубнеть-то" + +@router.message(InWordsFilter(["не", "нет", "неа"])) +async def no_message_handler(message: Message) -> str: + return "Ну на нет и суда нет" +``` + +## Магический фильтр + +Для начала этот фильтр нужно импортировать из aliceio. Если импортировать его из magic-filter, то метод `.as_()` не будет доступен (о нём в главе про DI и про магический фильтр). + +```python +from aliceio import F +``` + +К уже написанным обработчикам создадим ещё два, которые будут реагировать на [нажатия кнопок с payload'ом](https://yandex.ru/dev/dialogs/alice/doc/request-buttonpressed.html): + +```python +# Один и тот же фильтр, но разная запись +@router.button_pressed(F.payload["yes"], F.payload["yes"].is_(True)) +async def yes_button_handler(button: ButtonPressed) -> str: + return "Кнопку нажал? Говорить лень?\nНу да так да, чё бубнеть-то" + +# Один и тот же фильтр, но разная запись +@router.button_pressed(~F.payload["yes"], F.payload["yes"].is_(False)) +async def no_button_handler(button: ButtonPressed) -> str: + return"Кнопку нажал? Говорить лень?\nНу на нет и суда нет" +``` + +И чтобы эти кнопки появились, добавим хэндлер без фильтров, который будет срабатывать всегда, когда событие дойдёт до него: + +```python +# Лучше не обрабатывать разные типы событий одним хэндлером +@router.message() +@router.button_pressed() +async def any_message_handler(message: ...) -> Response: + return Response( + text="Да-да... Да-да...", + buttons=[ + TextButton(title="Да", payload={"yes": True}), + TextButton(title="Нет", payload={"yes": False}), + ], + ) +``` + +Допишем обычную точку входа и вуаля, вы прекрасны! + +## Комбинация фильтров + +Есть два основных способа комбинации фильтров: "и" и "или". +Все фильтры можно комбинировать друг с другом и создавать любые конфигурации под любую задачу. + +### Логическое "и" + +Предпочтительный: +```python +@.message(F.text.startswith("yoy"), F.text.endswith("wasap?")) +``` + +Дополнительный (с помощью `and_f()` фильтра): +```python +@.message(and_f(F.text.startswith("yoy"), F.text.endswith("wasap?"))) +``` + +### Логическое "или" + +Предпочтительный: +```python +@.message(F.text.startswith("yoy")) +@.message(F.text.endswith("wasap?")) +``` + +Дополнительный (с помощью `or_f()` фильтра): +```python +@.message(or_f(F.text.startswith("yoy"), F.text.endswith("wasap?"))) +``` + +### Логическое "не" (инверсия) + +Предпочтительный: +```python +@.message(~F.text.startswith("yoy")) +``` + +Дополнительный (с помощью `invert_f()` фильтра): +```python +@.message(invert_f(F.text.startswith("yoy"))) +``` + +## Примеры + +* [filters.py](https://ya.ru) +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/filters/index.html) +* [aiogram-magic](https://docs.aiogram.dev/en/dev-3.x/dispatcher/filters/magic_filters.html) diff --git a/docs/tutorial/finite-state-machine.md b/docs/tutorial/finite-state-machine.md new file mode 100644 index 0000000..235e304 --- /dev/null +++ b/docs/tutorial/finite-state-machine.md @@ -0,0 +1,144 @@ +# Машина состояний + +> Finite-state machine (FSM) или finite-state automation (FSA), конечный автомат — это математическая модель вычислений. +> +> Это абстрактная машина, которая в любой момент времени может находиться ровно в одном из конечного числа состояний. Конечный автомат может переходить из одного состояния в другое в ответ на некоторые входные данные; переход из одного состояния в другое называется переходом. +> +> Конечный автомат определяется списком его состояний, его начальным состоянием и входными данными, которые запускают каждый переход. +> +> [Википедия](https://en.wikipedia.org/wiki/Finite-state_machine) + +## Проблема + +Не вся функциональность навыка может быть реализована в одном хэндлере. +Если вам нужно получить некоторую информацию от пользователя в несколько шагов или нужно направить его в зависимости от ответа, то вам надо использовать FSM. + +Посмотрим, как это сделать пошагово. + +## Решение + +Перед обработкой любый состояний вы должны определить какие именно состояния вы хотите использовать: + +```python +class Form(StatesGroup): + name = State() + like_skills = State() + device = State() +``` + +И теперь напишите хэндлер для каждого состояния отдельно от старта диалога. + +Диалоги начинаются с новой сессией, поэтому давайте поймаем это и переместим пользователя в состояние `Form.name`: + +```python +@form_router.message(F.session.new) +async def new_session(message: Message, state: FSMContext) -> str: + await state.set_state(Form.name) + return "Привет! Как тебя зовут?" +``` + +После этого вы должны сохранить эти данные в хранилище и переместить пользователя в следующее состояние: + +```python +@form_router.message(Form.name) +async def process_name(message: Message, state: FSMContext) -> Response: + await state.update_data(name=message.command) + await state.set_state(Form.like_skills) + return Response( + text=f"Рад познакомиться, {message.command}!\nТебе нравятся навыки Алисы?", + buttons=[ + TextButton(title="Да"), + TextButton(title="Нет"), + ], + ) +``` + +На следующих этапах пользователь может дать разные ответы, например, это может быть *да*, *нет* или что-то другое. + +Обработаем `да` и поставим состояние `Form.device`: + +```python +@form_router.message(Form.like_skills, F.command == "да") +async def process_like_skills(message: Message, state: FSMContext) -> Response: + await state.set_state(Form.device) + return Response( + text="Класс! Мне тоже!\nЧерез какое устройство ты обычно их используешь?" + ) +``` + +Обработаем `нет`: + +```python +@form_router.message(Form.like_skills, F.command == "нет") +async def process_dont_like_skills(message: Message, state: FSMContext) -> Response: + data = await state.get_data() + await state.clear() + return Response( + text="Ну, бывает.\n" + show_summary(data=data, positive=False), + end_session=True, + ) +``` + +И все остальные случаи: + +```python +@form_router.message(Form.like_skills) +async def process_unknown_write_skills(message: Message) -> Response: + return Response( + text="Не могу понять тебя... Можешь повторить, пожалуйста?", + buttons=[ + TextButton(title="Да"), + TextButton(title="Нет"), + ], + ) +``` + +Все возможные случаи шага *Form.like_skills* были рассмотрены, давайте реализуем последний шаг: + +```python +@form_router.message(Form.device) +async def process_device(message: Message, state: FSMContext) -> Response: + data = await state.update_data(device=message.command) + await state.clear() + + if message.command == "телефон": + text = "С телефона? Да, это самое удобное, с чего можно пользоваться Алисой.\n" + else: + text = "" + text += show_summary(data=data) + + return Response(text=text, end_session=True) +``` +```python +def show_summary(data: Dict[str, Any], positive: bool = True) -> str: + name = data["name"] + device = data.get("device", "чём-то непонятном") + text = f"Я буду помнить, {name}, что " + text += ( + f"тебе нравятся навыки Алисы на {device}." + if positive + else "тебе не нравятся навыки Алисы..." + ) + return text +``` + +Теперь, когда мы доделали диалог, надо сделать возможность отменить разговор: + +```python +@form_router.message(F.command == "отмена") +async def cancel_handler(message: Message, state: FSMContext) -> Response: + """Позволяет пользователю отменить любое действие.""" + current_state = await state.get_state() + if current_state is not None: + logging.info("Cancelling state %r", current_state) + await state.clear() + + return Response(text="Окей, стою. Пока-пока!", end_session=True) +``` + +Готово! + +## Примеры + +* [finite_state_machine.py](https://ya.ru) +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/finite_state_machine/index.html) diff --git a/docs/tutorial/first-skill.md b/docs/tutorial/first-skill.md new file mode 100644 index 0000000..9983775 --- /dev/null +++ b/docs/tutorial/first-skill.md @@ -0,0 +1,148 @@ +# Первый навык на AliceIO + +Добро пожаловать в первую часть туториала. +Здесь будет представлено, как можно взаимодействовать с `API Алисы` и отвечать на его запросы. + +!!! info "Примечание" + "Яндекс", "Алиса" и "Диалоги" будут обозначать сторону, от которой приходят запросы. + + "Навык", "сервер", "вы" будут обозначать сторону, которая принимает запросы, обрабатывает их и отдаёт ответы. + +# База + +Перед тем, как начать разработку навыка для Алисы, важно знать [официальную документацию](https://yandex.ru/dev/dialogs/alice/doc/) и принцип работы навыков. + +Взаимодействие с Алисой происходит через [webhook](https://www.google.com/search?q=%D0%B2%D0%B5%D0%B1%D1%85%D1%83%D0%BA+%D1%8D%D1%82%D0%BE)'и - +Яндекс отправляет запрос с новым событие навыка, он что-то думает и возвращает ответ. Навыки не опрашивают Алису на предмет новых сообщений, действий и так далее. +Здесь нет [pooling](https://www.google.com/search?q=%D0%BF%D1%83%D0%BB%D0%B8%D0%BD%D0%B3+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%8D%D1%82%D0%BE)'а, +поэтому нельзя узнать, принял ли Яндекс ваш ответ без ошибок (но не всегда). + +!!! warning "Важно" + Именно из-за вебхуков все хэндлеры (и мидлвари) обязаны что-то вернуть, иначе Алиса завершит сессию пользователя. + +# Типизация + +На момент создания библиотеки разработчики постарались перевести все json-объекты из документации в модели pydantic'а, которые и являются подсказками типов. + +# Первые шаги + +Начнём с написания простого эхо-навыка. +Для начала работы следует ознакомиться с основными классами фреймворка: `Bot`, `Dispatcher`, и `OneSkillRequestHandler`. + +```python +from aiohttp import web +from aliceio import Dispatcher, Skill +from aliceio.types import AliceResponse, Message, Response # О типах чуть позже +from aliceio.webhook.aiohttp_server import OneSkillRequestHandler, setup_application + +dp = Dispatcher() +skill = Skill(skill_id="...", oauth_token="...") +``` + +При иницализации навыка нужно указать его айди (обязательно) и OAuth Token (опицонально). +Первый позволяет игнорировать запросы, адресованные не этому навыку, а второй даёт возможность взаимодействовать с файлами ваших навыков. + +Теперь в диспетчер можно добавить нужный обработчик: + +```python +@dp.message() +async def message_handler(message: Message) -> AliceResponse: + if message.session.new: + text = "Привет!" + else: + text = message.original_text + return AliceResponse(response=Response(text=text)) +``` + +Разберём этот фрагмент построчно: + +`#!python @dp.message()` - это декоратор, который регистрирует функцию-обработчик, которая сработает, если сообщение будет отвечать заданным фильтрам. +Здесь их нет, поэтому функция будет срабатывать на каждое сообщение. + +`#!python async def message_handler(message: Message) -> AliceResponse:` - сигнатура функции-обработчика, в которой первым аргументом всегда будет текущее событие. +Эта функция возвращает `#!python AliceResponse`, но фреймворк поддерживает и другие варианты. + +`#!python if message.session.new:` - проверяем, первое ли это сообщение в текущей сессии (т.е. пользователь только открыл навык). +Если это так, то вместо эха будет приветствие. + +`#!python return AliceResponse(response=Response(text=text))` - возвращаем полный объект, который ждёт Алиса. +Вместо него можно вернуть просто `#!python Response` или `#!python str`, которая станет текстом. + +# Запуск + +Теперь надо как-то запустить эту шайтан-машину, чтобы она принимала запросы от Алисы. +Для этого напишем простую точку входа, которая будет чуть модифицирована в дальнейшем: + +```python +def main() -> None: + app = web.Application() + webhook_requests_handler = OneSkillRequestHandler( + dispatcher=dp, + skill=skill, + ) + + # Навык принимает запросы по пути http://127.0.01:80/alice + WEB_SERVER_HOST = "127.0.0.1" + WEB_SERVER_PORT = 80 + WEBHOOK_PATH = "/alice" + + webhook_requests_handler.register(app, path=WEBHOOK_PATH) + setup_application(app, dp, skill=skill) + web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT) + +if __name__ == "__main__": + main() +``` + +Для тестирования из [панели разработчика](https://dialogs.yandex.ru/developer/skills) можно воспользоваться [ngrok](https://ngrok.com/)'ом. + +Для запуска в прод вам нужен свой домен и SSL сертификаты, об этом подробнее в официальной документации. + + +# Примеры + +* [echo_bot.py](https://ya.ru) +* [echo_bot_ssl.py](https://ya.ru) + +Полный код из этой главы: + +```python +from aiohttp import web + +from aliceio import Dispatcher, Skill +from aliceio.types import AliceResponse, Message, Response +from aliceio.webhook.aiohttp_server import OneSkillRequestHandler, setup_application + + +dp = Dispatcher() +skill = Skill(skill_id="...", oauth_token="...") + + +@dp.message() +async def message_handler(message: Message) -> AliceResponse: + if message.session.new: + text = "Привет!" + else: + text = message.original_text + return AliceResponse(response=Response(text=text)) + + +def main() -> None: + app = web.Application() + webhook_requests_handler = OneSkillRequestHandler( + dispatcher=dp, + skill=skill, + ) + + WEB_SERVER_HOST = "127.0.0.1" + WEB_SERVER_PORT = 80 + WEBHOOK_PATH = "/alice" + + webhook_requests_handler.register(app, path=WEBHOOK_PATH) + setup_application(app, dp, skill=skill) + web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT) + + +if __name__ == "__main__": + main() +``` diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/tutorial/methods.md b/docs/tutorial/methods.md new file mode 100644 index 0000000..29502ba --- /dev/null +++ b/docs/tutorial/methods.md @@ -0,0 +1,79 @@ +# Методы API + +Чтобы получить, загрузить и удалить загруженные изображения и звуки, надо передать [OAuth Token](https://yandex.ru/dev/direct/doc/start/token.html) при создании навыка и воспользоваться одним из следующих методов экземпляра: + +!!! warning "Предупреждение" + Без токена невозможно использовать все следующие методы. + +# Свободное место + +## ::: aliceio.client.skill.Skill.status + handler: python + options: + show_source: false + +Для каждого аккаунта Яндекса на Диалоги можно загрузить не больше 100 МБ картинок и 1 ГБ аудио. Чтобы узнать, сколько места уже занято, используйте этот метод. +[Док 1](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__quota) +[Док 2](https://yandex.ru/dev/dialogs/alice/doc/resource-sounds-upload.html#http-load__quota) + + +# Изображения + +## ::: aliceio.client.skill.Skill.get_images + handler: python + options: + show_source: false + +Список изображений, загруженных для навыка, можно получить этим методом. [Док](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__list) + +## ::: aliceio.client.skill.Skill.upload_image + handler: python + options: + show_source: false + + +Чтобы загрузить картинку из для навыка из интернета, передайте URL картинки в метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__download-internet) + +Чтобы загрузить файл, передайте наследника `InputFile`'а в метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__upload-file) + +## ::: aliceio.client.skill.Skill.delete_image + handler: python + options: + show_source: false + +Чтобы удалить загруженное изображение, передайте его идентификатор в этот метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-upload.html#http-images-load__delete) + + +# Аудио + +## ::: aliceio.client.skill.Skill.get_sounds + handler: python + options: + show_source: false + +Чтобы посмотреть аудиофайлы, загруженные для навыка, используйте этот метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-sounds-upload.html#http-load__list) + +## ::: aliceio.client.skill.Skill.upload_sound + handler: python + options: + show_source: false + +Аудио можно загрузить только файлом, передайте наследника `InputFile`'а в метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-sounds-upload.html#http-load__upload-file) + +## ::: aliceio.client.skill.Skill.delete_sound + handler: python + options: + show_source: false + +Чтобы удалить загруженное аудио, передайте его идентификатор в этот метод. +[Док](https://yandex.ru/dev/dialogs/alice/doc/resource-sounds-upload.html#http-load__delete) + + +# Примеры + +* [methods.py](https://ya.ru) diff --git a/docs/tutorial/middlewares.md b/docs/tutorial/middlewares.md new file mode 100644 index 0000000..f61d816 --- /dev/null +++ b/docs/tutorial/middlewares.md @@ -0,0 +1,98 @@ +# Мидлвари + +aliceio предоставляет мощный механизм настройки обработчиков событий через мидлвари + +Мидлвари здесь похожи на мидлвари в веб-фреймворках, таких как +[aiohttp](https://docs.aiohttp.org/en/stable/web_advanced.html#aiohttp-web-middlewares), +[fastapi](https://fastapi.tiangolo.com/tutorial/middleware/), +[Django](https://docs.djangoproject.com/en/5.0/topics/http/middleware/) и т.д. +с небольшой разницей - здесь реализованы два уровня промежуточного программного обеспечения (до и после фильтров). + +!!! info "Примечание" + Мидлварь - это код, который активируется при каждом событии, полученном от API Алисы. + +# Теория + +Как говорится во многих книгах и другой литературе в Интернете: +> Мидлвари — это повторно используемое программное обеспечение, которое использует шаблоны и платформы для устранения разрыва между функциональными требованиями приложений и базовыми операционными системами, стеками сетевых протоколов и базами данных + +Мидлварь может изменять, расширять или отклонять событие обработки во многих местах конвейера (обработки). + +# База + +Экземпляр мидлваря можно применить для каждого типа события (update, message, button_pressed etc) в двух местах: + +1. Внешняя (outer) область - перед обработкой фильтров (`..outer_middleware(...)`) +2. Внутренняя (inner) область - после обработки фильтров, но перед обработчиком (`..middleware(...)`) + +
+ ![middleware_light.png](../_static/middleware_light.png#only-light "middleware") + ![middleware_dark.png](../_static/middleware_dark.png#only-dark "middleware") +
Визуализация порядка обработки
+
+ +!!! warning "Внимание" + Мидлварь должен быть подклассом `BaseMiddleware` (`#!python from aliceio inport BaseMiddleware`) или поддерживать асинхронный `#!python __call__`. + +# Практика + +!!! danger "Важно" + Мидлварь должен всегда вызывать `#!python await handler(event, data)` чтобы передать событие следующему мидлварю/хэндлеру. + Если вы хотите завершить обработку события, вы должны не вызывать `#!python await handler(event, data)` + +## Class-based + +Напишем мидлварь, который будет разворачивать незалогиненных в Яндексе пользователей: + +```python +from aliceio import BaseMiddleware +from aliceio.types import Update + +class UserAuthorizedMiddleware(BaseMiddleware[Update]): + async def __call__( + self, + handler: Callable[[Update, Dict[str, Any]], Awaitable[Any]], + event: Update, + data: Dict[str, Any], + ) -> Any: + if event.session.user is None: + logging.info("Замечен пользователь без аккаунта, блокирую!") + return "Я вас не знаю, у вас нет аккаунта в Яндексе. А чтобы пользоваться мной, он нужен!" + return await handler(event, data) +``` + +И теперь добавим его: + +```python +dp = Dispatcher() +dp.update.outer_middleware(UserAuthorizedMiddleware()) +# либо `dp.update.middleware(UserAuthorizedMiddleware())` +``` + +## Function-based + +Напишем такой же мидлварь через функцию: + +```python +@dp.update.middleware() # либо `@dp.update.outer_middleware()` +async def check_authorization( + handler: Callable[[Update, Dict[str, Any]], Awaitable[Any]], + event: Update, + data: Dict[str, Any] +) -> Any: + if event.session.user is None: + logging.info("Замечен пользователь без аккаунта, блокирую!") + return "Я вас не знаю, у вас нет аккаунта в Яндексе. А чтобы пользоваться мной, он нужен!" + return await handler(event, data) +``` + +# Факты + +1. Outer-мидлвари будут вызываться при каждом входящем событиию. +2. Inner-мидлвари будут вызываться только при прохождении фильтров. +3. Если вы ничего не вернёте из мидлваря, то Алиса завершит диалог с навыком. + +# Примеры + +* [middlewares.py](https://ya.ru) +* [aiogram](https://docs.aiogram.dev/en/dev-3.x/dispatcher/middlewares.html) diff --git a/docs/tutorial/special-events.md b/docs/tutorial/special-events.md new file mode 100644 index 0000000..c2cc70e --- /dev/null +++ b/docs/tutorial/special-events.md @@ -0,0 +1,53 @@ +# Особые события + +## Таймаут + +Таймаут-событие возникает, когда время обработки запроса на стороне навыка длиться дольше 4 секунд (по умолчанию). + +Если хэндлер находится в режиме ожидания выполнения чего-то асинхронного, то диспетчер остановит обработку события и создаст "экстренное" событие таймаута. + +Его можно обработать также, как и любое другое входящее событие: + +```python +@router.timeout() +async def timeout_handler(event: TimeoutUpdate) -> str: + return "У меня что-то пошло не так, я какой-то долгодум..." +``` + +!!! warning "Важно" + От таких хэндлеров требуется молниеносный ответ. В них не должно быть ничего, что может долго работать. + + Если навык ничего не ответит, то Алиса завершит сессию. + +### Таймаут-событие + +### ::: aliceio.types.timeout_event.TimeoutUpdate + handler: python + options: + members: + - event + - event_type + +## Запуск и завершение + +В диспетчере можно зарегистрировать вспомогательные функции на включение и выключение. + +В них можно, например, инициализировать подключение к бд или проверить место для файлов навыка: + +```python +@dispatcher.startup() +async def on_startup(skill: Skill) -> None: + space: SpaceStatus = await skill.status() + if space.images.quota.available < 1024 or space.sounds.quota.available < 1024: + exit("ALARM!!! NOT ENOUGH SPACE") +``` +```python +async def on_shutdown() -> None: + await close_all_sessions() + +dispatcher.shutdown.register(on_shutdown) +``` + +## Примеры + +* [on_dispatcher_event.py](https://ya.ru) diff --git a/docs/tutorial/start.md b/docs/tutorial/start.md new file mode 100644 index 0000000..572821c --- /dev/null +++ b/docs/tutorial/start.md @@ -0,0 +1,13 @@ +# Содержание + +1. [Первый навык на aliceio](first-skill.md) +2. [Разделение кода](code-separation.md) +3. [Методы API](methods.md) +4. [Фильтры](filters.md) +5. [Мидлвари](middlewares.md) +6. [Машина состояний](finite-state-machine.md) +7. [Кнопки и альбомы](builders.md) +8. [Обработка ошибок](error-handling.md) +9. [Особые события](special-events.md) +10. [Внедрение зависимостей](dependency-injection.md) +11. [FAQ](faq.md) diff --git a/docs/types/alice_request.md b/docs/types/alice_request.md deleted file mode 100644 index f1a45d7..0000000 --- a/docs/types/alice_request.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.alice_response.AliceResponse - handler: python - options: - members: true diff --git a/docs/types/alice_response.md b/docs/types/alice_response.md deleted file mode 100644 index a2e4688..0000000 --- a/docs/types/alice_response.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.alice_request.AliceRequest - handler: python - options: - members: true diff --git a/docs/types/big_image.md b/docs/types/big_image.md deleted file mode 100644 index 2d86a57..0000000 --- a/docs/types/big_image.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.big_image.BigImage - handler: python - options: - members: true diff --git a/docs/types/datetime.md b/docs/types/datetime.md deleted file mode 100644 index 4f2c92b..0000000 --- a/docs/types/datetime.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.datetime.DateTimeEntity - handler: python - options: - members: true diff --git a/docs/types/fio_entity.md b/docs/types/fio_entity.md deleted file mode 100644 index ab28352..0000000 --- a/docs/types/fio_entity.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.fio_entity.FIOEntity - handler: python - options: - members: true diff --git a/docs/types/geo_entity.md b/docs/types/geo_entity.md deleted file mode 100644 index bf0b27c..0000000 --- a/docs/types/geo_entity.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.geo_entity.GeoEntity - handler: python - options: - members: true diff --git a/docs/types/interfaces.md b/docs/types/interfaces.md deleted file mode 100644 index aa2fa0d..0000000 --- a/docs/types/interfaces.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.interfaces.Interfaces - handler: python - options: - members: true diff --git a/docs/types/item_image.md b/docs/types/item_image.md deleted file mode 100644 index cd7dc8e..0000000 --- a/docs/types/item_image.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.item_image.ItemImage - handler: python - options: - members: true diff --git a/docs/types/items_list.md b/docs/types/items_list.md deleted file mode 100644 index bfb5fdd..0000000 --- a/docs/types/items_list.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.items_list.ItemsList - handler: python - options: - members: true diff --git a/docs/types/message.md b/docs/types/message.md deleted file mode 100644 index 780a8de..0000000 --- a/docs/types/message.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.message.Message - handler: python - options: - members: true diff --git a/docs/types/meta.md b/docs/types/meta.md deleted file mode 100644 index 4be3cf6..0000000 --- a/docs/types/meta.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.meta.Meta - handler: python - options: - members: true diff --git a/docs/types/metadata.md b/docs/types/metadata.md deleted file mode 100644 index 65030dd..0000000 --- a/docs/types/metadata.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.metadata.Metadata - handler: python - options: - members: true diff --git a/docs/types/nlu.md b/docs/types/nlu.md deleted file mode 100644 index 12c151a..0000000 --- a/docs/types/nlu.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.nlu.NLU - handler: python - options: - members: true diff --git a/docs/types/purchase.md b/docs/types/purchase.md deleted file mode 100644 index 29bac45..0000000 --- a/docs/types/purchase.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.purchase.Purchase - handler: python - options: - members: true diff --git a/docs/types/response.md b/docs/types/response.md deleted file mode 100644 index 1959d7d..0000000 --- a/docs/types/response.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.response.Response - handler: python - options: - members: true diff --git a/docs/types/session.md b/docs/types/session.md deleted file mode 100644 index c61144c..0000000 --- a/docs/types/session.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.session.Session - handler: python - options: - members: true diff --git a/docs/types/show_item_meta.md b/docs/types/show_item_meta.md deleted file mode 100644 index dda9106..0000000 --- a/docs/types/show_item_meta.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.show_item_meta.ShowItemMeta - handler: python - options: - members: true diff --git a/docs/types/text_button.md b/docs/types/text_button.md deleted file mode 100644 index d10a0e8..0000000 --- a/docs/types/text_button.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.types.text_button.TextButton - handler: python - options: - members: true diff --git a/docs/types/update.md b/docs/types/update.md deleted file mode 100644 index 847bbf3..0000000 --- a/docs/types/update.md +++ /dev/null @@ -1,7 +0,0 @@ -::: aliceio.types.update.Update - handler: python - options: - members: - - __init__ - - event - - event_type diff --git a/docs/types/uploaded_sound.md b/docs/types/uploaded_sound.md deleted file mode 100644 index 558e86e..0000000 --- a/docs/types/uploaded_sound.md +++ /dev/null @@ -1,18 +0,0 @@ -::: aliceio.types.uploaded_sound.UploadedSound - handler: python - options: - members: true - -
- -::: aliceio.types.uploaded_sound.PreUploadedSound - handler: python - options: - members: true - -
- -::: aliceio.types.uploaded_sound.UploadedSoundsList - handler: python - options: - members: true diff --git a/docs/utils/builders/builder.md b/docs/utils/builders/builder.md deleted file mode 100644 index f788af3..0000000 --- a/docs/utils/builders/builder.md +++ /dev/null @@ -1,4 +0,0 @@ -::: aliceio.utils.builders.Builder - handler: python - options: - members: true diff --git a/docs/utils/magic_filter.md b/docs/utils/magic_filter.md deleted file mode 100644 index 81bd44c..0000000 --- a/docs/utils/magic_filter.md +++ /dev/null @@ -1,11 +0,0 @@ -::: aliceio.utils.magic_filter.AsFilterResultOperation - handler: python - options: - members: true - -
- -::: aliceio.utils.magic_filter.MagicFilter - handler: python - options: - members: true diff --git a/docs/webhook/security.md b/docs/webhook/security.md deleted file mode 100644 index eccac77..0000000 --- a/docs/webhook/security.md +++ /dev/null @@ -1,5 +0,0 @@ -::: aliceio.webhook.security.IPFilter - handler: python - options: - merge_init_into_class: true - members: true diff --git a/examples/context_addition.py b/examples/context_addition.py index 9925032..e742a48 100644 --- a/examples/context_addition.py +++ b/examples/context_addition.py @@ -6,7 +6,7 @@ from aiohttp import web -from aliceio import BaseMiddleware, Dispatcher, Router, Skill +from aliceio import BaseMiddleware, Dispatcher, F, Router, Skill from aliceio.filters import BaseFilter from aliceio.types import Message, User from aliceio.webhook.aiohttp_server import OneSkillRequestHandler, setup_application @@ -52,12 +52,14 @@ async def random_number_handler( return f"🎲 Моё число... {int_num}!\n🤓Шанс на это был ~{float_num}%" -@router.message() +@router.message(F.text.as_("real_text")) async def start_handler( message: Message, yoy_num: int, # Аргумент из даты диспетчера kek_num: int, # Аргумент из даты RequestHandler'а + real_text: str, # Аргумент из магического фильтра ) -> str: + assert real_text == message.text return ( '💻 Скажи "число", и я скажу число, которое я задумал\n' f"(точно не {yoy_num} и не {kek_num})" diff --git a/examples/multi_file_skill/handlers/ping.py b/examples/multi_file_skill/handlers/ping.py new file mode 100644 index 0000000..e02eec0 --- /dev/null +++ b/examples/multi_file_skill/handlers/ping.py @@ -0,0 +1,11 @@ +from aliceio import F, Router +from aliceio.types import Message, Response + +# Для каждого файла мы можем создать отдельный роутер +ping_router = Router() + + +@ping_router.message(F.command == "ping") +@ping_router.message(F.command == "пинг") +async def echo_handler(message: Message) -> Response: + return Response(text="понг") diff --git a/examples/multi_file_skill/skill.py b/examples/multi_file_skill/skill.py index 2cec2d3..65510b8 100644 --- a/examples/multi_file_skill/skill.py +++ b/examples/multi_file_skill/skill.py @@ -4,6 +4,7 @@ from aiohttp import web from handlers.echo import echo_router +from handlers.ping import ping_router from handlers.start import start_router from aliceio import Dispatcher, Skill @@ -12,7 +13,7 @@ def main() -> None: dp = Dispatcher() - dp.include_routers(start_router, echo_router) + dp.include_routers(start_router, ping_router, echo_router) skill_id = os.environ["SKILL_ID"] oauth_token = os.getenv("OAUTH_TOKEN") diff --git a/mkdocs.yml b/mkdocs.yml index 672c243..254e4d7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,7 +5,7 @@ site_url: https://aliceio.rtfd.io/ repo_name: aliceio repo_url: https://github.com/K1rL3s/aliceio edit_uri: edit/master/docs/ -copyright: View maintainers +copyright: Лицензия extra: generator: false @@ -17,190 +17,167 @@ extra: nav: - Документация: + - index.md + - Установка: install.md + - API Алисы: + - Навык: aliceio/client/skill.md + - Enums: aliceio/enums/all-enums.md + - Методы: + - Base: aliceio/methods/base.md + - Статус: aliceio/methods/status.md + - Изображения: + - Загрузить: aliceio/methods/images/upload-image.md + - Получить: aliceio/methods/images/get-images.md + - Удалить: aliceio/methods/images/delete-image.md + - Звуки: + - Загрузить: aliceio/methods/sounds/upload-sound.md + - Получить: aliceio/methods/sounds/get-sounds.md + - Удалить: aliceio/methods/sounds/delete-sound.md + - Типы: + - AliceEvent: aliceio/types/alice-event.md + - AliceRequest: aliceio/types/alice-request.md + - AliceResponse: aliceio/types/alice-response.md + - AnalyticEvent: aliceio/types/analytic-event.md + - Analytics: aliceio/types/analytics.md + - ApiState: aliceio/types/api-state.md + - Application: aliceio/types/application.md + - AudioPlayer: aliceio/types/audio-player.md + - AudioPlayerDirective: aliceio/types/audio-player-directive.md + - AudioPlayerError: aliceio/types/audio-player-error.md + - AudioPlayerItem: aliceio/types/audio-player-item.md + - Base: aliceio/types/base.md + - BigImage: aliceio/types/big-image.md + - ButtonPressed: aliceio/types/button-pressed.md + - Card: aliceio/types/card.md + - CardFooter: aliceio/types/card-footer.md + - CardHeader: aliceio/types/card-header.md + - Datetime: aliceio/types/datetime.md + - Directives: aliceio/types/directives.md + - Entity: aliceio/types/entity.md + - ErrorEvent: aliceio/types/error-event.md + - ErrorResult: aliceio/types/error-result.md + - FIOEntity: aliceio/types/fio-entity.md + - GEOEntity: aliceio/types/geo-entity.md + - ImageGallery: aliceio/types/image-gallery.md + - ImageGalleryItem: aliceio/types/image-gallery-item.md + - InputFile: aliceio/types/input-file.md + - Interface: aliceio/types/interfaces.md + - ItemImage: aliceio/types/item-image.md + - ItemsList: aliceio/types/items-list.md + - Markup: aliceio/types/markup.md + - MediaButton: aliceio/types/media-button.md + - Message: aliceio/types/message.md + - Meta: aliceio/types/meta.md + - MetaData: aliceio/types/metadata.md + - NLU: aliceio/types/nlu.md + - NLUEntity: aliceio/types/nlu-entity.md + - NumberEntity: aliceio/types/number-entity.md + - Payload: aliceio/types/payload.md + - Purchase: aliceio/types/purchase.md + - Quota: aliceio/types/quota.md + - Response: aliceio/types/response.md + - Result: aliceio/types/result.md + - Session: aliceio/types/session.md + - ShowItemMeta: aliceio/types/show-item-meta.md + - ShowPull: aliceio/types/show-pull.md + - SpaceStatus: aliceio/types/space-status.md + - Stream: aliceio/types/stream.md + - TextButton: aliceio/types/text-button.md + - TimeoutEvent: aliceio/types/timeout-event.md + - TokensEntity: aliceio/types/tokens-entity.md + - Update: aliceio/types/update.md + - UploadedImage: aliceio/types/uploaded-image.md + - UploadedSound: aliceio/types/uploaded-sound.md + - URL: aliceio/types/url.md + - User: aliceio/types/user.md + - Клиент: + - Сервер Алисы: aliceio/client/alice.md + - ContextController: aliceio/client/context-controller.md + - Сессия: + - Base: aliceio/client/session/base.md + - Aiohttp: aliceio/client/session/aiohttp.md + - Мидлвари: + - Base: aliceio/client/session/middlewares/base.md + - Manager: aliceio/client/session/middlewares/manager.md + - RequestLogging: aliceio/client/session/middlewares/request-logging.md - - Пользовательский уровень: - - index.md - - Handling: - - Handlers: - - Base: handlers/base.md - - AudioPlayer: handlers/audio_player.md - - ButtonPressed: handlers/button_pressed.md - - Message: handlers/message.md - - Purchase: handlers/purchase.md - - ShowPull: handlers/show_pull.md - - Error: handlers/error.md - - Dispatcher: - - Dispatcher: dispatcher/dispatcher.md - - Flags: dispatcher/flags.md - - Router: dispatcher/router.md - - Middlewares: - - Base: dispatcher/middlewares/base.md - - Webhook: - - AiohttpServer: webhook/aiohttp_server.md - - - Tools: - - Filters: - - Base: filters/base.md - - State: filters/state.md - - Exception: filters/exception.md - - Logic: filters/logic.md - - MagicData: filters/magic_data.md - - FSM: - - Context: fsm/context.md - - State: fsm/state.md - - Strategy: fsm/strategy.md - - Storages: - - Base: fsm/storage/base.md - - MemoryStorage: fsm/storage/memory.md - - ApiStorage: fsm/storage/api.md - - Methods: - - Base: methods/base.md - - Status: methods/status.md - - Images: - - Upload: methods/images/upload_image.md - - Get: methods/images/get_images.md - - Delete: methods/images/delete_image.md - - Sounds: - - Upload: methods/sounds/upload_sound.md - - Get: methods/sounds/get_sounds.md - - Delete: methods/sounds/delete_sound.md - - Types: - - AliceEvent: types/alice_event.md - - AliceRequest: types/alice_request.md - - AliceResponse: types/alice_response.md - - AnalyticEvent: types/analytic_event.md - - Analytics: types/analytics.md - - ApiState: types/api_state.md - - Application: types/application.md - - AudioPlayer: types/audio_player.md - - AudioPlayerDirective: types/audio_player_directive.md - - AudioPlayerError: types/audio_player_error.md - - AudioPlayerItem: types/audio_player_item.md - - Base: types/base.md - - BigImage: types/big_image.md - - ButtonPressed: types/button_pressed.md - - Card: types/card.md - - CardFooter: types/card_footer.md - - CardHeader: types/card_header.md - - Datetime: types/datetime.md - - Directives: types/directives.md - - Entity: types/entity.md - - ErrorEvent: types/error_event.md - - ErrorResult: types/error_result.md - - FIOEntity: types/fio_entity.md - - GEOEntity: types/geo_entity.md - - ImageGallery: types/image_gallery.md - - ImageGalleryItem: types/image_gallery_item.md - - InputFile: types/input_file.md - - Interface: types/interfaces.md - - ItemImage: types/item_image.md - - ItemsList: types/items_list.md - - Markup: types/markup.md - - MediaButton: types/media_button.md - - Message: types/message.md - - Meta: types/meta.md - - MetaData: types/metadata.md - - NLU: types/nlu.md - - NLUEntity: types/nlu_entity.md - - NumberEntity: types/number_entity.md - - Payload: types/payload.md - - Purchase: types/purchase.md - - Quota: types/quota.md - - Response: types/response.md - - Result: types/result.md - - Session: types/session.md - - ShowItemMeta: types/show_item_meta.md - - ShowPull: types/show_pull.md - - SpaceStatus: types/space_status.md - - Stream: types/stream.md - - TextButton: types/text_button.md - - TimeOutEvent: types/timeout_event.md - - TokensEntity: types/tokens_entity.md - - Update: types/update.md - - UploadedImage: types/uploaded_image.md - - UploadedSound: types/uploaded_sound.md - - URL: types/url.md - - User: types/user.md - - Utils: - - MagicFilter: utils/magic_filter.md - - - Client: - - Skill: client/skill.md - - - - Продвинутый уровень: - - index.md - - Handling: - - Webhook: - - Security: webhook/security.md - - - Tools: - - Enums: - - enums/all_enums.md - - FSM: + - Обработка событий: + - Роутер: aliceio/dispatcher/router.md + - Диспетчер: aliceio/dispatcher/dispatcher.md + - Фильтрация: + - Base: aliceio/filters/base.md + - Состояния: aliceio/filters/state.md + - Исключение: aliceio/filters/exception.md + - Комбинации: aliceio/filters/logic.md + - MagicData: aliceio/filters/magic-data.md + - MagicFilter: aliceio/filters/magic-filter.md + - Вебхук: + - Aiohttp: aliceio/webhook/aiohttp-server.md + - Security: aliceio/webhook/security.md + - Машина состояний: + - Контекст: aliceio/fsm/context.md + - Состояние: aliceio/fsm/state.md + - Стратегия: aliceio/fsm/strategy.md + - Хранилища: + - Base: aliceio/fsm/storage/base.md + - MemoryStorage: aliceio/fsm/storage/memory.md + - ApiStorage: aliceio/fsm/storage/api.md - Redis: - - RedisStorage: fsm/storage/redis/redis.md - - DefaultKeyBuilder: fsm/storage/redis/default_key_builder.md - - KeyBuilder: fsm/storage/redis/key_builder.md - - Utils: - - Builders: - - Example: utils/builders.md - - Base: utils/builders/builder.md - - ImageGalleryBuilder: utils/builders/image_gallery_builder.md - - ItemsListBuilder: utils/builders/items_list_builder.md - - TextButtonBuilder: utils/builders/text_button_builder.md - - - Client: - - Alice: client/alice.md - - ContextController: client/context_controller.md - - Session: - - Base: client/session/base.md - - Aiohttp: client/session/aiohttp.md - - Middlewares: - - Base: client/session/middlewares/base.md - - Manager: client/session/middlewares/manager.md - - RequestLogging: client/session/middlewares/request_logging.md + - RedisStorage: aliceio/fsm/storage/redis/redis.md + - DefaultKeyBuilder: aliceio/fsm/storage/redis/default-key-builder.md + - KeyBuilder: aliceio/fsm/storage/redis/key-builder.md + - Мидлвари: + - Base: aliceio/dispatcher/middlewares/base.md + - Флаги: aliceio/dispatcher/flags.md + - Class-based хэндлеры: + - Base: aliceio/handlers/base.md + - AudioPlayer: aliceio/handlers/audio-player.md + - ButtonPressed: aliceio/handlers/button-pressed.md + - Message: aliceio/handlers/message.md + - Purchase: aliceio/handlers/purchase.md + - ShowPull: aliceio/handlers/show-pull.md + - Error: aliceio/handlers/error.md + - Timeout: aliceio/handlers/timeout.md + - Утилсы: + - Билдеры: + - Описание: aliceio/utils/builders.md + - Base: aliceio/utils/builders/builder.md + - ImageGalleryBuilder: aliceio/utils/builders/image-gallery-builder.md + - ItemsListBuilder: aliceio/utils/builders/items-list-builder.md + - TextButtonBuilder: aliceio/utils/builders/text-button-builder.md - Внутреннее устройство: - - index.md - - Handling: - - Dispatcher: - - Observers: - - Base: dispatcher/event/bases.md - - EventObserver: dispatcher/event/event.md - - AliceEventObserver: dispatcher/event/alice.md - - Handlers: dispatcher/event/handler.md - - Middlewares: - - Manager: dispatcher/middlewares/manager.md - - UserContext: dispatcher/middlewares/user_context.md - - Error: dispatcher/middlewares/error.md - - ResponseConvert: dispatcher/middlewares/response_convert.md - - - Tools: - - FSM: - - Middlewares: - - FSMContextMiddleware: fsm/middlewares/fsm_context.md - - FSMApiStorageMiddleware: fsm/middlewares/api_storage.md - - Utils: - - Funcs: utils/funcs.md - - Mixins: utils/mixins.md - - Warnings: utils/warnings.md - - - Кастомизация зависимостей: modules.md + - Наблюдатели: + - Base: aliceio/dispatcher/event/bases.md + - EventObserver: aliceio/dispatcher/event/event.md + - AliceEventObserver: aliceio/dispatcher/event/alice.md + - Handlers: aliceio/dispatcher/event/handler.md + - Мидлвари: + - Manager: aliceio/dispatcher/middlewares/manager.md + - UserContext: aliceio/dispatcher/middlewares/user-context.md + - Error: aliceio/dispatcher/middlewares/error.md + - ResponseConvert: aliceio/dispatcher/middlewares/response-convert.md + - FSMContextMiddleware: aliceio/fsm/middlewares/fsm-context.md + - FSMApiStorageMiddleware: aliceio/fsm/middlewares/api-storage.md + - Утилсы: + - Funcs: aliceio/utils/funcs.md + - Mixins: aliceio/utils/mixins.md + - Warnings: aliceio/utils/warnings.md -# TODO запилить туториал для алисы -# - Туториал: -# - tutorial/index.md -# - Первый бот: tutorial/first-bot.md -# - Правила: tutorial/rules.md -# - Разделение кода: tutorial/code-separation.md -# - Клавиатуры и вложения: tutorial/keyboards-attachments.md -# - Мидлвари и return менеджеры: tutorial/middlewares-return-managers.md -# - Обработка ошибок: tutorial/error-handling.md -# - Callback API: tutorial/callback-bot.md -# - Рекомендуемые IDE: tutorial/recommended-ide.md -# - FAQ: tutorial/faq.md + - Туториал: + - tutorial/start.md + - Первый навык: tutorial/first-skill.md + - Разделение кода: tutorial/code-separation.md + - Методы API: tutorial/methods.md + - Фильтры: tutorial/filters.md + - Мидлвари: tutorial/middlewares.md + - Машина состояний: tutorial/finite-state-machine.md + - Кнопки и альбомы: tutorial/builders.md + - Обработка ошибок: tutorial/error-handling.md + - Особые события: tutorial/special-events.md + - Внедрение зависимостей: tutorial/dependency-injection.md + - FAQ: tutorial/faq.md theme: @@ -238,7 +215,7 @@ markdown_extensions: - admonition: - md_in_html: - toc: - slugify: !!python/object/apply:pymdownx.slugs.slugify # noqa + slugify: !!python/object/apply:pymdownx.slugs.slugify kwds: case: lower permalink: "" @@ -284,7 +261,7 @@ plugins: show_root_heading: true show_signature: true show_signature_annotations: true - show_source: true + show_source: false show_symbol_type_heading: true show_symbol_type_toc: true diff --git a/pyproject.toml b/pyproject.toml index 6b7977b..8c45f3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -184,7 +184,7 @@ exclude = [ "scripts", "*.egg-info", ] -target-version = "py310" +target-version = "py38" [tool.pytest.ini_options] asyncio_mode = "auto"