# Marusia API [![GoDoc](https://godoc.org/github.com/neonxp/marusia?status.svg)](https://godoc.org/github.com/neonxp/marusia)
Неофициальное SDK навыков для голосового ассистента [Маруси](http://marusia.mail.ru/).
Документация: [https://pkg.go.dev/github.com/neonxp/marusia](https://pkg.go.dev/github.com/neonxp/marusia)
Пример: [/example/main.go](/example/main.go)
## Использование
Импорт библиотеки:
```go
import "github.com/neonxp/marusia"
```
Создание функции обработчика (имплементирующий интерфейс [marusia.MessageHandler](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#MessageHandler) ):
```go
func messageHandler(ctx context.Context, req *marusia.Request) (*marusia.Response, error) {
...
}
```
Создание экземпляра API и http сервера, обрабатывающего колбеки:
```go
m := marusia.New(messageHandler)
server := http.Server{
Addr: ":8080",
Handler: m.Handler(),
}
if err := server.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
```
Суть работы с API заключается в том, что при получении колбека с запросом типа [*marusia.Request](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#Request) в течении максимум 10 секунд следует ответить вернув сформированный объект типа [*marusia.Response](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#Response).
## Содержимое запроса
```go
type Request struct {
Command string
OriginalUtterance string
Type string
Payload Payload
Nlu struct {
Tokens []string
Entities []interface{}
}
}
```
* Command — служебное поле: запрос пользователя, преобразованный для внутренней обработки Марусей. В ходе преобразования текст, в частности, очищается от знаков препинания, а числительные преобразуются в числа. При завершении скилла по команде "стоп", "выход" и т.д. в скилл будет передано "on_interrupt", чтобы у скилла была возможность попрощаться с пользователем.
* OriginalUtterance — полный текст пользовательского запроса, максимум 1024 символа.
* Type — тип ввода, обязательное свойство. Возможные значения: "SimpleUtterance" — голосовой ввод, "ButtonPressed" — нажатие кнопки.
* Payload — JSON, полученный с нажатой кнопкой от обработчика скилла (в ответе на предыдущий запрос), максимум 4096 байт.
* Nlu.Tokens — слова и именованные сущности, которые Маруся извлекла из запроса пользователя.
* Nlu.Entities — здесь пока будет пустой массив или какие-то экспериментальные вещи, на которые не стоит смотреть.
## Содержимое ответа
```go
type Response struct {
Text string
TTS string
Buttons []*button
EndSession bool
}
```
Методы:
* NewResponse(text string) *Response - конструктор объекта, где text - текст ответа пользователю
* Response.SetText(text string) *Response - задание текста ответа
* Response.SetTTS(tts string) *Response - текст с раставленными ударениями (знак "+")
* Response.SetEndSession(endSession bool) *Response - задает признак конца диалога
* Response.AddButton(title string, payload Payload, URL string) *Response - добавляет кнопку в диалог