-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathimage.go
137 lines (117 loc) · 4.26 KB
/
image.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package alice
const (
// BigImageType одна большая картинка.
BigImageType = "BigImage"
// ItemsListType список с картинками.
ItemsListType = "ItemsList"
)
// Image структура картинки.
type Image struct {
ImageID string `json:"image_id"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Button *ImageButton `json:"button,omitempty"`
}
// ImageButton структура кнопки для добавления интерактивности картинке.
type ImageButton struct {
Title string `json:"title,omitempty"`
URL string `json:"url,omitempty"`
Payload interface{} `json:"payload,omitempty"`
}
// NewImageButton создает кнопку для добавления интерактивности картинке. Payload может быть проигнорирован. Если задано больше одного payload используется только первый.
func NewImageButton(title, url string, payload ...interface{}) ImageButton {
var p interface{}
if len(payload) > 0 {
p = payload[0]
}
return ImageButton{
Title: title,
URL: url,
Payload: p,
}
}
// 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"`
Footer *struct {
Text string `json:"text,omitempty"`
Button *ImageButton `json:"button,omitempty"`
} `json:"footer,omitempty"`
}
// BigImage добавляет к ответу одну большую картинку. Кнопка может быть проигнорирована. Если задано больше одной кнопки используется только первая. Требуемые размеры изображения: 1x — 388x172, 1.5x — 582x258, 2x — 776x344, 3x — 1164x516, 3.5x — 1358x602, 4x — 1552x688.
func (resp *Response) BigImage(id, title, desc string, button ...ImageButton) *Response {
var b *ImageButton
if len(button) > 0 {
b = &button[0]
}
image := &Card{
Type: BigImageType,
ImageID: id,
Title: title,
Description: desc,
Button: b,
}
resp.Response.Card = image
return resp
}
// List хранилище картинок для создания списка.
type List struct {
Images []Image
}
// Add добавляет картинку в заготовку для списка. Кнопка может быть проигнорирована. Если задано больше одной кнопки используется только первая.
func (l *List) Add(id, title, desc string, button ...ImageButton) *List {
var b *ImageButton
if len(button) > 0 {
b = &button[0]
}
image := Image{
ImageID: id,
Title: title,
Description: desc,
Button: b,
}
return l.AddImages(image)
}
// AddImages добавляет одну или несколько картинок в заготовку для списка.
func (l *List) AddImages(images ...Image) *List {
for _, v := range images {
l.Images = append(l.Images, v)
}
return l
}
// List добавляет к ответу список с картинками. Кнопка может быть проигнорирована. Если задано больше одной кнопки используется только первая.
func (resp *Response) List(header, footer string, l List, button ...ImageButton) *Response {
var b *ImageButton
if len(button) > 0 {
b = &button[0]
}
if len(l.Images) > 5 {
l.Images = l.Images[:5]
}
list := &Card{
Type: ItemsListType,
Header: &struct {
Text string `json:"text,omitempty"`
}{
Text: header,
},
Items: l.Images,
Footer: &struct {
Text string `json:"text,omitempty"`
Button *ImageButton `json:"button,omitempty"`
}{
Text: footer,
Button: b,
},
}
resp.Response.Card = list
return resp
}