-
Notifications
You must be signed in to change notification settings - Fork 292
/
mattermost_render.go
90 lines (77 loc) · 2.6 KB
/
mattermost_render.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
package bot
import (
"encoding/json"
"strconv"
"time"
"github.com/mattermost/mattermost/server/public/model"
"github.com/kubeshop/botkube/pkg/api"
"github.com/kubeshop/botkube/pkg/bot/interactive"
"github.com/kubeshop/botkube/pkg/formatx"
)
// MattermostRenderer provides functionality to render Mattermost specific messages from a generic models.
type MattermostRenderer struct {
mdFormatter interactive.MDFormatter
}
// NewMattermostRenderer returns new MattermostRenderer instance.
func NewMattermostRenderer() *MattermostRenderer {
return &MattermostRenderer{
mdFormatter: interactive.DefaultMDFormatter(),
}
}
// MessageToMarkdown renders message in Markdown format.
func (d *MattermostRenderer) MessageToMarkdown(in interactive.CoreMessage) string {
return interactive.RenderMessage(d.mdFormatter, in)
}
// NonInteractiveSectionToCard returns MessageEmbed for the given event message.
// Note: It cannot be used for other messages as we take into account only first message section with limited primitives:
// - TextFields
// - BulletLists
// - Timestamp
// It should be removed once we will add support for a proper message renderer.
func (d *MattermostRenderer) NonInteractiveSectionToCard(msg interactive.CoreMessage) ([]*model.SlackAttachment, error) {
if err := IsValidNonInteractiveSingleSection(msg); err != nil {
return nil, err
}
event := msg.Sections[0]
messageAttachment := &model.SlackAttachment{
Title: event.Base.Header,
Timestamp: d.renderTimestamp(msg.Timestamp),
Footer: "Botkube",
}
messageAttachment.Fields = append(messageAttachment.Fields, d.renderTextFields(event.TextFields)...)
messageAttachment.Fields = append(messageAttachment.Fields, d.renderBulletLists(event.BulletLists)...)
return []*model.SlackAttachment{
messageAttachment,
}, nil
}
func (*MattermostRenderer) renderTimestamp(in time.Time) json.Number {
if in.IsZero() {
return ""
}
return json.Number(strconv.FormatInt(in.Unix(), 10))
}
func (d *MattermostRenderer) renderTextFields(fields api.TextFields) []*model.SlackAttachmentField {
var out []*model.SlackAttachmentField
for _, field := range fields {
if field.IsEmpty() {
continue
}
out = append(out, &model.SlackAttachmentField{
Title: field.Key,
Value: field.Value,
Short: true,
})
}
return out
}
func (d *MattermostRenderer) renderBulletLists(lists api.BulletLists) []*model.SlackAttachmentField {
var out []*model.SlackAttachmentField
for _, item := range lists {
out = append(out, &model.SlackAttachmentField{
Title: item.Title,
Value: formatx.BulletPointListFromMessages(item.Items),
Short: false,
})
}
return out
}