Metadata-Version: 2.1
Name: alice-py-ycf
Version: 0.1
Summary: Module for easy writing of Yandex Alice skills.
Home-page: https://github.com/Aleksandr-Nevs/alice-py-ycf/releases/tag/0.1
Author: Aleks_Nevs
Author-email: WebAlek@yandex.ru
Keywords: Alice dialog,Python,Yandex
Classifier: Programming Language :: Python :: 3.8
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.8
Description-Content-Type: text/markdown

# alice-py-ycf 
## <font color='#6839CF'>Alice</font>-<font color='#6839CF'>Py</font>thon-<font color='#6839CF'>Y</font>andex<font color='#6839CF'>C</font>loud<font color='#6839CF'>F</font>unction

Фреймворк для разработки навыков Яндекс Алисы на Python

> Адаптирован для работы с Yandex Cloud Function
 
- Минималистичен
- Нет внешних зависимостей
- Достаточно базового уровня Python

----
Файл index.py с функцией handler для Yandex Function Cloud:
```python
def handler(event, context):
    # подключение только базового управления
    from alice_py_ycf import Alice, AddScene

    # создание еще одной сцены
    Alice.red_room = AddScene()

    # выполняется при первом запуске навыка 
    @Alice.start()
    def start_f(ctx, data):
        return {
            "txt" : 'Это первый запуск приложения',
        }

    # выполняется в основной комнате только если придет "привет" или "хай"
    @Alice.command(['привет','хай'])
    def comm_f(ctx, data):
        return {
            "txt":'И тебе привет!',
        }

    @Alice.command(['хочу в красную комнату','пошли в красную комнату'])
    def comm_f(ctx, data):
        data['scene'] = 'red_room'
        return {
            "txt": 'Отлично! Переходим в красную комнату',
            'data': data
        }

    # выполняется в основной комнате если это не первый запуск и 
    # не подходит ни под один из command( !! )
    @Alice.any()
    def any_f(ctx, data):
        return {
            "txt": 'Неизвестная команда',
            'tts': 'Эта команда мне неизв+естна'
        }

    # выполняется в дополнительной комнате (red_room) если 
    # пользователь находится в ней и 
    # не подходит ни под один из command( !! ) из этой комнаты
    @Alice.red_room.any()
    def any_f(ctx, data):
        return {
            "txt": 'Неизвестная команда в красной комнате',
            'tts': 'Эта команда неизв+естна в красной комнате',
            'data':data
        }
    # выполняется в только в дополнительной комнате (red_room) 
    # если пользователь в ней и не одна команда 
    # не подходит ни под один из command( !! ) из этой комнаты
    @Alice.red_room.command(['привет','хай'])
    def any_f(ctx, data):
        return {
            "txt": 'И тебе привет из красной комнаты',
            'tts': 'И тебе прив+ет из кр+асной комнаты',
            'data':data
        }
    
    # команда для возврата в основную комнату
    @Alice.red_room.command(['обратно в основную комнату','назад'])
    def any_f(ctx, data):
        data['scene'] = ''
        return {
            "txt": 'И тебе привет из красной комнаты',
            'tts': 'И тебе прив+ет из кр+асной комнаты',
            'data': data
        }
    
    # выполняется за пределами установленного таймаута
    @Alice.timeout()
    def any_f(ctx, data):
        return {
            "txt": 'Что-то пошло не так..',
            'data':data
        }

    # работа фреймворка
    # установлен timeout 4сек, за пределами которого 
    # будет отправлено 
    # подготовленное сообщение. 
    # default timeout = 3сек.
    return Alice.run(event, timeout=4)
```
**Особенности работы с фреймворком:**
 
- В любом ответе, значение "txt" обязателено: <br>
return {<br>
            <font color='red'>"txt":</font> 'текст ответа',<br>
            ( ... )

- Значение "tts" не является обязательным и может отсутствовать. В этом случае подставляется значение из "txt".

- Значение "txt" можно передавать массивом:
```python
choice_response = [
    {'txt':'первый вариант'}
    {'txt':'вариант посложней',
    'tts': 'вариант посложн+ей'},
    {'txt':'третий вариант ответа'}
]
@Alice.any()
    def any_f(ctx, data):
        return {
            "txt":choice_response,
        }
```
Из массива будет взят один случайный вариант ответа.

- Если навык не сможет ответить за отведенное время, можно ответить пользователю подготовленным ответом. 
```python
# (...)

# ответ который последует если навык выйдет за пределы timeout`а
@Alice.timeout()
    def any_f(ctx, data):
        return {
            "txt": 'Что-то пошло не так, но мы обязательно разберемся.. Давай попробуем еще раз.',
        }

    # не обязательный параметр timeout = количество секунд, через которые последует подготовленный ответ
    return Alice.run(event, timeout=4)
```

<font color="#67CDFE">ctx</font> - контекст вызова. Хранит полный полученный json.<br>
<font color="#67CDFE">data</font> - хранит данные сессий и данные сцены (комнат)<br>
```python
data = {
    # название сцены. Пустая строка = основная комната
    'scene': '',

    # хранение состояния сессии
    'us': {},

    # хранение состояния между сессиями
    'ws': {},

    # хранение состояние для экземпляра приложения
    'as': {}

}
```
Изменения в <font color="#67CDFE">data</font> добавляются в отправляемый json если это явно добавлено в <font color="#C3602C">return</font>.

Из всех комнат, кроме основной, передача <font color="#67CDFE">data</font> является обязательной.
