// Copyright (c) 2020 Alexander Kiryukhin // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. package marusia import "context" type requestEnvelope struct { Meta meta `json:"meta"` Request *Request `json:"request"` Session *session `json:"session"` Version string `json:"version"` } type responseEnvelope struct { Response *Response `json:"response"` Session *session `json:"session"` Version string `json:"version"` } // Text sets text to response func (r *Response) SetText(text string) *Response { r.Text = text return r } // TTS sets text with pronounce func (r *Response) SetTTS(tts string) *Response { r.TTS = tts return r } // EndSession if set dialog will be completed func (r *Response) SetEndSession(endSession bool) *Response { r.EndSession = endSession return r } // AddButton to dialog func (r *Response) AddButton(title string, payload Payload, URL string) *Response { r.Buttons = append(r.Buttons, newButton(title, payload, URL)) return r } // Request represents incoming message from Marusia to skill type Request struct { Command string `json:"command"` OriginalUtterance string `json:"original_utterance"` Type string `json:"type"` Payload Payload `json:"payload"` Nlu struct { Tokens []string `json:"tokens"` Entities []interface{} `json:"entities"` } `json:"nlu"` } // Response represents outgoing message from skill to Marusia type Response struct { Text string `json:"text"` TTS string `json:"tts"` Buttons []*button `json:"buttons"` EndSession bool `json:"end_session"` } func NewResponse(text string) *Response { return &Response{Text: text} } type meta struct { ClientID string `json:"client_id"` Locale string `json:"locale"` Timezone string `json:"timezone"` Interfaces map[string]interface{} `json:"interfaces"` } type session struct { SessionID string `json:"session_id"` MessageID int `json:"message_id"` UserID string `json:"user_id"` SkillID string `json:"skill_id,omitempty"` New bool `json:"new,omitempty"` } type button struct { Title string `json:"title"` Payload Payload `json:"payload"` URL string `json:"url"` } func newButton(title string, payload Payload, URL string) *button { return &button{Title: title, Payload: payload, URL: URL} } // Payload represents payload that sends by pressing interface button type Payload map[string]interface{} // MessageHandler represents handler for incoming requests type MessageHandler func(context.Context, *Request) (*Response, error)