Documentation ¶
Overview ¶
Package alice реализует библиотеку для создания навыков, расширяющих функциональность голосового помощника Алиса от Яндекса.
Example ¶
package main import ( "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { req, resp := k.Init() if req.IsNewSession() { return resp.Text("привет") } return resp.Text(req.OriginalUtterance()) }) }
Output:
Index ¶
- Constants
- func AutoPong(b bool) func(*Options)
- func Debug(b bool) func(*Options)
- func Plural(n int, singular, plural1, plural2 string) string
- func Timeout(t int) func(*Options)
- type Button
- type Card
- type Entities
- type Entity
- type Handler
- type Image
- type ImageButton
- type Kit
- type List
- type NEDateTime
- type NELocation
- type NEName
- type NENumber
- type NumberWrapper
- type Options
- type Phrase
- type Request
- func (req *Request) AuthToken() string
- func (req *Request) CanAccountLinking() bool
- func (req *Request) ClientID() string
- func (req *Request) Command() string
- func (req *Request) DangerousContext() bool
- func (req *Request) Entities() (Entities, error)
- func (req *Request) HasScreen() bool
- func (req *Request) IsLinkingComplete() bool
- func (req *Request) IsNewSession() bool
- func (req *Request) Locale() string
- func (req *Request) MessageID() int
- func (req *Request) OriginalUtterance() string
- func (req *Request) Payload() (map[string]interface{}, error)
- func (req *Request) PayloadString() (string, error)
- func (req *Request) SessionID() string
- func (req *Request) SkillID() string
- func (req *Request) StateSession(key string) interface{}
- func (req *Request) StateSessionAsJson() (string, error)
- func (req *Request) Text() string
- func (req *Request) Timezone() string
- func (req *Request) Tokens() []string
- func (req *Request) Type() string
- func (req *Request) UserID() string
- func (req *Request) Ver() string
- type Response
- func (resp *Response) AddSessionState(key string, data interface{}) error
- func (resp *Response) BigImage(id, title, desc string, button ...ImageButton) *Response
- func (resp *Response) Button(title, url string, hide bool, payload ...interface{}) *Response
- func (resp *Response) Buttons(buttons ...Button) *Response
- func (resp *Response) CustomSound(skill, sound string) *Response
- func (resp *Response) Effect(effect string) *Response
- func (resp *Response) EndSession() *Response
- func (resp *Response) List(header, footer string, l List, button ...ImageButton) *Response
- func (resp *Response) NoEffect() *Response
- func (resp *Response) Pause(n int) *Response
- func (resp *Response) Phrase(p ...Phrase) *Response
- func (resp *Response) RandomPhrase(p ...Phrase) *Response
- func (resp *Response) RandomText(s ...string) *Response
- func (resp *Response) ResetTTS() *Response
- func (resp *Response) ResetText() *Response
- func (resp *Response) S() *Response
- func (resp *Response) Sound(sound string) *Response
- func (resp *Response) Space() *Response
- func (resp *Response) StartAuthorization() *Response
- func (resp *Response) TTS(tts ...string) *Response
- func (resp *Response) Text(s ...string) *Response
- func (resp *Response) TextWithTTS(s, tts string) *Response
- type Stream
Examples ¶
Constants ¶
const ( // NENameType именованная сущность с ФИО. NENameType = "YANDEX.FIO" // NELocationType именованная сущность с топонимом. NELocationType = "YANDEX.GEO" // NEDataTimeType именованная сущность с датой и временем. NEDataTimeType = "YANDEX.DATETIME" // NENumberType именованная сущность с числом. NENumberType = "YANDEX.NUMBER" )
const ( // BigImageType одна большая картинка. BigImageType = "BigImage" // ItemsListType список с картинками. ItemsListType = "ItemsList" )
const ( // SimpleUtterance простая реплика. SimpleUtterance = "SimpleUtterance" // ButtonPressed нажатие кнопки. ButtonPressed = "ButtonPressed" )
Variables ¶
This section is empty.
Functions ¶
func AutoPong ¶
AutoPong автоматический ответ на технические сообщения ping, проверяющие работоспособность навыка. По умолчанию включено.
func Debug ¶
Debug показывает в консоле содержимое входящих и исходящих пакетов. По умолчанию отключено.
func Plural ¶
Plural помогает согласовать слово с числительным.
Example ¶
package main import ( "fmt" "github.com/azzzak/alice" ) func main() { num := 5 fmt.Printf("%d %s пива %s на столе", num, alice.Plural(num, "бутылка", "бутылки", "бутылок"), alice.Plural(num, "стояла", "стояли", "стояло")) }
Output: 5 бутылок пива стояло на столе
Types ¶
type Button ¶
type Button struct { Title string `json:"title"` URL string `json:"url,omitempty"` Payload interface{} `json:"payload,omitempty"` Hide bool `json:"hide,omitempty"` }
Button структура кнопки.
type Card ¶
type Card struct { ImageID string `json:"image_id,omitempty"` Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` Button *ImageButton `json:"button,omitempty"` Type string `json:"type"` Header *struct { Text string `json:"text,omitempty"` } `json:"header,omitempty"` Items []Image `json:"items,omitempty"` Text string `json:"text,omitempty"` Button *ImageButton `json:"button,omitempty"` } `json:"footer,omitempty"` }
Card структура для добавления в ответ картинок.
type Entities ¶
type Entities map[string][]newrapper
Entities контейнер для передачи необработанных именованных сущностей.
func (Entities) DatesTimes ¶
func (e Entities) DatesTimes() []NEDateTime
DatesTimes возвращает готовый к использованию массив именованных сущностей с датами и временем.
func (Entities) Locations ¶
func (e Entities) Locations() []NELocation
Locations возвращает готовый к использованию массив именованных сущностей с топонимами.
func (Entities) Names ¶
Names возвращает готовый к использованию массив именованных сущностей с ФИО.
func (Entities) Numbers ¶
func (e Entities) Numbers() []NumberWrapper
Numbers возвращает готовый к использованию массив именованных сущностей с числами.
type Entity ¶
type Entity struct { Tokens struct { Start int `json:"start"` End int `json:"end"` } `json:"tokens"` Type string `json:"type"` Value *json.RawMessage `json:"value"` }
Entity структура прототипа именованной сущности в запросе.
type Image ¶
type Image struct { ImageID string `json:"image_id"` Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` Button *ImageButton `json:"button,omitempty"` }
Image структура картинки.
type ImageButton ¶
type ImageButton struct { Title string `json:"title,omitempty"` URL string `json:"url,omitempty"` Payload interface{} `json:"payload,omitempty"` }
ImageButton структура кнопки для добавления интерактивности картинке.
func NewImageButton ¶
func NewImageButton(title, url string, payload ...interface{}) ImageButton
NewImageButton создает кнопку для добавления интерактивности картинке. Payload может быть проигнорирован. Если задано больше одного payload используется только первый.
type Kit ¶
type Kit struct { Req *Request Resp *Response // Ctx позволяет получить сигнал об истечении периода ожидания ответа. Ctx context.Context // contains filtered or unexported fields }
Kit структура для передачи данных в главный цикл.
type List ¶
type List struct {
Images []Image
}
List хранилище картинок для создания списка.
type NEDateTime ¶
type NEDateTime struct {
Start, End int
Year int `json:"year,omitempty"`
YearIsRelative bool `json:"year_is_relative,omitempty"`
Month int `json:"month,omitempty"`
MonthIsRelative bool `json:"month_is_relative,omitempty"`
Day int `json:"day,omitempty"`
DayIsRelative bool `json:"day_is_relative,omitempty"`
Hour int `json:"hour,omitempty"`
HourIsRelative bool `json:"hour_is_relative,omitempty"`
Minute int `json:"minute,omitempty"`
MinuterIsRelative bool `json:"minute_is_relative,omitempty"`
}
NEDateTime структура типа NEDataTimeType.
type NELocation ¶
type NELocation struct {
Start, End int
Country string `json:"country,omitempty"`
City string `json:"city,omitempty"`
Street string `json:"street,omitempty"`
HouseNumber string `json:"house_number,omitempty"`
Airport string `json:"airport,omitempty"`
}
NELocation структура типа NELocationType.
type NEName ¶
type NEName struct {
Start, End int
FirstName string `json:"first_name,omitempty"`
PatronymicName string `json:"patronymic_name,omitempty"`
LastName string `json:"last_name,omitempty"`
}
NEName структура типа NENameType.
type NumberWrapper ¶
NumberWrapper обертка для чисел из именованных сущностей.
type Request ¶
type Request struct { Meta struct { Locale string `json:"locale"` Timezone string `json:"timezone"` ClientID string `json:"client_id"` Interfaces struct { AccountLinking *struct{} `json:"account_linking"` Screen *struct{} `json:"screen"` } `json:"interfaces"` } `json:"meta"` LinkingComplete *struct{} `json:"account_linking_complete_event,omitenpty"` Request struct { Command string `json:"command"` OriginalUtterance string `json:"original_utterance"` Type string `json:"type"` Markup struct { DangerousContext *bool `json:"dangerous_context,omitempty"` } `json:"markup,omitempty"` Payload interface{} `json:"payload,omitempty"` NLU struct { Tokens []string `json:"tokens"` Entities []Entity `json:"entities,omitempty"` } `json:"nlu"` } `json:"request"` Session struct { New bool `json:"new"` MessageID int `json:"message_id"` SessionID string `json:"session_id"` SkillID string `json:"skill_id"` UserID string `json:"user_id"` } `json:"session"` State struct { Session interface{} `json:"session,omitempty"` } `json:"state,omitempty"` Version string `json:"version"` Bearer string }
Request структура входящего сообщения.
func (*Request) CanAccountLinking ¶
CanAccountLinking поддерживает ли устройство пользователя создание связки аккаунтов.
func (*Request) ClientID ¶
ClientID идентификатор клиентского устройства или приложения. Не рекомендуется использовать.
func (*Request) Command ¶
Command реплика пользователя, преобразованная Алисой. В частности, текст очищается от знаков препинания, а числительные преобразуются в числа.
func (*Request) DangerousContext ¶
DangerousContext флаг опасной реплики.
func (*Request) Entities ¶
Entities возвращает необработанные именованные сущности из запроса.
Example ¶
package main import ( "fmt" "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { req, resp := k.Init() entities, _ := req.Entities() for _, v := range entities.Names() { fmt.Printf("%+v\n", v) } for _, v := range entities.Locations() { fmt.Printf("%+v\n", v) } for _, v := range entities.DatesTimes() { fmt.Printf("%+v\n", v) } for _, v := range entities.Numbers() { fmt.Printf("%+v\n", v) } return resp.Text("ok") }) }
Output:
func (*Request) IsLinkingComplete ¶
IsLinkingComplete связка аккаунтов создана.
func (*Request) IsNewSession ¶
IsNewSession отправлена реплика в рамках нового разговора или уже начатого.
func (*Request) OriginalUtterance ¶
OriginalUtterance реплика пользователя без изменений.
func (*Request) Payload ¶
Payload возвращает map[string]interface{} с данными, которые были переданы в Payload кнопки. Подходит для Payload, оформленного в виде json-объекта. Если Payload простая строка следует использовать метод PayloadString(). Если в запросе нет Payload возвращается ошибка.
Example ¶
package main import ( "fmt" "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { req, resp := k.Init() // payload вида {"msg":"ok","n":42} payload, err := req.Payload() if err == nil { fmt.Println(payload["msg"].(string)) fmt.Println(payload["n"].(int)) } return resp.Text("ok") }) }
Output:
func (*Request) PayloadString ¶
PayloadString возвращает строку, которая была передана в Payload кнопки. Для сложных объектов следует использовать метод Payload(). Если в запросе нет Payload возвращается ошибка.
Example ¶
package main import ( "fmt" "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { req, resp := k.Init() payload, err := req.PayloadString() if err == nil { fmt.Println(payload) } return resp.Text("ok") }) }
Output:
func (*Request) StateSession ¶
State.Session Состояние сессии.
func (*Request) StateSessionAsJson ¶
State.Session Состояние сессии json строкой
type Response ¶
type Response struct { Response *struct { Text string `json:"text"` TTS string `json:"tts,omitempty"` Card *Card `json:"card,omitempty"` Buttons []Button `json:"buttons,omitempty"` EndSession bool `json:"end_session"` } `json:"response,omitempty"` StartAccountLinking *struct{} `json:"start_account_linking,omitempty"` Session struct { MessageID int `json:"message_id"` SessionID string `json:"session_id"` UserID string `json:"user_id"` } `json:"session"` SessionState interface{} `json:"session_state,omitempty"` Version string `json:"version"` }
Response структура исходящего сообщения.
func (*Response) AddSessionState ¶
AddSessionState добавляет па
func (*Response) BigImage ¶
func (resp *Response) BigImage(id, title, desc string, button ...ImageButton) *Response
BigImage добавляет к ответу одну большую картинку. Кнопка может быть проигнорирована. Если задано больше одной кнопки используется только первая. Требуемые размеры изображения: 1x — 388x172, 1.5x — 582x258, 2x — 776x344, 3x — 1164x516, 3.5x — 1358x602, 4x — 1552x688.
Example ¶
package main import ( "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { _, resp := k.Init() return resp.BigImage("111111/00000000000000000000", "image", "desc") }) }
Output:
Example (Button) ¶
package main import ( "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { _, resp := k.Init() b := alice.NewImageButton("кнопка", "https://yandex.ru") return resp.BigImage("111111/00000000000000000000", "image", "desc", b) }) }
Output:
func (*Response) Button ¶
Button создает кнопку и добавляет ее в ответ. Payload может быть проигнорирован. Если задано больше одного payload используется только первый.
func (*Response) CustomSound ¶
CustomSound добавляет к TTS собственный звук.
func (*Response) EndSession ¶
EndSession флаг о закрытии сессии.
func (*Response) List ¶
func (resp *Response) List(header, footer string, l List, button ...ImageButton) *Response
List добавляет к ответу список с картинками. Кнопка может быть проигнорирована. Если задано больше одной кнопки используется только первая.
Example ¶
package main import ( "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook") go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { _, resp := k.Init() var list alice.List list.Add("111111/00000000000000000000", "image1", "desc1") list.Add("222222/00000000000000000000", "image2", "desc2") list.Add("333333/00000000000000000000", "image3", "desc3") return resp.Text("список").List("список", "подвал", list) }) }
Output:
func (*Response) RandomPhrase ¶
RandomPhrase добавляет к тексту и TTS ответа данные случайной фразы из числа предложенных.
func (*Response) RandomText ¶
RandomText добавляет к текстовому ответу случайную строку из числа предложенных.
func (*Response) StartAuthorization ¶
StartAuthorization начать создание связки аккаунтов и показать пользователю карточку авторизации.
func (*Response) TTS ¶
TTS добавляет строку к TTS. Если передано несколько строк, они будут разделены пробелом.
func (*Response) Text ¶
Text добавляет строку к текстовому ответу. Если передано несколько строк, они будут разделены пробелом.
func (*Response) TextWithTTS ¶
TextWithTTS добавляет строки к текстовому ответу и к TTS.
type Stream ¶
type Stream <-chan Kit
Stream канал, передающий данные в основной цикл.
func ListenForWebhook ¶
ListenForWebhook регистрирует обработчик входящих пакетов.
Example ¶
package main import ( "net/http" "github.com/azzzak/alice" ) func main() { updates := alice.ListenForWebhook("/hook", alice.Debug(true)) go http.ListenAndServe(":3000", nil) updates.Loop(func(k alice.Kit) *alice.Response { _, resp := k.Init() return resp.Text("ok") }) }
Output: